Autor

Alejandro Alcalde

Graduado en Ingeniería Informática en la ETSIIT, Granada.

Más artículos de Alejandro Alcalde

Hace poco he migrado el blog de Jekyll a Hugo. El proceso ha sido fácil, pero he tenido que cambiar varias cosas en el frontmatter de los artículos.

Tras buscar en Google encontré un parseador en python para frontmatter escritos en YAML. A continuación se explica cómo instalarlo y usarlo.

Instalar Python-Frontmatter

Basta con ejecutar

sudo pip install python-frontmatter


Ayúdanos a seguir escribiendo


Usar Python-Frontmatter

Ejemplo 1: Añadir un nuevo valor al FrontMatter

Una vez instalado, es bastante sencillo de usar. Supongamos que queremos añadir una variable que almacene el autor del artículo, para ello bastaría el siguiente código:

import frontmatter
import io
from os.path import basename, splitext
import glob

# Ruta a los ficheros
path = "en/*.markdown"

# Iterar sobre ellos
for fname in glob.glob(path):
    with io.open(fname, 'r') as f:
        # Parsear los ficheros
        post = frontmatter.load(f)
        if post.get('author') == None:
            post['author'] = "alex"
            # Guardar el fichero modificado
            newfile = io.open(fname, 'w', encoding='utf8')
            frontmatter.dump(post, newfile)
            newfile.close()

Eso es todo, así de simple. Veamos un ejemplo algo más complejo.

Ejemplo 2: Modificar variables existentes en el FrontMatter

En este caso, supongamos dos variables, mainclass y categories. Queremos incluir el valor de mainclass a los valores existentes en categories, y a la vez mantener los valores actuales en categories.

for fname in glob.glob(path):
    with io.open(fname, 'r') as f:
        post = frontmatter.load(f)

        # Si no exite la variable categories, crearla con el valor de mainclass
        if post.get('categories') == None:
            post['categories'] = [post['mainclass']]
            print(post['categories'])
        else: # Categories existe
            cat = post['categories']
            main = post['mainclass']
            # Si categories contiene un solo valor ej: categories: 'category1'
            if type(cat) == str:
                if cat.lower() != main:
                    cat = [cat, main]
            else: # Si categories es una lista ej: categories: [cat1, cat2]
                cat = [s.lower() for s in cat]
                if main in cat == False:
                    cat.append(main)

            post['categories'] = cat
            print("%s") % (post['categories'])

        # Guardar los cambios
        newfile = io.open(fname, 'w', encoding='utf8')
        frontmatter.dump(post, newfile)
        newfile.close()

Referencias

Categorías:Etiquetas: