miércoles, noviembre 23, 2011

Ciclo redactar publicar con Blogger

Tengo la intención de escribir varios artículos en este blog:
  • Despliegue en Django
  • Mi presentación de Git
  • La conferencia Mejorando la web
  • Cita al ensayo sobre SOPA creado por @danielmaxx
  • Algunas cosas viejas que escribí por ahí
Pero habiendo colaborado en algunas revisiones de El blog en español de Python Insider quise poner en práctica el mismo workflow que ellos aplican. Y es lo que estoy haciendo justamente ahora mientras escribo este artículo acerca del mismo workflow (y lo que haré de ahora en adelante).

Le workflow

El mencionado workflow está explicado en el wiki del proyecto de los blogs de Python. Pero básicamente se basa en utilizar un repositorio bajo control de versiones donde un convenio en el uso de los directorios permite distribuir el trabajo.
La parte interesante del workflow es que el trabajo de redacción no se hace en la interfaz que para ello disponga el sitio que almacena y publica los artículos (en nuestro caso, la interfaz web de Blogger), sino que se redacta en un archivo dedicado al artículo, y ese archivo se mantiene en control de versiones. Luego, cuando se esté conforme con el resultado, se publica utilizando un script que sube el archivo como si fuera el artículo (también pudiera usarse el copiar y pegar con la interfaz web).
En particular, el proyecto de los blogs de Python utiliza mercurial como sistema de control de versiones, bitbucket es donde almacenan su repositorio, reStructuredText es el lenguaje de marcas que utilizan para estructurar y formatear los artículos y un script en Python [1] muy específico para subir el archivo al blog.
Una de las más grandes ventajas de trabajar de esta manera es el soporte en la coordinación del trabajo de varias personas sobre el mismo producto que se obtiene al usar el sistema de control de versiones y un repositorio compartido.
Pero cuando se usa para un blog como el mío que solo tiene un autor, todavía hay ventajas.
Primero, el control de versiones. Pero esta vez, en vez de referirme al poder de coordinación, me refiero a la ventaja de contar con versiones que reflejen la evolución de lo que escribo y poder echar para atrás los cambios que quiera.
Segundo, escribir en tu lenguaje de marcas preferido ... punto.
Tercero, escribir en tu editor de texto preferido ... punto.

Ejemplo

Como ejemplo de cómo trabajar con este workflow voy a explicar cómo he escrito esta entrada y cómo lo publiqué.
Le script
El script en Python se llama rst2blogger.py. Se usa la siguiente manera:
$ rst2blogger.py <blog> <.rst>
Lo que hace es convertir el archivo .rst en un contenido en formato html y trata de subir ese contenido en el blog blog. Para ello te pide que te autentifiques con los servicios de Google.
Como este es un script que rápidamente se hizo para este workflow de los blogs de Python, entonces hay que modificarlo un poco para que sirva con el de uno.
Lo primero que hace el script después de todos los imports es definir un diccionario llamado BLOG_IDS, asocia una etiqueta al identificador único del blog. Entonces, simplemente se añade el blog de uno en ese diccionario. Por ejemplo, el identificador único de mi blog es 15836385 [2], entonces asocie el identificador jgomo3 con él. Queda algo así:
# local
import rst2post

BLOG_IDS = {
    'jgomo3':'15836385',                # jgomo3's blog
    'clienttest':'4574580403850978202',
Hay que aclarar dos cosas acerca del script:
  • Él pica el contenido en dos partes: el título, y el resto. Entonces, el título con el que sube el artículo va a ser el que le coloques como título principal en el .rst.
  • La primera vez sube el artículo como un borrador nuevo. Las siguietes veces que publique el mismo blog, simplemente actualiza el blog. Para publicar, se hace desde la interfaz administrativa de Blogger.
Como alternativa a este script, pudiera lograrse algo parecido con una combinación entre rst2html y googlecl.
Le repo
Creé un repositorio en bitbucket para mantener el blog (de ahora en adelante).
Luego, lo cloné en mi máquina para trabajar:
$ hg clone https://bitbucket.org/jgomo3/jgomo3-blog
Siguiendo el convenio de los blog de Python, definí dos directorios:
  • InProgress: que contiene los artículos "en progreso", es decir, los borradores.
  • Published: que contiene los artículo ya publicados en el blog.
$ install -d InProgress Published
Entonces, el trabajo es evidente. Cuando se quiere empezar un nuevo artículo, simplemente se crea un archivo en la carpeta InProgress. Luego, un hg add para hacerle seguimiento con mercurial. hg commit por cada cambio relevante que queremos recordar con mercurial y cuando queramos salvaguardar el trabajo en bitbucket, un hg push (así además puedes mostrar el trabajo a terceros para que le echen un ojo y si quieren pueden colaborar).
$ cd InProgress
$ hg add ciclo-redactar-publicar-blogger.rst

... Ciclo largo de trabajo
.
.    ... Ciclo corto de trabajo
.    .   $ [tu editor favorito o emacs] ciclo-redactar-publicar-blogger.rst
.    .   $ rst2html ciclo-redactar-publicar-blogger.rst > test.html
.    .   # Ver el archivo test.html en un navegador
.    ...
.
... $ hg commit

$ hg push
Le blog
Una vez esté terminado el artículo y se quiera publicar en el blog, se ejecuta el script:
$ rst2blogger.py jgomo3 ciclo-redactar-publicar-blogger.rst
Esto creará un borrador en Blogger. Entonces se navega a Blogger, se aprecia cómo se ve el borrador, se le asigna la fecha de publicación al artículo y se publica.
Por último, se mueve el artículo de la carpeta InProgress a la carpeta Published y se actualiza el repositorio en bitbucket:
$ hg mv ciclo-redactar-publicar-blogger.rst ../Published
$ hg commit
$ hg push
Le FIN
Como ya comenté, de ahora en adelante usaré esta técnica para escribir en el blog.
Por último, por si no lo notaron, mi editor favorito es Emacs, y dejo a su disposición un par de artículos que explican esta misma idea pero desde el punto de vista de un par de emacseros y usuarios del org-mode.
[1]Deben estar todos los archivos .py en el mismo lugar.
[2]Para saber cuál es el identificador único de tu blog en Blogger simplemente observa la barra de direcciones de tu navegador mientras lo editas.