/pelican-metadataparsing

Plugin for Pelican to allow definition of custom metadata parsers

Primary LanguagePythonApache License 2.0Apache-2.0

pelican-metadataparsing

A plugin for Pelican that allows the easy definition of custom metadata parsers.

Install

To install the library, you can use pip

$ pip install pelican-metadataparsing

Usage

  1. Update pelicanconf.py:

    1. Add metadataparsing to PLUGINS.

      You should add it before any metadata-affecting plugins.

      PLUGINS = [..., 'metadataparsing', ...]
    2. Define your custom metadata parsers through the METADATA_PARSERS setting:

      METADATA_PARSERS = {
          "<metadata-field-name1>": <function parser1(x)>,
          "<metadata-field-name2>": <function parser2(x)>
      }
  2. Corresponding fields of the page, article or entity object will have the value returned from the respective parser function.

Example

Gallery Metadata

pelicanconf.py:

import collections
import six

GalleryItem = collections.namedtuple("GalleryItem", ["url", "description"])
def parse_gallery(string):
    if string is None or not isinstance(string, collections.Iterable):
        return None

    if not isinstance(string, six.string_types):
        string = '\n'.join(string)

    items = []

    for line in string.split('\n'):
        if not line:
            continue

        parts = line.split("||")

        url = parts[0].strip()

        if len(parts) == 1:
            description = None
        else:
            description = parts[1].strip()

        items.append(GalleryItem(url, description))

    return items

METADATA_PARSERS = {
    "Gallery": parse_gallery
}

Theme:

{% if article.gallery %}
<div class="article-gallery">
    <h3>Gallery:</h3>
    <ul>
        {% for image in article.gallery %}
        <li>{{ colorbox(image.url, image.description) }}</li>
        {% endfor %}
    </ul>
</div>
{% endif %}

Multi-line metadata to simple string

import collections
import six

def parse_description(string):
    if string is None or isinstance(string, six.string_types):
        return string

    if isinstance(string, collections.Iterable):
        string = " ".join(string)

    return string


METADATA_PARSERS = {
    "Description": parse_description
}

For a working example check my site and my site's source code.