varia.website/plugins/textile_reader/textile_reader.py

74 lines
2.1 KiB
Python

# -*- coding: utf-8 -*-
from __future__ import unicode_literals, print_function
from pelican import signals
from pelican.readers import BaseReader
from pelican.utils import pelican_open
try:
from textile import textile
except ImportError:
textile = False
class TextileReader(BaseReader):
"""Reader for Textile files. Written using the core MarkdownReader as
a template. Textile input files must be of the form:
Title: An example
Date: 2013-08-10
----
p. Lorem ipsum dolar sit amet...
Specifically, the header values as with Markdown files, then four
dashes, then the body.
"""
enabled = bool(textile)
file_extensions = ['textile']
def __init__(self, *args, **kwargs):
super(TextileReader, self).__init__(*args, **kwargs)
def _parse_metadata(self, meta):
"""Process the metadata dict, lowercasing the keys and textilizing the
value of the 'summary' key (if present). Keys that share the same
lowercased form will be overridden in some arbitrary order.
"""
output = {}
for name, value in meta.items():
name = name.lower()
if name == "summary":
value = textile(value)
output[name] = self.process_metadata(name, value)
return output
def read(self, source_path):
"""Parse content and metadata of textile files."""
with pelican_open(source_path) as text:
parts = text.split('----', 1)
if len(parts) == 2:
headerlines = parts[0].splitlines()
headerpairs = map(lambda l: l.split(':', 1), headerlines)
headerdict = {pair[0]: pair[1].strip()
for pair in headerpairs
if len(pair) == 2}
metadata = self._parse_metadata(headerdict)
content = textile(parts[1])
else:
metadata = {}
content = textile(text)
return content, metadata
def add_reader(readers):
readers.reader_classes['textile'] = TextileReader
def register():
signals.readers_init.connect(add_reader)