Support configurable URL's & SAVE_AS path for Author, Category and Tag

This commit is contained in:
Kyle Fuller 2011-12-23 23:43:32 +00:00
commit 44cf2ad400
4 changed files with 60 additions and 43 deletions

View file

@ -15,28 +15,30 @@ except ImportError:
Markdown = False
import re
from pelican.contents import Category, Tag, Author
from pelican.contents import Category, Tag, Author, URLWrapper
from pelican.utils import get_date, open
_METADATA_PROCESSORS = {
'tags': lambda x: map(Tag, unicode(x).split(',')),
'date': lambda x: get_date(x),
'status': unicode.strip,
'tags': lambda x, y: [Tag(tag, y) for tag in unicode(x).split(',')],
'date': lambda x, y: get_date(x),
'status': lambda x,y: unicode.strip(x),
'category': Category,
'author': Author,
}
def _process_metadata(name, value):
if name.lower() in _METADATA_PROCESSORS:
return _METADATA_PROCESSORS[name.lower()](value)
return value
class Reader(object):
enabled = True
extensions = None
def __init__(self, settings):
self.settings = settings
def process_metadata(self, name, value):
if name.lower() in _METADATA_PROCESSORS:
return _METADATA_PROCESSORS[name.lower()](value, self.settings)
return value
class _FieldBodyTranslator(HTMLTranslator):
def astext(self):
@ -54,29 +56,25 @@ def render_node_to_html(document, node):
node.walkabout(visitor)
return visitor.astext()
def get_metadata(document):
"""Return the dict containing document metadata"""
output = {}
for docinfo in document.traverse(docutils.nodes.docinfo):
for element in docinfo.children:
if element.tagname == 'field': # custom fields (e.g. summary)
name_elem, body_elem = element.children
name = name_elem.astext()
value = render_node_to_html(document, body_elem)
else: # standard fields (e.g. address)
name = element.tagname
value = element.astext()
output[name] = _process_metadata(name, value)
return output
class RstReader(Reader):
enabled = bool(docutils)
extension = "rst"
def _parse_metadata(self, document):
return get_metadata(document)
"""Return the dict containing document metadata"""
output = {}
for docinfo in document.traverse(docutils.nodes.docinfo):
for element in docinfo.children:
if element.tagname == 'field': # custom fields (e.g. summary)
name_elem, body_elem = element.children
name = name_elem.astext()
value = render_node_to_html(document, body_elem)
else: # standard fields (e.g. address)
name = element.tagname
value = element.astext()
output[name] = self.process_metadata(name, value)
return output
def _get_publisher(self, filename):
extra_params = {'initial_header_level': '2'}
@ -113,7 +111,7 @@ class MarkdownReader(Reader):
metadata = {}
for name, value in md.Meta.items():
name = name.lower()
metadata[name] = _process_metadata(name, value[0])
metadata[name] = self.process_metadata(name, value[0])
return content, metadata
@ -129,7 +127,7 @@ class HtmlReader(Reader):
key = i.split(':')[0][5:].strip()
value = i.split(':')[-1][:-3].strip()
name = key.lower()
metadata[name] = _process_metadata(name, value)
metadata[name] = self.process_metadata(name, value)
return content, metadata
@ -143,7 +141,7 @@ def read_file(filename, fmt=None, settings=None):
fmt = filename.split('.')[-1]
if fmt not in _EXTENSIONS.keys():
raise TypeError('Pelican does not know how to parse %s' % filename)
reader = _EXTENSIONS[fmt]()
reader = _EXTENSIONS[fmt](settings)
settings_key = '%s_EXTENSIONS' % fmt.upper()
if settings and settings_key in settings:
reader.extensions = settings[settings_key]