Skip to content

Commit

Permalink
Merge pull request #2288 from charlesfleche/fix-metadata-intrasite-li…
Browse files Browse the repository at this point in the history
…nks-squashed

Fix intrasite links for non-'summary' metadata

Metadata like `MyArticleBanner: ![alt text]({attach}banner.jpg)` would be properly parsed (as defined in `FORMATTED_FIELDS`), but the intrasite links would not be processed.

Only the summary gets its intrasite links processed, has its value is either generated from the content (calling self._update_content at some point) or self._update_content is explicitly called if summary is passed as metadata.

This PR expands the paths as soon as possible in (`Content.__init__`) for metadata defined in `FORMATTED_FIELDS`.
  • Loading branch information
justinmayer authored Feb 9, 2018
2 parents 98852a6 + 3de422b commit 2d24d6b
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 10 deletions.
4 changes: 4 additions & 0 deletions pelican/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,10 @@ def run(self):
if hasattr(p, 'generate_context'):
p.generate_context()

for p in generators:
if hasattr(p, 'refresh_metadata_intersite_links'):
p.refresh_metadata_intersite_links()

signals.all_generators_finalized.send(generators)

writer = self.get_writer()
Expand Down
19 changes: 14 additions & 5 deletions pelican/contents.py
Original file line number Diff line number Diff line change
Expand Up @@ -140,9 +140,8 @@ def __init__(self, content, metadata=None, settings=None,
if not hasattr(self, 'status'):
self.status = getattr(self, 'default_status', None)

# store the summary metadata if it is set
if 'summary' in metadata:
self._summary = metadata['summary']
if len(self._context.get('filenames', [])) > 0:
self.refresh_metadata_intersite_links()

signals.content_object_init.send(self)

Expand Down Expand Up @@ -356,8 +355,8 @@ def get_summary(self, siteurl):
This is based on the summary metadata if set, otherwise truncate the
content.
"""
if hasattr(self, '_summary'):
return self._update_content(self._summary, siteurl)
if 'summary' in self.metadata:
return self.metadata['summary']

if self.settings['SUMMARY_MAX_LENGTH'] is None:
return self.content
Expand Down Expand Up @@ -432,6 +431,16 @@ def relative_dir(self):
os.path.abspath(self.source_path),
os.path.abspath(self.settings['PATH']))))

def refresh_metadata_intersite_links(self):
for key in self.settings['FORMATTED_FIELDS']:
if key in self.metadata:
value = self._update_content(
self.metadata[key],
self.get_siteurl()
)
self.metadata[key] = value
setattr(self, key.lower(), value)


class Page(Content):
mandatory_properties = ('title',)
Expand Down
15 changes: 15 additions & 0 deletions pelican/generators.py
Original file line number Diff line number Diff line change
Expand Up @@ -588,6 +588,14 @@ def generate_output(self, writer):
self.generate_pages(writer)
signals.article_writer_finalized.send(self, writer=writer)

def refresh_metadata_intersite_links(self):
for e in chain(self.articles,
self.translations,
self.drafts,
self.drafts_translations):
if hasattr(e, 'refresh_metadata_intersite_links'):
e.refresh_metadata_intersite_links()


class PagesGenerator(CachingGenerator):
"""Generate pages"""
Expand Down Expand Up @@ -656,6 +664,13 @@ def generate_output(self, writer):
override_output=hasattr(page, 'override_save_as'))
signals.page_writer_finalized.send(self, writer=writer)

def refresh_metadata_intersite_links(self):
for e in chain(self.pages,
self.hidden_pages,
self.hidden_translations):
if hasattr(e, 'refresh_metadata_intersite_links'):
e.refresh_metadata_intersite_links()


class StaticGenerator(Generator):
"""copy static paths (what you want to copy, like images, medias etc.
Expand Down
14 changes: 9 additions & 5 deletions pelican/tests/test_contents.py
Original file line number Diff line number Diff line change
Expand Up @@ -319,17 +319,21 @@ def test_intrasite_link(self):
)

# also test for summary in metadata
args['metadata']['summary'] = (
parsed = (
'A simple summary test, with a '
'<a href="|filename|article.rst">link</a>'
)
args['context']['localsiteurl'] = 'http://notmyidea.org'
p = Page(**args)
self.assertEqual(
p.summary,
linked = (
'A simple summary test, with a '
'<a href="http://notmyidea.org/article.html">link</a>'
)
args['settings']['FORMATTED_FIELDS'] = ['summary', 'custom']
args['metadata']['summary'] = parsed
args['metadata']['custom'] = parsed
args['context']['localsiteurl'] = 'http://notmyidea.org'
p = Page(**args)
self.assertEqual(p.summary, linked)
self.assertEqual(p.custom, linked)

def test_intrasite_link_more(self):
# type does not take unicode in PY2 and bytes in PY3, which in
Expand Down

0 comments on commit 2d24d6b

Please sign in to comment.