mirror of
https://github.com/getpelican/pelican.git
synced 2025-10-15 20:28:56 +02:00
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:
parent
ed82f62a5a
commit
ecf5682930
1 changed files with 19 additions and 5 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue