[English]

ntWeb

Tabla de Contenido:

GitHub Actions GitHub Actions Netlify Status

ntWeb es un pequeño sitio web con grandes intenciones. Provee un portafolio, una plataforma de blog, URLs personalizadas para paquetes Go y una API JSON.

Probablemente cualquiera podría pensar que este proyecto es muy sencillo y que su autor no tiene buenas capacidades en desarrollo frontend, y de hecho es cierto en algunos aspectos porque no es mi especialidad, pero su sencillez es intencional (y está escrito con tecnologías web modernas).

El sitio web es creado con Hugo y parte de su contenido es generado con Go y Mage (los proyectos y los URLs personalizadas de los paquetes Go).

Para mostrar la pagina principal solo se descargan ~28 KB (incluyendo los favicons), para un artículo del blog se descargan ~215 KB (incluyendo sus imágenes, los favicons y desactivando los comentarios). Es usable incluso sin JavaScript y puede visualizarse en navegadores web TUI.

Página principal en TUI

Página principal en TUI

Blog en TUI

Blog en TUI

Artículo en TUI

Artículo en TUI

Todo su contenido también puede obtenerse como JSON, por lo que es posible crear nuevos frontends más complejos sin necesidad de tener que repetir el contenido. Por ser una API estática se obtiene un buen rendimiento pues no se realiza ningún computo extra al de leer el archivo, es bastante segura porque no hay servidor de base de datos que pueda ser atacado y puede hospedarse en cualquier servicio que soporte archivos estáticos.

API

Casi todas las páginas HTML tienen JSON como formato alternativo, que puede ser obtenido agregando index.json al final de su URL. Por ejemplo, para esta página, el URL de su formato JSON sería https://nt.web.ve/es/projects/ntweb/index.json.

Cada página tiene los siguientes atributos:

url (cadena):
URL del recurso.
kind (cadena):
Tipo de recurso. Puede ser home, section, taxonomyTerm, taxonomy o page.
type (cadena):
Tipo de contenido. Puede ser blog, gallery, projects, tag o page.
lang (cadena):
Idioma del recurso.
title (cadena):
Título del recurso.
image (string):
URL de la imagen del recurso.
params (cadena):
Parámetros del frontmatter del recurso. Puede variar segur el tipo del contenido.
content (cadena codificada en base64):
Contenido Markdown procesado del recurso.
data (objeto):
Datos específicos del recurso. Para la página principal, contiene todos los elementos de primer nivel; para colecciones, contiene sus elementos e información sobre la paginación; y para recursos comunes, es un objeto vacío.
altLang (arreglo de objetos):
Traducciones del recurso. Cada objeto tiene las propiedades lang y url.
altMediaType (arreglo de objetos):
Formatos alternativos del recurso. Cada objeto tiene las propiedades mediaType y url.
$ wget -qO - https://nt.web.ve/es/projects/ntweb/index.json | jq
{
  "url": "https://nt.web.ve/es/projects/ntweb/",
  "kind": "page",
  "type": "projects",
  "lang": "es",
  "title": "ntWeb",
  "params": {
    "comments": true,
    "description": "Un pequeño sitio web con grandes intenciones.",
    "draft": false,
    "iscjklanguage": false,
    "metadata": {
      "license": "MIT",
      "source-code": "https://github.com/ntrrg/ntweb"
    },
    "tags": [
      "go",
      "go-templates",
      "html",
      "css",
      "javascript",
      "sitio-web",
      "json-api",
      "hugo",
      "mage",
      "docker",
      "github-actions",
      "netlify"
    ],
    "title": "ntWeb",
    "toc": true
  },
  "content": "...",
  "data": {},
  "altLang": [
    {
      "lang": "en",
      "url": "https://nt.web.ve/en/projects/ntweb/"
    }
  ],
  "altMediaType": [
    {
      "mediaType": "text/html",
      "url": "https://nt.web.ve/es/projects/ntweb/"
    }
  ]
}

Endpoints

Principal

https://nt.web.ve/es/index.json

Obtiene todos los elementos de primer nivel. Ver API para mas información sobre las propiedades en común.

data.sections (arreglo de objetos):
Secciones. Cada objeto tiene las propiedades url, title y pages. La propiedad pages es la cantidad de páginas dentro de la sección.
data.taxonomies (arreglo de objetos):
Taxonomías. Cada objeto tiene las propiedades url, title y terms. La propiedad terms es la cantidad de términos dentro de la taxonomía.
data.pages (arreglo de objetos):
Páginas de primer nivel. Cada objeto tiene las propiedades url y title.

Colecciones

https://nt.web.ve/es/:section/index.json

https://nt.web.ve/es/:section/page/:pageNumber/index.json

https://nt.web.ve/es/tags/:tag/index.json

https://nt.web.ve/es/tags/:tag/page/:pageNumber/index.json

Parámetros
section:
Nombre de la sección. Puede ser blog, gallery o projects.
tag:
Nombre de la etiqueta. Debe ser una etiqueta existente.
pageNumber:
Número de página. La primera página es obtenida sin page/:pageNumber/.

Obtiene la lista de elementos de una colección específica. Ver API para mas información sobre las propiedades en común.

data.pages (arreglo de objetos):
Lista de elementos. Cada página tiene las propiedades url, title, image, publishDate, date, description y tags. La propiedad tags es un arreglo de etiquetas asignadas al elemento.
data.pagination (objeto):
Información de paginación. Contiene las propiedades prefix, first, prev, next y last.

Elementos

https://nt.web.ve/es/:section/:title/index.json

Parámetros
section:
Sección. Puede ser blog, gallery o projects.
title:
Título codificado en URL del recurso.

Obtiene un elemento. Ver API para mas información sobre las propiedades en común.

Índice de búsqueda

https://nt.web.ve/es/search-index/index.json

Obtiene todos los elementos que pueden ser procesados por motores de búsqueda. Es un arreglo de objetos, cada objeto tiene las propiedades url, title, description y content. El valor de la propiedad content esta codificado con base64.

Nota: este recurso no tiene las propiedades comunes de otros recursos

Modo sin conexión

Requerimientos:

  • Hugo >= 0.62

Descargar el código fuente

$ # Paquete
$ wget https://github.com/ntrrg/ntweb/archive/master.tar.gz
$
$ # Repositorio Git
$ git clone --depth 1 https://github.com/ntrrg/ntweb.git

Ejecutar el servidor de Hugo en la carpeta raíz del proyecto:

$ hugo server

Ir a http://localhost:1313/ con un navegador web.

Docker

$ docker run --rm -p 1313:80 ntrrg/ntweb

Ir a http://localhost:1313/ con un navegador web.

Atribuciones

Trabando en este proyecto uso/usé: