|
@@ -0,0 +1,73 @@
|
|
|
+# -*- 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)
|