Como está hecho este blog

Índice

Este blog está hecho completamente con orgmode, la idea de hacerlo de esta forma era que fuese más fácil generar el contenido al no tener que escribir el html crudo y además para hacer uso de la automatización para generar el listado de post, que antes realizaba a mano en yaca.gq. Todo el proceso fue de aprendizaje completo, me guié por el contenido de acá, acá, acá y acá (de este último saqué el script para el índice que pueden ver acá). Pero por lejos, lo mejor fue haber encontrado contenido en español que explicara un poco mejor como el blog de Notxor. Gracias a ese blog en español pude dar el paso y logré crear algo básico para empezar.

Estructura

Comencemos viendo la estructura de las carpetas, es importante tener todo organizado:

drimyswinteri/
├── drafts
│   └── plantilla.org
├── org
│   └── static
│       ├── css
│       │   └── drimyswinteri.css
│       └── img
└── public_html

Se ve que tengo 3 directorios principales:

  • drafts: Aquí es en donde comienzo a escribir. De hecho tengo una plantilla que contiene cosas como el título, el autor y opciones (toc:nil , num:nil, entre otras). Voy guardando los archivos .org acá y cuando siento que ya está completado lo muevo a la carpeta org.
  • org: Aquí es donde la magia ocurre. Al momento de publicar (C-c C-e P p) los archivos .org que existan acá se transformarán en .html y se moverán a la carpeta public_html. Vemos que dentro de org hay una carpeta static, como su nombre indica son los archivos estáticos como la hoja de estilo (CSS) o las imágenes que usaré como recursos en algunos posts. La carpeta static se copia a public_html al momento de publicar, pero sólo los archivos que no se encuentren ya copiados.
  • public_html: Aquí es en donde queda todo el trabajo ya exportado. Se puede definir una carpeta mediante TRAMP para poder publicar directamente por ssh y es lo que hago para generar esta web. Personalmente uso esta carpeta como testing, si veo que todo se ve correctamente entonces cambio la configuración de orgmode para exportar a mi servidor.

Código

Intentaré comentar el código dentro de este bloque:

(require 'ox-publish) ;; Cargamos el paquete para publicar
;; proyectos. Debería estar instalado pues viene
;; con orgmode.

;; La siguiente función la extraje del blog de Zhao Wei, lo que hace
;; es definir cómo se ve la lista de posts (esa parte que dice creado
;; por <autor> en <fecha>).
(defun me/org-sitemap-format-entry (entry style project)
  "Format posts with author and published data in the index page.

ENTRY: file-name
STYLE:
PROJECT: `posts in this case."
  (cond ((not (directory-name-p entry))
         (format "*[[file:%s][%s]]*
                 #+HTML: <p class='pubdate'>por %s en  %s.</p>"
                 entry
                 (org-publish-find-title entry project)
                 (car (org-publish-find-property entry :author project))
                 (format-time-string this-date-format
                                     (org-publish-find-date entry project))))
        ((eq style 'tree) (file-name-nondirectory (directory-file-name entry)))
        (t entry)))

;;Esta variable define el formato de la fecha
(defvar this-date-format "%b %d, %Y")

;;Esta es la configuración per se.
(setq org-publish-project-alist
      '(

        ;; El proyecto está declarado por partes, una de ellas es la parte
        ;; en donde se publicarán los posts, la otra es la parte en donde
        ;; se alojarán los recursos estáticos como las imágenes y
        ;; finalmente declararemos que el proyecto es la suma de las dos
        ;; partes anteriores.
        ("fuente"
         ;; la ruta en donde se encuentran los archivos .org que deseas publicar:
         :base-directory "~/drimyswinteri/org/"

         ;; la extensión de los archivos que deseas publicar:
         :base-extension "org"

         ;; la ruta en donde se publicarán (se guardarán los
         ;;archivos .html) los archivos .org. como puedes
         ;;ver yo tengo 2 rutas, una comentada y otra
         ;;no... lo que pasa es que cuando quiero probar
         ;;como va quedando todo publico directo en mi
         ;;máquina local, y cuando estoy seguro de que
         ;;todo anda bien publico por ssh a mi servidor:
         :publishing-directory "/ssh:drimyswinteri.ml:/home/yaca/drimyswinteri.ml/public_html/"
         ;; :publishing-directory "~/drimyswinteri/public_html/"

         ;; pedimos que el proceso sea recursivo para que también
         ;; exporte sub-carpetas:
         :recursive t

         ;; indicamos la función para exportar, en este caso de .org a .html:
         :publishing-function org-html-publish-to-html

         ;; el nivel de títulos/subtítulos a utilizar:
         :headline-levels 4

         ;; Indicamos que nos cree una lista de posts:
         :auto-sitemap t

         ;; le decimos en dónde guardar la lista de posts:
         :sitemap-filename "posts.org"

         ;; el título de la lista de posts:
         :sitemap-title ""

         ;; el formato de las entradas de posts (con la función de antes):
         :sitemap-format-entry me/org-sitemap-format-entry

         ;; el estilo de las entradas, en este caso como lista:
         :sitemap-style list

         ;; ordenamos la lista de manera anticronológica:
         :sitemap-sort-files anti-chronologically

         ;; el 'head' de html que queremos usar en todos los posts:
         :html-head "<link rel="stylesheet" type="text/css" href="drimyswinteri.css" />")

        ;; Aquí indicamos en dónde se encuentran los archivos
        ;; 'estáticos' como las imágenes u hojas de estilo (css):
        ("static"
         :base-directory "~/drimyswinteri/org/"
         :base-extension "css\\|png\\|ttf\\|gif\\|jpg"
         ;;:publishing-directory "~/drimyswinteri/public_html/"
         :publishing-directory "/ssh:drimyswinteri.ml:/home/yaca/drimyswinteri.ml/public_html/"
         :recursive t
         :publishing-function org-publish-attachment)

        ;; Finalmente declaramos el proyecto completo 'blog' que consta de su
        ;; parte 'fuente' y 'static
        ("blog"
         :components ("fuente" "static"))))

Como se puede apreciar la configuración no es tan complicada, pero sí que son varios ítems a tener en cuenta. Puedes encontrar más información buscando dentro de emacs con M-x describe-function RET org-publish.

Index

En el código vimos que se genera una lista de post, pero ¿cómo la usamos?

Primero generamos el index, que es la página de bienvenida en https://drimyswinteri.ml:

index.png

Lo único que tuve que hacer para incluir la lista de posts en el index fue escribir INCLUDE al final del archivo org. Gracias al poder de orgmode podemos agregar lo que existe en otros archivos sin hacer lío.

Publicación

Ya habiendo terminado todo lo anterior podemos exportar los resultados a nuestro servidor mediante C-c C-e P p. La primera vez se exportarán todos los archivos, tanto los estáticos como los posts. Luego sólo se irán agregando los archivos nuevos pero si por alguna razón necesitamos exportar nuevamente todo (por ejemplo al haber modificado el css) podemos forzarlo con M-: (org-publish "proyecto" t) en donde "proyecto" es el nombre que declaramos como el conjunto de 'fuente' y 'static', en este caso es 'blog'.

Autor: yaca

Created: 2021-06-29 mar 17:29

Validate