Initial commit

This commit is contained in:
Mario Romero 2023-08-27 19:19:52 -04:00
commit 9f2dcf1054
43 changed files with 1032 additions and 0 deletions

2
.gitattributes vendored Normal file
View File

@ -0,0 +1,2 @@
*.jpg filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text

9
Dockerfile Normal file
View File

@ -0,0 +1,9 @@
FROM denoland/deno:latest
EXPOSE 3000
WORKDIR /app
COPY /src .
ENTRYPOINT ["deno"]
CMD ["task", "serve"]

8
compose-dev.yaml Normal file
View File

@ -0,0 +1,8 @@
version: "3.9"
services:
app:
container_name: ieee-usm-web-dev
image: mario1159/ieee-usm-web
build: .
ports:
- 8080:3000

2
src/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
_bin
build

46
src/_config.ts Normal file
View File

@ -0,0 +1,46 @@
import lume from "lume/mod.ts";
import date from "lume/plugins/date.ts";
import postcss from "lume/plugins/postcss.ts";
import codeHighlight from "lume/plugins/code_highlight.ts";
import basePath from "lume/plugins/base_path.ts";
import slugifyUrls from "lume/plugins/slugify_urls.ts";
import resolveUrls from "lume/plugins/resolve_urls.ts";
import pageFind from "lume/plugins/pagefind.ts";
import sitemap from "lume/plugins/sitemap.ts";
import feed from "lume/plugins/feed.ts";
const site = lume({
location: new URL("https://ieee.usm.cl/"),
src: "content",
dest: "build"
});
site
.ignore("README.md")
.copy("img")
.use(postcss())
.use(date())
.use(codeHighlight())
.use(basePath())
.use(sitemap())
.use(pageFind({
ui: {
resetStyles: false,
},
}))
.use(slugifyUrls({ alphanumeric: false }))
.use(feed({
output: ["/feed.json", "/feed.xml"],
query: "type=posts",
info: {
title: "=site.title",
description: "=site.description",
},
items: {
title: "=title",
content: "$.post-body",
}
}))
.use(resolveUrls());
export default site;

1
src/content/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
_site

8
src/content/404.md Normal file
View File

@ -0,0 +1,8 @@
---
layout: layouts/home.njk
url: /404.html
---
# Content not found.
Go [home](/).

128
src/content/README.md Normal file
View File

@ -0,0 +1,128 @@
# Lume base blog example
A starter repository showing how to build a blog with the
[Lume](https://github.com/lumeland/lume) static site generator.
This project started as a fork of
[eleventy-base-blog](https://github.com/11ty/eleventy-base-blog) but adapted to
Lume and with the NetlifyCMS.
## Getting Started
1. Make sure you have [Deno installed](https://deno.land/#installation).
2. Clone this Repository
`git clone https://github.com/lumeland/base-blog.git my-blog-name`
3. Edit `_data/site.yml`. Specifically have a look at `_config.js` to see if you
want to configure any option differently. See the
[Lume documentation site](https://lume.land/).
4. Run Lume with `deno task serve`.
### Implementation Notes
- `about.md` shows how to add a content page.
- `posts/` has the blog posts but really they can live in any directory. The
`posts/_data.yml` file adds the value for `type` and `layout` fields to all
posts.
- The `menu` field adds any page to the top level site navigation. For example,
this is in use on `index.njk` and `about.md`. You can configure the order with
`menu.order` and the text with `menu.title`.
- `css` files are processed with `postcss` plugin. The imported styles are in
`_includes/css`
- `img` folder is copied as is, (keeping the same directory structure).
- The blog post feed template is in `feed.xml.njk` and `feed.tmpl.js`.
- This example uses four layouts stored in `_includes/layouts/`:
- `base.njk`: the top level HTML structure
- `home.njk`: the home page template (wrapped into `base.njk`)
- `post.njk`: the blog post template (wrapped into `base.njk`)
- `tag.njk`: the tag page template (wrapped into `base.njk`)
- `_includes/templates/postlist.njk` is a Nunjucks a reusable template used to
display a list of all the posts. `index.njk` has an example of how to use it.
- `admin/` has the [NetlifyCMS](https://www.netlifycms.org/) configuration so
you can edit or create new posts using a friendly CMS.
## Deployment
### GitHub Pages
- [Get your own Lume blog on Github Pages](https://github.com/lumeland/base-blog/generate)
- Open the file `.github/workflows/build.yml` and edit the `--location` option
with the url of the site, for example
`--location=https://username.github.io/repo/`
- Enable Github Pages and select the branch `gh-pages` as source.
- [See a live demo](https://lumeland.github.io/base-blog/)
### GitLab Pages
- Open the file `.gitlab-ci.yml` and edit the `--location` option
with the url of the site, for example
`--location=https://username.gitlab.io/repo/`
- [See a live demo](https://oscarotero.gitlab.io/base-blog/)
### Deno Deploy
- [Create a project in Deno Deploy](https://deno.com/deploy) and configure it.
- Link to your git repository
- Set the GitHub Actions deployment mode.
- Open the file `.github/workflows/deno_deploy.yml` and edit the following:
- The `--location` option with the url of the site, for example:
`--location=https://my-blog.deno.dev`
- The project name in the `denoland/deployctl` step with the name of your
project.
- [See a live demo](https://lume-blog.deno.dev)
### Vercel
- [Get your own Lume blog on Vercel](https://vercel.com/new/git/external?repository-url=https://github.com/lumeland/base-blog)
- You need to config your the project manually with the following values:
- **Build Command:**
`curl -fsSL https://deno.land/x/install/install.sh | sh && /vercel/.deno/bin/deno task build --location=https://example.vercel.app/`.
Edit the `--location` option with the name of your domain.
- **Output directory:** `_site`
- [See a live demo](https://lume-blog.vercel.app/)
### Netlify
- [Get your own Lume blog on Netlify](https://app.netlify.com/start/deploy?repository=https://github.com/lumeland/base-blog)
- Open the `netlify.toml` file and edit the
`--location=https://deno-blog.netlify.app/` option with your own domain.
- [See a live demo](https://lume-blog.netlify.app/)
- If you want to use NetlifyCMS:
- Activate the Identity service in your Netlify settings panel.
- Activate the Git Gateway.
- Invite the users to edit the content.
### Fleek
- [Import your project](https://app.fleek.co/#/start/connect-repository)
- Open the `.fleek.json` file and edit the
`--location=https://example.on.fleek.co` option with your own domain.
- [See a live demo](https://lume-blog.on.fleek.co/)
### Cloudflare Pages
- Configure the project with the following values:
- **Build Command:**
`curl -fsSL https://deno.land/x/install/install.sh | sh && /opt/buildhome/.deno/bin/deno task build --location=https://example.pages.dev/`.
Edit the `--location` option with the name of your domain.
- **Output directory:** `_site`
- [See a live demo](https://base-blog.pages.dev/)
### AWS Amplify
- Configure the `amplify.yml` file with the following values:
```yml
version: 1
frontend:
phases:
build:
commands:
- curl -fsSL https://deno.land/x/install/install.sh | sh
- /root/.deno/bin/deno task build
artifacts:
baseDirectory: /_site
files:
- '**/*'
cache:
paths: []
```
- [See a live demo](https://master.docjzml5t5if1.amplifyapp.com/)

View File

@ -0,0 +1,63 @@
.carousel .buttons {
display: flex;
flex-flow: row nowrap;
justify-content: space-around;
align-items: center;
position: absolute;
text-align: center;
left: 0;
right: 0;
bottom: 10px;
}
.carousel .prev {
margin: 0px 340px 0px 0px;
}
.carousel .next {
margin: 0px 0px 0px 340px;
}
.carousel .prev, .carousel .next {
display: inline-block;
height: 25px;
width: 25px;
background-color: #000000;
color:rgb(245, 245, 245);
border-radius: 50%;
cursor: pointer;
opacity: 0.6;
}
.dot {
display: inline-block;
text-align: center;
height: 15px;
width: 15px;
background-color: transparent;
border: 2px solid;
border-color: white;
border-radius: 50%;
cursor: pointer;
opacity: 0.8;
margin: 0 5px;
}
.active, .dot:hover{
background-color: white;
}
.carousel {
position: relative;
height: 670px;
width: 1920px;
margin: 0px auto;
overflow: hidden;
}
.carousel img {
object-fit: cover;
width: 100%;
height: 670px;
mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.4), rgba(0, 0, 0, 0));
}

View File

@ -0,0 +1 @@
@import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@700&display=swap');

View File

@ -0,0 +1,62 @@
.navbar {
display: flex;
flex-wrap: wrap;
align-items: center;
padding: 1rem 1rem 1rem 2rem;
column-gap: 2rem;
row-gap: 1rem;
border-bottom: 6px solid #0e649d;
& a {
display: block;
&:not(:hover) {
text-decoration: none;
}
}
}
.navbar-links {
padding: 0;
margin: 0;
list-style: none;
display: flex;
flex-wrap: wrap;
column-gap: 2rem;
& [aria-current="page"] {
font-weight: bold;
text-decoration: underline;
}
}
.navbar-search {
flex-grow: 1;
max-width: 800px;
margin-left: auto;
}
#search {
& .pagefind-ui__drawer {
margin-top: 2px;
position: absolute;
background: var(--white);
padding: 0 2rem 1rem;
max-height: calc(100vh - 200px);
overflow-y: auto;
box-shadow: 0 10px 10px -5px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.1);
border-bottom-right-radius: var(--pagefind-ui-border-radius);
border-bottom-left-radius: var(--pagefind-ui-border-radius);
width: 100%;
box-sizing: border-box;
}
& .pagefind-ui__message {
margin: 0;
padding: 0;
}
& .pagefind-ui__result-link {
color: var(--blue);
}
& .pagefind-ui__result-excerpt {
color: var(--darkgray);
}
}

View File

@ -0,0 +1,45 @@
.post-banner-list {
list-style: none;
padding: 0;
}
.post-banner {
position: relative;
width: 1920px;
height: 670px;
}
.post-banner-bg {
display: block;
overflow: hidden;
background-color: black;
}
.post-banner-overlay {
position: absolute;
margin: 72px;
}
.post-banner-overlay-container {
margin: 0px 0px 10px 0px;
padding: 6px 0px;
}
.post-banner-title {
font-size: 4em;
}
.post-banner-description {
font-size: 2em;
}
.post-banner-date {
font-size: 0.8rem;
color: var(--fg-primary);
}
.post-banner-overlay-container span {
font-family: 'Montserrat', sans-serif;
color: white;
padding: 8px;
}

View File

@ -0,0 +1,19 @@
.postList {
list-style: none;
padding: 0;
}
.postList-date {
font-size: 0.8rem;
color: var(--fg-primary);
}
.postList-title {
display: inline-block;
padding: 0.5em 0.2em;
font-size: 1.2rem;
&[aria-current="page"] {
font-weight: bold;
}
}

View File

@ -0,0 +1,45 @@
.post-header {
padding: 5vh 0;
}
.post-title {
font-size: 4rem;
font-size: clamp(2rem, 10vw, 4rem);
line-height: 1;
letter-spacing: -0.02em;
margin: 0 0 0.25em;
}
.post-tags {
display: inline;
}
.post-body {
font-size: 1.2em;
line-height: 1.4;
& p,
& ul,
& ol {
max-width: 45em;
}
& h2,
& h3,
& h4,
& h5,
& h6 {
max-width: 20em;
margin-bottom: 0;
}
}
.post-navigation {
& ul {
list-style: none;
padding: 0;
display: flex;
flex-wrap: wrap;
justify-content: center;
}
& li {
padding: 1em;
}
}

View File

@ -0,0 +1,68 @@
:root {
--red: #c04;
--lightgray: #e6e6e6;
--darkgray: #0d1117;
--blue: #135;
--white: #fff;
--font-family: -apple-system, system-ui, sans-serif;
}
html,
body {
padding: 0;
margin: 0;
font-family: var(--font-family);
color: var(--darkgray);
background-color: var(--white);
/** Pagefind variables */
--pagefind-ui-scale: .8;
--pagefind-ui-primary: var(--darkgray);
--pagefind-ui-text: var(--darkgray);
--pagefind-ui-background: var(--white);
--pagefind-ui-border: var(--lightgray);
--pagefind-ui-tag: var(--lightgray);
--pagefind-ui-border-width: 1px;
--pagefind-ui-border-radius: 6px;
--pagefind-ui-image-border-radius: 6px;
--pagefind-ui-image-box-ratio: 3 / 2;
--pagefind-ui-font: var(--font-family);
}
main {
& > :first-child {
margin-top: 0;
}
}
a {
color: var(--blue);
}
/* Warning */
.warning {
background-color: #ffc;
padding: 1em 0.5em;
}
table {
margin: 1em 0;
& td,
& th {
padding-right: 1em;
}
}
pre,
code {
font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace;
line-height: 1.5;
font-size: 1rem;
}
hr {
border: 0;
border-top: solid 2px var(--lightgray);
margin: 5vh 0;
}

View File

@ -0,0 +1,35 @@
search-form {
}
oom-search::part(input) {
border: solid 2px var(--darkgray);
border-radius: 4px;
padding: .5em;
background: none;
}
oom-search::part(label) {
font-weight: bold;
}
oom-search::part(input) {
border: solid 2px var(--darkgray);
border-radius: 4px;
padding: .5em;
background: none;
}
oom-search::part(items) {
padding: .5em;
margin: .5em 0;
box-shadow: 0 2px 3px #0003;
background: white;
width: auto;
min-width: 100%;
right: 0;
}
oom-search::part(item) {
background: none;
font: inherit;
padding: .5em 1em;
}
oom-search::part(active) {
background-color: var(--lightgray);
}

View File

@ -0,0 +1,16 @@
.tag {
display: inline-block;
text-transform: uppercase;
font-size: 0.7rem;
line-height: 1;
padding: 0.2em 0.5em;
margin-right: 0.8em;
background-color: var(--red);
color: var(--white);
border-radius: 0.25em;
text-decoration: none;
&.is-big {
font-size: 1rem;
}
}

View File

@ -0,0 +1,30 @@
---
layout: layouts/base.njk
bodyClass: body-tag
---
<h1>{{ title }}</h1>
{% set postslist = results %}
{% include "templates/postslist.njk" %}
<hr>
<nav class="post-navigation">
<ul>
{%- if pagination.previous %}
<li>
<a href="{{ pagination.previous }}" rel="prev">← Previous</a>
</li>
{% endif %}
<li>
Page {{ pagination.page }}
</li>
{%- if pagination.next %}
<li>
<a href="{{ pagination.next }}" rel="next">Next →</a>
</li>
{% endif %}
</ul>
</nav>

View File

@ -0,0 +1,41 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ title or site.title }}</title>
<meta name="description" content="{{ description or site.description }}">
<link rel="stylesheet" href="/styles.css">
<link rel="alternate" href="/feed.xml" type="application/atom+xml" title="{{ site.title }}">
<link rel="alternate" href="/feed.json" type="application/json" title="{{ site.title }}">
</head>
<body>
<nav class="navbar">
<img src="img/logo.jpg" height="50px"/>
<a href="/" class="navbar-home">
<strong>{{ site.title }}</strong>
</a>
<ul class="navbar-links">
{%- for entry in search.pages("menu.visible=true", "menu.order") %}
<li>
<a href="{{ entry.data.url }}"{% if entry.data.url == url %} aria-current="page"{% endif %}>
{{ entry.data.menu.title or entry.data.title }}
</a>
</li>
{%- endfor %}
</ul>
<div class="navbar-search">
<div id="search"></div>
</div>
</nav>
<main class="{{ bodyClass }}">
{{ content | safe }}
</main>
<footer></footer>
</body>
</html>

View File

@ -0,0 +1,6 @@
---
layout: layouts/base.njk
bodyClass: body-home
---
{{ content | safe }}

View File

@ -0,0 +1,43 @@
---
layout: layouts/base.njk
bodyClass: body-post
---
<article class="post" data-pagefind-body>
<div class="post-header">
<h1 class="post-title">{{ title }}</h1>
<nav class="post-tags">
{% for tag in tags %}
<a href="/tags/{{ tag }}/" class="tag">{{ tag }}</a>
{% endfor %}
</nav>
<time class="post-date" datetime="{{ date | date('DATETIME') }}">
{{ date | date('HUMAN_DATE') }}
</time>
</div>
<div class="post-body">
{{ content | safe }}
</div>
</article>
<hr>
<nav class="post-navigation">
<ul>
{%- set previousPost = search.previousPage(url, "type=posts") %}
{%- if previousPost %}
<li>
← Previous: <a href="{{ previousPost.data.url }}" rel="prev">{{ previousPost.data.title }}</a>
</li>
{% endif %}
{%- set nextPost = search.nextPage(url, "type=posts") %}
{%- if nextPost %}
<li>
<strong>Next: <a href="{{ nextPost.data.url }}" rel="next">{{ nextPost.data.title }}</a> →</strong>
</li>
{% endif %}
</ul>
</nav>

View File

@ -0,0 +1,14 @@
---
layout: layouts/base.njk
bodyClass: body-tag
---
<div data-pagefind-body>
<h1>Tagged “{{ tag }}”</h1>
{% set postslist = search.pages("'" + tag + "'") %}
{% include "templates/postslist.njk" %}
<hr>
<p>See <a href="/tags/">all tags</a>.</p>
</div>

View File

@ -0,0 +1,50 @@
<div class="carousel">
{% for post in postslist %}
<div class="slide">
{% include "templates/carousel_card.njk" %}
</div>
{% endfor %}
<div class="buttons">
<div class="prev" onclick="plusDivs(-1)"> <span>&#10094;</span> </div>
<div class="dot active" onclick="currentDiv(1)"> <span></span> </div>
<div class="dot" onclick="currentDiv(2)"> <span></span> </div>
<div class="dot" onclick="currentDiv(3)"> <span></span> </div>
<div class="next" onclick="plusDivs(+1)"> <span>&#10095;</span> </div>
</div>
<script>
var slideIndex = 1;
//showDivs(slideIndex);
setTimeout(automatic_slide, 5000, 5000);
function automatic_slide(time) {
plusDivs(1);
setTimeout(automatic_slide, time, time);
}
function currentDiv(n) {
showDivs(slideIndex = n);
}
function plusDivs(n) {
showDivs(slideIndex += n);
}
function showDivs(n) {
var i;
var x = document.getElementsByClassName("slide");
var dots = document.getElementsByClassName("dot");
if (n > x.length) {slideIndex = 1}
if (n < 1) {slideIndex = x.length};
for (i = 0; i < x.length; i++) {
x[i].style.display = "none";
}
for (i = 0; i < dots.length; i++) {
dots[i].classList.remove("active");
}
dots[slideIndex-1].classList.add("active");
x[slideIndex-1].style.display = "block";
}
</script>
</div>

View File

@ -0,0 +1,27 @@
<div class="post-banner">
<div class="post-banner-overlay">
<div class="post-banner-overlay-container">
<span class="post-banner-title">{{ post.data.title }}</span>
</div>
<div class="post-banner-overlay-container">
<span class="post-banner-description">{{ post.data.description }}</span>
</div>
<div class="post-banner-overlay-container">
<span>
<time class="post-banner-date" datetime="{{ post.data.date | date('DATETIME') }}">
{{ post.data.date | date('HUMAN_DATE') }}
</time>
{% for tag in post.data.tags %}
{% set page = search.page("type=tag tag='" + tag + "'") %}
{% if page %}
<a class="post-banner-date" href="{{ page.data.url }}" class="tag">{{ tag }}</a>
</span>
{% endif %}
{% endfor %}
</div>
</div>
<a href="{{ post.data.url }}" class="post-banner-bg"{% if entry.data.url == url %} aria-current="page"{% endif %}>
<img src="{{ post.data.image }}" />
</a>
</div>

View File

@ -0,0 +1,24 @@
<ul class="postList">
{% for post in postslist %}
<li class="postList-post">
<a href="{{ post.data.url }}" class="postList-title"{% if entry.data.url == url %} aria-current="page"{% endif %}>
{% if post.data.title %}
<strong>{{ post.data.title }}</strong>
{% else %}
<code>{{ post.url }}</code>
{% endif %}
</a>
<time class="postList-date" datetime="{{ post.data.date | date('DATETIME') }}">
{{ post.data.date | date('HUMAN_DATE') }}
</time>
{% for tag in post.data.tags %}
{% set page = search.page("type=tag tag='" + tag + "'") %}
{% if page %}
<a href="{{ page.data.url }}" class="tag">{{ tag }}</a>
{% endif %}
{% endfor %}
</li>
{% endfor %}
</ul>

36
src/content/about.md Normal file
View File

@ -0,0 +1,36 @@
---
layout: layouts/post.njk
title: Sobre nosotros
templateClass: tmpl-post
menu:
visible: true
order: 3
---
# IEEE-USM-SB
El IEEE de la Universidad Técnica Fedrico Santa María (IEEE-USM-SB), nació el 30 de Mayo de 1986, día en que fue reconocida oficialmente por ese organismo internacional. A partir de su formación se ha destacado por complementar la formación del estudiante de ingeniería mediante la organización de numerosos eventos, entre los cuales los ICX'89-'91 y SEIN-'89-'90 están considerados dentro de los más exitosos, sin desmerecer el IEEExpo-'95 o G-Line y numerosos cursos, tutoriales y charlas que semestre a semestre se organizan en nuestra rama.
Nuestra Directiva
## Sobre la IEEE
Fundado el año 1884 por Alexander Graham Bell, el Instituto de Ingenieros Eléctricos y Electrónicos (IEEE) es la sociedad técnica profesional más grande del Mundo, devota al avance de la teoría y aplicación de la ingeniería eléctrica, electrónica y computacional.
Sobre 350.000 ingenieros eléctricos, electrónicos, científicos y estudiantes, en aproximadamente 150 países son los que hoy forman el instituto.
El instituto promueve el desarrollo de electrotecnologías y ciencias aliadas por medio de la aplicación de estas tecnologías para el beneficio de la humanidad, el mejoramiento del conocimiento de la profesión y la capacitación de sus miembros.
## Ramas Estudiantiles
El IEEE posee, como una forma de fomentar el conocimiento, ramas estudiantiles en los principales centros de estudio en el mundo. De esta forma logran que el conocimiento este al alcance de todos los futuros profesionales.
Estas Ramas Estudiantiles no solo son un puente entre el IEEE y los estudiantes, sino que también fomentan las capacidades de organización de cada uno de sus miembros.
## Algunos Beneficios
Al inscribirse al Instituto, automáticamente obtiene una suscripción a la prestigiosa revista Magazine "Spectrum", además de la posibilidad de suscribirse a cualquiera de las publicaciones que periodicamente publica el IEEE a un muy bajo costo.
Obtienes precios preferenciales a la mayoria de los Congresos, Cursos y similares actividades, además de una gran cantidad de productos, descuentos, etc. para los miembros de determinados países.

View File

@ -0,0 +1,28 @@
export const layout = "layouts/archive.njk";
export const title = "Archive";
export default function* ({ search, paginate }) {
const posts = search.pages("type=posts", "date=desc");
for (
const data of paginate(posts, { url, size: 10 })
) {
// Show the first page in the menu
if (data.pagination.page === 1) {
data.menu = {
visible: true,
order: 3,
};
}
yield data;
}
}
function url(n) {
if (n === 1) {
return "/posts/";
}
return `/posts/${n}/`;
}

12
src/content/chapters.njk Normal file
View File

@ -0,0 +1,12 @@
---
layout: layouts/post.njk
title: Chapters
templateClass: tmpl-post
menu:
visible: true
order: 1
---
<a>SSCS/CAS/EDS</a>
<a>Computer Society</a>
<a>Power and Energy Systems</a>

BIN
src/content/img/logo.jpg (Stored with Git LFS) Normal file

Binary file not shown.

BIN
src/content/img/posts/20230701_canelos_img.jpg (Stored with Git LFS) Normal file

Binary file not shown.

BIN
src/content/img/posts/20230701_canelos_photo_1.jpg (Stored with Git LFS) Normal file

Binary file not shown.

BIN
src/content/img/posts/20230701_canelos_photo_2.jpg (Stored with Git LFS) Normal file

Binary file not shown.

BIN
src/content/img/posts/20230825_rnr.jpg (Stored with Git LFS) Normal file

Binary file not shown.

30
src/content/index.njk Normal file
View File

@ -0,0 +1,30 @@
---
layout: layouts/home.njk
menu:
visible: true
title: Home
order: 0
---
<div >
{% set postslist = search.pages("type=posts", "date=desc", 3) %}
{%if postslist.length %}
{% include "templates/carousel.njk" %}
{% endif %}
<h1>Latest {% if postslist.length == 1 %}Post{% else %}{{ postslist.length }} Posts{% endif %}</h1>
{% include "templates/postslist.njk" %}
<hr>
{% set postslist = search.pages("pinned=true") %}
{%if postslist.length %}
<h2>Pinned Post:</h1>
{% include "templates/postslist.njk" %}
<hr>
{% endif %}
<p>More posts can be found in <a href="/posts/">the archive</a>.</p>

View File

@ -0,0 +1,12 @@
---
title: CANELOS
description: CAD and Nanoelectronics Seminar
date: 2023-08-25
tags:
- chipusm sscs-cas-eds-sb
image: img/posts/20230701_canelos_photo_1.jpg
---
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam placerat pulvinar sagittis. Suspendisse commodo, erat ac tincidunt bibendum, tortor quam imperdiet eros, at vestibulum eros urna a eros. Phasellus quis placerat magna. Donec convallis placerat risus, eu venenatis felis dignissim vel. Praesent vel varius urna. Suspendisse potenti. Phasellus consequat elementum dui nec accumsan. Mauris suscipit lorem dolor, eu ultrices orci vulputate id.
Proin quis lacus dolor. Sed eu metus malesuada, tempus turpis ut, egestas ex. Vestibulum pulvinar tempor nunc, lobortis iaculis nulla ornare vel. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Praesent odio metus, venenatis sit amet aliquam eget, tincidunt lacinia nulla. Aenean a gravida nunc. Pellentesque commodo mi sit amet mauris maximus efficitur. Quisque ullamcorper dapibus quam quis vehicula. Morbi gravida sagittis nisi vitae faucibus. Sed tempor felis non laoreet tincidunt. Integer dolor nulla, tincidunt non purus a, consectetur volutpat lectus. In hac habitasse platea dictumst. Cras sed vulputate tortor, vitae sodales nisl. Nam laoreet ante non sagittis cursus. Phasellus et magna vitae mi interdum tempus. Fusce consectetur augue sit amet lectus rhoncus, non sollicitudin metus sodales.

View File

@ -0,0 +1,18 @@
---
title: RNR Chile USACH/UDP
description: Asistencia RNR 2023
date: 2023-08-25
tags:
- utfsm-sb
image: img/posts/20230825_rnr.jpg
---
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam placerat pulvinar sagittis. Suspendisse commodo, erat ac tincidunt bibendum, tortor quam imperdiet eros, at vestibulum eros urna a eros. Phasellus quis placerat magna. Donec convallis placerat risus, eu venenatis felis dignissim vel. Praesent vel varius urna. Suspendisse potenti. Phasellus consequat elementum dui nec accumsan. Mauris suscipit lorem dolor, eu ultrices orci vulputate id.
Proin quis lacus dolor. Sed eu metus malesuada, tempus turpis ut, egestas ex. Vestibulum pulvinar tempor nunc, lobortis iaculis nulla ornare vel. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Praesent odio metus, venenatis sit amet aliquam eget, tincidunt lacinia nulla. Aenean a gravida nunc. Pellentesque commodo mi sit amet mauris maximus efficitur. Quisque ullamcorper dapibus quam quis vehicula. Morbi gravida sagittis nisi vitae faucibus. Sed tempor felis non laoreet tincidunt. Integer dolor nulla, tincidunt non purus a, consectetur volutpat lectus. In hac habitasse platea dictumst. Cras sed vulputate tortor, vitae sodales nisl. Nam laoreet ante non sagittis cursus. Phasellus et magna vitae mi interdum tempus. Fusce consectetur augue sit amet lectus rhoncus, non sollicitudin metus sodales.
Suspendisse potenti. Cras eu posuere neque. Nulla blandit nunc in ligula hendrerit euismod. Pellentesque lacinia quam ut orci rhoncus mollis. Nunc varius interdum libero, in cursus diam interdum quis. In egestas, nibh vel lacinia fringilla, lorem dui fermentum tellus, vitae luctus purus libero in augue. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam id tempus ex. Nam vulputate, purus non ultrices viverra, ligula augue molestie enim, nec aliquet dolor massa eu erat. Praesent accumsan felis ut malesuada pellentesque. Donec sem urna, convallis a eleifend at, cursus et felis. Proin scelerisque felis vel fermentum lacinia. In hac habitasse platea dictumst. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aenean scelerisque commodo risus, sit amet suscipit leo efficitur sit amet.
Praesent in diam sed tellus eleifend imperdiet. Aliquam vestibulum at turpis nec congue. Nullam mi justo, accumsan et massa dapibus, pellentesque rhoncus mauris. Praesent at rutrum tellus, vitae sagittis erat. Fusce ultrices, ante et pretium facilisis, neque tellus ultrices felis, vitae sollicitudin tellus odio finibus metus. Nulla semper eu lorem sit amet porttitor. Phasellus consequat augue sed metus hendrerit rutrum. Donec ut mi a dolor ultricies venenatis. Praesent bibendum, tortor vel bibendum efficitur, arcu felis venenatis ipsum, sed porttitor neque diam ut purus. Cras vitae turpis nec neque blandit malesuada. Fusce ultricies cursus auctor. Curabitur augue ante, pharetra sit amet fermentum nec, accumsan a justo. Aliquam orci elit, iaculis at enim sit amet, bibendum ullamcorper sem.
Vivamus feugiat felis eu neque rhoncus dapibus non sollicitudin dolor. Praesent erat sem, molestie nec volutpat et, commodo sit amet mauris. Duis efficitur laoreet turpis a consequat. Quisque ac ante egestas, pulvinar massa eu, aliquet orci. Curabitur id egestas est. Donec rhoncus pellentesque tellus quis maximus. Sed nec odio sed magna convallis vehicula non nec neque.

View File

@ -0,0 +1,2 @@
type: posts
layout: layouts/post.njk

View File

@ -0,0 +1,25 @@
export const url = "/search.json";
export default function ({ search }, { url }) {
const result = [];
// Search tags
for (const tag of search.tags("type=posts")) {
result.push({
label: `Tag: ${tag}`,
search: tag,
value: url(`/tags/${tag}/`),
});
}
// Search posts
for (const post of search.pages("type=posts")) {
result.push({
label: post.data.title,
search: `${post.data.title} ${post.data.tags.join(" ")}`,
value: url(post.data.url),
});
}
return JSON.stringify(result);
}

12
src/content/styles.css Normal file
View File

@ -0,0 +1,12 @@
/* Code syntax highlight */
@import "https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.0.0/build/styles/github-dark.min.css";
@import "css/reset.css";
@import "css/navbar.css";
@import "css/search.css";
@import "css/post-list.css";
@import "css/post.css";
@import "css/tag.css";
@import "css/carousel.css";
@import "css/post-list-banner.css";
@import "css/fonts.css";

12
src/content/tag.tmpl.js Normal file
View File

@ -0,0 +1,12 @@
export const layout = "layouts/tag.njk";
export default function* ({ search }) {
for (const tag of search.tags()) {
yield {
url: `/tags/${tag}/`,
title: `Tagged “${tag}`,
type: "tag",
tag,
};
}
}

8
src/content/tags.njk Normal file
View File

@ -0,0 +1,8 @@
---
layout: layouts/base.njk
---
<h1>Tags</h1>
{% for page in search.pages("type=tag", "tag") %}
<a href="{{ page.data.url }}" class="tag is-big">{{ page.data.tag }}</a>
{% endfor %}

11
src/deno.json Normal file
View File

@ -0,0 +1,11 @@
{
"imports": {
"lume/": "https://deno.land/x/lume@v1.17.3/"
},
"lock": false,
"tasks": {
"build": "deno task lume",
"serve": "deno task lume -s",
"lume": "echo \"import 'lume/cli.ts'\" | deno run --unstable -A -"
}
}

18
src/server.ts Normal file
View File

@ -0,0 +1,18 @@
import Server from "lume/core/server.ts";
import expires from "lume/middlewares/expires.ts";
import notFound from "lume/middlewares/not_found.ts";
const server = new Server({
port: 8000,
root: `${Deno.cwd()}/_site`,
});
server.use(expires());
server.use(notFound({
root: `${Deno.cwd()}/_site`,
page404: "/404.html",
}));
server.start();
console.log("Listening on http://localhost:8000");