From 048ea4dc0c18b82cf5f560cb86de5a054c11b6e8 Mon Sep 17 00:00:00 2001 From: Oliver Urs Lenz Date: Wed, 11 Jul 2018 15:54:47 +0200 Subject: [PATCH] automatically copy linked static files --- docs/changelog.rst | 3 + docs/content.rst | 83 ++++---- pelican/__init__.py | 7 +- pelican/contents.py | 82 +++++--- pelican/generators.py | 41 ++-- .../tests/TestPages/page_with_static_links.md | 7 + .../output/basic/author/alexis-metaireau.html | 6 +- pelican/tests/output/basic/category/bar.html | 2 +- pelican/tests/output/basic/category/yeah.html | 4 +- .../basic/feeds/alexis-metaireau.atom.xml | 8 +- .../basic/feeds/alexis-metaireau.rss.xml | 2 +- .../tests/output/basic/feeds/all-en.atom.xml | 8 +- pelican/tests/output/basic/feeds/all.atom.xml | 8 +- pelican/tests/output/basic/feeds/bar.atom.xml | 4 +- .../tests/output/basic/feeds/yeah.atom.xml | 4 +- pelican/tests/output/basic/index.html | 2 +- pelican/tests/output/basic/oh-yeah.html | 2 +- pelican/tests/output/basic/pictures/Sushi.jpg | Bin 0 -> 28992 bytes .../output/basic/pictures/Sushi_Macro.jpg | Bin 0 -> 38594 bytes pelican/tests/output/basic/tag/bar.html | 2 +- pelican/tests/output/basic/tag/foobar.html | 4 +- pelican/tests/output/basic/tag/yeah.html | 2 +- .../output/basic/this-is-a-super-article.html | 4 +- pelican/tests/support.py | 9 + pelican/tests/test_cache.py | 52 ++--- pelican/tests/test_contents.py | 109 ++++++++--- pelican/tests/test_generators.py | 177 ++++++++++++------ pelican/tests/test_pelican.py | 2 +- pelican/tools/pelican_import.py | 2 +- pelican/utils.py | 2 +- samples/content/another_super_article.rst | 2 +- samples/content/super_article.rst | 4 +- 32 files changed, 422 insertions(+), 222 deletions(-) create mode 100644 pelican/tests/TestPages/page_with_static_links.md create mode 100644 pelican/tests/output/basic/pictures/Sushi.jpg create mode 100644 pelican/tests/output/basic/pictures/Sushi_Macro.jpg diff --git a/docs/changelog.rst b/docs/changelog.rst index aa54009d..858a6e1b 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -14,6 +14,9 @@ Next release and author pages 2) feeds 3) draft and hidden articles and pages * New ``ARTICLE_TRANSLATION_ID`` and ``PAGE_TRANSLATION_ID`` settings to specify metadata attributes used to identify translations; or to disable translations +* New ``{static}`` syntax to link to static content; content linked to by + ``{static}`` and ``{attach}`` is automatically copied over even if not in + ``STATIC_PATHS`` 3.7.1 (2017-01-10) ================== diff --git a/docs/content.rst b/docs/content.rst index 7bafbf6f..8d07e390 100644 --- a/docs/content.rst +++ b/docs/content.rst @@ -168,6 +168,34 @@ If you want to exclude any pages from being linked to or listed in the menu then add a ``status: hidden`` attribute to its metadata. This is useful for things like making error pages that fit the generated theme of your site. +Static content +============== + +Static files are files other than articles and pages that are copied to the +output folder as-is, without processing. You can control which static files +are copied over with the ``STATIC_PATHS`` setting of the project's +``pelicanconf.py`` file. Pelican's default configuration includes the +``images`` directory for this, but others must be added manually. In addition, +static files that are explicitly linked to are included (see below). + +Mixed content in the same directory +----------------------------------- + +Starting with Pelican 3.5, static files can safely share a source directory with +page source files, without exposing the page sources in the generated site. +Any such directory must be added to both ``STATIC_PATHS`` and ``PAGE_PATHS`` +(or ``STATIC_PATHS`` and ``ARTICLE_PATHS``). Pelican will identify and process +the page source files normally, and copy the remaining files as if they lived +in a separate directory reserved for static files. + +Note: Placing static and content source files together in the same source +directory does not guarantee that they will end up in the same place in the +generated site. The easiest way to do this is by using the ``{attach}`` link +syntax (described below). Alternatively, the ``STATIC_SAVE_AS``, +``PAGE_SAVE_AS``, and ``ARTICLE_SAVE_AS`` settings (and the corresponding +``*_URL`` settings) can be configured to place files of different types +together, just as they could in earlier versions of Pelican. + .. _ref-linking-to-internal-content: Linking to internal content @@ -221,13 +249,10 @@ and ``article2.md``:: Linking to static files ----------------------- -Linking to non-article or non-page content uses the same ``{filename}`` syntax -as described above. It is important to remember that those files will not be -copied to the output directory unless the source directories containing them -are included in the ``STATIC_PATHS`` setting of the project's ``pelicanconf.py`` -file. Pelican's default configuration includes the ``images`` directory for -this, but others must be added manually. Forgetting to do so will result in -broken links. +You can link to static content using ``{static}path/to/file``. Files linked to +with this syntax will automatically be copied to the output directory, even if +the source directories containing them are not included in the ``STATIC_PATHS`` +setting of the project's ``pelicanconf.py`` file. For example, a project's content directory might be structured like this:: @@ -241,48 +266,28 @@ For example, a project's content directory might be structured like this:: ``test.md`` would include:: - ![Alt Text]({filename}/images/han.jpg) - [Our Menu]({filename}/pdfs/menu.pdf) - -``pelicanconf.py`` would include:: - - STATIC_PATHS = ['images', 'pdfs'] + ![Alt Text]({static}/images/han.jpg) + [Our Menu]({static}/pdfs/menu.pdf) Site generation would then copy ``han.jpg`` to ``output/images/han.jpg``, ``menu.pdf`` to ``output/pdfs/menu.pdf``, and write the appropriate links in ``test.md``. -Mixed content in the same directory ------------------------------------ - -Starting with Pelican 3.5, static files can safely share a source directory with -page source files, without exposing the page sources in the generated site. -Any such directory must be added to both ``STATIC_PATHS`` and ``PAGE_PATHS`` -(or ``STATIC_PATHS`` and ``ARTICLE_PATHS``). Pelican will identify and process -the page source files normally, and copy the remaining files as if they lived -in a separate directory reserved for static files. - -Note: Placing static and content source files together in the same source -directory does not guarantee that they will end up in the same place in the -generated site. The easiest way to do this is by using the ``{attach}`` link -syntax (described below). Alternatively, the ``STATIC_SAVE_AS``, -``PAGE_SAVE_AS``, and ``ARTICLE_SAVE_AS`` settings (and the corresponding -``*_URL`` settings) can be configured to place files of different types -together, just as they could in earlier versions of Pelican. +If you use ``{static}`` to link to an article or a page, this will be turned into +a link to its source code. Attaching static files ---------------------- Starting with Pelican 3.5, static files can be "attached" to a page or article using this syntax for the link target: ``{attach}path/to/file`` This works -like the ``{filename}`` syntax, but also relocates the static file into the +like the ``{static}`` syntax, but also relocates the static file into the linking document's output directory. If the static file originates from a subdirectory beneath the linking document's source, that relationship will be preserved on output. Otherwise, it will become a sibling of the linking document. -This only works for linking to static files, and only when they originate from -a directory included in the ``STATIC_PATHS`` setting. +This only works for linking to static files. For example, a project's content directory might be structured like this:: @@ -298,7 +303,6 @@ For example, a project's content directory might be structured like this:: ``pelicanconf.py`` would include:: PATH = 'content' - STATIC_PATHS = ['blog', 'downloads'] ARTICLE_PATHS = ['blog'] ARTICLE_SAVE_AS = '{date:%Y}/{slug}.html' ARTICLE_URL = '{date:%Y}/{slug}.html' @@ -328,7 +332,7 @@ the article's output directory. If a static file is linked multiple times, the relocating feature of ``{attach}`` will only work in the first of those links to be processed. -After the first link, Pelican will treat ``{attach}`` like ``{filename}``. +After the first link, Pelican will treat ``{attach}`` like ``{static}``. This avoids breaking the already-processed links. **Be careful when linking to a file from multiple documents:** @@ -342,7 +346,7 @@ file's old location might then find their links broken. **It is therefore advisable to use {attach} only if you use it in all links to a file, and only if the linking documents share a single directory.** Under these conditions, the file's output location will not change in future builds. In cases where -these precautions are not possible, consider using ``{filename}`` links instead +these precautions are not possible, consider using ``{static}`` links instead of ``{attach}``, and letting the file's location be determined by the project's ``STATIC_SAVE_AS`` and ``STATIC_URL`` settings. (Per-file ``save_as`` and ``url`` overrides can still be set in ``EXTRA_PATH_METADATA``.) @@ -360,8 +364,11 @@ To remain compatible with earlier versions, Pelican still supports vertical bars (``||``) in addition to curly braces (``{}``) for internal links. For example: ``|filename|an_article.rst``, ``|tag|tagname``, ``|category|foobar``. The syntax was changed from ``||`` to ``{}`` to avoid collision with Markdown -extensions or reST directives. Support for the old syntax may eventually be -removed. +extensions or reST directives. Similarly, Pelican also still supports linking to +static content with ``{filename}``. The syntax was changed to ``{static}`` to allow +linking to both generated articles and pages and their static sources. + +Support for the old syntax may eventually be removed. Importing an existing site diff --git a/pelican/__init__.py b/pelican/__init__.py index 83b2c169..bc236708 100644 --- a/pelican/__init__.py +++ b/pelican/__init__.py @@ -150,8 +150,11 @@ class Pelican(object): start_time = time.time() context = self.settings.copy() - # Share these among all the generators and content objects: - context['filenames'] = {} # maps source path to Content object or None + # Share these among all the generators and content objects + # They map source paths to Content objects or None + context['generated_content'] = {} + context['static_links'] = set() + context['static_content'] = {} context['localsiteurl'] = self.settings['SITEURL'] generators = [ diff --git a/pelican/contents.py b/pelican/contents.py index dbda19b0..327adc72 100644 --- a/pelican/contents.py +++ b/pelican/contents.py @@ -142,7 +142,8 @@ class Content(object): if not hasattr(self, 'status'): self.status = getattr(self, 'default_status', None) - if len(self._context.get('filenames', [])) > 0: + if (len(self._context.get('generated_content', [])) > 0 or + len(self._context.get('static_content', [])) > 0): self.refresh_metadata_intersite_links() signals.content_object_init.send(self) @@ -255,7 +256,7 @@ class Content(object): siteurl += '/' # XXX Put this in a different location. - if what in {'filename', 'attach'}: + if what in {'filename', 'static', 'attach'}: if path.startswith('/'): path = path[1:] else: @@ -264,22 +265,33 @@ class Content(object): os.path.join(self.relative_dir, path) ) - if path not in self._context['filenames']: - unquoted_path = path.replace('%20', ' ') + key = 'static_content' if what in ('static', 'attach')\ + else 'generated_content' - if unquoted_path in self._context['filenames']: - path = unquoted_path + def _get_linked_content(key, path): + try: + return self._context[key][path] + except KeyError: + try: + # Markdown escapes spaces, try unescaping + return self._context[key][path.replace('%20', ' ')] + except KeyError: + if what == 'filename' and key == 'generated_content': + key = 'static_content' + linked_content = _get_linked_content(key, path) + if linked_content: + logger.warning( + '{filename} used for linking to static' + 'content %s in %s. Use {static} instead', + path, + self.get_relative_source_path()) + return linked_content + return None - linked_content = self._context['filenames'].get(path) + linked_content = _get_linked_content(key, path) if linked_content: if what == 'attach': - if isinstance(linked_content, Static): - linked_content.attach_to(self) - else: - logger.warning( - "%s used {attach} link syntax on a " - "non-static file. Use {filename} instead.", - self.get_relative_source_path()) + linked_content.attach_to(self) origin = joiner(siteurl, linked_content.url) origin = origin.replace('\\', '/') # for Windows paths. else: @@ -310,6 +322,17 @@ class Content(object): return ''.join((m.group('markup'), m.group('quote'), origin, m.group('quote'))) + def _get_intrasite_link_regex(self): + intrasite_link_regex = self.settings['INTRASITE_LINK_REGEX'] + regex = r""" + (?P<[^\>]+ # match tag with all url-value attributes + (?:href|src|poster|data|cite|formaction|action)\s*=\s*) + + (?P["\']) # require value to be quoted + (?P{0}(?P.*?)) # the url value + \2""".format(intrasite_link_regex) + return re.compile(regex, re.X) + def _update_content(self, content, siteurl): """Update the content attribute. @@ -323,18 +346,29 @@ class Content(object): if not content: return content - instrasite_link_regex = self.settings['INTRASITE_LINK_REGEX'] - regex = r""" - (?P<[^\>]+ # match tag with all url-value attributes - (?:href|src|poster|data|cite|formaction|action)\s*=\s*) - - (?P["\']) # require value to be quoted - (?P{0}(?P.*?)) # the url value - \2""".format(instrasite_link_regex) - hrefs = re.compile(regex, re.X) - + hrefs = self._get_intrasite_link_regex() return hrefs.sub(lambda m: self._link_replacer(siteurl, m), content) + def get_static_links(self): + static_links = set() + hrefs = self._get_intrasite_link_regex() + for m in hrefs.finditer(self._content): + what = m.group('what') + value = urlparse(m.group('value')) + path = value.path + if what not in {'static', 'attach'}: + continue + if path.startswith('/'): + path = path[1:] + else: + # relative to the source path of this content + path = self.get_relative_source_path( + os.path.join(self.relative_dir, path) + ) + path = path.replace('%20', ' ') + static_links.add(path) + return static_links + def get_siteurl(self): return self._context.get('localsiteurl', '') diff --git a/pelican/generators.py b/pelican/generators.py index a960051d..90e4c8a5 100644 --- a/pelican/generators.py +++ b/pelican/generators.py @@ -147,7 +147,7 @@ class Generator(object): parent_path, subdir = os.path.split(os.path.join(self.path, e)) exclusions_by_dirpath.setdefault(parent_path, set()).add(subdir) - files = [] + files = set() ignores = self.settings['IGNORE_FILES'] for path in paths: # careful: os.path.join() will add a slash when path == ''. @@ -170,33 +170,41 @@ class Generator(object): for f in temp_files: fp = os.path.join(reldir, f) if self._include_path(fp, extensions): - files.append(fp) + files.add(fp) elif os.path.exists(root) and self._include_path(path, extensions): - files.append(path) # can't walk non-directories + files.add(path) # can't walk non-directories return files - def add_source_path(self, content): + def add_source_path(self, content, static=False): """Record a source file path that a Generator found and processed. Store a reference to its Content object, for url lookups later. """ location = content.get_relative_source_path() - self.context['filenames'][location] = content + key = 'static_content' if static else 'generated_content' + self.context[key][location] = content - def _add_failed_source_path(self, path): + def _add_failed_source_path(self, path, static=False): """Record a source file path that a Generator failed to process. (For example, one that was missing mandatory metadata.) The path argument is expected to be relative to self.path. """ - self.context['filenames'][posixize_path(os.path.normpath(path))] = None + key = 'static_content' if static else 'generated_content' + self.context[key][posixize_path(os.path.normpath(path))] = None - def _is_potential_source_path(self, path): + def _is_potential_source_path(self, path, static=False): """Return True if path was supposed to be used as a source file. (This includes all source files that have been found by generators before this method is called, even if they failed to process.) The path argument is expected to be relative to self.path. """ - return (posixize_path(os.path.normpath(path)) - in self.context['filenames']) + key = 'static_content' if static else 'generated_content' + return (posixize_path(os.path.normpath(path)) in self.context[key]) + + def add_static_links(self, content): + """Add file links in content to context to be processed as Static + content. + """ + self.context['static_links'] |= content.get_static_links() def _update_context(self, items): """Update the context with the given items from the currrent @@ -596,6 +604,7 @@ class ArticlesGenerator(CachingGenerator): elif article.status == "draft": all_drafts.append(article) self.add_source_path(article) + self.add_static_links(article) def _process(arts): origs, translations = process_translations( @@ -702,6 +711,7 @@ class PagesGenerator(CachingGenerator): elif page.status == "draft": draft_pages.append(page) self.add_source_path(page) + self.add_static_links(page) def _process(pages): origs, translations = process_translations( @@ -753,9 +763,12 @@ class StaticGenerator(Generator): def generate_context(self): self.staticfiles = [] - for f in self.get_files(self.settings['STATIC_PATHS'], - exclude=self.settings['STATIC_EXCLUDES'], - extensions=False): + linked_files = {os.path.join(self.path, path) + for path in self.context['static_links']} + found_files = self.get_files(self.settings['STATIC_PATHS'], + exclude=self.settings['STATIC_EXCLUDES'], + extensions=False) + for f in linked_files | found_files: # skip content source files unless the user explicitly wants them if self.settings['STATIC_EXCLUDE_SOURCES']: @@ -770,7 +783,7 @@ class StaticGenerator(Generator): context_signal=signals.static_generator_context, context_sender=self) self.staticfiles.append(static) - self.add_source_path(static) + self.add_source_path(static, static=True) self._update_context(('staticfiles',)) signals.static_generator_finalized.send(self) diff --git a/pelican/tests/TestPages/page_with_static_links.md b/pelican/tests/TestPages/page_with_static_links.md new file mode 100644 index 00000000..1967cfcf --- /dev/null +++ b/pelican/tests/TestPages/page_with_static_links.md @@ -0,0 +1,7 @@ +Title: Page with static links + +My links: + +[Link 0]({static}image0.jpg) + +[Link 1]({attach}image1.jpg) diff --git a/pelican/tests/output/basic/author/alexis-metaireau.html b/pelican/tests/output/basic/author/alexis-metaireau.html index bc05969e..aa19e421 100644 --- a/pelican/tests/output/basic/author/alexis-metaireau.html +++ b/pelican/tests/output/basic/author/alexis-metaireau.html @@ -42,8 +42,8 @@

This is a simple title

And here comes the cool stuff.

-alternate text -alternate text +alternate text +alternate text
 >>> from ipdb import set_trace
 >>> set_trace()
@@ -78,7 +78,7 @@
 

Why not ?

After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst ! YEAH !

-alternate text +alternate text
read more diff --git a/pelican/tests/output/basic/category/bar.html b/pelican/tests/output/basic/category/bar.html index a0b06964..2d327f5f 100644 --- a/pelican/tests/output/basic/category/bar.html +++ b/pelican/tests/output/basic/category/bar.html @@ -38,7 +38,7 @@

Why not ?

After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst ! YEAH !

-alternate text +alternate text diff --git a/pelican/tests/output/basic/category/yeah.html b/pelican/tests/output/basic/category/yeah.html index c7c8e507..2621e587 100644 --- a/pelican/tests/output/basic/category/yeah.html +++ b/pelican/tests/output/basic/category/yeah.html @@ -42,8 +42,8 @@

This is a simple title

And here comes the cool stuff.

-alternate text -alternate text +alternate text +alternate text
 >>> from ipdb import set_trace
 >>> set_trace()
diff --git a/pelican/tests/output/basic/feeds/alexis-metaireau.atom.xml b/pelican/tests/output/basic/feeds/alexis-metaireau.atom.xml
index fe670d13..54378c52 100644
--- a/pelican/tests/output/basic/feeds/alexis-metaireau.atom.xml
+++ b/pelican/tests/output/basic/feeds/alexis-metaireau.atom.xml
@@ -5,8 +5,8 @@ as well as <strong>inline markup</strong>.</p>
 <div class="section" id="this-is-a-simple-title">
 <h2>This is a simple title</h2>
 <p>And here comes the cool <a class="reference external" href="http://books.couchdb.org/relax/design-documents/views">stuff</a>.</p>
-<img alt="alternate text" src="|filename|/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
-<img alt="alternate text" src="|filename|/pictures/Sushi_Macro.jpg" style="width: 600px; height: 450px;" />
+<img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
+<img alt="alternate text" src="/pictures/Sushi_Macro.jpg" style="width: 600px; height: 450px;" />
 <pre class="literal-block">
 &gt;&gt;&gt; from ipdb import set_trace
 &gt;&gt;&gt; set_trace()
@@ -17,12 +17,12 @@ as well as <strong>inline markup</strong>.</p>
 <h2>Why not ?</h2>
 <p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !
 YEAH !</p>
-<img alt="alternate text" src="|filename|/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
+<img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
 </div>
 <div class="section" id="why-not">
 <h2>Why not ?</h2>
 <p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !
 YEAH !</p>
-<img alt="alternate text" src="|filename|/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
+<img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
 </div>
 
\ No newline at end of file
diff --git a/pelican/tests/output/basic/feeds/alexis-metaireau.rss.xml b/pelican/tests/output/basic/feeds/alexis-metaireau.rss.xml
index 9c3f82f0..57942aed 100644
--- a/pelican/tests/output/basic/feeds/alexis-metaireau.rss.xml
+++ b/pelican/tests/output/basic/feeds/alexis-metaireau.rss.xml
@@ -5,6 +5,6 @@ as well as <strong>inline markup</strong>.</p>
 <h2>Why not ?</h2>
 <p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !
 YEAH !</p>
-<img alt="alternate text" src="|filename|/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
+<img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
 </div>
 Alexis MétaireauWed, 20 Oct 2010 10:14:00 +0000tag:None,2010-10-20:/oh-yeah.htmlohbaryeah
\ No newline at end of file
diff --git a/pelican/tests/output/basic/feeds/all-en.atom.xml b/pelican/tests/output/basic/feeds/all-en.atom.xml
index 2a0c7ea3..b5965cc8 100644
--- a/pelican/tests/output/basic/feeds/all-en.atom.xml
+++ b/pelican/tests/output/basic/feeds/all-en.atom.xml
@@ -19,8 +19,8 @@ as well as <strong>inline markup</strong>.</p>
 <div class="section" id="this-is-a-simple-title">
 <h2>This is a simple title</h2>
 <p>And here comes the cool <a class="reference external" href="http://books.couchdb.org/relax/design-documents/views">stuff</a>.</p>
-<img alt="alternate text" src="|filename|/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
-<img alt="alternate text" src="|filename|/pictures/Sushi_Macro.jpg" style="width: 600px; height: 450px;" />
+<img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
+<img alt="alternate text" src="/pictures/Sushi_Macro.jpg" style="width: 600px; height: 450px;" />
 <pre class="literal-block">
 &gt;&gt;&gt; from ipdb import set_trace
 &gt;&gt;&gt; set_trace()
@@ -31,13 +31,13 @@ as well as <strong>inline markup</strong>.</p>
 <h2>Why not ?</h2>
 <p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !
 YEAH !</p>
-<img alt="alternate text" src="|filename|/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
+<img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
 </div>
 <div class="section" id="why-not">
 <h2>Why not ?</h2>
 <p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !
 YEAH !</p>
-<img alt="alternate text" src="|filename|/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
+<img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
 </div>
 Unbelievable !2010-10-15T20:30:00+00:002010-10-15T20:30:00+00:00tag:None,2010-10-15:/unbelievable.html<p>Or completely awesome. Depends the needs.</p>
 <p><a class="reference external" href="/a-markdown-powered-article.html">a root-relative link to markdown-article</a>
diff --git a/pelican/tests/output/basic/feeds/all.atom.xml b/pelican/tests/output/basic/feeds/all.atom.xml
index ba6322df..33e852a9 100644
--- a/pelican/tests/output/basic/feeds/all.atom.xml
+++ b/pelican/tests/output/basic/feeds/all.atom.xml
@@ -21,8 +21,8 @@ as well as <strong>inline markup</strong>.</p>
 <div class="section" id="this-is-a-simple-title">
 <h2>This is a simple title</h2>
 <p>And here comes the cool <a class="reference external" href="http://books.couchdb.org/relax/design-documents/views">stuff</a>.</p>
-<img alt="alternate text" src="|filename|/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
-<img alt="alternate text" src="|filename|/pictures/Sushi_Macro.jpg" style="width: 600px; height: 450px;" />
+<img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
+<img alt="alternate text" src="/pictures/Sushi_Macro.jpg" style="width: 600px; height: 450px;" />
 <pre class="literal-block">
 &gt;&gt;&gt; from ipdb import set_trace
 &gt;&gt;&gt; set_trace()
@@ -33,13 +33,13 @@ as well as <strong>inline markup</strong>.</p>
 <h2>Why not ?</h2>
 <p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !
 YEAH !</p>
-<img alt="alternate text" src="|filename|/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
+<img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
 </div>
 <div class="section" id="why-not">
 <h2>Why not ?</h2>
 <p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !
 YEAH !</p>
-<img alt="alternate text" src="|filename|/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
+<img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
 </div>
 Unbelievable !2010-10-15T20:30:00+00:002010-10-15T20:30:00+00:00tag:None,2010-10-15:/unbelievable.html<p>Or completely awesome. Depends the needs.</p>
 <p><a class="reference external" href="/a-markdown-powered-article.html">a root-relative link to markdown-article</a>
diff --git a/pelican/tests/output/basic/feeds/bar.atom.xml b/pelican/tests/output/basic/feeds/bar.atom.xml
index 0d0f0ce6..2d594f29 100644
--- a/pelican/tests/output/basic/feeds/bar.atom.xml
+++ b/pelican/tests/output/basic/feeds/bar.atom.xml
@@ -3,12 +3,12 @@
 <h2>Why not ?</h2>
 <p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !
 YEAH !</p>
-<img alt="alternate text" src="|filename|/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
+<img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
 </div>
 <div class="section" id="why-not">
 <h2>Why not ?</h2>
 <p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !
 YEAH !</p>
-<img alt="alternate text" src="|filename|/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
+<img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
 </div>
 
\ No newline at end of file
diff --git a/pelican/tests/output/basic/feeds/yeah.atom.xml b/pelican/tests/output/basic/feeds/yeah.atom.xml
index dfd37b62..3d48f4f3 100644
--- a/pelican/tests/output/basic/feeds/yeah.atom.xml
+++ b/pelican/tests/output/basic/feeds/yeah.atom.xml
@@ -5,8 +5,8 @@ as well as <strong>inline markup</strong>.</p>
 <div class="section" id="this-is-a-simple-title">
 <h2>This is a simple title</h2>
 <p>And here comes the cool <a class="reference external" href="http://books.couchdb.org/relax/design-documents/views">stuff</a>.</p>
-<img alt="alternate text" src="|filename|/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
-<img alt="alternate text" src="|filename|/pictures/Sushi_Macro.jpg" style="width: 600px; height: 450px;" />
+<img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
+<img alt="alternate text" src="/pictures/Sushi_Macro.jpg" style="width: 600px; height: 450px;" />
 <pre class="literal-block">
 &gt;&gt;&gt; from ipdb import set_trace
 &gt;&gt;&gt; set_trace()
diff --git a/pelican/tests/output/basic/index.html b/pelican/tests/output/basic/index.html
index ed1356ed..077d0ba5 100644
--- a/pelican/tests/output/basic/index.html
+++ b/pelican/tests/output/basic/index.html
@@ -191,7 +191,7 @@ as well as inline markup.

Why not ?

After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst ! YEAH !

-alternate text +alternate text
read more diff --git a/pelican/tests/output/basic/oh-yeah.html b/pelican/tests/output/basic/oh-yeah.html index 86086bc1..df378418 100644 --- a/pelican/tests/output/basic/oh-yeah.html +++ b/pelican/tests/output/basic/oh-yeah.html @@ -43,7 +43,7 @@

Why not ?

After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst ! YEAH !

-alternate text +alternate text diff --git a/pelican/tests/output/basic/pictures/Sushi.jpg b/pelican/tests/output/basic/pictures/Sushi.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e49e5f0ab53461187c2cf61ebc1f3befdc937aed GIT binary patch literal 28992 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 V9RVclK)_SR8Zrq#de{_0|JgZd7T*8> literal 0 HcmV?d00001 diff --git a/pelican/tests/output/basic/tag/bar.html b/pelican/tests/output/basic/tag/bar.html index b699a45d..04bb26eb 100644 --- a/pelican/tests/output/basic/tag/bar.html +++ b/pelican/tests/output/basic/tag/bar.html @@ -90,7 +90,7 @@ as well as inline markup.

Why not ?

After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst ! YEAH !

-alternate text +alternate text read more diff --git a/pelican/tests/output/basic/tag/foobar.html b/pelican/tests/output/basic/tag/foobar.html index 34505977..cc72782c 100644 --- a/pelican/tests/output/basic/tag/foobar.html +++ b/pelican/tests/output/basic/tag/foobar.html @@ -42,8 +42,8 @@

This is a simple title

And here comes the cool stuff.

-alternate text -alternate text +alternate text +alternate text
 >>> from ipdb import set_trace
 >>> set_trace()
diff --git a/pelican/tests/output/basic/tag/yeah.html b/pelican/tests/output/basic/tag/yeah.html
index 2729561c..49d1616d 100644
--- a/pelican/tests/output/basic/tag/yeah.html
+++ b/pelican/tests/output/basic/tag/yeah.html
@@ -38,7 +38,7 @@
 

Why not ?

After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst ! YEAH !

-alternate text +alternate text
diff --git a/pelican/tests/output/basic/this-is-a-super-article.html b/pelican/tests/output/basic/this-is-a-super-article.html index f8de5f85..5e6f1365 100644 --- a/pelican/tests/output/basic/this-is-a-super-article.html +++ b/pelican/tests/output/basic/this-is-a-super-article.html @@ -47,8 +47,8 @@

This is a simple title

And here comes the cool stuff.

-alternate text -alternate text +alternate text +alternate text
 >>> from ipdb import set_trace
 >>> set_trace()
diff --git a/pelican/tests/support.py b/pelican/tests/support.py
index 252a28c8..93db8328 100644
--- a/pelican/tests/support.py
+++ b/pelican/tests/support.py
@@ -175,6 +175,15 @@ def get_settings(**kwargs):
     return settings
 
 
+def get_context(settings=None, **kwargs):
+    context = settings.copy() if settings else {}
+    context['generated_content'] = {}
+    context['static_links'] = set()
+    context['static_content'] = {}
+    context.update(kwargs)
+    return context
+
+
 class LogCountHandler(BufferingHandler):
     """Capturing and counting logged messages."""
 
diff --git a/pelican/tests/test_cache.py b/pelican/tests/test_cache.py
index 72b2b557..ceba649e 100644
--- a/pelican/tests/test_cache.py
+++ b/pelican/tests/test_cache.py
@@ -6,7 +6,7 @@ from shutil import rmtree
 from tempfile import mkdtemp
 
 from pelican.generators import ArticlesGenerator, PagesGenerator
-from pelican.tests.support import get_settings, unittest
+from pelican.tests.support import get_context, get_settings, unittest
 
 try:
     from unittest.mock import MagicMock
@@ -29,7 +29,7 @@ class TestCache(unittest.TestCase):
         rmtree(self.temp_cache)
 
     def _get_cache_enabled_settings(self):
-        settings = get_settings(filenames={})
+        settings = get_settings()
         settings['CACHE_CONTENT'] = True
         settings['LOAD_CONTENT_CACHE'] = True
         settings['CACHE_PATH'] = self.temp_cache
@@ -42,20 +42,21 @@ class TestCache(unittest.TestCase):
         settings['PAGE_PATHS'] = ['TestPages']
         settings['DEFAULT_DATE'] = (1970, 1, 1)
         settings['READERS'] = {'asc': None}
+        context = get_context(settings)
 
         def sorted_titles(items):
             return sorted(item.title for item in items)
 
         # Articles
         generator = ArticlesGenerator(
-            context=settings.copy(), settings=settings,
+            context=context.copy(), settings=settings,
             path=CONTENT_DIR, theme=settings['THEME'], output_path=None)
         generator.generate_context()
         uncached_articles = sorted_titles(generator.articles)
         uncached_drafts = sorted_titles(generator.drafts)
 
         generator = ArticlesGenerator(
-            context=settings.copy(), settings=settings,
+            context=context.copy(), settings=settings,
             path=CONTENT_DIR, theme=settings['THEME'], output_path=None)
         generator.generate_context()
         cached_articles = sorted_titles(generator.articles)
@@ -66,7 +67,7 @@ class TestCache(unittest.TestCase):
 
         # Pages
         generator = PagesGenerator(
-            context=settings.copy(), settings=settings,
+            context=context.copy(), settings=settings,
             path=CUR_DIR, theme=settings['THEME'], output_path=None)
         generator.generate_context()
         uncached_pages = sorted_titles(generator.pages)
@@ -74,7 +75,7 @@ class TestCache(unittest.TestCase):
         uncached_draft_pages = sorted_titles(generator.draft_pages)
 
         generator = PagesGenerator(
-            context=settings.copy(), settings=settings,
+            context=context.copy(), settings=settings,
             path=CUR_DIR, theme=settings['THEME'], output_path=None)
         generator.generate_context()
         cached_pages = sorted_titles(generator.pages)
@@ -92,20 +93,21 @@ class TestCache(unittest.TestCase):
         settings['PAGE_PATHS'] = ['TestPages']
         settings['DEFAULT_DATE'] = (1970, 1, 1)
         settings['READERS'] = {'asc': None}
+        context = get_context(settings)
 
         def sorted_titles(items):
             return sorted(item.title for item in items)
 
         # Articles
         generator = ArticlesGenerator(
-            context=settings.copy(), settings=settings,
+            context=context.copy(), settings=settings,
             path=CONTENT_DIR, theme=settings['THEME'], output_path=None)
         generator.generate_context()
         uncached_articles = sorted_titles(generator.articles)
         uncached_drafts = sorted_titles(generator.drafts)
 
         generator = ArticlesGenerator(
-            context=settings.copy(), settings=settings,
+            context=context.copy(), settings=settings,
             path=CONTENT_DIR, theme=settings['THEME'], output_path=None)
         generator.generate_context()
         cached_articles = sorted_titles(generator.articles)
@@ -116,14 +118,14 @@ class TestCache(unittest.TestCase):
 
         # Pages
         generator = PagesGenerator(
-            context=settings.copy(), settings=settings,
+            context=context.copy(), settings=settings,
             path=CUR_DIR, theme=settings['THEME'], output_path=None)
         generator.generate_context()
         uncached_pages = sorted_titles(generator.pages)
         uncached_hidden_pages = sorted_titles(generator.hidden_pages)
 
         generator = PagesGenerator(
-            context=settings.copy(), settings=settings,
+            context=context.copy(), settings=settings,
             path=CUR_DIR, theme=settings['THEME'], output_path=None)
         generator.generate_context()
         cached_pages = sorted_titles(generator.pages)
@@ -139,15 +141,16 @@ class TestCache(unittest.TestCase):
         settings['CONTENT_CACHING_LAYER'] = 'generator'
         settings['DEFAULT_DATE'] = (1970, 1, 1)
         settings['READERS'] = {'asc': None}
+        context = get_context(settings)
 
         generator = ArticlesGenerator(
-            context=settings.copy(), settings=settings,
+            context=context.copy(), settings=settings,
             path=CONTENT_DIR, theme=settings['THEME'], output_path=None)
         generator.generate_context()
         self.assertTrue(hasattr(generator, '_cache'))
 
         generator = ArticlesGenerator(
-            context=settings.copy(), settings=settings,
+            context=context.copy(), settings=settings,
             path=CONTENT_DIR, theme=settings['THEME'], output_path=None)
         generator.readers.read_file = MagicMock()
         generator.generate_context()
@@ -167,15 +170,16 @@ class TestCache(unittest.TestCase):
         """Test raw article content caching at the reader level"""
         settings = self._get_cache_enabled_settings()
         settings['READERS'] = {'asc': None}
+        context = get_context(settings)
 
         generator = ArticlesGenerator(
-            context=settings.copy(), settings=settings,
+            context=context.copy(), settings=settings,
             path=CONTENT_DIR, theme=settings['THEME'], output_path=None)
         generator.generate_context()
         self.assertTrue(hasattr(generator.readers, '_cache'))
 
         generator = ArticlesGenerator(
-            context=settings.copy(), settings=settings,
+            context=context.copy(), settings=settings,
             path=CONTENT_DIR, theme=settings['THEME'], output_path=None)
         readers = generator.readers.readers
         for reader in readers.values():
@@ -191,9 +195,10 @@ class TestCache(unittest.TestCase):
         used in --ignore-cache or autoreload mode"""
         settings = self._get_cache_enabled_settings()
         settings['READERS'] = {'asc': None}
+        context = get_context(settings)
 
         generator = ArticlesGenerator(
-            context=settings.copy(), settings=settings,
+            context=context.copy(), settings=settings,
             path=CONTENT_DIR, theme=settings['THEME'], output_path=None)
         generator.readers.read_file = MagicMock()
         generator.generate_context()
@@ -202,7 +207,7 @@ class TestCache(unittest.TestCase):
 
         settings['LOAD_CONTENT_CACHE'] = False
         generator = ArticlesGenerator(
-            context=settings.copy(), settings=settings,
+            context=context.copy(), settings=settings,
             path=CONTENT_DIR, theme=settings['THEME'], output_path=None)
         generator.readers.read_file = MagicMock()
         generator.generate_context()
@@ -217,15 +222,16 @@ class TestCache(unittest.TestCase):
         settings['CONTENT_CACHING_LAYER'] = 'generator'
         settings['PAGE_PATHS'] = ['TestPages']
         settings['READERS'] = {'asc': None}
+        context = get_context(settings)
 
         generator = PagesGenerator(
-            context=settings.copy(), settings=settings,
+            context=context.copy(), settings=settings,
             path=CUR_DIR, theme=settings['THEME'], output_path=None)
         generator.generate_context()
         self.assertTrue(hasattr(generator, '_cache'))
 
         generator = PagesGenerator(
-            context=settings.copy(), settings=settings,
+            context=context.copy(), settings=settings,
             path=CUR_DIR, theme=settings['THEME'], output_path=None)
         generator.readers.read_file = MagicMock()
         generator.generate_context()
@@ -241,15 +247,16 @@ class TestCache(unittest.TestCase):
         settings = self._get_cache_enabled_settings()
         settings['PAGE_PATHS'] = ['TestPages']
         settings['READERS'] = {'asc': None}
+        context = get_context(settings)
 
         generator = PagesGenerator(
-            context=settings.copy(), settings=settings,
+            context=context.copy(), settings=settings,
             path=CUR_DIR, theme=settings['THEME'], output_path=None)
         generator.generate_context()
         self.assertTrue(hasattr(generator.readers, '_cache'))
 
         generator = PagesGenerator(
-            context=settings.copy(), settings=settings,
+            context=context.copy(), settings=settings,
             path=CUR_DIR, theme=settings['THEME'], output_path=None)
         readers = generator.readers.readers
         for reader in readers.values():
@@ -266,9 +273,10 @@ class TestCache(unittest.TestCase):
         settings = self._get_cache_enabled_settings()
         settings['PAGE_PATHS'] = ['TestPages']
         settings['READERS'] = {'asc': None}
+        context = get_context(settings)
 
         generator = PagesGenerator(
-            context=settings.copy(), settings=settings,
+            context=context.copy(), settings=settings,
             path=CUR_DIR, theme=settings['THEME'], output_path=None)
         generator.readers.read_file = MagicMock()
         generator.generate_context()
@@ -277,7 +285,7 @@ class TestCache(unittest.TestCase):
 
         settings['LOAD_CONTENT_CACHE'] = False
         generator = PagesGenerator(
-            context=settings.copy(), settings=settings,
+            context=context.copy(), settings=settings,
             path=CUR_DIR, theme=settings['THEME'], output_path=None)
         generator.readers.read_file = MagicMock()
         generator.generate_context()
diff --git a/pelican/tests/test_contents.py b/pelican/tests/test_contents.py
index 032df468..21766359 100644
--- a/pelican/tests/test_contents.py
+++ b/pelican/tests/test_contents.py
@@ -14,7 +14,8 @@ import six
 from pelican.contents import Article, Author, Category, Page, Static, Tag
 from pelican.settings import DEFAULT_CONFIG
 from pelican.signals import content_object_init
-from pelican.tests.support import LoggedTestCase, get_settings, unittest
+from pelican.tests.support import LoggedTestCase, get_context, get_settings,\
+    unittest
 from pelican.utils import SafeDatetime, path_to_url, truncate_html_words
 
 
@@ -264,7 +265,7 @@ class TestPage(LoggedTestCase):
         args = self.page_kwargs.copy()
         args['settings'] = get_settings()
         args['source_path'] = 'content'
-        args['context']['filenames'] = {'article.rst': article}
+        args['context']['generated_content'] = {'article.rst': article}
 
         # Classic intrasite link via filename
         args['content'] = (
@@ -343,22 +344,24 @@ class TestPage(LoggedTestCase):
         args = self.page_kwargs.copy()
         args['settings'] = get_settings()
         args['source_path'] = 'content'
-        args['context']['filenames'] = {
-            'images/poster.jpg': type(
-                cls_name, (object,), {'url': 'images/poster.jpg'}),
-            'assets/video.mp4': type(
-                cls_name, (object,), {'url': 'assets/video.mp4'}),
-            'images/graph.svg': type(
-                cls_name, (object,), {'url': 'images/graph.svg'}),
-            'reference.rst': type(
-                cls_name, (object,), {'url': 'reference.html'}),
+        args['context']['static_content'] = {
+            'images/poster.jpg':
+                type(cls_name, (object,), {'url': 'images/poster.jpg'}),
+            'assets/video.mp4':
+                type(cls_name, (object,), {'url': 'assets/video.mp4'}),
+            'images/graph.svg':
+                type(cls_name, (object,), {'url': 'images/graph.svg'}),
+        }
+        args['context']['generated_content'] = {
+            'reference.rst':
+                type(cls_name, (object,), {'url': 'reference.html'}),
         }
 
         # video.poster
         args['content'] = (
             'There is a video with poster '
-            '