From a4b65ac09f315902cf5072bb9ae5cdce3efeaaaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Charles=20Fl=C3=A8che?= Date: Sat, 14 Oct 2017 02:31:44 +0700 Subject: [PATCH 1/9] Fix intrasite links for non-'summary' metadata 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 patch expands the paths as soon as possible in (Content init) for metadata defined in FORMATTED_FIELDS. --- pelican/contents.py | 10 ++++++++++ pelican/tests/test_contents.py | 14 +++++++++----- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/pelican/contents.py b/pelican/contents.py index 15770fc8..2494edbb 100644 --- a/pelican/contents.py +++ b/pelican/contents.py @@ -140,6 +140,16 @@ class Content(object): if not hasattr(self, 'status'): self.status = getattr(self, 'default_status', None) + 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) + + # store the summary metadata if it is set if 'summary' in metadata: self._summary = metadata['summary'] diff --git a/pelican/tests/test_contents.py b/pelican/tests/test_contents.py index d028c7a1..edd91fb6 100644 --- a/pelican/tests/test_contents.py +++ b/pelican/tests/test_contents.py @@ -319,17 +319,21 @@ class TestPage(LoggedTestCase): ) # also test for summary in metadata - args['metadata']['summary'] = ( + parsed = ( 'A simple summary test, with a ' 'link' ) - args['context']['localsiteurl'] = 'http://notmyidea.org' - p = Page(**args) - self.assertEqual( - p.summary, + linked = ( 'A simple summary test, with a ' 'link' ) + 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 From 4603cf9627c4d391989f963d4c5878fdeb059c49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Charles=20Fl=C3=A8che?= Date: Sat, 14 Oct 2017 02:32:09 +0700 Subject: [PATCH 2/9] Prevent useless call to _update_content on _summary when requested Links in summary have been processed in Content.__init__ already. --- pelican/contents.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pelican/contents.py b/pelican/contents.py index 2494edbb..88089e47 100644 --- a/pelican/contents.py +++ b/pelican/contents.py @@ -151,8 +151,8 @@ class Content(object): # store the summary metadata if it is set - if 'summary' in metadata: - self._summary = metadata['summary'] + if 'summary' in self.metadata: + self._summary = self.metadata['summary'] signals.content_object_init.send(self) @@ -348,7 +348,7 @@ class Content(object): content. """ if hasattr(self, '_summary'): - return self._update_content(self._summary, siteurl) + return self._summary if self.settings['SUMMARY_MAX_LENGTH'] is None: return self.content From b2f0f85802972a8a80577653c929662b351928a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Charles=20Fl=C3=A8che?= Date: Sat, 14 Oct 2017 02:50:30 +0700 Subject: [PATCH 3/9] Fix flake8 error --- pelican/contents.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pelican/contents.py b/pelican/contents.py index 88089e47..0e919ee8 100644 --- a/pelican/contents.py +++ b/pelican/contents.py @@ -149,7 +149,6 @@ class Content(object): self.metadata[key] = value setattr(self, key.lower(), value) - # store the summary metadata if it is set if 'summary' in self.metadata: self._summary = self.metadata['summary'] From 2acd936bf483779e1234aac442e4581ed033eb16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Charles=20Fl=C3=A8che?= Date: Sat, 14 Oct 2017 22:31:49 +0700 Subject: [PATCH 4/9] Remove Content._summary and direclty access metadata on request --- pelican/contents.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/pelican/contents.py b/pelican/contents.py index 0e919ee8..725bc039 100644 --- a/pelican/contents.py +++ b/pelican/contents.py @@ -149,10 +149,6 @@ class Content(object): self.metadata[key] = value setattr(self, key.lower(), value) - # store the summary metadata if it is set - if 'summary' in self.metadata: - self._summary = self.metadata['summary'] - signals.content_object_init.send(self) def __str__(self): @@ -346,8 +342,8 @@ class Content(object): This is based on the summary metadata if set, otherwise truncate the content. """ - if hasattr(self, '_summary'): - return self._summary + if 'summary' in self.metadata: + return self.metadata['summary'] if self.settings['SUMMARY_MAX_LENGTH'] is None: return self.content From 3f7540d91e69424fecdd4466c7c834a8525d22b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Charles=20Fl=C3=A8che?= Date: Sun, 15 Oct 2017 12:14:41 +0700 Subject: [PATCH 5/9] Extract Content.refresh_metadata_intersite_links Allows to refresh the metadata intrasite links not only in the __init__, but also later when the Content has a better view of the available static files. --- pelican/contents.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/pelican/contents.py b/pelican/contents.py index 725bc039..0bfffb15 100644 --- a/pelican/contents.py +++ b/pelican/contents.py @@ -140,15 +140,7 @@ class Content(object): if not hasattr(self, 'status'): self.status = getattr(self, 'default_status', None) - 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) - + self.refresh_metadata_intersite_links() signals.content_object_init.send(self) def __str__(self): @@ -418,6 +410,16 @@ class Content(object): 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',) From 75e1f1467e76a0ad1ca63208dbb78d8175d9dd23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Charles=20Fl=C3=A8che?= Date: Sun, 15 Oct 2017 12:50:33 +0700 Subject: [PATCH 6/9] Add refresh_metadata_intersite_links for Articles and Pages generators --- pelican/generators.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/pelican/generators.py b/pelican/generators.py index eb97c115..798863d0 100644 --- a/pelican/generators.py +++ b/pelican/generators.py @@ -581,6 +581,14 @@ class ArticlesGenerator(CachingGenerator): 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""" @@ -649,6 +657,14 @@ class PagesGenerator(CachingGenerator): 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. From e6755e7641ac0d43c1c902622c26d00540420c61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Charles=20Fl=C3=A8che?= Date: Sun, 15 Oct 2017 12:55:02 +0700 Subject: [PATCH 7/9] Call generator's refresh_metadata_intersite_links after contexes are made This allows to refresh the intersite links after contexes are made and static files are identified. --- pelican/__init__.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pelican/__init__.py b/pelican/__init__.py index 70013804..89eefdd3 100644 --- a/pelican/__init__.py +++ b/pelican/__init__.py @@ -170,6 +170,10 @@ class Pelican(object): 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() From 26e77014a35df7d0dc455e24b78ba34bc85f4db0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Charles=20Fl=C3=A8che?= Date: Sun, 15 Oct 2017 13:00:34 +0700 Subject: [PATCH 8/9] Do not call refresh_metadata_intersite_links in __init__ if not needed This avoid a warning while resolving intersite links if metadata has empty filenames --- pelican/contents.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pelican/contents.py b/pelican/contents.py index 0bfffb15..310690ba 100644 --- a/pelican/contents.py +++ b/pelican/contents.py @@ -140,7 +140,9 @@ class Content(object): if not hasattr(self, 'status'): self.status = getattr(self, 'default_status', None) - self.refresh_metadata_intersite_links() + if len(self._context.get('filenames', [])) > 0: + self.refresh_metadata_intersite_links() + signals.content_object_init.send(self) def __str__(self): From 268810b7b79238f019a214b53e92a264e7d81e88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Charles=20Fl=C3=A8che?= Date: Sun, 15 Oct 2017 13:08:01 +0700 Subject: [PATCH 9/9] Fix flake8 warnings --- pelican/generators.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/pelican/generators.py b/pelican/generators.py index 798863d0..8a0180f7 100644 --- a/pelican/generators.py +++ b/pelican/generators.py @@ -582,14 +582,14 @@ class ArticlesGenerator(CachingGenerator): 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): + 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""" @@ -658,10 +658,9 @@ class PagesGenerator(CachingGenerator): 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): + for e in chain(self.pages, + self.hidden_pages, + self.hidden_translations): if hasattr(e, 'refresh_metadata_intersite_links'): e.refresh_metadata_intersite_links()