From 9e70c17839c440ecca7729a9501c403fed47bbe6 Mon Sep 17 00:00:00 2001 From: Deniz Turgut Date: Wed, 10 Apr 2013 19:12:31 -0400 Subject: [PATCH] import plugins from core and restructure repo --- .gitignore | 1 + .travis.yml | 13 + Contributing.rst | 29 ++ README.rst | 11 - Readme.rst | 41 ++ assets/Readme.rst | 80 ++++ assets/__init__.py | 1 + assets/assets.py | 53 +++ github_activity/Readme.rst | 30 ++ github_activity/__init__.py | 1 + github_activity/github_activity.py | 67 +++ global_license/Readme.rst | 6 + global_license/__init__.py | 1 + global_license/global_license.py | 18 + .../README.md => goodreads_activity/Readme.md | 0 goodreads_activity/__init__.py | 1 + .../goodreads_activity.py | 9 + gravatar/Readme.rst | 15 + gravatar/__init__.py | 1 + gravatar/gravatar.py | 31 ++ gzip_cache/Readme.rst | 10 + gzip_cache/__init__.py | 1 + gzip_cache/gzip_cache.py | 84 ++++ html_rst_directive/Readme.rst | 45 ++ html_rst_directive/__init__.py | 1 + html_rst_directive/html_rst_directive.py | 30 ++ {pelicanext/latex => latex}/Readme.md | 0 latex/__init__.py | 1 + latex/latex.py | 47 ++ .../README.md => multi_part/Readme.md | 4 +- multi_part/__init__.py | 1 + .../multi_part => multi_part}/multi_part.py | 27 +- .../README.rst => neighbors/Readme.rst | 19 +- neighbors/__init__.py | 1 + .../neighbors => neighbors}/neighbors.py | 0 pelicanext/latex/latex.py | 112 ----- pelicanext/random_article/Readme.md | 36 -- pelicanext/sitemap/__init__.py | 0 random_article/Readme.md | 19 + random_article/__init__.py | 1 + .../random_article.py | 9 + related_posts/Readme.rst | 19 + related_posts/__init__.py | 1 + related_posts/related_posts.py | 35 ++ sitemap/Readme.rst | 65 +++ sitemap/__init__.py | 1 + {pelicanext/sitemap => sitemap}/sitemap.py | 7 + summary/Readme.rst | 27 ++ summary/__init__.py | 1 + summary/summary.py | 61 +++ tests/Readme.rst | 13 + tests/__init__.py | 2 + tests/test_assets.py | 142 ++++++ .../content/2012-11-30_filename-metadata.rst | 4 + .../content/another_super_article-fr.rst | 7 + .../content/another_super_article.rst | 20 + tests/test_data/content/article2-fr.rst | 9 + tests/test_data/content/article2.rst | 9 + tests/test_data/content/cat1/article1.rst | 7 + tests/test_data/content/cat1/article2.rst | 6 + tests/test_data/content/cat1/article3.rst | 6 + .../content/cat1/markdown-article.md | 7 + tests/test_data/content/draft_article.rst | 7 + tests/test_data/content/extra/robots.txt | 2 + tests/test_data/content/pages/hidden_page.rst | 9 + .../content/pages/jinja2_template.html | 6 + .../content/pages/override_url_saveas.rst | 9 + tests/test_data/content/pages/test_page.rst | 12 + tests/test_data/content/pictures/Fat_Cat.jpg | Bin 0 -> 62675 bytes tests/test_data/content/pictures/Sushi.jpg | Bin 0 -> 28992 bytes .../content/pictures/Sushi_Macro.jpg | Bin 0 -> 38594 bytes tests/test_data/content/super_article.rst | 36 ++ tests/test_data/content/unbelievable.rst | 9 + tests/test_data/content/unwanted_file | 1 + tests/test_data/pelican.conf.py | 45 ++ .../assets_theme/static/css/style.min.css | 1 + .../themes/assets_theme/static/css/style.scss | 19 + .../themes/assets_theme/templates/base.html | 7 + .../themes/notmyidea/static/css/main.css | 446 ++++++++++++++++++ .../themes/notmyidea/static/css/pygment.css | 205 ++++++++ .../themes/notmyidea/static/css/reset.css | 52 ++ .../themes/notmyidea/static/css/typogrify.css | 3 + .../themes/notmyidea/static/css/wide.css | 48 ++ .../notmyidea/static/images/icons/aboutme.png | Bin 0 -> 751 bytes .../static/images/icons/bitbucket.png | Bin 0 -> 3714 bytes .../static/images/icons/delicious.png | Bin 0 -> 958 bytes .../static/images/icons/facebook.png | Bin 0 -> 202 bytes .../notmyidea/static/images/icons/github.png | Bin 0 -> 346 bytes .../static/images/icons/gitorious.png | Bin 0 -> 227 bytes .../notmyidea/static/images/icons/gittip.png | Bin 0 -> 487 bytes .../static/images/icons/google-groups.png | Bin 0 -> 803 bytes .../static/images/icons/google-plus.png | Bin 0 -> 527 bytes .../static/images/icons/hackernews.png | Bin 0 -> 3273 bytes .../notmyidea/static/images/icons/lastfm.png | Bin 0 -> 975 bytes .../static/images/icons/linkedin.png | Bin 0 -> 896 bytes .../notmyidea/static/images/icons/reddit.png | Bin 0 -> 693 bytes .../notmyidea/static/images/icons/rss.png | Bin 0 -> 879 bytes .../static/images/icons/slideshare.png | Bin 0 -> 535 bytes .../static/images/icons/speakerdeck.png | Bin 0 -> 1049 bytes .../notmyidea/static/images/icons/twitter.png | Bin 0 -> 830 bytes .../notmyidea/static/images/icons/vimeo.png | Bin 0 -> 544 bytes .../notmyidea/static/images/icons/youtube.png | Bin 0 -> 458 bytes .../themes/notmyidea/templates/analytics.html | 12 + .../themes/notmyidea/templates/archives.html | 13 + .../themes/notmyidea/templates/article.html | 35 ++ .../notmyidea/templates/article_infos.html | 15 + .../themes/notmyidea/templates/author.html | 2 + .../themes/notmyidea/templates/authors.html | 0 .../themes/notmyidea/templates/base.html | 88 ++++ .../themes/notmyidea/templates/category.html | 2 + .../themes/notmyidea/templates/comments.html | 1 + .../notmyidea/templates/disqus_script.html | 11 + .../themes/notmyidea/templates/github.html | 9 + .../themes/notmyidea/templates/index.html | 61 +++ .../themes/notmyidea/templates/page.html | 12 + .../themes/notmyidea/templates/piwik.html | 16 + .../themes/notmyidea/templates/tag.html | 2 + .../themes/notmyidea/templates/taglist.html | 2 + .../notmyidea/templates/translations.html | 8 + .../themes/notmyidea/templates/twitter.html | 3 + .../themes/simple/templates/archives.html | 11 + .../themes/simple/templates/article.html | 25 + .../themes/simple/templates/author.html | 7 + .../themes/simple/templates/base.html | 63 +++ .../themes/simple/templates/categories.html | 8 + .../themes/simple/templates/category.html | 5 + .../themes/simple/templates/gosquared.html | 14 + .../themes/simple/templates/index.html | 22 + .../themes/simple/templates/page.html | 9 + .../themes/simple/templates/pagination.html | 15 + .../themes/simple/templates/tag.html | 0 .../themes/simple/templates/tags.html | 0 .../themes/simple/templates/translations.html | 9 + tests/test_data/themes/test_summary.py | 75 +++ tests/test_gzip_cache.py | 54 +++ 135 files changed, 2628 insertions(+), 204 deletions(-) create mode 100644 .gitignore create mode 100644 .travis.yml create mode 100644 Contributing.rst delete mode 100644 README.rst create mode 100644 Readme.rst create mode 100644 assets/Readme.rst create mode 100644 assets/__init__.py create mode 100644 assets/assets.py create mode 100644 github_activity/Readme.rst create mode 100644 github_activity/__init__.py create mode 100644 github_activity/github_activity.py create mode 100644 global_license/Readme.rst create mode 100644 global_license/__init__.py create mode 100644 global_license/global_license.py rename pelicanext/goodreads_activity/README.md => goodreads_activity/Readme.md (100%) create mode 100644 goodreads_activity/__init__.py rename {pelicanext/goodreads_activity => goodreads_activity}/goodreads_activity.py (91%) create mode 100644 gravatar/Readme.rst create mode 100644 gravatar/__init__.py create mode 100644 gravatar/gravatar.py create mode 100644 gzip_cache/Readme.rst create mode 100644 gzip_cache/__init__.py create mode 100644 gzip_cache/gzip_cache.py create mode 100644 html_rst_directive/Readme.rst create mode 100644 html_rst_directive/__init__.py create mode 100644 html_rst_directive/html_rst_directive.py rename {pelicanext/latex => latex}/Readme.md (100%) create mode 100644 latex/__init__.py create mode 100644 latex/latex.py rename pelicanext/multi_part/README.md => multi_part/Readme.md (87%) create mode 100644 multi_part/__init__.py rename {pelicanext/multi_part => multi_part}/multi_part.py (53%) rename pelicanext/neighbors/README.rst => neighbors/Readme.rst (55%) create mode 100644 neighbors/__init__.py rename {pelicanext/neighbors => neighbors}/neighbors.py (100%) delete mode 100644 pelicanext/latex/latex.py delete mode 100644 pelicanext/random_article/Readme.md delete mode 100644 pelicanext/sitemap/__init__.py create mode 100644 random_article/Readme.md create mode 100644 random_article/__init__.py rename {pelicanext/random_article => random_article}/random_article.py (89%) create mode 100644 related_posts/Readme.rst create mode 100644 related_posts/__init__.py create mode 100644 related_posts/related_posts.py create mode 100644 sitemap/Readme.rst create mode 100644 sitemap/__init__.py rename {pelicanext/sitemap => sitemap}/sitemap.py (98%) create mode 100644 summary/Readme.rst create mode 100644 summary/__init__.py create mode 100644 summary/summary.py create mode 100644 tests/Readme.rst create mode 100644 tests/__init__.py create mode 100644 tests/test_assets.py create mode 100644 tests/test_data/content/2012-11-30_filename-metadata.rst create mode 100644 tests/test_data/content/another_super_article-fr.rst create mode 100644 tests/test_data/content/another_super_article.rst create mode 100644 tests/test_data/content/article2-fr.rst create mode 100644 tests/test_data/content/article2.rst create mode 100644 tests/test_data/content/cat1/article1.rst create mode 100644 tests/test_data/content/cat1/article2.rst create mode 100644 tests/test_data/content/cat1/article3.rst create mode 100644 tests/test_data/content/cat1/markdown-article.md create mode 100644 tests/test_data/content/draft_article.rst create mode 100644 tests/test_data/content/extra/robots.txt create mode 100644 tests/test_data/content/pages/hidden_page.rst create mode 100644 tests/test_data/content/pages/jinja2_template.html create mode 100644 tests/test_data/content/pages/override_url_saveas.rst create mode 100644 tests/test_data/content/pages/test_page.rst create mode 100644 tests/test_data/content/pictures/Fat_Cat.jpg create mode 100644 tests/test_data/content/pictures/Sushi.jpg create mode 100644 tests/test_data/content/pictures/Sushi_Macro.jpg create mode 100644 tests/test_data/content/super_article.rst create mode 100644 tests/test_data/content/unbelievable.rst create mode 100644 tests/test_data/content/unwanted_file create mode 100755 tests/test_data/pelican.conf.py create mode 100644 tests/test_data/themes/assets_theme/static/css/style.min.css create mode 100644 tests/test_data/themes/assets_theme/static/css/style.scss create mode 100644 tests/test_data/themes/assets_theme/templates/base.html create mode 100644 tests/test_data/themes/notmyidea/static/css/main.css create mode 100644 tests/test_data/themes/notmyidea/static/css/pygment.css create mode 100644 tests/test_data/themes/notmyidea/static/css/reset.css create mode 100644 tests/test_data/themes/notmyidea/static/css/typogrify.css create mode 100644 tests/test_data/themes/notmyidea/static/css/wide.css create mode 100644 tests/test_data/themes/notmyidea/static/images/icons/aboutme.png create mode 100644 tests/test_data/themes/notmyidea/static/images/icons/bitbucket.png create mode 100644 tests/test_data/themes/notmyidea/static/images/icons/delicious.png create mode 100644 tests/test_data/themes/notmyidea/static/images/icons/facebook.png create mode 100644 tests/test_data/themes/notmyidea/static/images/icons/github.png create mode 100644 tests/test_data/themes/notmyidea/static/images/icons/gitorious.png create mode 100644 tests/test_data/themes/notmyidea/static/images/icons/gittip.png create mode 100644 tests/test_data/themes/notmyidea/static/images/icons/google-groups.png create mode 100644 tests/test_data/themes/notmyidea/static/images/icons/google-plus.png create mode 100644 tests/test_data/themes/notmyidea/static/images/icons/hackernews.png create mode 100644 tests/test_data/themes/notmyidea/static/images/icons/lastfm.png create mode 100644 tests/test_data/themes/notmyidea/static/images/icons/linkedin.png create mode 100644 tests/test_data/themes/notmyidea/static/images/icons/reddit.png create mode 100644 tests/test_data/themes/notmyidea/static/images/icons/rss.png create mode 100644 tests/test_data/themes/notmyidea/static/images/icons/slideshare.png create mode 100644 tests/test_data/themes/notmyidea/static/images/icons/speakerdeck.png create mode 100644 tests/test_data/themes/notmyidea/static/images/icons/twitter.png create mode 100644 tests/test_data/themes/notmyidea/static/images/icons/vimeo.png create mode 100644 tests/test_data/themes/notmyidea/static/images/icons/youtube.png create mode 100644 tests/test_data/themes/notmyidea/templates/analytics.html create mode 100644 tests/test_data/themes/notmyidea/templates/archives.html create mode 100644 tests/test_data/themes/notmyidea/templates/article.html create mode 100644 tests/test_data/themes/notmyidea/templates/article_infos.html create mode 100644 tests/test_data/themes/notmyidea/templates/author.html rename pelicanext/__init__.py => tests/test_data/themes/notmyidea/templates/authors.html (100%) create mode 100644 tests/test_data/themes/notmyidea/templates/base.html create mode 100644 tests/test_data/themes/notmyidea/templates/category.html create mode 100644 tests/test_data/themes/notmyidea/templates/comments.html create mode 100644 tests/test_data/themes/notmyidea/templates/disqus_script.html create mode 100644 tests/test_data/themes/notmyidea/templates/github.html create mode 100644 tests/test_data/themes/notmyidea/templates/index.html create mode 100644 tests/test_data/themes/notmyidea/templates/page.html create mode 100644 tests/test_data/themes/notmyidea/templates/piwik.html create mode 100644 tests/test_data/themes/notmyidea/templates/tag.html create mode 100644 tests/test_data/themes/notmyidea/templates/taglist.html create mode 100644 tests/test_data/themes/notmyidea/templates/translations.html create mode 100644 tests/test_data/themes/notmyidea/templates/twitter.html create mode 100644 tests/test_data/themes/simple/templates/archives.html create mode 100644 tests/test_data/themes/simple/templates/article.html create mode 100644 tests/test_data/themes/simple/templates/author.html create mode 100644 tests/test_data/themes/simple/templates/base.html create mode 100644 tests/test_data/themes/simple/templates/categories.html create mode 100644 tests/test_data/themes/simple/templates/category.html create mode 100644 tests/test_data/themes/simple/templates/gosquared.html create mode 100644 tests/test_data/themes/simple/templates/index.html create mode 100644 tests/test_data/themes/simple/templates/page.html create mode 100644 tests/test_data/themes/simple/templates/pagination.html rename pelicanext/goodreads_activity/__init__.py => tests/test_data/themes/simple/templates/tag.html (100%) rename pelicanext/latex/__init__.py => tests/test_data/themes/simple/templates/tags.html (100%) create mode 100644 tests/test_data/themes/simple/templates/translations.html create mode 100644 tests/test_data/themes/test_summary.py create mode 100644 tests/test_gzip_cache.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7e99e36 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.pyc \ No newline at end of file diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..bfb6446 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,13 @@ +language: python +python: + - "2.7" + - "3.2" +before_install: + - sudo apt-get update -qq + - sudo apt-get install -qq --no-install-recommends ruby-sass +install: + - pip install nose + - pip install -e git://github.com/getpelican/pelican.git#egg=pelican + - pip install --use-mirrors Markdown + - if [[ $TRAVIS_PYTHON_VERSION == '2.7' ]]; then pip install --use-mirrors webassets cssmin; fi +script: nosetests tests diff --git a/Contributing.rst b/Contributing.rst new file mode 100644 index 0000000..913d71c --- /dev/null +++ b/Contributing.rst @@ -0,0 +1,29 @@ +Contributing a plugin +===================== + +Details of how to write a plugin is explained in the official Pelican `docs`_. + +If you want to contribute, please fork this repository and issue your pull +request. Make sure that your plugin follows the structure below:: + + my_plugin + ├── __init__.py + ├── my_plugin.py + └── Readme.rst / Readme.md + +``my_plugin.py`` is the actual plugin implementation. Include a brief +explanation of what the plugin does as a module docstring. Leave any further +explanations and usage details to ``Readme`` file. + +``__init__.py`` should contain a single line with ``from .my_plugin import *``. + +If you have tests for your plugin, place them in the ``tests`` folder with name +``test_my_plugin.py``. You can use ``test_data`` folder inside, if you need content +or templates in your tests. + +**Note:** Plugins in the repository are licensed with *GNU AFFERO GENERAL PUBLIC LICENSE +Version 3*. By submitting a pull request, you accept to release your +contribution under same license. Please refer to the ``LICENSE`` file for +full text of the license. + +.. _docs: http://docs.getpelican.com/en/latest/plugins.html#how-to-create-plugins diff --git a/README.rst b/README.rst deleted file mode 100644 index 41de2bd..0000000 --- a/README.rst +++ /dev/null @@ -1,11 +0,0 @@ -Pelican Plugins -############### - -This repository contains plugins for Pelican. At the moment, this is only a -subset of the available plugins, with others currently residing in the primary -Pelican repository. Those latter plugins will eventually be moved here, so all -plugins will be in one place. - -That being the case, if you have a plugin to contribute, please fork this -Pelican Plugins repository and issue your pull request from there (as opposed -to the primary Pelican repository). diff --git a/Readme.rst b/Readme.rst new file mode 100644 index 0000000..5d957aa --- /dev/null +++ b/Readme.rst @@ -0,0 +1,41 @@ +Pelican Plugins +############### + +Beginning with version 3.0, Pelican supports plugins. Plugins are a way to add +features to Pelican without having to directly modify the Pelican core. Starting +with 3.2, all plugins (including the ones previously in the core) are +moved here, so this is the central place for all plugins. + +How to use plugins +================== + +Easiest way to install and use these plugins is cloning this repo:: + + git clone https://github.com/getpelican/pelican-plugins + +and activating the ones you want in your settings file:: + + PLUGIN_PATH = 'path/to/pelican-plugins' + PLUGINS = ['assets', 'sitemap', 'gravatar'] + +``PLUGIN_PATH`` can be a path relative to your settings file or an absolute path. + +Alternatively, if plugins are in an importable path, you can omit ``PLUGIN_PATH`` +and list them:: + + PLUGINS = ['assets', 'sitemap', 'gravatar'] + +or you can ``import`` the plugin directly and give that:: + + import my_plugin + PLUGINS = [my_plugin, 'assets'] + +Please refer to the ``Readme`` file in a plugin's folder for detailed information about +that plugin. + +Contributing a plugin +===================== + +Please refer to the `Contributing`_ file. + +.. _Contributing: Contributing.rst diff --git a/assets/Readme.rst b/assets/Readme.rst new file mode 100644 index 0000000..a61959f --- /dev/null +++ b/assets/Readme.rst @@ -0,0 +1,80 @@ +Asset management +---------------- + +This plugin allows you to use the `Webassets`_ module to manage assets such as +CSS and JS files. The module must first be installed:: + + pip install webassets + +The Webassets module allows you to perform a number of useful asset management +functions, including: + +* CSS minifier (``cssmin``, ``yui_css``, ...) +* CSS compiler (``less``, ``sass``, ...) +* JS minifier (``uglifyjs``, ``yui_js``, ``closure``, ...) + +Others filters include gzip compression, integration of images in CSS via data +URIs, and more. Webassets can also append a version identifier to your asset +URL to convince browsers to download new versions of your assets when you use +far-future expires headers. Please refer to the `Webassets documentation`_ for +more information. + +When used with Pelican, Webassets is configured to process assets in the +``OUTPUT_PATH/theme`` directory. You can use Webassets in your templates by +including one or more template tags. The Jinja variable ``{{ ASSET_URL }}`` can +be used in templates and is relative to the ``theme/`` url. The +``{{ ASSET_URL }}`` variable should be used in conjunction with the +``{{ SITEURL }}`` variable in order to generate URLs properly. For example: + +.. code-block:: jinja + + {% assets filters="cssmin", output="css/style.min.css", "css/inuit.css", "css/pygment-monokai.css", "css/main.css" %} + + {% endassets %} + +... will produce a minified css file with a version identifier that looks like: + +.. code-block:: html + + + +These filters can be combined. Here is an example that uses the SASS compiler +and minifies the output: + +.. code-block:: jinja + + {% assets filters="sass,cssmin", output="css/style.min.css", "css/style.scss" %} + + {% endassets %} + +Another example for Javascript: + +.. code-block:: jinja + + {% assets filters="uglifyjs,gzip", output="js/packed.js", "js/jquery.js", "js/base.js", "js/widgets.js" %} + + {% endassets %} + +The above will produce a minified and gzipped JS file: + +.. code-block:: html + + + +Pelican's debug mode is propagated to Webassets to disable asset packaging +and instead work with the uncompressed assets. + +Many of Webasset's available compilers have additional configuration options +(i.e. 'Less', 'Sass', 'Stylus', 'Closure_js'). You can pass these options to +Webassets using the ``ASSET_CONFIG`` in your settings file. + +The following will handle Google Closure's compilation level and locate +LessCSS's binary: + +.. code-block:: python + + ASSET_CONFIG = (('closure_compressor_optimization', 'WHITESPACE_ONLY'), + ('less_bin', 'lessc.cmd'), ) + +.. _Webassets: https://github.com/miracle2k/webassets +.. _Webassets documentation: http://webassets.readthedocs.org/en/latest/builtin_filters.html diff --git a/assets/__init__.py b/assets/__init__.py new file mode 100644 index 0000000..67b75dd --- /dev/null +++ b/assets/__init__.py @@ -0,0 +1 @@ +from .assets import * diff --git a/assets/assets.py b/assets/assets.py new file mode 100644 index 0000000..4e2d104 --- /dev/null +++ b/assets/assets.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +""" +Asset management plugin for Pelican +=================================== + +This plugin allows you to use the `webassets`_ module to manage assets such as +CSS and JS files. + +The ASSET_URL is set to a relative url to honor Pelican's RELATIVE_URLS +setting. This requires the use of SITEURL in the templates:: + + + +.. _webassets: https://webassets.readthedocs.org/ + +""" +from __future__ import unicode_literals + +import os +import logging + +from pelican import signals +from webassets import Environment +from webassets.ext.jinja2 import AssetsExtension + + +def add_jinja2_ext(pelican): + """Add Webassets to Jinja2 extensions in Pelican settings.""" + + pelican.settings['JINJA_EXTENSIONS'].append(AssetsExtension) + + +def create_assets_env(generator): + """Define the assets environment and pass it to the generator.""" + + assets_url = 'theme/' + assets_src = os.path.join(generator.output_path, 'theme') + generator.env.assets_environment = Environment(assets_src, assets_url) + + if 'ASSET_CONFIG' in generator.settings: + for item in generator.settings['ASSET_CONFIG']: + generator.env.assets_environment.config[item[0]] = item[1] + + logger = logging.getLogger(__name__) + if logging.getLevelName(logger.getEffectiveLevel()) == "DEBUG": + generator.env.assets_environment.debug = True + + +def register(): + """Plugin registration.""" + + signals.initialized.connect(add_jinja2_ext) + signals.generator_init.connect(create_assets_env) diff --git a/github_activity/Readme.rst b/github_activity/Readme.rst new file mode 100644 index 0000000..fa3b95d --- /dev/null +++ b/github_activity/Readme.rst @@ -0,0 +1,30 @@ +GitHub activity +--------------- + +This plugin makes use of the `feedparser`_ library that you'll need to +install. + +Set the ``GITHUB_ACTIVITY_FEED`` parameter to your GitHub activity feed. +For example, to track Pelican project activity, the setting would be:: + + GITHUB_ACTIVITY_FEED = 'https://github.com/getpelican.atom' + +On the template side, you just have to iterate over the ``github_activity`` +variable, as in this example:: + + {% if GITHUB_ACTIVITY_FEED %} +
+

Github Activity

+ +
+ {% endif %} + +``github_activity`` is a list of lists. The first element is the title, +and the second element is the raw HTML from GitHub. + +.. _feedparser: https://crate.io/packages/feedparser/ diff --git a/github_activity/__init__.py b/github_activity/__init__.py new file mode 100644 index 0000000..19b6db8 --- /dev/null +++ b/github_activity/__init__.py @@ -0,0 +1 @@ +from .github_activity import * diff --git a/github_activity/github_activity.py b/github_activity/github_activity.py new file mode 100644 index 0000000..f0b1e0b --- /dev/null +++ b/github_activity/github_activity.py @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- + +# NEEDS WORK +""" +Copyright (c) Marco Milanesi + +Github Activity +--------------- +A plugin to list your Github Activity +""" + +from __future__ import unicode_literals, print_function + +from pelican import signals + + +class GitHubActivity(): + """ + A class created to fetch github activity with feedparser + """ + def __init__(self, generator): + try: + import feedparser + self.activities = feedparser.parse( + generator.settings['GITHUB_ACTIVITY_FEED']) + except ImportError: + raise Exception("Unable to find feedparser") + + def fetch(self): + """ + returns a list of html snippets fetched from github actitivy feed + """ + + entries = [] + for activity in self.activities['entries']: + entries.append( + [element for element in [activity['title'], + activity['content'][0]['value']]]) + + return entries + + +def fetch_github_activity(gen, metadata): + """ + registered handler for the github activity plugin + it puts in generator.context the html needed to be displayed on a + template + """ + + if 'GITHUB_ACTIVITY_FEED' in gen.settings.keys(): + gen.context['github_activity'] = gen.plugin_instance.fetch() + + +def feed_parser_initialization(generator): + """ + Initialization of feed parser + """ + + generator.plugin_instance = GitHubActivity(generator) + + +def register(): + """ + Plugin registration + """ + signals.article_generator_init.connect(feed_parser_initialization) + signals.article_generate_context.connect(fetch_github_activity) diff --git a/global_license/Readme.rst b/global_license/Readme.rst new file mode 100644 index 0000000..0b314f0 --- /dev/null +++ b/global_license/Readme.rst @@ -0,0 +1,6 @@ +Global license +-------------- + +This plugin allows you to define a ``LICENSE`` setting and adds the contents of that +license variable to the article's context, making that variable available to use +from within your theme's templates. diff --git a/global_license/__init__.py b/global_license/__init__.py new file mode 100644 index 0000000..ffe2862 --- /dev/null +++ b/global_license/__init__.py @@ -0,0 +1 @@ +from .global_license import * diff --git a/global_license/global_license.py b/global_license/global_license.py new file mode 100644 index 0000000..60c4fe9 --- /dev/null +++ b/global_license/global_license.py @@ -0,0 +1,18 @@ +""" +License plugin for Pelican +========================== + +This plugin allows you to define a LICENSE setting and adds the contents of that +license variable to the article's context, making that variable available to use +from within your theme's templates. +""" + +from pelican import signals + +def add_license(generator, metadata): + if 'license' not in metadata.keys()\ + and 'LICENSE' in generator.settings.keys(): + metadata['license'] = generator.settings['LICENSE'] + +def register(): + signals.article_generate_context.connect(add_license) diff --git a/pelicanext/goodreads_activity/README.md b/goodreads_activity/Readme.md similarity index 100% rename from pelicanext/goodreads_activity/README.md rename to goodreads_activity/Readme.md diff --git a/goodreads_activity/__init__.py b/goodreads_activity/__init__.py new file mode 100644 index 0000000..176113d --- /dev/null +++ b/goodreads_activity/__init__.py @@ -0,0 +1 @@ +from .goodreads_activity import * \ No newline at end of file diff --git a/pelicanext/goodreads_activity/goodreads_activity.py b/goodreads_activity/goodreads_activity.py similarity index 91% rename from pelicanext/goodreads_activity/goodreads_activity.py rename to goodreads_activity/goodreads_activity.py index 8e1ebc0..e92c3d3 100644 --- a/pelicanext/goodreads_activity/goodreads_activity.py +++ b/goodreads_activity/goodreads_activity.py @@ -1,4 +1,13 @@ # -*- coding: utf-8 -*- +""" +Goodreads Activity +================== + +A Pelican plugin to lists books from your Goodreads shelves. + +Copyright (c) Talha Mansoor +""" + from __future__ import unicode_literals from pelican import signals import feedparser diff --git a/gravatar/Readme.rst b/gravatar/Readme.rst new file mode 100644 index 0000000..a37335d --- /dev/null +++ b/gravatar/Readme.rst @@ -0,0 +1,15 @@ +Gravatar +-------- + +This plugin assigns the ``author_gravatar`` variable to the Gravatar URL and +makes the variable available within the article's context. You can add +``AUTHOR_EMAIL`` to your settings file to define the default author's email +address. Obviously, that email address must be associated with a Gravatar +account. + +Alternatively, you can provide an email address from within article metadata:: + + :email: john.doe@example.com + +If the email address is defined via at least one of the two methods above, +the ``author_gravatar`` variable is added to the article's context. diff --git a/gravatar/__init__.py b/gravatar/__init__.py new file mode 100644 index 0000000..cc60487 --- /dev/null +++ b/gravatar/__init__.py @@ -0,0 +1 @@ +from .gravatar import * diff --git a/gravatar/gravatar.py b/gravatar/gravatar.py new file mode 100644 index 0000000..303d3c0 --- /dev/null +++ b/gravatar/gravatar.py @@ -0,0 +1,31 @@ +""" +Gravatar plugin for Pelican +=========================== + +This plugin assigns the ``author_gravatar`` variable to the Gravatar URL and +makes the variable available within the article's context. +""" + +import hashlib +import six + +from pelican import signals + + +def add_gravatar(generator, metadata): + + #first check email + if 'email' not in metadata.keys()\ + and 'AUTHOR_EMAIL' in generator.settings.keys(): + metadata['email'] = generator.settings['AUTHOR_EMAIL'] + + #then add gravatar url + if 'email' in metadata.keys(): + email_bytes = six.b(metadata['email']).lower() + gravatar_url = "http://www.gravatar.com/avatar/" + \ + hashlib.md5(email_bytes).hexdigest() + metadata["author_gravatar"] = gravatar_url + + +def register(): + signals.article_generate_context.connect(add_gravatar) diff --git a/gzip_cache/Readme.rst b/gzip_cache/Readme.rst new file mode 100644 index 0000000..c5ff76f --- /dev/null +++ b/gzip_cache/Readme.rst @@ -0,0 +1,10 @@ +Gzip cache +---------- + +Certain web servers (e.g., Nginx) can use a static cache of gzip-compressed +files to prevent the server from compressing files during an HTTP call. Since +compression occurs at another time, these compressed files can be compressed +at a higher compression level for increased optimization. + +The ``gzip_cache`` plugin compresses all common text type files into a ``.gz`` +file within the same directory as the original file. diff --git a/gzip_cache/__init__.py b/gzip_cache/__init__.py new file mode 100644 index 0000000..fb76712 --- /dev/null +++ b/gzip_cache/__init__.py @@ -0,0 +1 @@ +from .gzip_cache import * diff --git a/gzip_cache/gzip_cache.py b/gzip_cache/gzip_cache.py new file mode 100644 index 0000000..1a8dd83 --- /dev/null +++ b/gzip_cache/gzip_cache.py @@ -0,0 +1,84 @@ +''' +Copyright (c) 2012 Matt Layman + +Gzip cache +---------- + +A plugin to create .gz cache files for optimization. +''' + +import gzip +import logging +import os + +from pelican import signals + +logger = logging.getLogger(__name__) + +# A list of file types to exclude from possible compression +EXCLUDE_TYPES = [ + # Compressed types + '.bz2', + '.gz', + + # Audio types + '.aac', + '.flac', + '.mp3', + '.wma', + + # Image types + '.gif', + '.jpg', + '.jpeg', + '.png', + + # Video types + '.avi', + '.mov', + '.mp4', +] + +def create_gzip_cache(pelican): + '''Create a gzip cache file for every file that a webserver would + reasonably want to cache (e.g., text type files). + + :param pelican: The Pelican instance + ''' + for dirpath, _, filenames in os.walk(pelican.settings['OUTPUT_PATH']): + for name in filenames: + if should_compress(name): + filepath = os.path.join(dirpath, name) + create_gzip_file(filepath) + +def should_compress(filename): + '''Check if the filename is a type of file that should be compressed. + + :param filename: A file name to check against + ''' + for extension in EXCLUDE_TYPES: + if filename.endswith(extension): + return False + + return True + +def create_gzip_file(filepath): + '''Create a gzipped file in the same directory with a filepath.gz name. + + :param filepath: A file to compress + ''' + compressed_path = filepath + '.gz' + + with open(filepath, 'rb') as uncompressed: + try: + logger.debug('Compressing: %s' % filepath) + compressed = gzip.open(compressed_path, 'wb') + compressed.writelines(uncompressed) + except Exception as ex: + logger.critical('Gzip compression failed: %s' % ex) + finally: + compressed.close() + +def register(): + signals.finalized.connect(create_gzip_cache) + diff --git a/html_rst_directive/Readme.rst b/html_rst_directive/Readme.rst new file mode 100644 index 0000000..93a7a1d --- /dev/null +++ b/html_rst_directive/Readme.rst @@ -0,0 +1,45 @@ +HTML tags for reStructuredText +------------------------------ + +This plugin allows you to use HTML tags from within reST documents. + + +Directives +---------- + + +:: + + .. html:: + + (HTML code) + + +Example +------- + +A search engine:: + + .. html:: + +
+ + + +
+ + +A contact form:: + + .. html:: + +
+

+ +
+ +
+ +

+
diff --git a/html_rst_directive/__init__.py b/html_rst_directive/__init__.py new file mode 100644 index 0000000..57ec228 --- /dev/null +++ b/html_rst_directive/__init__.py @@ -0,0 +1 @@ +from .html_rst_directive import * diff --git a/html_rst_directive/html_rst_directive.py b/html_rst_directive/html_rst_directive.py new file mode 100644 index 0000000..ed877da --- /dev/null +++ b/html_rst_directive/html_rst_directive.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +""" +HTML tags for reStructuredText +============================== + +This plugin allows you to use HTML tags from within reST documents. + +""" + +from __future__ import unicode_literals +from docutils import nodes +from docutils.parsers.rst import directives, Directive + + +class RawHtml(Directive): + required_arguments = 0 + optional_arguments = 0 + final_argument_whitespace = True + has_content = True + + def run(self): + html = ' '.join(self.content) + node = nodes.raw('', html, format='html') + return [node] + + + +def register(): + directives.register_directive('html', RawHtml) + diff --git a/pelicanext/latex/Readme.md b/latex/Readme.md similarity index 100% rename from pelicanext/latex/Readme.md rename to latex/Readme.md diff --git a/latex/__init__.py b/latex/__init__.py new file mode 100644 index 0000000..1b2ce76 --- /dev/null +++ b/latex/__init__.py @@ -0,0 +1 @@ +from .latex import * \ No newline at end of file diff --git a/latex/latex.py b/latex/latex.py new file mode 100644 index 0000000..2ebd1c7 --- /dev/null +++ b/latex/latex.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +""" +Latex Plugin For Pelican +======================== + +This plugin allows you to write mathematical equations in your articles using Latex. +It uses the MathJax Latex JavaScript library to render latex that is embedded in +between `$..$` for inline math and `$$..$$` for displayed math. It also allows for +writing equations in by using `\begin{equation}`...`\end{equation}`. +""" + +from pelican import signals + +latexScript = """ + +""" + +def addLatex(gen, metadata): + """ + The registered handler for the latex plugin. It will add + the latex script to the article metadata + """ + if 'LATEX' in gen.settings.keys() and gen.settings['LATEX'] == 'article': + if 'latex' in metadata.keys(): + metadata['latex'] = latexScript + else: + metadata['latex'] = latexScript + +def register(): + """ + Plugin registration + """ + signals.article_generate_context.connect(addLatex) diff --git a/pelicanext/multi_part/README.md b/multi_part/Readme.md similarity index 87% rename from pelicanext/multi_part/README.md rename to multi_part/Readme.md index ec553eb..f6caf93 100644 --- a/pelicanext/multi_part/README.md +++ b/multi_part/Readme.md @@ -7,7 +7,9 @@ In order to mark posts as part of a multi-part post, use the `:parts:` metadata: :parts: MY_AWESOME_MULTI_PART_POST -You can then use the `article.related_posts` variable in your templates to display other parts of current post. +You can then use the `article.metadata.parts_articles` variable in your templates +to display other parts of current post. + For example: {% if article.metadata.parts_articles %} diff --git a/multi_part/__init__.py b/multi_part/__init__.py new file mode 100644 index 0000000..6e00046 --- /dev/null +++ b/multi_part/__init__.py @@ -0,0 +1 @@ +from .multi_part import * diff --git a/pelicanext/multi_part/multi_part.py b/multi_part/multi_part.py similarity index 53% rename from pelicanext/multi_part/multi_part.py rename to multi_part/multi_part.py index 0581b50..8aa3bca 100644 --- a/pelicanext/multi_part/multi_part.py +++ b/multi_part/multi_part.py @@ -6,33 +6,8 @@ Multiple part support ===================== Create a navigation menu for multi-part related_posts - -Article metadata: ------------------- - -:parts: a unique identifier for multi-part posts, must be the same in each -post part. - -Usage ------ - {% if article.metadata.parts_articles %} -
    - {% for part_article in article.metadata.parts_articles %} - {% if part_article == article %} -
  1. - {{ part_article.title }} - -
  2. - {% else %} -
  3. - {{ part_article.title }} - -
  4. - {% endif %} - {% endfor %} -
- {% endif %} """ + from collections import defaultdict from pelican import signals diff --git a/pelicanext/neighbors/README.rst b/neighbors/Readme.rst similarity index 55% rename from pelicanext/neighbors/README.rst rename to neighbors/Readme.rst index e772fde..e6f7eb5 100644 --- a/pelicanext/neighbors/README.rst +++ b/neighbors/Readme.rst @@ -4,23 +4,6 @@ Neighbor Articles Plugin for Pelican This plugin adds ``next_article`` (newer) and ``prev_article`` (older) variables to the article's context -Installation ------------- -To enable, ensure that ``neighbors.py`` is in somewhere you can ``import``. -Then use the following in your `settings`:: - - PLUGINS = ["neighbors"] - -Or you can put the plugin in ``plugins`` folder in pelican installation. You -can find the location by typing:: - - python -c 'import pelican.plugins as p, os; print os.path.dirname(p.__file__)' - -Once you get the folder, copy the ``neighbors.py`` there and use the following -in your settings:: - - PLUGINS = ["pelican.plugins.neighbors"] - Usage ----- @@ -41,4 +24,4 @@ Usage {% endif %} - \ No newline at end of file + diff --git a/neighbors/__init__.py b/neighbors/__init__.py new file mode 100644 index 0000000..9038d7e --- /dev/null +++ b/neighbors/__init__.py @@ -0,0 +1 @@ +from .neighbors import * diff --git a/pelicanext/neighbors/neighbors.py b/neighbors/neighbors.py similarity index 100% rename from pelicanext/neighbors/neighbors.py rename to neighbors/neighbors.py diff --git a/pelicanext/latex/latex.py b/pelicanext/latex/latex.py deleted file mode 100644 index 8785fdf..0000000 --- a/pelicanext/latex/latex.py +++ /dev/null @@ -1,112 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Latex Plugin For Pelican -======================== - -This plugin allows you to write mathematical equations in your articles using Latex. -It uses the MathJax Latex JavaScript library to render latex that is embedded in -between `$..$` for inline math and `$$..$$` for displayed math. It also allows for -writing equations in by using `\begin{equation}`...`\end{equation}`. - -Installation ------------- - -To enable, ensure that `latex.py` is put somewhere that is accessible. -Then use as follows by adding the following to your settings.py: - - PLUGINS = ["latex"] - -Be careful: Not loading the plugin is easy to do, and difficult to detect. To -make life easier, find where pelican is installed, and then copy the plugin -there. An easy way to find where pelican is installed is to verbose list the -available themes by typing `pelican-themes -l -v`. - -Once the pelican folder is found, copy `latex.py` to the `plugins` folder. Then -add to settings.py like this: - - PLUGINS = ["pelican.plugins.latex"] - -Now all that is left to do is to embed the following to your template file -between the `` parameters (for the NotMyIdea template, this file is base.html) - - {% if article and article.latex %} - {{ article.latex }} - {% endif %} - -Usage ------ -Latex will be embedded in every article. If however you want latex only for -selected articles, then in settings.py, add - - LATEX = 'article' - -And in each article, add the metadata key `latex:`. For example, with the above -settings, creating an article that I want to render latex math, I would just -include 'Latex' as part of the metadata without any value: - - Date: 1 sep 2012 - Status: draft - Latex: - -Latex Examples --------------- -###Inline -Latex between `$`..`$`, for example, `$`x^2`$`, will be rendered inline -with respect to the current html block. - -###Displayed Math -Latex between `$$`..`$$`, for example, `$$`x^2`$$`, will be rendered centered in a -new paragraph. - -###Equations -Latex between `\begin` and `\end`, for example, `begin{equation}` x^2 `\end{equation}`, -will be rendered centered in a new paragraph with a right justified equation number -at the top of the paragraph. This equation number can be referenced in the document. -To do this, use a `label` inside of the equation format and then refer to that label -using `ref`. For example: `begin{equation}` `\label{eq}` X^2 `\end{equation}`. Now -refer to that equation number by `$`\ref{eq}`$`. - -Template And Article Examples ------------------------------ -To see an example of this plugin in action, look at -[this article](http://doctrina.org/How-RSA-Works-With-Examples.html). To see how -this plugin works with a template, look at -[this template](https://github.com/barrysteyn/pelican_theme-personal_blog). -""" - -from pelican import signals - -latexScript = """ - -""" - -def addLatex(gen, metadata): - """ - The registered handler for the latex plugin. It will add - the latex script to the article metadata - """ - if 'LATEX' in gen.settings.keys() and gen.settings['LATEX'] == 'article': - if 'latex' in metadata.keys(): - metadata['latex'] = latexScript - else: - metadata['latex'] = latexScript - -def register(): - """ - Plugin registration - """ - signals.article_generate_context.connect(addLatex) diff --git a/pelicanext/random_article/Readme.md b/pelicanext/random_article/Readme.md deleted file mode 100644 index f12a899..0000000 --- a/pelicanext/random_article/Readme.md +++ /dev/null @@ -1,36 +0,0 @@ -Random Article Plugin For Pelican -======================== - -This plugin generates a html file which redirect to a random article -using javascript's window.location. The generated html file is -saved at SITEURL. - -Only published articles are listed to redirect. - - -Installation ------------- - -To enable, ensure that `random_article.py` is put somewhere that is accessible. -Then use as follows by adding the following to your settings.py: - - PLUGINS = ["random_article"] - -An easy way to find where pelican is installed is to verbose list the -available themes by typing `pelican-themes -l -v`. - -Once the pelican folder is found, copy `random_article.py` to the `plugins` folder. Then -add to settings.py like this: - - PLUGINS = ["pelican.plugins.random_article"] - -Usage ------ - -To use it you have to add in your config file the name of the file to use: - - RANDOM = 'random.html' - -Then in some template you add: - - random article diff --git a/pelicanext/sitemap/__init__.py b/pelicanext/sitemap/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/random_article/Readme.md b/random_article/Readme.md new file mode 100644 index 0000000..fcf00a1 --- /dev/null +++ b/random_article/Readme.md @@ -0,0 +1,19 @@ +Random Article Plugin For Pelican +======================== + +This plugin generates a html file which redirect to a random article +using javascript's `window.location`. The generated html file is +saved at `SITEURL`. + +Only published articles are listed to redirect. + +Usage +----- + +To use it you have to add in your config file the name of the file to use: + + RANDOM = 'random.html' + +Then in some template you add: + + random article diff --git a/random_article/__init__.py b/random_article/__init__.py new file mode 100644 index 0000000..b59a6a0 --- /dev/null +++ b/random_article/__init__.py @@ -0,0 +1 @@ +from .random_article import * diff --git a/pelicanext/random_article/random_article.py b/random_article/random_article.py similarity index 89% rename from pelicanext/random_article/random_article.py rename to random_article/random_article.py index 056c542..8f49448 100644 --- a/pelicanext/random_article/random_article.py +++ b/random_article/random_article.py @@ -1,4 +1,13 @@ # -*- coding: utf-8 -*- +""" +Random Article Plugin For Pelican +======================== + +This plugin generates a html file which redirect to a random article +using javascript's window.location. The generated html file is +saved at SITEURL. +""" + from __future__ import unicode_literals import os.path diff --git a/related_posts/Readme.rst b/related_posts/Readme.rst new file mode 100644 index 0000000..db97149 --- /dev/null +++ b/related_posts/Readme.rst @@ -0,0 +1,19 @@ +Related posts +------------- + +This plugin adds the ``related_posts`` variable to the article's context. +By default, up to 5 articles are listed. You can customize this value by +defining ``RELATED_POSTS_MAX`` in your settings file:: + + RELATED_POSTS_MAX = 10 + +You can then use the ``article.related_posts`` variable in your templates. +For example:: + + {% if article.related_posts %} + + {% endif %} diff --git a/related_posts/__init__.py b/related_posts/__init__.py new file mode 100644 index 0000000..057540e --- /dev/null +++ b/related_posts/__init__.py @@ -0,0 +1 @@ +from .related_posts import * diff --git a/related_posts/related_posts.py b/related_posts/related_posts.py new file mode 100644 index 0000000..8199900 --- /dev/null +++ b/related_posts/related_posts.py @@ -0,0 +1,35 @@ +""" +Related posts plugin for Pelican +================================ + +Adds related_posts variable to article's context +""" + +from pelican import signals +from collections import Counter + + +def add_related_posts(generator): + # get the max number of entries from settings + # or fall back to default (5) + numentries = generator.settings.get('RELATED_POSTS_MAX', 5) + + for article in generator.articles: + # no tag, no relation + if not hasattr(article, 'tags'): + continue + + # score = number of common tags + scores = Counter() + for tag in article.tags: + scores += Counter(generator.tags[tag]) + + # remove itself + scores.pop(article) + + article.related_posts = [other for other, count + in scores.most_common(numentries)] + + +def register(): + signals.article_generator_finalized.connect(add_related_posts) \ No newline at end of file diff --git a/sitemap/Readme.rst b/sitemap/Readme.rst new file mode 100644 index 0000000..b58a8d5 --- /dev/null +++ b/sitemap/Readme.rst @@ -0,0 +1,65 @@ +Sitemap +------- + +The sitemap plugin generates plain-text or XML sitemaps. You can use the +``SITEMAP`` variable in your settings file to configure the behavior of the +plugin. + +The ``SITEMAP`` variable must be a Python dictionary and can contain three keys: + +- ``format``, which sets the output format of the plugin (``xml`` or ``txt``) + +- ``priorities``, which is a dictionary with three keys: + + - ``articles``, the priority for the URLs of the articles and their + translations + + - ``pages``, the priority for the URLs of the static pages + + - ``indexes``, the priority for the URLs of the index pages, such as tags, + author pages, categories indexes, archives, etc... + + All the values of this dictionary must be decimal numbers between ``0`` and ``1``. + +- ``changefreqs``, which is a dictionary with three items: + + - ``articles``, the update frequency of the articles + + - ``pages``, the update frequency of the pages + + - ``indexes``, the update frequency of the index pages + + Valid frequency values are ``always``, ``hourly``, ``daily``, ``weekly``, ``monthly``, + ``yearly`` and ``never``. + +If a key is missing or a value is incorrect, it will be replaced with the +default value. + +The sitemap is saved in ``/sitemap.``. + +.. note:: + ``priorities`` and ``changefreqs`` are information for search engines. + They are only used in the XML sitemaps. + For more information: + +**Example** + +Here is an example configuration (it's also the default settings): + +.. code-block:: python + + PLUGINS=['pelican.plugins.sitemap',] + + SITEMAP = { + 'format': 'xml', + 'priorities': { + 'articles': 0.5, + 'indexes': 0.5, + 'pages': 0.5 + }, + 'changefreqs': { + 'articles': 'monthly', + 'indexes': 'daily', + 'pages': 'monthly' + } + } diff --git a/sitemap/__init__.py b/sitemap/__init__.py new file mode 100644 index 0000000..6523d3a --- /dev/null +++ b/sitemap/__init__.py @@ -0,0 +1 @@ +from .sitemap import * \ No newline at end of file diff --git a/pelicanext/sitemap/sitemap.py b/sitemap/sitemap.py similarity index 98% rename from pelicanext/sitemap/sitemap.py rename to sitemap/sitemap.py index 8043baa..33529b7 100644 --- a/pelicanext/sitemap/sitemap.py +++ b/sitemap/sitemap.py @@ -1,4 +1,11 @@ # -*- coding: utf-8 -*- +''' +Sitemap +------- + +The sitemap plugin generates plain-text or XML sitemaps. +''' + from __future__ import unicode_literals import collections diff --git a/summary/Readme.rst b/summary/Readme.rst new file mode 100644 index 0000000..08691da --- /dev/null +++ b/summary/Readme.rst @@ -0,0 +1,27 @@ +Summary +------- + +This plugin allows easy, variable length summaries directly embedded into the +body of your articles. It introduces two new settings: ``SUMMARY_BEGIN_MARKER`` +and ``SUMMARY_END_MARKER``: strings which can be placed directly into an article +to mark the beginning and end of a summary. When found, the standard +``SUMMARY_MAX_LENGTH`` setting will be ignored. The markers themselves will also +be removed from your articles before they are published. The default values +are ```` and ````. +For example:: + + Title: My super title + Date: 2010-12-03 10:20 + Tags: thats, awesome + Category: yeah + Slug: my-super-post + Author: Alexis Metaireau + + This is the content of my super blog post. + + and this content occurs after the summary. + +Here, the summary is taken to be the first line of the post. Because no +beginning marker was found, it starts at the top of the body. It is possible +to leave out the end marker instead, in which case the summary will start at the +beginning marker and continue to the end of the body. diff --git a/summary/__init__.py b/summary/__init__.py new file mode 100644 index 0000000..afe9311 --- /dev/null +++ b/summary/__init__.py @@ -0,0 +1 @@ +from .summary import * diff --git a/summary/summary.py b/summary/summary.py new file mode 100644 index 0000000..500e6ec --- /dev/null +++ b/summary/summary.py @@ -0,0 +1,61 @@ +""" +Summary +------- + +This plugin allows easy, variable length summaries directly embedded into the +body of your articles. +""" + +import types + +from pelican import signals + +def initialized(pelican): + from pelican.settings import _DEFAULT_CONFIG + _DEFAULT_CONFIG.setdefault('SUMMARY_BEGIN_MARKER', + '') + _DEFAULT_CONFIG.setdefault('SUMMARY_END_MARKER', + '') + if pelican: + pelican.settings.setdefault('SUMMARY_BEGIN_MARKER', + '') + pelican.settings.setdefault('SUMMARY_END_MARKER', + '') + +def content_object_init(instance): + # if summary is already specified, use it + if 'summary' in instance.metadata: + return + + def _get_content(self): + content = self._content + if self.settings['SUMMARY_BEGIN_MARKER']: + content = content.replace( + self.settings['SUMMARY_BEGIN_MARKER'], '', 1) + if self.settings['SUMMARY_END_MARKER']: + content = content.replace( + self.settings['SUMMARY_END_MARKER'], '', 1) + return content + instance._get_content = types.MethodType(_get_content, instance) + + # extract out our summary + if not hasattr(instance, '_summary') and instance._content is not None: + content = instance._content + begin_summary = -1 + end_summary = -1 + if instance.settings['SUMMARY_BEGIN_MARKER']: + begin_summary = content.find(instance.settings['SUMMARY_BEGIN_MARKER']) + if instance.settings['SUMMARY_END_MARKER']: + end_summary = content.find(instance.settings['SUMMARY_END_MARKER']) + if begin_summary != -1 or end_summary != -1: + # the beginning position has to take into account the length + # of the marker + begin_summary = (begin_summary + + len(instance.settings['SUMMARY_BEGIN_MARKER']) + if begin_summary != -1 else 0) + end_summary = end_summary if end_summary != -1 else None + instance._summary = content[begin_summary:end_summary] + +def register(): + signals.initialized.connect(initialized) + signals.content_object_init.connect(content_object_init) diff --git a/tests/Readme.rst b/tests/Readme.rst new file mode 100644 index 0000000..9ed244d --- /dev/null +++ b/tests/Readme.rst @@ -0,0 +1,13 @@ +Test Data +--------- + +Place tests for your plugin here. ``test_data`` folder contains following +common data for your tests, if you need them. + +=============== =========================== +File/Folder Description +=============== =========================== +content A sample content folder +themes Default themes from Pelican +pelican.conf.py A sample settings file +=============== =========================== diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..32353ea --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1,2 @@ +import logging +logging.getLogger().addHandler(logging.NullHandler()) diff --git a/tests/test_assets.py b/tests/test_assets.py new file mode 100644 index 0000000..1c14b2b --- /dev/null +++ b/tests/test_assets.py @@ -0,0 +1,142 @@ +# -*- coding: utf-8 -*- +# from __future__ import unicode_literals + +import hashlib +import locale +import os +from codecs import open +from tempfile import mkdtemp +from shutil import rmtree +import unittest +import subprocess + +from pelican import Pelican +from pelican.settings import read_settings + +CUR_DIR = os.path.dirname(__file__) +THEME_DIR = os.path.join(CUR_DIR, 'test_data', 'themes', 'assets_theme') +CSS_REF = open(os.path.join(THEME_DIR, 'static', 'css', + 'style.min.css')).read() +CSS_HASH = hashlib.md5(CSS_REF).hexdigest()[0:8] + + +def skipIfNoExecutable(executable): + """Skip test if `executable` is not found + + Tries to run `executable` with subprocess to make sure it's in the path, + and skips the tests if not found (if subprocess raises a `OSError`). + """ + + with open(os.devnull, 'w') as fnull: + try: + res = subprocess.call(executable, stdout=fnull, stderr=fnull) + except OSError: + res = None + + if res is None: + return unittest.skip('{0} executable not found'.format(executable)) + + return lambda func: func + + +def module_exists(module_name): + """Test if a module is importable.""" + + try: + __import__(module_name) + except ImportError: + return False + else: + return True + + + +@unittest.skipUnless(module_exists('webassets'), "webassets isn't installed") +@skipIfNoExecutable(['scss', '-v']) +@skipIfNoExecutable(['cssmin', '--version']) +class TestWebAssets(unittest.TestCase): + """Base class for testing webassets.""" + + def setUp(self, override=None): + import assets + + self.temp_path = mkdtemp(prefix='pelicantests.') + settings = { + 'PATH': os.path.join(CUR_DIR, 'test_data', 'content'), + 'OUTPUT_PATH': self.temp_path, + 'PLUGINS': [assets], + 'THEME': THEME_DIR, + 'LOCALE': locale.normalize('en_US'), + } + if override: + settings.update(override) + + self.settings = read_settings(override=settings) + pelican = Pelican(settings=self.settings) + pelican.run() + + def tearDown(self): + rmtree(self.temp_path) + + def check_link_tag(self, css_file, html_file): + """Check the presence of `css_file` in `html_file`.""" + + link_tag = ('' + .format(css_file=css_file)) + html = open(html_file).read() + self.assertRegexpMatches(html, link_tag) + + +class TestWebAssetsRelativeURLS(TestWebAssets): + """Test pelican with relative urls.""" + + + def setUp(self): + TestWebAssets.setUp(self, override={'RELATIVE_URLS': True}) + + def test_jinja2_ext(self): + # Test that the Jinja2 extension was correctly added. + + from webassets.ext.jinja2 import AssetsExtension + self.assertIn(AssetsExtension, self.settings['JINJA_EXTENSIONS']) + + def test_compilation(self): + # Compare the compiled css with the reference. + + gen_file = os.path.join(self.temp_path, 'theme', 'gen', + 'style.{0}.min.css'.format(CSS_HASH)) + self.assertTrue(os.path.isfile(gen_file)) + + css_new = open(gen_file).read() + self.assertEqual(css_new, CSS_REF) + + def test_template(self): + # Look in the output files for the link tag. + + css_file = './theme/gen/style.{0}.min.css'.format(CSS_HASH) + html_files = ['index.html', 'archives.html', + 'this-is-a-super-article.html'] + for f in html_files: + self.check_link_tag(css_file, os.path.join(self.temp_path, f)) + + self.check_link_tag( + '../theme/gen/style.{0}.min.css'.format(CSS_HASH), + os.path.join(self.temp_path, 'category/yeah.html')) + + +class TestWebAssetsAbsoluteURLS(TestWebAssets): + """Test pelican with absolute urls.""" + + def setUp(self): + TestWebAssets.setUp(self, override={'RELATIVE_URLS': False, + 'SITEURL': 'http://localhost'}) + + def test_absolute_url(self): + # Look in the output files for the link tag with absolute url. + + css_file = ('http://localhost/theme/gen/style.{0}.min.css' + .format(CSS_HASH)) + html_files = ['index.html', 'archives.html', + 'this-is-a-super-article.html'] + for f in html_files: + self.check_link_tag(css_file, os.path.join(self.temp_path, f)) diff --git a/tests/test_data/content/2012-11-30_filename-metadata.rst b/tests/test_data/content/2012-11-30_filename-metadata.rst new file mode 100644 index 0000000..b048103 --- /dev/null +++ b/tests/test_data/content/2012-11-30_filename-metadata.rst @@ -0,0 +1,4 @@ +FILENAME_METADATA example +######################### + +Some cool stuff! diff --git a/tests/test_data/content/another_super_article-fr.rst b/tests/test_data/content/another_super_article-fr.rst new file mode 100644 index 0000000..71ac963 --- /dev/null +++ b/tests/test_data/content/another_super_article-fr.rst @@ -0,0 +1,7 @@ +Trop bien ! +########### + +:lang: fr +:slug: oh-yeah + +Et voila du contenu en français diff --git a/tests/test_data/content/another_super_article.rst b/tests/test_data/content/another_super_article.rst new file mode 100644 index 0000000..e6e0a92 --- /dev/null +++ b/tests/test_data/content/another_super_article.rst @@ -0,0 +1,20 @@ +Oh yeah ! +######### + +:tags: oh, bar, yeah +:date: 2010-10-20 10:14 +:category: bar +:author: Alexis Métaireau +:slug: oh-yeah +:license: WTFPL + +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 ! + +.. image:: |filename|/pictures/Sushi.jpg + :height: 450 px + :width: 600 px + :alt: alternate text diff --git a/tests/test_data/content/article2-fr.rst b/tests/test_data/content/article2-fr.rst new file mode 100644 index 0000000..31970f7 --- /dev/null +++ b/tests/test_data/content/article2-fr.rst @@ -0,0 +1,9 @@ +Deuxième article +################ + +:tags: foo, bar, baz +:date: 2012-02-29 +:lang: fr +:slug: second-article + +Ceci est un article, en français. diff --git a/tests/test_data/content/article2.rst b/tests/test_data/content/article2.rst new file mode 100644 index 0000000..66f768e --- /dev/null +++ b/tests/test_data/content/article2.rst @@ -0,0 +1,9 @@ +Second article +############## + +:tags: foo, bar, baz +:date: 2012-02-29 +:lang: en +:slug: second-article + +This is some article, in english diff --git a/tests/test_data/content/cat1/article1.rst b/tests/test_data/content/cat1/article1.rst new file mode 100644 index 0000000..1148a8f --- /dev/null +++ b/tests/test_data/content/cat1/article1.rst @@ -0,0 +1,7 @@ +Article 1 +######### + +:date: 2011-02-17 +:yeah: oh yeah ! + +Article 1 diff --git a/tests/test_data/content/cat1/article2.rst b/tests/test_data/content/cat1/article2.rst new file mode 100644 index 0000000..a4f8786 --- /dev/null +++ b/tests/test_data/content/cat1/article2.rst @@ -0,0 +1,6 @@ +Article 2 +######### + +:date: 2011-02-17 + +Article 2 diff --git a/tests/test_data/content/cat1/article3.rst b/tests/test_data/content/cat1/article3.rst new file mode 100644 index 0000000..5347117 --- /dev/null +++ b/tests/test_data/content/cat1/article3.rst @@ -0,0 +1,6 @@ +Article 3 +######### + +:date: 2011-02-17 + +Article 3 diff --git a/tests/test_data/content/cat1/markdown-article.md b/tests/test_data/content/cat1/markdown-article.md new file mode 100644 index 0000000..5307b47 --- /dev/null +++ b/tests/test_data/content/cat1/markdown-article.md @@ -0,0 +1,7 @@ +Title: A markdown powered article +Date: 2011-04-20 + +You're mutually oblivious. + +[a root-relative link to unbelievable](|filename|/unbelievable.rst) +[a file-relative link to unbelievable](|filename|../unbelievable.rst) diff --git a/tests/test_data/content/draft_article.rst b/tests/test_data/content/draft_article.rst new file mode 100644 index 0000000..76ce9a1 --- /dev/null +++ b/tests/test_data/content/draft_article.rst @@ -0,0 +1,7 @@ +A draft article +############### + +:status: draft + +This is a draft article, it should live under the /drafts/ folder and not be +listed anywhere else. diff --git a/tests/test_data/content/extra/robots.txt b/tests/test_data/content/extra/robots.txt new file mode 100644 index 0000000..ae5b0d0 --- /dev/null +++ b/tests/test_data/content/extra/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: /static/pictures diff --git a/tests/test_data/content/pages/hidden_page.rst b/tests/test_data/content/pages/hidden_page.rst new file mode 100644 index 0000000..ab8704e --- /dev/null +++ b/tests/test_data/content/pages/hidden_page.rst @@ -0,0 +1,9 @@ +This is a test hidden page +########################## + +:category: test +:status: hidden + +This is great for things like error(404) pages +Anyone can see this page but it's not linked to anywhere! + diff --git a/tests/test_data/content/pages/jinja2_template.html b/tests/test_data/content/pages/jinja2_template.html new file mode 100644 index 0000000..1b0dc4e --- /dev/null +++ b/tests/test_data/content/pages/jinja2_template.html @@ -0,0 +1,6 @@ +{% extends "base.html" %} +{% block content %} + +Some text + +{% endblock %} diff --git a/tests/test_data/content/pages/override_url_saveas.rst b/tests/test_data/content/pages/override_url_saveas.rst new file mode 100644 index 0000000..8a515f6 --- /dev/null +++ b/tests/test_data/content/pages/override_url_saveas.rst @@ -0,0 +1,9 @@ +Override url/save_as +#################### + +:date: 2012-12-07 +:url: override/ +:save_as: override/index.html + +Test page which overrides save_as and url so that this page will be generated +at a custom location. diff --git a/tests/test_data/content/pages/test_page.rst b/tests/test_data/content/pages/test_page.rst new file mode 100644 index 0000000..2285f17 --- /dev/null +++ b/tests/test_data/content/pages/test_page.rst @@ -0,0 +1,12 @@ +This is a test page +################### + +:category: test + +Just an image. + +.. image:: |filename|/pictures/Fat_Cat.jpg + :height: 450 px + :width: 600 px + :alt: alternate text + diff --git a/tests/test_data/content/pictures/Fat_Cat.jpg b/tests/test_data/content/pictures/Fat_Cat.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d8a96d356be94e782aaf36ba4e47168435b56338 GIT binary patch literal 62675 zcmbTdbwE_j`|y31rMnv>mJVU*QgZ29I;BfMLK-9#1f+Ipq`L)_RwS2_?odDwq@^UR zclGxBeDB};zJEN=GrPll&Tvg!bFP^^d(G^x#b4_HsRm3P27o{yKn?u@er+)6ssy?^ z0f4$XFMtaG03kpE!T|8ll#h<2XeLIdmFP$g0s|m)`a9Btu>PbiXlD4!U1;Y1D}#Y% zVRTtSbc#YpD4HqJ=`=c0VEj|hZ<(wp3;+wAZlj~?Q_Meg;-VWU>&F2Y(Rl~xIFAVc zFe43hn7WoWnp`~{^;`p441~pngnp~=r_6s+RdsDW7O0@Ops)}C6%rPf7DB(pScFBS zMTDiHQUD7&0Dzv4tLH;?Z9oVrCIkQ&=+_^;e*Xa=Ku**@x^`aXl9H3Z@;*Lg18t^c+XaWB%ojXa*tvkpZD~$3Xm3|JUF7Nc=x-|3ote@}GQc zFaUu6<`bhC^Dk4Q8SAeMGn#Rb|Mchg_~HKL-`&Cc%j#&x|0~almJdbZ0KsS-1hRtANk)R82@7MzZm;pjQ=kt{1^W&kB^SZ=*E8c+X2n!doT3o z-b=9vi%N@$NsIomhyPFBZ=3vGRtH`7ce($R=lFY#&ia!N`&%z5TF>8d|FOs4_DzqD z{~1jYAyTw8-9qPR{8o_^k-RV<-@$q4_8q5qNx$o@O}pnowy{@;Ake=$Ju-+a)&7~@}zOZm?@ z7@(~R?_Z2h`A^y3mI^5Rx1QgZVp33L5m6CI5vYhTx|q0-h_Zx`n2;e{LIf%yfxa`k zaBT%Gmfxa(M&6nZJ(g(xPx^cAV*HtZa4AVN{pU`g7YB5}1;Bq-By9B6|KAEGi|*8a zRxo8W|9b@kVf-^2w9xq&fB75D|6IX-xALFW=RfJMf3LK^yNmAduN6QEz{SSK!N$VH z!NI}9!^J10BqAgrAfzLwAfaTUzs1Z%&&bFE5#(ZF<7a1ND!z9BZXBAe!rqH*=Ve_Vh zMk0!E*%cdmsNhpyAR=}?QF!>&G_-W|9GqO-JiMY};u4Zl(n`uIFjX~m4Ff|XV-r&| zb9)CzCubK|H{XYT{sDnO!H=Ir$2^UVi$|uWrDtSjW#<%^l$MoOR900ty?oW&(%RPE z(c9NQfEpYc9+{q*ots}+Tw31vxViOdd*}1+-pT3N`Nh}EtLvNJdV$a;@SpIHV*f9_ z$k2LWU}AzXaenIs!U#Y|Fc~Hmt1vdXfgDQPkLj$1Vc@LS^SOg-;C; z-QYO+t=b>W{`VA%`oGfbe<}7~y_Nw&Fxu|Pz+}K(V2fEi<4{Yt)l;I#;8pSiB@_NF z@s8ey{e?w$b}IIGk?H|Hhm52e{a*4`g^xI2EV(Se0zY-6!N?wC>i8xbm_jZ^rG=o6 z+&%Yqb;(Y>9$D_(n$9VOdXUy}mW6vg|ZVJx!0%qceSo($=Jm(xUCb50v_tLN z=x~phBXQo4Txflrx&3(Nti}bKgbwm$R;^!Z9k@GwHxD3J+2$S|`gy1zDV$UoPIlg1 z@vd9&oZ0?j^P+Mq`e>v<1|#8cJ7w5Q+4FOc=~?Px_)Q~RiLZuf045VTUuYb-L7GW8 z*4@2MaxXZawmVTB_yyoTr~~d|HN1<=l-!(;u~a|JC(%h~W#d?ns3c4d)w%&TJC{?c$Vz4xmO^^jg!lL@AA*w5yQ-F1Rzm58TbVutTVY`^ZXi&~WNLdSj`r|Y1|QQ;R=2v|KF`;`fQJS9 zmQ|Q%Ia-g>Eh{bG?H~SRz1ROl?$zxpMErE~RWbqeS*Q53A8jlCcZvBXk|-TgaDt=D za4JN73OnVB`}(QrBhEbP$yU3>B?xh*TMZCBdm>5AXBV%xC5+)lksE32kF7k@HxHF` z5VmhHj#$4dZ~Ox8To5zG!;gYP5(Kx|XMK0)5s@KYRi`@zWlkn0QEMQUCE_lb@spwMBp42u z$(1mn(ez98J6$@)^>Bnz%i=Q$9qh1Oom<7Zl@sg*WvX6wUX|BCLd#d0W zU|-O0V3uv_3~8lhB6%aOUELIMA%8Xi8!7&*K#VG=8pkm(L{+QQPCfW*?By1N`E>Jw~KL?&&PnIxv0c!oHOj>bI;&ClBlPRK_c z-RE1Zc$Hp~9)xL9`1uz=YMZ~VQUznT?ao%c6?zr<1V;-UQk7ltP{5XeDd|Z3MEWx zsAv2`Bly^*>5u!R>Mi3wSC;v@8rr5N?Szl~=hZ1AR7VTUeWm&3sW@S@kW_eWzLP`m z0g96Of)OQ_9DUuSI-NqKrWH%8Lepg;YRI5#zfkZ-1+aGYPq2*z7nrMMZ>4e&&nyJU z8fLAXCL~<$uSk`WdHez#$Z{VWV%8dU)L?<7xTv_I$yLm` zQjwLEM*@uvlaMam3$DOPWksZ0u~z(h?+GeLMkrz8;zf1sVmJ6!qBb5&;?jVN{6z{5 z=J~N!NGW;hY_MT~Jl~PE;hfU&z82OaQ$+WeT!XD8aa!X_Hfah8liV)g82dP%m>YvP zAL}Q(KJWQu#W8N+b_D;BAz?U8aQTiv4gs}P1sk=EOpXPKw|#8mJtY$|IM!-#K9+=w zz$eyjaH^g*=dO5#!hk@ZZIcwzF8C|es+Pd{J!}i*shWFM-!}ukaMgKdXg+Hju7k=7Dha?f7NfC&)YMT3fk4R&R)j-2`9QH8=Kr*~puysxMHP_fs#V9_7ki z>pdmcNZ!}q`*17l&Pkn9Z&s|*-XLSaNR4Zz_mX9l5Y3gYmO)C!_TjtW2#27fGFNqw zp*Zjz%kQ&>(yg33PL^SNebbv^iV7iK@`-9>fOM{3T}`IJr!S`V05cz_i+nfrmi-

)n(M0K@w($Mad^U|4b&>Gs6u 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 literal 0 HcmV?d00001 diff --git a/tests/test_data/content/pictures/Sushi.jpg b/tests/test_data/content/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/tests/test_data/content/super_article.rst b/tests/test_data/content/super_article.rst new file mode 100644 index 0000000..76e5768 --- /dev/null +++ b/tests/test_data/content/super_article.rst @@ -0,0 +1,36 @@ +This is a super article ! +######################### + +:tags: foo, bar, foobar +:date: 2010-12-02 10:14 +:category: yeah +:author: Alexis Métaireau +:summary: + Multi-line metadata should be supported + as well as **inline markup**. + +Some content here ! + +This is a simple title +====================== + +And here comes the cool stuff_. + +.. image:: |filename|/pictures/Sushi.jpg + :height: 450 px + :width: 600 px + :alt: alternate text + +.. image:: |filename|/pictures/Sushi_Macro.jpg + :height: 450 px + :width: 600 px + :alt: alternate text + +:: + + >>> from ipdb import set_trace + >>> set_trace() + +→ And now try with some utf8 hell: ééé + +.. _stuff: http://books.couchdb.org/relax/design-documents/views diff --git a/tests/test_data/content/unbelievable.rst b/tests/test_data/content/unbelievable.rst new file mode 100644 index 0000000..20cb9dc --- /dev/null +++ b/tests/test_data/content/unbelievable.rst @@ -0,0 +1,9 @@ +Unbelievable ! +############## + +:date: 2010-10-15 20:30 + +Or completely awesome. Depends the needs. + +`a root-relative link to markdown-article <|filename|/cat1/markdown-article.md>`_ +`a file-relative link to markdown-article <|filename|cat1/markdown-article.md>`_ diff --git a/tests/test_data/content/unwanted_file b/tests/test_data/content/unwanted_file new file mode 100644 index 0000000..591255a --- /dev/null +++ b/tests/test_data/content/unwanted_file @@ -0,0 +1 @@ +not to be parsed diff --git a/tests/test_data/pelican.conf.py b/tests/test_data/pelican.conf.py new file mode 100755 index 0000000..714a418 --- /dev/null +++ b/tests/test_data/pelican.conf.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +AUTHOR = 'Alexis Métaireau' +SITENAME = "Alexis' log" +SITEURL = 'http://blog.notmyidea.org' +TIMEZONE = "Europe/Paris" + +GITHUB_URL = 'http://github.com/ametaireau/' +DISQUS_SITENAME = "blog-notmyidea" +PDF_GENERATOR = False +REVERSE_CATEGORY_ORDER = True +LOCALE = "C" +DEFAULT_PAGINATION = 4 +DEFAULT_DATE = (2012, 3, 2, 14, 1, 1) + +FEED_ALL_RSS = 'feeds/all.rss.xml' +CATEGORY_FEED_RSS = 'feeds/%s.rss.xml' + +LINKS = (('Biologeek', 'http://biologeek.org'), + ('Filyb', "http://filyb.info/"), + ('Libert-fr', "http://www.libert-fr.com"), + ('N1k0', "http://prendreuncafe.com/blog/"), + ('Tarek Ziadé', "http://ziade.org/blog"), + ('Zubin Mithra', "http://zubin71.wordpress.com/"),) + +SOCIAL = (('twitter', 'http://twitter.com/ametaireau'), + ('lastfm', 'http://lastfm.com/user/akounet'), + ('github', 'http://github.com/ametaireau'),) + +# global metadata to all the contents +DEFAULT_METADATA = (('yeah', 'it is'),) + +# static paths will be copied under the same name +STATIC_PATHS = ["pictures", ] + +# A list of files to copy from the source to the destination +FILES_TO_COPY = (('extra/robots.txt', 'robots.txt'),) + +# custom page generated with a jinja2 template +TEMPLATE_PAGES = {'pages/jinja2_template.html': 'jinja2_template.html'} + +# foobar will not be used, because it's not in caps. All configuration keys +# have to be in caps +foobar = "barbaz" diff --git a/tests/test_data/themes/assets_theme/static/css/style.min.css b/tests/test_data/themes/assets_theme/static/css/style.min.css new file mode 100644 index 0000000..daf9c3c --- /dev/null +++ b/tests/test_data/themes/assets_theme/static/css/style.min.css @@ -0,0 +1 @@ +body{font:14px/1.5 "Droid Sans",sans-serif;background-color:#e4e4e4;color:#242424}a{color:red}a:hover{color:orange} \ No newline at end of file diff --git a/tests/test_data/themes/assets_theme/static/css/style.scss b/tests/test_data/themes/assets_theme/static/css/style.scss new file mode 100644 index 0000000..10cd05b --- /dev/null +++ b/tests/test_data/themes/assets_theme/static/css/style.scss @@ -0,0 +1,19 @@ +/* -*- scss-compile-at-save: nil -*- */ + +$baseFontFamily : "Droid Sans", sans-serif; +$textColor : #242424; +$bodyBackground : #e4e4e4; + +body { + font: 14px/1.5 $baseFontFamily; + background-color: $bodyBackground; + color: $textColor; +} + +a { + color: red; + + &:hover { + color: orange; + } +} diff --git a/tests/test_data/themes/assets_theme/templates/base.html b/tests/test_data/themes/assets_theme/templates/base.html new file mode 100644 index 0000000..05a32d0 --- /dev/null +++ b/tests/test_data/themes/assets_theme/templates/base.html @@ -0,0 +1,7 @@ +{% extends "!simple/base.html" %} + +{% block head %} + {% assets filters="scss,cssmin", output="gen/style.%(version)s.min.css", "css/style.scss" %} + + {% endassets %} +{% endblock %} diff --git a/tests/test_data/themes/notmyidea/static/css/main.css b/tests/test_data/themes/notmyidea/static/css/main.css new file mode 100644 index 0000000..5722444 --- /dev/null +++ b/tests/test_data/themes/notmyidea/static/css/main.css @@ -0,0 +1,446 @@ +/* + Name: Smashing HTML5 + Date: July 2009 + Description: Sample layout for HTML5 and CSS3 goodness. + Version: 1.0 + Author: Enrique Ramírez + Autor URI: http://enrique-ramirez.com +*/ + +/* Imports */ +@import url("reset.css"); +@import url("pygment.css"); +@import url("typogrify.css"); +@import url(//fonts.googleapis.com/css?family=Yanone+Kaffeesatz&subset=latin); + +/***** Global *****/ +/* Body */ +body { + background: #F5F4EF; + color: #000305; + font-size: 87.5%; /* Base font size: 14px */ + font-family: 'Trebuchet MS', Trebuchet, 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif; + line-height: 1.429; + margin: 0; + padding: 0; + text-align: left; +} + +/* Headings */ +h1 {font-size: 2em } +h2 {font-size: 1.571em} /* 22px */ +h3 {font-size: 1.429em} /* 20px */ +h4 {font-size: 1.286em} /* 18px */ +h5 {font-size: 1.143em} /* 16px */ +h6 {font-size: 1em} /* 14px */ + +h1, h2, h3, h4, h5, h6 { + font-weight: 400; + line-height: 1.1; + margin-bottom: .8em; + font-family: 'Yanone Kaffeesatz', arial, serif; +} + +h3, h4, h5, h6 { margin-top: .8em; } + +hr { border: 2px solid #EEEEEE; } + +/* Anchors */ +a {outline: 0;} +a img {border: 0px; text-decoration: none;} +a:link, a:visited { + color: #C74350; + padding: 0 1px; + text-decoration: underline; +} +a:hover, a:active { + background-color: #C74350; + color: #fff; + text-decoration: none; + text-shadow: 1px 1px 1px #333; +} + +h1 a:hover { + background-color: inherit +} + +/* Paragraphs */ +div.line-block, +p { margin-top: 1em; + margin-bottom: 1em;} + +strong, b {font-weight: bold;} +em, i {font-style: italic;} + +/* Lists */ +ul { + list-style: outside disc; + margin: 0em 0 0 1.5em; +} + +ol { + list-style: outside decimal; + margin: 0em 0 0 1.5em; +} + +li { margin-top: 0.5em;} + +.post-info { + float:right; + margin:10px; + padding:5px; +} + +.post-info p{ + margin-top: 1px; + margin-bottom: 1px; +} + +.readmore { float: right } + +dl {margin: 0 0 1.5em 0;} +dt {font-weight: bold;} +dd {margin-left: 1.5em;} + +pre{background-color: rgb(238, 238, 238); padding: 10px; margin: 10px; overflow: auto;} + +/* Quotes */ +blockquote { + margin: 20px; + font-style: italic; +} +cite {} + +q {} + +div.note { + float: right; + margin: 5px; + font-size: 85%; + max-width: 300px; +} + +/* Tables */ +table {margin: .5em auto 1.5em auto; width: 98%;} + + /* Thead */ + thead th {padding: .5em .4em; text-align: left;} + thead td {} + + /* Tbody */ + tbody td {padding: .5em .4em;} + tbody th {} + + tbody .alt td {} + tbody .alt th {} + + /* Tfoot */ + tfoot th {} + tfoot td {} + +/* HTML5 tags */ +header, section, footer, +aside, nav, article, figure { + display: block; +} + +/***** Layout *****/ +.body {clear: both; margin: 0 auto; width: 800px;} +img.right, figure.right {float: right; margin: 0 0 2em 2em;} +img.left, figure.left {float: left; margin: 0 2em 2em 0;} + +/* + Header +*****************/ +#banner { + margin: 0 auto; + padding: 2.5em 0 0 0; +} + + /* Banner */ + #banner h1 {font-size: 3.571em; line-height: 0;} + #banner h1 a:link, #banner h1 a:visited { + color: #000305; + display: block; + font-weight: bold; + margin: 0 0 .6em .2em; + text-decoration: none; + } + #banner h1 a:hover, #banner h1 a:active { + background: none; + color: #C74350; + text-shadow: none; + } + + #banner h1 strong {font-size: 0.36em; font-weight: normal;} + + /* Main Nav */ + #banner nav { + background: #000305; + font-size: 1.143em; + height: 40px; + line-height: 30px; + margin: 0 auto 2em auto; + padding: 0; + text-align: center; + width: 800px; + + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + } + + #banner nav ul {list-style: none; margin: 0 auto; width: 800px;} + #banner nav li {float: left; display: inline; margin: 0;} + + #banner nav a:link, #banner nav a:visited { + color: #fff; + display: inline-block; + height: 30px; + padding: 5px 1.5em; + text-decoration: none; + } + #banner nav a:hover, #banner nav a:active, + #banner nav .active a:link, #banner nav .active a:visited { + background: #C74451; + color: #fff; + text-shadow: none !important; + } + + #banner nav li:first-child a { + border-top-left-radius: 5px; + -moz-border-radius-topleft: 5px; + -webkit-border-top-left-radius: 5px; + + border-bottom-left-radius: 5px; + -moz-border-radius-bottomleft: 5px; + -webkit-border-bottom-left-radius: 5px; + } + +/* + Featured +*****************/ +#featured { + background: #fff; + margin-bottom: 2em; + overflow: hidden; + padding: 20px; + width: 760px; + + border-radius: 10px; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; +} + +#featured figure { + border: 2px solid #eee; + float: right; + margin: 0.786em 2em 0 5em; + width: 248px; +} +#featured figure img {display: block; float: right;} + +#featured h2 {color: #C74451; font-size: 1.714em; margin-bottom: 0.333em;} +#featured h3 {font-size: 1.429em; margin-bottom: .5em;} + +#featured h3 a:link, #featured h3 a:visited {color: #000305; text-decoration: none;} +#featured h3 a:hover, #featured h3 a:active {color: #fff;} + +/* + Body +*****************/ +#content { + background: #fff; + margin-bottom: 2em; + overflow: hidden; + padding: 20px 20px; + width: 760px; + + border-radius: 10px; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; +} + +/* + Extras +*****************/ +#extras {margin: 0 auto 3em auto; overflow: hidden;} + +#extras ul {list-style: none; margin: 0;} +#extras li {border-bottom: 1px solid #fff;} +#extras h2 { + color: #C74350; + font-size: 1.429em; + margin-bottom: .25em; + padding: 0 3px; +} + +#extras a:link, #extras a:visited { + color: #444; + display: block; + border-bottom: 1px solid #F4E3E3; + text-decoration: none; + padding: .3em .25em; +} + +#extras a:hover, #extras a:active {color: #fff;} + + /* Blogroll */ + #extras .blogroll { + float: left; + width: 615px; + } + + #extras .blogroll li {float: left; margin: 0 20px 0 0; width: 185px;} + + /* Social */ + #extras .social { + float: right; + width: 175px; + } + + #extras div[class='social'] a { + background-repeat: no-repeat; + background-position: 3px 6px; + padding-left: 25px; + } + + /* Icons */ + .social a[href*='about.me'] {background-image: url('../images/icons/aboutme.png');} + .social a[href*='bitbucket.org'] {background-image: url('../images/icons/bitbucket.png');} + .social a[href*='delicious.com'] {background-image: url('../images/icons/delicious.png');} + .social a[href*='digg.com'] {background-image: url('../images/icons/digg.png');} + .social a[href*='facebook.com'] {background-image: url('../images/icons/facebook.png');} + .social a[href*='gitorious.org'] {background-image: url('../images/icons/gitorious.png');} + .social a[href*='github.com'], + .social a[href*='git.io'] {background-image: url('../images/icons/github.png');} + .social a[href*='gittip.com'] {background-image: url('../images/icons/gittip.png');} + .social a[href*='plus.google.com'] {background-image: url('../images/icons/google-plus.png');} + .social a[href*='groups.google.com'] {background-image: url('../images/icons/google-groups.png');} + .social a[href*='news.ycombinator.com'], + .social a[href*='hackernewsers.com'] {background-image: url('../images/icons/hackernews.png');} + .social a[href*='last.fm'], .social a[href*='lastfm.'] {background-image: url('../images/icons/lastfm.png');} + .social a[href*='linkedin.com'] {background-image: url('../images/icons/linkedin.png');} + .social a[href*='reddit.com'] {background-image: url('../images/icons/reddit.png');} + .social a[type$='atom+xml'], .social a[type$='rss+xml'] {background-image: url('../images/icons/rss.png');} + .social a[href*='slideshare.net'] {background-image: url('../images/icons/slideshare.png');} + .social a[href*='speakerdeck.com'] {background-image: url('../images/icons/speakerdeck.png');} + .social a[href*='twitter.com'] {background-image: url('../images/icons/twitter.png');} + .social a[href*='vimeo.com'] {background-image: url('../images/icons/vimeo.png');} + .social a[href*='youtube.com'] {background-image: url('../images/icons/youtube.png');} + +/* + About +*****************/ +#about { + background: #fff; + font-style: normal; + margin-bottom: 2em; + overflow: hidden; + padding: 20px; + text-align: left; + width: 760px; + + border-radius: 10px; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; +} + +#about .primary {float: left; width: 165px;} +#about .primary strong {color: #C64350; display: block; font-size: 1.286em;} +#about .photo {float: left; margin: 5px 20px;} + +#about .url:link, #about .url:visited {text-decoration: none;} + +#about .bio {float: right; width: 500px;} + +/* + Footer +*****************/ +#contentinfo {padding-bottom: 2em; text-align: right;} + +/***** Sections *****/ +/* Blog */ +.hentry { + display: block; + clear: both; + border-bottom: 1px solid #eee; + padding: 1.5em 0; +} +li:last-child .hentry, #content > .hentry {border: 0; margin: 0;} +#content > .hentry {padding: 1em 0;} +.hentry img{display : none ;} +.entry-title {font-size: 3em; margin-bottom: 10px; margin-top: 0;} +.entry-title a:link, .entry-title a:visited {text-decoration: none; color: #333;} +.entry-title a:visited {background-color: #fff;} + +.hentry .post-info * {font-style: normal;} + + /* Content */ + .hentry footer {margin-bottom: 2em;} + .hentry footer address {display: inline;} + #posts-list footer address {display: block;} + + /* Blog Index */ + #posts-list {list-style: none; margin: 0;} + #posts-list .hentry {padding-left: 10px; position: relative;} + + #posts-list footer { + left: 10px; + position: relative; + float: left; + top: 0.5em; + width: 190px; + } + + /* About the Author */ + #about-author { + background: #f9f9f9; + clear: both; + font-style: normal; + margin: 2em 0; + padding: 10px 20px 15px 20px; + + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + } + + #about-author strong { + color: #C64350; + clear: both; + display: block; + font-size: 1.429em; + } + + #about-author .photo {border: 1px solid #ddd; float: left; margin: 5px 1em 0 0;} + + /* Comments */ + #comments-list {list-style: none; margin: 0 1em;} + #comments-list blockquote { + background: #f8f8f8; + clear: both; + font-style: normal; + margin: 0; + padding: 15px 20px; + + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + } + #comments-list footer {color: #888; padding: .5em 1em 0 0; text-align: right;} + + #comments-list li:nth-child(2n) blockquote {background: #F5f5f5;} + + /* Add a Comment */ + #add-comment label {clear: left; float: left; text-align: left; width: 150px;} + #add-comment input[type='text'], + #add-comment input[type='email'], + #add-comment input[type='url'] {float: left; width: 200px;} + + #add-comment textarea {float: left; height: 150px; width: 495px;} + + #add-comment p.req {clear: both; margin: 0 .5em 1em 0; text-align: right;} + + #add-comment input[type='submit'] {float: right; margin: 0 .5em;} + #add-comment * {margin-bottom: .5em;} diff --git a/tests/test_data/themes/notmyidea/static/css/pygment.css b/tests/test_data/themes/notmyidea/static/css/pygment.css new file mode 100644 index 0000000..fdd056f --- /dev/null +++ b/tests/test_data/themes/notmyidea/static/css/pygment.css @@ -0,0 +1,205 @@ +.hll { +background-color:#eee; +} +.c { +color:#408090; +font-style:italic; +} +.err { +border:1px solid #FF0000; +} +.k { +color:#007020; +font-weight:bold; +} +.o { +color:#666666; +} +.cm { +color:#408090; +font-style:italic; +} +.cp { +color:#007020; +} +.c1 { +color:#408090; +font-style:italic; +} +.cs { +background-color:#FFF0F0; +color:#408090; +} +.gd { +color:#A00000; +} +.ge { +font-style:italic; +} +.gr { +color:#FF0000; +} +.gh { +color:#000080; +font-weight:bold; +} +.gi { +color:#00A000; +} +.go { +color:#303030; +} +.gp { +color:#C65D09; +font-weight:bold; +} +.gs { +font-weight:bold; +} +.gu { +color:#800080; +font-weight:bold; +} +.gt { +color:#0040D0; +} +.kc { +color:#007020; +font-weight:bold; +} +.kd { +color:#007020; +font-weight:bold; +} +.kn { +color:#007020; +font-weight:bold; +} +.kp { +color:#007020; +} +.kr { +color:#007020; +font-weight:bold; +} +.kt { +color:#902000; +} +.m { +color:#208050; +} +.s { +color:#4070A0; +} +.na { +color:#4070A0; +} +.nb { +color:#007020; +} +.nc { +color:#0E84B5; +font-weight:bold; +} +.no { +color:#60ADD5; +} +.nd { +color:#555555; +font-weight:bold; +} +.ni { +color:#D55537; +font-weight:bold; +} +.ne { +color:#007020; +} +.nf { +color:#06287E; +} +.nl { +color:#002070; +font-weight:bold; +} +.nn { +color:#0E84B5; +font-weight:bold; +} +.nt { +color:#062873; +font-weight:bold; +} +.nv { +color:#BB60D5; +} +.ow { +color:#007020; +font-weight:bold; +} +.w { +color:#BBBBBB; +} +.mf { +color:#208050; +} +.mh { +color:#208050; +} +.mi { +color:#208050; +} +.mo { +color:#208050; +} +.sb { +color:#4070A0; +} +.sc { +color:#4070A0; +} +.sd { +color:#4070A0; +font-style:italic; +} +.s2 { +color:#4070A0; +} +.se { +color:#4070A0; +font-weight:bold; +} +.sh { +color:#4070A0; +} +.si { +color:#70A0D0; +font-style:italic; +} +.sx { +color:#C65D09; +} +.sr { +color:#235388; +} +.s1 { +color:#4070A0; +} +.ss { +color:#517918; +} +.bp { +color:#007020; +} +.vc { +color:#BB60D5; +} +.vg { +color:#BB60D5; +} +.vi { +color:#BB60D5; +} +.il { +color:#208050; +} diff --git a/tests/test_data/themes/notmyidea/static/css/reset.css b/tests/test_data/themes/notmyidea/static/css/reset.css new file mode 100644 index 0000000..1e21756 --- /dev/null +++ b/tests/test_data/themes/notmyidea/static/css/reset.css @@ -0,0 +1,52 @@ +/* + Name: Reset Stylesheet + Description: Resets browser's default CSS + Author: Eric Meyer + Author URI: http://meyerweb.com/eric/tools/css/reset/ +*/ + +/* v1.0 | 20080212 */ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, font, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td { + background: transparent; + border: 0; + font-size: 100%; + margin: 0; + outline: 0; + padding: 0; + vertical-align: baseline; +} + +body {line-height: 1;} + +ol, ul {list-style: none;} + +blockquote, q {quotes: none;} + +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} + +/* remember to define focus styles! */ +:focus { + outline: 0; +} + +/* remember to highlight inserts somehow! */ +ins {text-decoration: none;} +del {text-decoration: line-through;} + +/* tables still need 'cellspacing="0"' in the markup */ +table { + border-collapse: collapse; + border-spacing: 0; +} \ No newline at end of file diff --git a/tests/test_data/themes/notmyidea/static/css/typogrify.css b/tests/test_data/themes/notmyidea/static/css/typogrify.css new file mode 100644 index 0000000..c9b34dc --- /dev/null +++ b/tests/test_data/themes/notmyidea/static/css/typogrify.css @@ -0,0 +1,3 @@ +.caps {font-size:.92em;} +.amp {color:#666; font-size:1.05em;font-family:"Warnock Pro", "Goudy Old Style","Palatino","Book Antiqua",serif; font-style:italic;} +.dquo {margin-left:-.38em;} diff --git a/tests/test_data/themes/notmyidea/static/css/wide.css b/tests/test_data/themes/notmyidea/static/css/wide.css new file mode 100644 index 0000000..88fd59c --- /dev/null +++ b/tests/test_data/themes/notmyidea/static/css/wide.css @@ -0,0 +1,48 @@ +@import url("main.css"); + +body { + font:1.3em/1.3 "Hoefler Text","Georgia",Georgia,serif,sans-serif; +} + +.post-info{ + display: none; +} + +#banner nav { + display: none; + -moz-border-radius: 0px; + margin-bottom: 20px; + overflow: hidden; + font-size: 1em; + background: #F5F4EF; +} + +#banner nav ul{ + padding-right: 50px; +} + +#banner nav li{ + float: right; + color: #000; +} + +#banner nav li a { + color: #000; +} + +#banner h1 { + margin-bottom: -18px; +} + +#featured, #extras { + padding: 50px; +} + +#featured { + padding-top: 20px; +} + +#extras { + padding-top: 0px; + padding-bottom: 0px; +} diff --git a/tests/test_data/themes/notmyidea/static/images/icons/aboutme.png b/tests/test_data/themes/notmyidea/static/images/icons/aboutme.png new file mode 100644 index 0000000000000000000000000000000000000000..9609df3bd9d766cd4b827fb0a8339b700c1abf24 GIT binary patch literal 751 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstUx|vage(c z!@6@aFM%9|WRD45bDP46hOx7_4S6Fo+k-*%fF5)Ta>O z6XFU~z-^brZ51PwI9(_Kh^7g}PZf%vA`~}SFm|F~be~{E7r$Q>mqnyt>;%CWAnF&0 z>J^CU7KrHN4{PNQZsheU=5fy8Gz;Yisssv#ckqX`@rAbXg*5X8HSz`4@%dHr`jqpy z=5RZtaF_)12GsKU*YNsP@%UEo0L8sad4MK(6mq-eal2-7IizygC9)g&bNiP6KWohG zS-|Cz#pRUFX_v@p6U%1c!{t%H>ygjnp2z8w&f}cUVI9k18Od!O&8Fwc>5|Q96~*D0 z#%UhPVH?k3;LWPz#^I34reVi!8_%X{#by@DrewmR<-%&@&nzOxqVB+|@6E{0!>ne@ zqU+A2Y{jhQ!lY=;OkH}&m?E%Ja zC$sHaw(BO9N_QK10Mpk${dC;$Iv-Sgs1 z>}GlM0tE(@$Z4WS9~SJov+DT=kEZa@(E0WcEcx0FsV`5Db6NC!V}woNM4#AY#y4|V zcGfJc2;H@B=ic4*7ff{9i&|5ruCcY7__a#1S1tN{P32SRuV!D_tlt0mk+S{xzkezF zn-7Y&EBC3-DcWUz;LL;X@g_ZzKBs5>H{b4a!=6dHduc-B)u;`Jo`r8<+{W~Vq2`0N zaE8$A3qX&kmbgZgq$HN4S|t~y0x1R~14Cn717lr7(-1=oD?>9YBLiInb1MS_`T5Fb hC>nC}Q!>*kF*O*PK{PbaT?tCT44$rjF6*2UngApI;B){0 literal 0 HcmV?d00001 diff --git a/tests/test_data/themes/notmyidea/static/images/icons/bitbucket.png b/tests/test_data/themes/notmyidea/static/images/icons/bitbucket.png new file mode 100644 index 0000000000000000000000000000000000000000..d05ba1610eab6ec3f9a4dcae689d4d88bda5433f GIT binary patch literal 3714 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 literal 0 HcmV?d00001 diff --git a/tests/test_data/themes/notmyidea/static/images/icons/gitorious.png b/tests/test_data/themes/notmyidea/static/images/icons/gitorious.png new file mode 100644 index 0000000000000000000000000000000000000000..3eeb3ecec36a73ff505e04ecdecbcc4792ef6786 GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!O@L2`D?^o)dRwqYcev@q#DMvQ z*(*AHH`kW0om8=NO8&uVRmbKn*uQ@5(H+Zf?%R0x*ww37FTJ_{>eZ{eAD{pK|9`68 zWgnn9NuDl_ArhBs&l(CfDDW^GWLD*36#n?Xe(OZZj60uZDW6tS-s!tZ;qA;Vf>oNe zoO+M!7w(Q%nqK|iN%H(B6U8~-_(gR#lieQ**`4zb(6ROF5mHl4iMd b=se=)bK`s~y3?}Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iyq( z0|^AkZL;YA00C!7L_t(I%VS`Gf&_0HFrDaQqmtllJp)MJ0^(m#dOmnQe`Ts~~BcM&z2u(nCq_gq= z7&lY6AuyMK{funGm2)TmfBF3B|J(^}V8h})E&un_7XJV6?(P5kw{QH<2ysPrkqQGe zaQ=a8*|2Qhe-QZh?;n_+)zkF9r6dC`2Exbo?ff4HG!&|51_Ly-!Oq;YV!?kH04e_c z`xn?|n1LYr#DU#F11w-JxWxdCCa^$xYWRObptr6V*$cl=42W?z`+xTMA)r;58bP){ zesK4Hl#4Nj0k@C?G1=e#|F54v;Lb)4le}mj^k}^W4@6{%>dY9FfCGV^+9H&wMGiz2 zjKtz?1=auqi>CG<2OMfNq9-I62F3rB_Uiwu=1l{q2lUhkPe>?9*&EFzURJO;$Dfob d%1o4IX8>>N|HqM7x0V0^002ovPDHLkV1m@;(I5Z- literal 0 HcmV?d00001 diff --git a/tests/test_data/themes/notmyidea/static/images/icons/google-groups.png b/tests/test_data/themes/notmyidea/static/images/icons/google-groups.png new file mode 100644 index 0000000000000000000000000000000000000000..5de15e68f4d1e4176b46fe6346d42f53e3296b21 GIT binary patch literal 803 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstUx|vage(c z!@6@aFM%9|WRD45bDP46hOx7_4S6Fo+k-*%fF5)Mpyt z6XFU~@c;jRouXIDNvA)3c>3}ElMnA6zkmDa-J1t*U*CKC>h7DDcV4}?_43)x7td}y ze|qiNlPk|2Uv}&NGS4Ioi}&t+__Wd%$cHF^5*9C6Zh|& zS-fcGqD3=xieDc*uvxqCB`~XH4>TcVYa`q+>QZfU%sx2Z(n*wUnoNHS?EYjGdv*%IzuiFv_(s)h|m2&VRzopr01MEB^#A|> literal 0 HcmV?d00001 diff --git a/tests/test_data/themes/notmyidea/static/images/icons/google-plus.png b/tests/test_data/themes/notmyidea/static/images/icons/google-plus.png new file mode 100644 index 0000000000000000000000000000000000000000..3c6b74324031611f20c0a3810131aa74fd0a5a9f GIT binary patch literal 527 zcmV+q0`UEbP)ZK z>upIAVz}dFal_O6CT?`r$qOAn;FBaOK-k!D!Jidayc;Y>7GYGxnGBxue+IChM|)V`ar=`j`~3M zC07%M|NqZF^fS8TVssIRJYwIy1j>GXU1E8{UJs6dLU1-v!-3nb2Irih=+?6PKKJ@8lF5#&^v9fcghZg&b90USur#Ch_yBx0YzYJ9ftpZ|9@Mbb;3sH7#Llc zapC{3OLv2zTp&7Rr3KUgB!TRsHrfndzX7?Q-YzOS8|-?va>A!K_nuYT9<U;^giL<|Q^RJR%`Z!y$8yYa>Upa1{=xci{g2`qvgF`RFk`e^@wXB(G2 zShMW$$p`;HLHGV;SLhaf#f_+F1DIs^y0_<$oBBFk`Sl>Ab*Ovm_g^4AcawG2Lj|D- zqK4swiTo;US!A@iaP1FZz%33(6Ney%eY$dMwPn_zpvZ?`|G(*ST!StSLI9gPlb*yp RBR2p5002ovPDHLkV1g3B{|5j7 literal 0 HcmV?d00001 diff --git a/tests/test_data/themes/notmyidea/static/images/icons/hackernews.png b/tests/test_data/themes/notmyidea/static/images/icons/hackernews.png new file mode 100644 index 0000000000000000000000000000000000000000..fc7a82d4d68068d5fb032885b93e670c385ae1b4 GIT binary patch literal 3273 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 literal 0 HcmV?d00001 diff --git a/tests/test_data/themes/notmyidea/static/images/icons/lastfm.png b/tests/test_data/themes/notmyidea/static/images/icons/lastfm.png new file mode 100644 index 0000000000000000000000000000000000000000..3a6c6262b644dadbcf6cce5dfe4fed9740a9ec1f GIT binary patch literal 975 zcmV;=12FuFP)6?8>dbVG7wVRUJ4ZXi@?ZDjy5FfTVRFgbe517iRH11L#E zK~y*q1;I~j6jdC+@$Y-{cJ_af?v|Cd&=58%RRW19jgdqNQ4(W7BPZ0vgC6ith#oz2 zwmQaM~wsz^Z-QCXa%DC5DyB?4oI zHSqw7c|gHN7dAskEJO*20zV5*!N7txD5W7|ke~#<+t+u*fj>r ztH?8TXslr8?-TWV6(gOX%;6VdsD%CI2XwQA8l*5f0`DG!`c7!JVEYK^^e^` zcD=D}N`gz%A|jG3Hzk<+OHvW}@9ocI<-{ifWL)N6Op zl_6x*$4|GSoI{~dSr4lfE@RM%BU`HwdyYXEVvL7at4)4lw9&i$@PL;@=v)?SEfh1D zasgHF@wCQe1o1p1(b(1+x;KE@R@B7!CDScsKTn?9J!|Sao$80mhEYbMc$-A=FpjF~ xhgEG<4rh((w99I&de5(oe5r7A)lWa1`5&mym2=&ymqP#m002ovPDHLkV1nRSx}g97 literal 0 HcmV?d00001 diff --git a/tests/test_data/themes/notmyidea/static/images/icons/linkedin.png b/tests/test_data/themes/notmyidea/static/images/icons/linkedin.png new file mode 100644 index 0000000000000000000000000000000000000000..d29c1201bcb0c278d49f573f9ef95ebfe932fb5b GIT binary patch literal 896 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 KT-G@yGywnx3UT@X literal 0 HcmV?d00001 diff --git a/tests/test_data/themes/notmyidea/static/images/icons/twitter.png b/tests/test_data/themes/notmyidea/static/images/icons/twitter.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef3cc1b36ab79ac7931c2269b70f3662950a97 GIT binary patch literal 830 zcmV-E1Ht@>P)6?8>dbVG7wVRUJ4ZXi@?ZDjy5FfTVRFgbe517iRH0+&fd zK~y*q1;I;eT~!#z;orN~+WXwn#6*y$w(*h*ilq*eIv-e)>{rfz2>o|YjIakM#%UhMb+@bNp@nA+}SPdDo7O9oA zGH1DQ=3VCA#gT5=SO4a&tyI0gXBT8cdC;FG`L+ZpV~z_2(k zy27+~*2T$!9(dBjs?l*Gs@^i^ycrPqX$n7{!nGav4CBKp&|ow~joLoVsusArMnnq)x&OT0jOD0^FU!r)xMV z@T`Lg@WUazJu+?=Xo^@Bc7w?~m$5A3q=>T&2}l_pF5!6#!NjS=iGu;#28{!#P2-AU z0h%HbP#g*{cet?yAML`kY`i-ZA56r3H`W4*h|+12)Ju^?5tk}wyNb*^F%HHT7vW$4 z0AT#-;$9CI5)714(INy>lS^h8jI9{BG64bGL3}rZ+e`R_3xqi;MG7(3u z(Kz(IvnufS+IiH% z|H$#?(3yDKFI$%htO#ZKU{k0-ZZa!IYoMLFnl`;oUNO7#KQyI_l_SgjkN^Mx07*qo IM6N<$g7S@P4*&oF literal 0 HcmV?d00001 diff --git a/tests/test_data/themes/notmyidea/static/images/icons/vimeo.png b/tests/test_data/themes/notmyidea/static/images/icons/vimeo.png new file mode 100644 index 0000000000000000000000000000000000000000..dba472022f0fcf7ecdd8f4847a8a3bde90789bc7 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstUx|vage(c z!@6@aFM%9|WRD45bDP46hOx7_4S6Fo+k-*%fF5l;{oc z32_C|+_Uys@43gj_L}zg+illgm0x@zv+3s4+i(B>|Nr6VAFo3XmfU;0&*Mqkod+xp6y#3gPyN@QHxXzy0-n4wn!XxLor|jgco@-h?@!*{&Jj>5-y7s_z z@+$6G2Ohk5z2Vroh5JukeEmths6S=tPM4Z~$^H#Vee))+-^JCwnxk~8b9t9&bn*5L zvT{HNF_r}R1v5B2yO9RsBze2LaDKeG^bL^H>FMGaB5^si|EAa>1s)gXg^zYT($l&Y zn|<~Fe;e+k=x2)RJNb=;l_qw0c;tC<3C(%IzGPL~DJ!ccy{fL?3~Y=q61VnM+{k& zPwWILICuW)Iw1Sxx96+>e|Uf6_up&l^DbVzD4uS~541_8B*-rqWG?~05TV1%3sir^ z)5S5Q;#N{XT0%k!1BU`zox({D0S6wQ93LMAIc5h2!;S_HIkiHz2^JA8f(i{15>tM# zJZaz(V9+^u@ZiY + var _gaq = _gaq || []; + _gaq.push(['_setAccount', '{{GOOGLE_ANALYTICS}}']); + _gaq.push(['_trackPageview']); + (function() { + var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; + ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; + var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); + })(); + +{% endif %} \ No newline at end of file diff --git a/tests/test_data/themes/notmyidea/templates/archives.html b/tests/test_data/themes/notmyidea/templates/archives.html new file mode 100644 index 0000000..f678494 --- /dev/null +++ b/tests/test_data/themes/notmyidea/templates/archives.html @@ -0,0 +1,13 @@ +{% extends "base.html" %} +{% block content %} +

+

Archives for {{ SITENAME }}

+ +
+{% for article in dates %} +
{{ article.locale_date }}
+
{{ article.title }}
+{% endfor %} +
+
+{% endblock %} diff --git a/tests/test_data/themes/notmyidea/templates/article.html b/tests/test_data/themes/notmyidea/templates/article.html new file mode 100644 index 0000000..516fd3b --- /dev/null +++ b/tests/test_data/themes/notmyidea/templates/article.html @@ -0,0 +1,35 @@ +{% extends "base.html" %} +{% block title %}{{ article.title|striptags }}{% endblock %} +{% block content %} +
+
+
+

+ {{ article.title}}

+ {% include 'twitter.html' %} +
+ +
+ {% include 'article_infos.html' %} + {{ article.content }} +
+ {% if DISQUS_SITENAME and SITEURL and article.status != "draft" %} +
+

Comments !

+
+ +
+ {% endif %} + +
+
+{% endblock %} diff --git a/tests/test_data/themes/notmyidea/templates/article_infos.html b/tests/test_data/themes/notmyidea/templates/article_infos.html new file mode 100644 index 0000000..4b86716 --- /dev/null +++ b/tests/test_data/themes/notmyidea/templates/article_infos.html @@ -0,0 +1,15 @@ +
+ + {{ article.locale_date }} + + + {% if article.author %} +
+ By {{ article.author }} +
+ {% endif %} +

In {{ article.category }}. {% if PDF_PROCESSOR %}get the pdf{% endif %}

+{% include 'taglist.html' %} +{% import 'translations.html' as translations with context %} +{{ translations.translations_for(article) }} +
diff --git a/tests/test_data/themes/notmyidea/templates/author.html b/tests/test_data/themes/notmyidea/templates/author.html new file mode 100644 index 0000000..0b37290 --- /dev/null +++ b/tests/test_data/themes/notmyidea/templates/author.html @@ -0,0 +1,2 @@ +{% extends "index.html" %} +{% block title %}{{ SITENAME }} - {{ author }}{% endblock %} diff --git a/pelicanext/__init__.py b/tests/test_data/themes/notmyidea/templates/authors.html similarity index 100% rename from pelicanext/__init__.py rename to tests/test_data/themes/notmyidea/templates/authors.html diff --git a/tests/test_data/themes/notmyidea/templates/base.html b/tests/test_data/themes/notmyidea/templates/base.html new file mode 100644 index 0000000..42a2cec --- /dev/null +++ b/tests/test_data/themes/notmyidea/templates/base.html @@ -0,0 +1,88 @@ + + + + {% block title %}{{ SITENAME }}{%endblock%} + + + {% if FEED_ALL_ATOM %} + + {% endif %} + {% if FEED_ALL_RSS %} + + {% endif %} + + + + + + + + + + +{% include 'github.html' %} + + {% block content %} + {% endblock %} +
+ {% if LINKS %} +
+

blogroll

+
    + {% for name, link in LINKS %} +
  • {{ name }}
  • + {% endfor %} +
+
+ {% endif %} + {% if SOCIAL or FEED_ALL_ATOM or FEED_ALL_RSS %} + + {% endif %} +
+ + + +{% include 'analytics.html' %} +{% include 'piwik.html' %} +{% include 'disqus_script.html' %} + + diff --git a/tests/test_data/themes/notmyidea/templates/category.html b/tests/test_data/themes/notmyidea/templates/category.html new file mode 100644 index 0000000..56f8e93 --- /dev/null +++ b/tests/test_data/themes/notmyidea/templates/category.html @@ -0,0 +1,2 @@ +{% extends "index.html" %} +{% block title %}{{ SITENAME }} - {{ category }}{% endblock %} diff --git a/tests/test_data/themes/notmyidea/templates/comments.html b/tests/test_data/themes/notmyidea/templates/comments.html new file mode 100644 index 0000000..bb033c0 --- /dev/null +++ b/tests/test_data/themes/notmyidea/templates/comments.html @@ -0,0 +1 @@ +{% if DISQUS_SITENAME %}

There are comments.

{% endif %} diff --git a/tests/test_data/themes/notmyidea/templates/disqus_script.html b/tests/test_data/themes/notmyidea/templates/disqus_script.html new file mode 100644 index 0000000..c4f442c --- /dev/null +++ b/tests/test_data/themes/notmyidea/templates/disqus_script.html @@ -0,0 +1,11 @@ +{% if DISQUS_SITENAME %} + +{% endif %} diff --git a/tests/test_data/themes/notmyidea/templates/github.html b/tests/test_data/themes/notmyidea/templates/github.html new file mode 100644 index 0000000..75592ac --- /dev/null +++ b/tests/test_data/themes/notmyidea/templates/github.html @@ -0,0 +1,9 @@ +{% if GITHUB_URL %} + +{% if GITHUB_POSITION != "left" %} +Fork me on GitHub +{% else %} +Fork me on GitHub +{% endif %} + +{% endif %} diff --git a/tests/test_data/themes/notmyidea/templates/index.html b/tests/test_data/themes/notmyidea/templates/index.html new file mode 100644 index 0000000..8752a6b --- /dev/null +++ b/tests/test_data/themes/notmyidea/templates/index.html @@ -0,0 +1,61 @@ +{% extends "base.html" %} +{% block content_title %}{% endblock %} +{% block content %} +{% if articles %} + {% for article in articles_page.object_list %} + + {# First item #} + {% if loop.first and not articles_page.has_previous() %} + + {% if loop.length > 1 %} +
+

Other articles

+
+
    + {% endif %} + {# other items #} + {% else %} + {% if loop.first and articles_page.has_previous %} +
    +
      + {% endif %} +
    1. +
      +

      {{ article.title }}

      +
      + +
      + {% include 'article_infos.html' %} + {{ article.summary }} + read more + {% include 'comments.html' %} +
      +
    2. + {% endif %} + {% if loop.last %} +
    + {% if loop.last and (articles_page.has_previous() + or not articles_page.has_previous() and loop.length > 1) %} + {% include 'pagination.html' %} + {% endif %} +
    + {% endif %} + {% endfor %} +{% else %} +
    +

    Pages

    + {% for page in PAGES %} +
  1. {{ page.title }}
  2. + {% endfor %} +
    +{% endif %} +{% endblock content %} diff --git a/tests/test_data/themes/notmyidea/templates/page.html b/tests/test_data/themes/notmyidea/templates/page.html new file mode 100644 index 0000000..60409d5 --- /dev/null +++ b/tests/test_data/themes/notmyidea/templates/page.html @@ -0,0 +1,12 @@ +{% extends "base.html" %} +{% block title %}{{ page.title }}{% endblock %} +{% block content %} +
    +

    {{ page.title }}

    + {% import 'translations.html' as translations with context %} + {{ translations.translations_for(page) }} + {% if PDF_PROCESSOR %}get + the pdf{% endif %} + {{ page.content }} +
    +{% endblock %} diff --git a/tests/test_data/themes/notmyidea/templates/piwik.html b/tests/test_data/themes/notmyidea/templates/piwik.html new file mode 100644 index 0000000..ff459af --- /dev/null +++ b/tests/test_data/themes/notmyidea/templates/piwik.html @@ -0,0 +1,16 @@ +{% if PIWIK_URL and PIWIK_SITE_ID %} + +{% endif %} \ No newline at end of file diff --git a/tests/test_data/themes/notmyidea/templates/tag.html b/tests/test_data/themes/notmyidea/templates/tag.html new file mode 100644 index 0000000..68cdcba --- /dev/null +++ b/tests/test_data/themes/notmyidea/templates/tag.html @@ -0,0 +1,2 @@ +{% extends "index.html" %} +{% block title %}{{ SITENAME }} - {{ tag }}{% endblock %} diff --git a/tests/test_data/themes/notmyidea/templates/taglist.html b/tests/test_data/themes/notmyidea/templates/taglist.html new file mode 100644 index 0000000..c792fd7 --- /dev/null +++ b/tests/test_data/themes/notmyidea/templates/taglist.html @@ -0,0 +1,2 @@ +{% if article.tags %}

    tags: {% for tag in article.tags %}{{ tag }}{% endfor %}

    {% endif %} +{% if PDF_PROCESSOR %}

    get the pdf

    {% endif %} diff --git a/tests/test_data/themes/notmyidea/templates/translations.html b/tests/test_data/themes/notmyidea/templates/translations.html new file mode 100644 index 0000000..ca03a2c --- /dev/null +++ b/tests/test_data/themes/notmyidea/templates/translations.html @@ -0,0 +1,8 @@ +{% macro translations_for(article) %} +{% if article.translations %} +Translations: + {% for translation in article.translations %} + {{ translation.lang }} + {% endfor %} +{% endif %} +{% endmacro %} diff --git a/tests/test_data/themes/notmyidea/templates/twitter.html b/tests/test_data/themes/notmyidea/templates/twitter.html new file mode 100644 index 0000000..c6b159f --- /dev/null +++ b/tests/test_data/themes/notmyidea/templates/twitter.html @@ -0,0 +1,3 @@ +{% if TWITTER_USERNAME %} + +{% endif %} \ No newline at end of file diff --git a/tests/test_data/themes/simple/templates/archives.html b/tests/test_data/themes/simple/templates/archives.html new file mode 100644 index 0000000..050f268 --- /dev/null +++ b/tests/test_data/themes/simple/templates/archives.html @@ -0,0 +1,11 @@ +{% extends "base.html" %} +{% block content %} +

    Archives for {{ SITENAME }}

    + +
    +{% for article in dates %} +
    {{ article.locale_date }}
    +
    {{ article.title }}
    +{% endfor %} +
    +{% endblock %} diff --git a/tests/test_data/themes/simple/templates/article.html b/tests/test_data/themes/simple/templates/article.html new file mode 100644 index 0000000..98cc852 --- /dev/null +++ b/tests/test_data/themes/simple/templates/article.html @@ -0,0 +1,25 @@ +{% extends "base.html" %} +{% block content %} +
    +
    +

    + {{ article.title }}

    + {% import 'translations.html' as translations with context %} + {{ translations.translations_for(article) }} +
    +
    + + {{ article.locale_date }} + + {% if article.author %} +
    + By {{ article.author }} +
    + {% endif %} +
    +
    + {{ article.content }} +
    +
    +{% endblock %} diff --git a/tests/test_data/themes/simple/templates/author.html b/tests/test_data/themes/simple/templates/author.html new file mode 100644 index 0000000..e9f7870 --- /dev/null +++ b/tests/test_data/themes/simple/templates/author.html @@ -0,0 +1,7 @@ +{% extends "index.html" %} + +{% block title %}{{ SITENAME }} - Articles by {{ author }}{% endblock %} +{% block content_title %} +

    Articles by {{ author }}

    +{% endblock %} + diff --git a/tests/test_data/themes/simple/templates/base.html b/tests/test_data/themes/simple/templates/base.html new file mode 100644 index 0000000..7973d77 --- /dev/null +++ b/tests/test_data/themes/simple/templates/base.html @@ -0,0 +1,63 @@ + + + + {% block head %} + {% block title %}{{ SITENAME }}{% endblock title %} + + {% if FEED_ALL_ATOM %} + + {% endif %} + {% if FEED_ALL_RSS %} + + {% endif %} + {% if FEED_ATOM %} + + {% endif %} + {% if FEED_RSS %} + + {% endif %} + {% if CATEGORY_FEED_ATOM and category %} + + {% endif %} + {% if CATEGORY_FEED_RSS and category %} + + {% endif %} + {% if TAG_FEED_ATOM and tag %} + + {% endif %} + {% if TAG_FEED_RSS and tag %} + + {% endif %} + {% endblock head %} + + + + + + {% block content %} + {% endblock %} +
    +
    + Proudly powered by Pelican, + which takes great advantage of Python. +
    +
    + + diff --git a/tests/test_data/themes/simple/templates/categories.html b/tests/test_data/themes/simple/templates/categories.html new file mode 100644 index 0000000..e29be0c --- /dev/null +++ b/tests/test_data/themes/simple/templates/categories.html @@ -0,0 +1,8 @@ +{% extends "base.html" %} +{% block content %} +
      +{% for category, articles in categories %} +
    • {{ category }}
    • +{% endfor %} +
    +{% endblock %} diff --git a/tests/test_data/themes/simple/templates/category.html b/tests/test_data/themes/simple/templates/category.html new file mode 100644 index 0000000..4e6fd24 --- /dev/null +++ b/tests/test_data/themes/simple/templates/category.html @@ -0,0 +1,5 @@ +{% extends "index.html" %} +{% block content_title %} +

    Articles in the {{ category }} category

    +{% endblock %} + diff --git a/tests/test_data/themes/simple/templates/gosquared.html b/tests/test_data/themes/simple/templates/gosquared.html new file mode 100644 index 0000000..f47efcf --- /dev/null +++ b/tests/test_data/themes/simple/templates/gosquared.html @@ -0,0 +1,14 @@ +{% if GOSQUARED_SITENAME %} + +{% endif %} diff --git a/tests/test_data/themes/simple/templates/index.html b/tests/test_data/themes/simple/templates/index.html new file mode 100644 index 0000000..5bb94df --- /dev/null +++ b/tests/test_data/themes/simple/templates/index.html @@ -0,0 +1,22 @@ +{% extends "base.html" %} +{% block content %} +
    +{% block content_title %} +

    All articles

    +{% endblock %} + +
      +{% for article in articles_page.object_list %} +
    1. +{% endfor %} +
    +{% include 'pagination.html' %} +
    +{% endblock content %} diff --git a/tests/test_data/themes/simple/templates/page.html b/tests/test_data/themes/simple/templates/page.html new file mode 100644 index 0000000..3a0dc4a --- /dev/null +++ b/tests/test_data/themes/simple/templates/page.html @@ -0,0 +1,9 @@ +{% extends "base.html" %} +{% block title %}{{ page.title }}{%endblock%} +{% block content %} +

    {{ page.title }}

    + {% import 'translations.html' as translations with context %} + {{ translations.translations_for(page) }} + + {{ page.content }} +{% endblock %} diff --git a/tests/test_data/themes/simple/templates/pagination.html b/tests/test_data/themes/simple/templates/pagination.html new file mode 100644 index 0000000..83c587a --- /dev/null +++ b/tests/test_data/themes/simple/templates/pagination.html @@ -0,0 +1,15 @@ +{% if DEFAULT_PAGINATION %} +

    + {% if articles_page.has_previous() %} + {% if articles_page.previous_page_number() == 1 %} + « + {% else %} + « + {% endif %} + {% endif %} + Page {{ articles_page.number }} / {{ articles_paginator.num_pages }} + {% if articles_page.has_next() %} + » + {% endif %} +

    +{% endif %} diff --git a/pelicanext/goodreads_activity/__init__.py b/tests/test_data/themes/simple/templates/tag.html similarity index 100% rename from pelicanext/goodreads_activity/__init__.py rename to tests/test_data/themes/simple/templates/tag.html diff --git a/pelicanext/latex/__init__.py b/tests/test_data/themes/simple/templates/tags.html similarity index 100% rename from pelicanext/latex/__init__.py rename to tests/test_data/themes/simple/templates/tags.html diff --git a/tests/test_data/themes/simple/templates/translations.html b/tests/test_data/themes/simple/templates/translations.html new file mode 100644 index 0000000..db8c372 --- /dev/null +++ b/tests/test_data/themes/simple/templates/translations.html @@ -0,0 +1,9 @@ +{% macro translations_for(article) %} +{% if article.translations %} +Translations: +{% for translation in article.translations %} +{{ translation.lang }} +{% endfor %} +{% endif %} +{% endmacro %} + diff --git a/tests/test_data/themes/test_summary.py b/tests/test_data/themes/test_summary.py new file mode 100644 index 0000000..c995106 --- /dev/null +++ b/tests/test_data/themes/test_summary.py @@ -0,0 +1,75 @@ +# -*- coding: utf-8 -*- + +import unittest + +from jinja2.utils import generate_lorem_ipsum + +# generate one paragraph, enclosed with

    +TEST_CONTENT = str(generate_lorem_ipsum(n=1)) +TEST_SUMMARY = generate_lorem_ipsum(n=1, html=False) + + +from pelican.contents import Page + +import summary + +class TestSummary(unittest.TestCase): + def setUp(self): + super(TestSummary, self).setUp() + + summary.register() + summary.initialized(None) + self.page_kwargs = { + 'content': TEST_CONTENT, + 'context': { + 'localsiteurl': '', + }, + 'metadata': { + 'summary': TEST_SUMMARY, + 'title': 'foo bar', + 'author': 'Blogger', + }, + } + + def _copy_page_kwargs(self): + # make a deep copy of page_kwargs + page_kwargs = dict([(key, self.page_kwargs[key]) for key in + self.page_kwargs]) + for key in page_kwargs: + if not isinstance(page_kwargs[key], dict): + break + page_kwargs[key] = dict([(subkey, page_kwargs[key][subkey]) + for subkey in page_kwargs[key]]) + + return page_kwargs + + def test_end_summary(self): + page_kwargs = self._copy_page_kwargs() + del page_kwargs['metadata']['summary'] + page_kwargs['content'] = ( + TEST_SUMMARY + '' + TEST_CONTENT) + page = Page(**page_kwargs) + # test both the summary and the marker removal + self.assertEqual(page.summary, TEST_SUMMARY) + self.assertEqual(page.content, TEST_SUMMARY + TEST_CONTENT) + + def test_begin_summary(self): + page_kwargs = self._copy_page_kwargs() + del page_kwargs['metadata']['summary'] + page_kwargs['content'] = ( + 'FOOBAR' + TEST_CONTENT) + page = Page(**page_kwargs) + # test both the summary and the marker removal + self.assertEqual(page.summary, TEST_CONTENT) + self.assertEqual(page.content, 'FOOBAR' + TEST_CONTENT) + + def test_begin_end_summary(self): + page_kwargs = self._copy_page_kwargs() + del page_kwargs['metadata']['summary'] + page_kwargs['content'] = ( + 'FOOBAR' + TEST_SUMMARY + + '' + TEST_CONTENT) + page = Page(**page_kwargs) + # test both the summary and the marker removal + self.assertEqual(page.summary, TEST_SUMMARY) + self.assertEqual(page.content, 'FOOBAR' + TEST_SUMMARY + TEST_CONTENT) diff --git a/tests/test_gzip_cache.py b/tests/test_gzip_cache.py new file mode 100644 index 0000000..a41e212 --- /dev/null +++ b/tests/test_gzip_cache.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +'''Core plugins unit tests''' + +import os +import tempfile +import unittest + +from contextlib import contextmanager +from tempfile import mkdtemp +from shutil import rmtree + +import gzip_cache + +@contextmanager +def temporary_folder(): + """creates a temporary folder, return it and delete it afterwards. + + This allows to do something like this in tests: + + >>> with temporary_folder() as d: + # do whatever you want + """ + tempdir = mkdtemp() + try: + yield tempdir + finally: + rmtree(tempdir) + + +class TestGzipCache(unittest.TestCase): + + def test_should_compress(self): + # Some filetypes should compress and others shouldn't. + self.assertTrue(gzip_cache.should_compress('foo.html')) + self.assertTrue(gzip_cache.should_compress('bar.css')) + self.assertTrue(gzip_cache.should_compress('baz.js')) + self.assertTrue(gzip_cache.should_compress('foo.txt')) + + self.assertFalse(gzip_cache.should_compress('foo.gz')) + self.assertFalse(gzip_cache.should_compress('bar.png')) + self.assertFalse(gzip_cache.should_compress('baz.mp3')) + self.assertFalse(gzip_cache.should_compress('foo.mov')) + + def test_creates_gzip_file(self): + # A file matching the input filename with a .gz extension is created. + + # The plugin walks over the output content after the finalized signal + # so it is safe to assume that the file exists (otherwise walk would + # not report it). Therefore, create a dummy file to use. + with temporary_folder() as tempdir: + _, a_html_filename = tempfile.mkstemp(suffix='.html', dir=tempdir) + gzip_cache.create_gzip_file(a_html_filename) + self.assertTrue(os.path.exists(a_html_filename + '.gz')) +