1
0
Fork 0
forked from github/pelican

readers: Instrument read_file to return Content objects

The assorted generators all use read_file() to read in the file
contents and metadata.  Previously, they sometimes parse additional
metadata, fire off signals, and initialize a pelican.contents.Content
subclass on their own.  We can reduce duplicated code and increase
consistency by shifting all that stuff into read_file() itself, and
this commit is a step in that direction.
This commit is contained in:
W. Trevor King 2013-01-04 14:21:38 -05:00
commit ecf5682930

View file

@ -31,7 +31,7 @@ try:
except ImportError:
from HTMLParser import HTMLParser
from pelican.contents import Category, Tag, Author
from pelican.contents import Page, Category, Tag, Author
from pelican.utils import get_date, pelican_open
@ -333,8 +333,15 @@ for cls in [Reader] + Reader.__subclasses__():
EXTENSIONS[ext] = cls
def read_file(path, fmt=None, settings=None):
"""Return a reader object using the given format."""
def read_file(base_path, path, content_class=Page, fmt=None,
settings=None, context=None,
preread_signal=None, preread_sender=None,
context_signal=None, context_sender=None):
"""Return a content object parsed with the given format."""
if preread_signal:
preread_signal.send(preread_sender)
path = os.path.abspath(os.path.join(base_path, path))
source_path = os.path.relpath(path, base_path)
base, ext = os.path.splitext(os.path.basename(path))
if not fmt:
fmt = ext[1:]
@ -355,7 +362,7 @@ def read_file(path, fmt=None, settings=None):
raise ValueError("Missing dependencies for %s" % fmt)
metadata = parse_path_metadata(
path=path, settings=settings, process=reader.process_metadata)
path=source_path, settings=settings, process=reader.process_metadata)
content, reader_metadata = reader.read(path)
metadata.update(reader_metadata)
@ -365,7 +372,14 @@ def read_file(path, fmt=None, settings=None):
content = typogrify(content)
metadata['title'] = typogrify(metadata['title'])
return content, metadata
if context_signal:
context_signal.send(context_sender, metadata=metadata)
return content_class(
content=content,
metadata=metadata,
settings=settings,
source_path=path,
context=context)
def parse_path_metadata(path, settings=None, process=None):
"""Extract a metadata dictionary from a file's path