From d79fbee6a4b982c2db48a794ff259d66fe746e43 Mon Sep 17 00:00:00 2001
From: Vincent Mazenod <vmazenod@gmail.com>
Date: Fri, 26 Aug 2022 16:36:27 +0200
Subject: [PATCH] working docker in dev

---
 .docker/build/kerberos/Dockerfile             |  25 +
 .docker/build/pelican/Dockerfile              |  54 ---
 .docker/scripts/kerberos/command.dev.sh       |  16 +
 .docker/scripts/node/command.dev.sh           |   2 +
 .docker/scripts/python/command.dev.sh         |   9 +
 .env                                          |   4 +-
 .gitmodules                                   |   3 -
 Makefile                                      |  13 +-
 develop_server.sh                             |   2 +-
 docker-compose.yml                            |  42 +-
 plugins/i18n_subsites/README.rst              | 156 ------
 plugins/i18n_subsites/__init__.py             |   1 -
 plugins/i18n_subsites/__init__.pyc            | Bin 202 -> 0 bytes
 plugins/i18n_subsites/i18n_subsites.py        | 450 ------------------
 plugins/i18n_subsites/i18n_subsites.pyc       | Bin 17976 -> 0 bytes
 .../implementing_language_buttons.rst         | 128 -----
 .../i18n_subsites/localizing_using_jinja2.rst | 200 --------
 .../test_data/content/images/img.png          |   0
 .../content/pages/hidden-page-cz.rst          |   7 -
 .../content/pages/hidden-page-de.rst          |   7 -
 .../content/pages/hidden-page-en.rst          |   7 -
 .../content/pages/untranslated-page.rst       |   5 -
 .../content/translated_article-cz.rst         |   8 -
 .../content/translated_article-de.rst         |   8 -
 .../content/translated_article-en.rst         |   8 -
 .../content/untranslated_article-en.rst       |   9 -
 .../test_data/localized_theme/babel.cfg       |   2 -
 .../test_data/localized_theme/messages.pot    |  23 -
 .../localized_theme/static/style.css          |   0
 .../localized_theme/templates/base.html       |   7 -
 .../translations/de/LC_MESSAGES/messages.mo   | Bin 486 -> 0 bytes
 .../translations/de/LC_MESSAGES/messages.po   |  23 -
 .../output/an-untranslated-article.html       |  49 --
 .../output/cz/an-untranslated-article-en.html |  48 --
 .../test_data/output/cz/feeds_all.atom.xml    |  18 -
 .../test_data/output/cz/index.html            |  54 ---
 .../test_data/output/cz/pages/404.html        |  33 --
 .../output/cz/translated-article.html         |  51 --
 .../de/drafts/an-untranslated-article-en.html |  48 --
 .../test_data/output/de/feeds_all.atom.xml    |  14 -
 .../test_data/output/de/index.html            |  42 --
 .../test_data/output/de/pages/404.html        |  33 --
 .../output/de/pages/untranslated-page-en.html |  30 --
 .../output/de/translated-article.html         |  51 --
 .../test_data/output/feeds_all.atom.xml       |  18 -
 .../test_data/output/images/img.png           |   0
 .../i18n_subsites/test_data/output/index.html |  55 ---
 .../test_data/output/pages/404.html           |  34 --
 .../output/pages/untranslated-page.html       |  31 --
 .../test_data/output/theme/style.css          |   0
 .../test_data/output/translated-article.html  |  52 --
 .../i18n_subsites/test_data/pelicanconf.py    |  53 ---
 plugins/i18n_subsites/test_i18n_subsites.py   | 139 ------
 plugins/math_render                           |   1 -
 plugins/tag_cloud/README.rst                  |  98 ----
 plugins/tag_cloud/__init__.py                 |   2 -
 plugins/tag_cloud/tag_cloud.py                |  89 ----
 plugins/tag_cloud/test_data/article_1.md      |   4 -
 plugins/tag_cloud/test_data/article_2.md      |   5 -
 plugins/tag_cloud/test_data/article_3.md      |   5 -
 plugins/tag_cloud/test_data/article_4.md      |   5 -
 plugins/tag_cloud/test_data/article_5.md      |   5 -
 plugins/tag_cloud/test_tag_cloud.py           | 103 ----
 requirements.txt                              |  24 +-
 64 files changed, 103 insertions(+), 2310 deletions(-)
 create mode 100644 .docker/build/kerberos/Dockerfile
 delete mode 100644 .docker/build/pelican/Dockerfile
 create mode 100755 .docker/scripts/kerberos/command.dev.sh
 create mode 100755 .docker/scripts/node/command.dev.sh
 create mode 100755 .docker/scripts/python/command.dev.sh
 delete mode 100644 .gitmodules
 delete mode 100644 plugins/i18n_subsites/README.rst
 delete mode 100644 plugins/i18n_subsites/__init__.py
 delete mode 100644 plugins/i18n_subsites/__init__.pyc
 delete mode 100644 plugins/i18n_subsites/i18n_subsites.py
 delete mode 100644 plugins/i18n_subsites/i18n_subsites.pyc
 delete mode 100644 plugins/i18n_subsites/implementing_language_buttons.rst
 delete mode 100644 plugins/i18n_subsites/localizing_using_jinja2.rst
 delete mode 100644 plugins/i18n_subsites/test_data/content/images/img.png
 delete mode 100644 plugins/i18n_subsites/test_data/content/pages/hidden-page-cz.rst
 delete mode 100644 plugins/i18n_subsites/test_data/content/pages/hidden-page-de.rst
 delete mode 100644 plugins/i18n_subsites/test_data/content/pages/hidden-page-en.rst
 delete mode 100644 plugins/i18n_subsites/test_data/content/pages/untranslated-page.rst
 delete mode 100644 plugins/i18n_subsites/test_data/content/translated_article-cz.rst
 delete mode 100644 plugins/i18n_subsites/test_data/content/translated_article-de.rst
 delete mode 100644 plugins/i18n_subsites/test_data/content/translated_article-en.rst
 delete mode 100644 plugins/i18n_subsites/test_data/content/untranslated_article-en.rst
 delete mode 100644 plugins/i18n_subsites/test_data/localized_theme/babel.cfg
 delete mode 100644 plugins/i18n_subsites/test_data/localized_theme/messages.pot
 delete mode 100644 plugins/i18n_subsites/test_data/localized_theme/static/style.css
 delete mode 100644 plugins/i18n_subsites/test_data/localized_theme/templates/base.html
 delete mode 100644 plugins/i18n_subsites/test_data/localized_theme/translations/de/LC_MESSAGES/messages.mo
 delete mode 100644 plugins/i18n_subsites/test_data/localized_theme/translations/de/LC_MESSAGES/messages.po
 delete mode 100644 plugins/i18n_subsites/test_data/output/an-untranslated-article.html
 delete mode 100644 plugins/i18n_subsites/test_data/output/cz/an-untranslated-article-en.html
 delete mode 100644 plugins/i18n_subsites/test_data/output/cz/feeds_all.atom.xml
 delete mode 100644 plugins/i18n_subsites/test_data/output/cz/index.html
 delete mode 100644 plugins/i18n_subsites/test_data/output/cz/pages/404.html
 delete mode 100644 plugins/i18n_subsites/test_data/output/cz/translated-article.html
 delete mode 100644 plugins/i18n_subsites/test_data/output/de/drafts/an-untranslated-article-en.html
 delete mode 100644 plugins/i18n_subsites/test_data/output/de/feeds_all.atom.xml
 delete mode 100644 plugins/i18n_subsites/test_data/output/de/index.html
 delete mode 100644 plugins/i18n_subsites/test_data/output/de/pages/404.html
 delete mode 100644 plugins/i18n_subsites/test_data/output/de/pages/untranslated-page-en.html
 delete mode 100644 plugins/i18n_subsites/test_data/output/de/translated-article.html
 delete mode 100644 plugins/i18n_subsites/test_data/output/feeds_all.atom.xml
 delete mode 100644 plugins/i18n_subsites/test_data/output/images/img.png
 delete mode 100644 plugins/i18n_subsites/test_data/output/index.html
 delete mode 100644 plugins/i18n_subsites/test_data/output/pages/404.html
 delete mode 100644 plugins/i18n_subsites/test_data/output/pages/untranslated-page.html
 delete mode 100644 plugins/i18n_subsites/test_data/output/theme/style.css
 delete mode 100644 plugins/i18n_subsites/test_data/output/translated-article.html
 delete mode 100644 plugins/i18n_subsites/test_data/pelicanconf.py
 delete mode 100644 plugins/i18n_subsites/test_i18n_subsites.py
 delete mode 160000 plugins/math_render
 delete mode 100644 plugins/tag_cloud/README.rst
 delete mode 100644 plugins/tag_cloud/__init__.py
 delete mode 100644 plugins/tag_cloud/tag_cloud.py
 delete mode 100644 plugins/tag_cloud/test_data/article_1.md
 delete mode 100644 plugins/tag_cloud/test_data/article_2.md
 delete mode 100644 plugins/tag_cloud/test_data/article_3.md
 delete mode 100644 plugins/tag_cloud/test_data/article_4.md
 delete mode 100644 plugins/tag_cloud/test_data/article_5.md
 delete mode 100644 plugins/tag_cloud/test_tag_cloud.py

diff --git a/.docker/build/kerberos/Dockerfile b/.docker/build/kerberos/Dockerfile
new file mode 100644
index 0000000..511a636
--- /dev/null
+++ b/.docker/build/kerberos/Dockerfile
@@ -0,0 +1,25 @@
+FROM debian:stable
+ARG DEBIAN_FRONTEND=noninteractive
+
+RUN { \
+        echo krb5-config krb5-config/default_realm string 'LOCAL.ISIMA.FR'; \
+        echo tzdata tzdata/Areas string 'Etc'; \
+        echo tzdata tzdata/Zones/Etc string 'UTC'; \
+    } | debconf-set-selections \
+    && \
+    apt-get update && apt-get install -y --no-install-recommends \
+        build-essential \
+        gcc \
+        apt-utils \
+        krb5-user \
+        krb5-config \
+        openssh-client \
+        locales \
+        rsync \
+    && \
+    locale-gen fr_FR \
+    locale-gen fr_FR.UTF-8 \
+    update-locale LANG=fr_FR.UTF-8 \
+    . /etc/default/locale
+
+WORKDIR /srv/blog
\ No newline at end of file
diff --git a/.docker/build/pelican/Dockerfile b/.docker/build/pelican/Dockerfile
deleted file mode 100644
index 3bd6031..0000000
--- a/.docker/build/pelican/Dockerfile
+++ /dev/null
@@ -1,54 +0,0 @@
-# FROM nikolaik/python-nodejs:python3.7-nodejs16-bullseye AS compile-image
-FROM nikolaik/python-nodejs:python3.7-nodejs16-bullseye AS source-image
-ARG DEBIAN_FRONTEND=noninteractive
-
-RUN { \
-        echo krb5-config krb5-config/default_realm string 'LOCAL.ISIMA.FR'; \
-        echo tzdata tzdata/Areas string 'Etc'; \
-        echo tzdata tzdata/Zones/Etc string 'UTC'; \
-    } | debconf-set-selections \
-    && \
-    apt-get update && apt-get install -y --no-install-recommends \
-        build-essential \
-        gcc \
-        apt-utils \
-        krb5-user \
-        krb5-config \
-        locales \
-        rsync \
-    && \
-    locale-gen fr_FR \
-    locale-gen fr_FR.UTF-8 \
-    update-locale LANG=fr_FR.UTF-8 \
-    . /etc/default/locale
-
-COPY requirements.txt .
-RUN pip install --user -r requirements.txt
-COPY content/package.json ./content/package.json
-RUN cd content && yarn install
-
-# FROM nikolaik/python-nodejs:python3.7-nodejs16-bullseye AS build-image
-# COPY --from=compile-image /root/.local /root/.local
-# COPY --from=compile-image /usr/bin /usr/bin
-# COPY --from=compile-image /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu
-# LABEL stage=builder
-
-ENV SRV_DIR=//srv
-ENV WORKING_DIR=//srv/pelican
-ENV PORT=8000
-ENV PATH=/root/.local/bin:$PATH
-
-ADD . $SRV_DIR
-WORKDIR $WORKING_DIR
-RUN mkdir output content cache
-# VOLUME ["$WORKING_DIR/"]
-
-# make python server in foreground
-RUN sed -i 's/\$port &/\$port/g' $SRV_DIR/develop_server.sh
-
-RUN chmod +x $SRV_DIR/develop_server.sh
-
-EXPOSE $PORT
-
-ENTRYPOINT $SRV_DIR/develop_server.sh start $PORT
-
diff --git a/.docker/scripts/kerberos/command.dev.sh b/.docker/scripts/kerberos/command.dev.sh
new file mode 100755
index 0000000..6e50280
--- /dev/null
+++ b/.docker/scripts/kerberos/command.dev.sh
@@ -0,0 +1,16 @@
+source .env 
+SSH_CMD="ssh -o StrictHostKeyChecking=no -K ${KRB_USER}@${SERVER}"
+RSYNC_CMD=''
+kinit ${KRB_USER}
+${SSH_CMD} "mkdir -p ~/public_html/"
+${SSH_CMD} "echo 'Options +FollowSymLinks' >  ~/public_html/.htaccess"
+${SSH_CMD} "echo 'RewriteEngine on' >>  ~/public_html/.htaccess"
+${SSH_CMD} "echo 'RewriteCond %{HTTP_HOST} ^perso.isima.fr$' >>  ~/public_html/.htaccess"
+${SSH_CMD} "echo 'RewriteRule (.*) https://perso.limos.fr%{REQUEST_URI} [R=301,L]' >>  ~/public_html/.htaccess"
+${SSH_CMD} "mkdir -p ~/public_html/_"
+${SSH_CMD} "echo '<FilesMatch "\.phar">' >  ~/public_html/_/.htaccess"
+${SSH_CMD} "echo '   php_flag engine off' >>  ~/public_html/_/.htaccess"
+${SSH_CMD} "echo '   ForceType application/octet-stream' >>  ~/public_html/_/.htaccess"
+${SSH_CMD} "echo '   Header set Content-Disposition attachment' >>  ~/public_html/_/.htaccess"
+${SSH_CMD} "echo '</FilesMatch>' >>  ~/public_html/_/.htaccess"
+rsync -az --exclude "_" -e "ssh -o StrictHostKeyChecking=no -K" ./output/ ${KRB_USER}@${SERVER}:~/public_html/
\ No newline at end of file
diff --git a/.docker/scripts/node/command.dev.sh b/.docker/scripts/node/command.dev.sh
new file mode 100755
index 0000000..7ec44b6
--- /dev/null
+++ b/.docker/scripts/node/command.dev.sh
@@ -0,0 +1,2 @@
+cd /srv/blog/content/slides
+yarn
\ No newline at end of file
diff --git a/.docker/scripts/python/command.dev.sh b/.docker/scripts/python/command.dev.sh
new file mode 100755
index 0000000..19b564f
--- /dev/null
+++ b/.docker/scripts/python/command.dev.sh
@@ -0,0 +1,9 @@
+apt-get update 
+apt-get -y --no-install-recommends install python3 python3-pip #python3-gettext
+cd /srv/blog
+pip install --user -r requirements.txt
+sed -i 's/\$port &/\$port/g' ./develop_server.sh
+chmod +x develop_server.sh
+export PATH=/root/.local/bin:$PATH
+export PY='/usr/bin/python3'
+./develop_server.sh start 8000
\ No newline at end of file
diff --git a/.env b/.env
index 7a6eab4..6764631 100644
--- a/.env
+++ b/.env
@@ -1,3 +1,5 @@
 REGISTRY_URL=docker.isima.fr
 NAMESPACE=docker.isima.fr/vimazeno
-APP_NAME=pelican_perso
\ No newline at end of file
+APP_NAME=pelican_perso
+KRB_USER=vimazeno
+SERVER=perso.local.isima.fr
diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644
index 519347d..0000000
--- a/.gitmodules
+++ /dev/null
@@ -1,3 +0,0 @@
-[submodule "plugins/math_render"]
-	path = plugins/math_render
-	url = https://github.com/barrysteyn/pelican_plugin-render_math.git
diff --git a/Makefile b/Makefile
index 533e07a..767489b 100644
--- a/Makefile
+++ b/Makefile
@@ -16,7 +16,7 @@ DOCKER_COMP   := docker-compose
 .DEFAULT_GOAL := help
 
 # Docker containers
-PELICAN_CONT  := $(DOCKER_COMP) exec pelican
+KERBEROS_CONT  := $(DOCKER_COMP) run kerberos
 
 include .env
 
@@ -34,7 +34,10 @@ push: ## Push build docker compose images
 .PHONY: push
 
 up: ## Make required containers up
-	@$(DOCKER_COMP) up --remove-orphans
+	@$(DOCKER_COMP) up --remove-orphans node
+#	@$(DOCKER_COMP) run dockerize -timeout 180s -wait-retry-interval 3s \
+#			-wait file:///tmp/content/node_modules/.yarn-integrity ;
+	@$(DOCKER_COMP) up --remove-orphans python
 .PHONY: up
 
 down: ## Make required containers down
@@ -54,9 +57,9 @@ errors: ## Show live container errors.
 	@$(DOCKER_COMP) logs | grep error
 .PHONY: errors
 
-pelican: ## Open bash on php container
-	@$(PELICAN_CONT) bash
-.PHONY: pelican
+publish: ## Open bash on php container
+	@$(KERBEROS_CONT) bash .docker/scripts/kerberos/command.dev.sh
+.PHONY: publish
 
 clean: ## Remove node and php folders and files
 	@for volume in ${VOLUMES} ; do \
diff --git a/develop_server.sh b/develop_server.sh
index 2661df3..53cb99f 100755
--- a/develop_server.sh
+++ b/develop_server.sh
@@ -67,7 +67,7 @@ function start_up(){
   pelican_pid=$!
   echo $pelican_pid > $PELICAN_PID
   mkdir -p $OUTPUTDIR && cd $OUTPUTDIR
-  $PY -m pelican.server $port &
+  $PY -m pelican.server $port
   srv_pid=$!
   echo $srv_pid > $SRV_PID
   cd $BASEDIR
diff --git a/docker-compose.yml b/docker-compose.yml
index c5807a3..189f9cb 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -2,15 +2,41 @@ version: '3.5'
 
 services:
 
-  pelican:
-    image: ${NAMESPACE}/${APP_NAME}:latest
+  node:
+    image: node:latest
+    container_name: blog_node_dev
+    environment:
+      TZ: ${TIMEZONE:-Europe/Paris}
+    working_dir: /srv/blog
+    volumes:
+      - .:/srv/blog
+    command: bash /srv/blog/.docker/scripts/node/command.dev.sh
+
+  python:
+    image: debian:stable
+    container_name: blog_python_dev
+    environment:
+      TZ: ${TIMEZONE:-Europe/Paris}
+    working_dir: /srv/blog
+    volumes:
+      - .:/srv/blog
+    ports:
+      - "8000:8000"
+    command: bash /srv/blog/.docker/scripts/python/command.dev.sh
+
+  kerberos:
+    image: ${NAMESPACE}/${APP_NAME}_kerberos_dev:latest
     build:
       context: .
-      dockerfile: .docker/build/pelican/Dockerfile
-    container_name: pelican
+      dockerfile: .docker/build/kerberos/Dockerfile
+    container_name: blog_kerberos_dev
     environment:
       TZ: ${TIMEZONE:-Europe/Paris}
-    # volumes:
-    #   - .:/srv/pelican
-    ports:
-      - "8000:8000"
\ No newline at end of file
+    volumes:
+      - .:/srv/blog
+    command: bash /srv/blog/.docker/scripts/kerberos/command.dev.sh
+
+  dockerize:
+    image: jwilder/dockerize
+    volumes:
+      - .:/tmp
\ No newline at end of file
diff --git a/plugins/i18n_subsites/README.rst b/plugins/i18n_subsites/README.rst
deleted file mode 100644
index 12e113d..0000000
--- a/plugins/i18n_subsites/README.rst
+++ /dev/null
@@ -1,156 +0,0 @@
-=======================
- I18N Sub-sites Plugin
-=======================
-
-This plugin extends the translations functionality by creating
-internationalized sub-sites for the default site.
-
-This plugin is designed for Pelican 3.4 and later.
-
-What it does
-============
-
-1. When the content of the main site is being generated, the settings
-   are saved and the generation stops when content is ready to be
-   written. While reading source files and generating content objects,
-   the output queue is modified in certain ways:
-
-  - translations that will appear as native in a different (sub-)site
-    will be removed
-  - untranslated articles will be transformed to drafts if
-    ``I18N_UNTRANSLATED_ARTICLES`` is ``'hide'`` (default), removed if
-    ``'remove'`` or kept as they are if ``'keep'``.
-  - untranslated pages will be transformed into hidden pages if
-    ``I18N_UNTRANSLATED_PAGES`` is ``'hide'`` (default), removed if
-    ``'remove'`` or kept as they are if ``'keep'``.''
-  - additional content manipulation similar to articles and pages can
-    be specified for custom generators in the ``I18N_GENERATOR_INFO``
-    setting.
-
-2. For each language specified in the ``I18N_SUBSITES`` dictionary the
-   settings overrides are applied to the settings from the main site
-   and a new sub-site is generated in the same way as with the main
-   site until content is ready to be written.
-3. When all (sub-)sites are waiting for content writing, all removed
-   contents, translations and static files are interlinked across the
-   (sub-)sites.
-4. Finally, all the output is written.
-
-Setting it up
-=============
-
-For each extra used language code, a language-specific settings overrides
-dictionary must be given (but can be empty) in the ``I18N_SUBSITES`` dictionary
-
-.. code-block:: python
-
-    PLUGINS = ['i18n_subsites', ...]
-
-    # mapping: language_code -> settings_overrides_dict
-    I18N_SUBSITES = {
-        'cz': {
-	    'SITENAME': 'Hezkej blog',
-	    }
-	}
-
-Default and special overrides
------------------------------
-The settings overrides may contain arbitrary settings, however, there
-are some that are handled in a special way:
-
-``SITEURL``
-  Any overrides to this setting should ensure that there is some level
-  of hierarchy between all (sub-)sites, because Pelican makes all URLs
-  relative to ``SITEURL`` and the plugin can only cross-link between
-  the sites using this hierarchy. For instance, with the main site
-  ``http://example.com`` a sub-site ``http://example.com/de`` will
-  work, but ``http://de.example.com`` will not. If not overridden, the
-  language code (the language identifier used in the ``lang``
-  metadata) is appended to the main ``SITEURL`` for each sub-site.
-``OUTPUT_PATH``, ``CACHE_PATH``
-  If not overridden, the language code is appended as with ``SITEURL``.
-  Separate cache paths are required as parser results depend on the locale.
-``STATIC_PATHS``, ``THEME_STATIC_PATHS``
-  If not overridden, they are set to ``[]`` and all links to static
-  files are cross-linked to the main site.
-``THEME``, ``THEME_STATIC_DIR``
-  If overridden, the logic with ``THEME_STATIC_PATHS`` does not apply.
-``DEFAULT_LANG``
-  This should not be overridden as the plugin changes it to the
-  language code of each sub-site to change what is perceived as translations.
-
-Localizing templates
---------------------
-
-Most importantly, this plugin can use localized templates for each
-sub-site. There are two approaches to having the templates localized:
-
-- You can set a different ``THEME`` override for each language in
-  ``I18N_SUBSITES``, e.g. by making a copy of a theme ``my_theme`` to
-  ``my_theme_lang`` and then editing the templates in the new
-  localized theme. This approach means you don't have to deal with
-  gettext ``*.po`` files, but it is harder to maintain over time.
-- You use only one theme and localize the templates using the
-  `jinja2.ext.i18n Jinja2 extension
-  <http://jinja.pocoo.org/docs/templates/#i18n>`_. For a kickstart
-  read this `guide <./localizing_using_jinja2.rst>`_.
-
-Additional context variables
-............................
-
-It may be convenient to add language buttons to your theme in addition
-to the translation links of articles and pages. These buttons could,
-for example, point to the ``SITEURL`` of each (sub-)site. For this
-reason the plugin adds these variables to the template context:
-
-``main_lang``
-  The language of the main site — the original ``DEFAULT_LANG``
-``main_siteurl``
-  The ``SITEURL`` of the main site — the original ``SITEURL``
-``lang_siteurls``
-  An ordered dictionary, mapping all used languages to their
-  ``SITEURL``. The ``main_lang`` is the first key with ``main_siteurl``
-  as the value. This dictionary is useful for implementing global
-  language buttons that show the language of the currently viewed
-  (sub-)site too.
-``extra_siteurls``
-  An ordered dictionary, subset of ``lang_siteurls``, the current
-  ``DEFAULT_LANG`` of the rendered (sub-)site is not included, so for
-  each (sub-)site ``set(extra_siteurls) == set(lang_siteurls) -
-  set([DEFAULT_LANG])``. This dictionary is useful for implementing
-  global language buttons that do not show the current language.
-``relpath_to_site``
-  A function that returns a relative path from the first (sub-)site to
-  the second (sub-)site where the (sub-)sites are identified by the
-  language codes given as two arguments.
-
-If you don't like the default ordering of the ordered dictionaries,
-use a Jinja2 filter to alter the ordering.
-
-All the siteurls above are always absolute even in the case of
-``RELATIVE_URLS == True`` (it would be to complicated to replicate the
-Pelican internals for local siteurls), so you may rather use something
-like ``{{ SITEURL }}/{{ relpath_to_site(DEFAULT_LANG, main_lang }}``
-to link to the main site.
-
-This short `howto <./implementing_language_buttons.rst>`_ shows two
-example implementations of language buttons.
-
-Usage notes
-===========
-- It is **mandatory** to specify ``lang`` metadata for each article
-  and page as ``DEFAULT_LANG`` is later changed for each sub-site, so
-  content without ``lang`` metadata would be rendered in every
-  (sub-)site.
-- As with the original translations functionality, ``slug`` metadata
-  is used to group translations. It is therefore often convenient to
-  compensate for this by overriding the content URL (which defaults to
-  slug) using the ``url`` and ``save_as`` metadata. You could also
-  give articles e.g. ``name`` metadata and use it in ``ARTICLE_URL =
-  '{name}.html'``.
-
-Development
-===========
-
-- A demo and a test site is in the ``gh-pages`` branch and can be seen
-  at http://smartass101.github.io/pelican-plugins/
diff --git a/plugins/i18n_subsites/__init__.py b/plugins/i18n_subsites/__init__.py
deleted file mode 100644
index 7dfbde0..0000000
--- a/plugins/i18n_subsites/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-from .i18n_subsites import *
diff --git a/plugins/i18n_subsites/__init__.pyc b/plugins/i18n_subsites/__init__.pyc
deleted file mode 100644
index 4e4d242fd150b546379306b3c3468e9b0b5254c4..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 202
zcmZSn%*!<)N-{o~0ScIav;z<q^8twzAYx?5VPFVJVPXi@U<L|hG6D$=5K#gmwEQ4!
zUXYZbMP7VyX;N`!NouhMP=EnJ6uSet`WgATsrtEzRjGOTWtsXZsb%^}Ir-^eLN6yX
yH@{dftw_Hhr!+k?uUH?&IQ{te%)HE!_;|g7$`THsSvI-(DWy57c3_u)>;eFeIV~gr

diff --git a/plugins/i18n_subsites/i18n_subsites.py b/plugins/i18n_subsites/i18n_subsites.py
deleted file mode 100644
index 388e758..0000000
--- a/plugins/i18n_subsites/i18n_subsites.py
+++ /dev/null
@@ -1,450 +0,0 @@
-"""i18n_subsites plugin creates i18n-ized subsites of the default site
-
-This plugin is designed for Pelican 3.4 and later
-"""
-
-
-import os
-import six
-import logging
-import posixpath
-
-from copy import copy
-from itertools import chain
-from operator import attrgetter
-from collections import OrderedDict
-from contextlib import contextmanager
-from six.moves.urllib.parse import urlparse
-
-import gettext
-import locale
-
-from pelican import signals
-from pelican.generators import ArticlesGenerator, PagesGenerator
-from pelican.settings import configure_settings
-from pelican.contents import Draft
-
-
-# Global vars
-_MAIN_SETTINGS = None     # settings dict of the main Pelican instance
-_MAIN_LANG = None         # lang of the main Pelican instance
-_MAIN_SITEURL = None      # siteurl of the main Pelican instance
-_MAIN_STATIC_FILES = None # list of Static instances the main Pelican instance
-_SUBSITE_QUEUE = {}   # map: lang -> settings overrides
-_SITE_DB = OrderedDict()           # OrderedDict: lang -> siteurl
-_SITES_RELPATH_DB = {}       # map: (lang, base_lang) -> relpath
-# map: generator -> list of removed contents that need interlinking
-_GENERATOR_DB = {}
-_NATIVE_CONTENT_URL_DB = {} # map: source_path -> content in its native lang
-_LOGGER = logging.getLogger(__name__)
-
-
-@contextmanager
-def temporary_locale(temp_locale=None):
-    '''Enable code to run in a context with a temporary locale
-
-    Resets the locale back when exiting context.
-    Can set a temporary locale if provided
-    '''
-    orig_locale = locale.setlocale(locale.LC_ALL)
-    if temp_locale is not None:
-        locale.setlocale(locale.LC_ALL, temp_locale)
-    yield
-    locale.setlocale(locale.LC_ALL, orig_locale)
-
-
-def initialize_dbs(settings):
-    '''Initialize internal DBs using the Pelican settings dict
-
-    This clears the DBs for e.g. autoreload mode to work
-    '''
-    global _MAIN_SETTINGS, _MAIN_SITEURL, _MAIN_LANG, _SUBSITE_QUEUE
-    _MAIN_SETTINGS = settings
-    _MAIN_LANG = settings['DEFAULT_LANG']
-    _MAIN_SITEURL = settings['SITEURL']
-    _SUBSITE_QUEUE = settings.get('I18N_SUBSITES', {}).copy()
-    prepare_site_db_and_overrides()
-    # clear databases in case of autoreload mode
-    _SITES_RELPATH_DB.clear()
-    _NATIVE_CONTENT_URL_DB.clear()
-    _GENERATOR_DB.clear()
-
-
-def prepare_site_db_and_overrides():
-    '''Prepare overrides and create _SITE_DB
-
-    _SITE_DB.keys() need to be ready for filter_translations
-    '''
-    _SITE_DB.clear()
-    _SITE_DB[_MAIN_LANG] = _MAIN_SITEURL
-    # make sure it works for both root-relative and absolute
-    main_siteurl = '/' if _MAIN_SITEURL == '' else _MAIN_SITEURL
-    for lang, overrides in _SUBSITE_QUEUE.items():
-        if 'SITEURL' not in overrides:
-            overrides['SITEURL'] = posixpath.join(main_siteurl, lang)
-        _SITE_DB[lang] = overrides['SITEURL']
-        # default subsite hierarchy
-        if 'OUTPUT_PATH' not in overrides:
-            overrides['OUTPUT_PATH'] = os.path.join(
-                _MAIN_SETTINGS['OUTPUT_PATH'], lang)
-        if 'CACHE_PATH' not in overrides:
-            overrides['CACHE_PATH'] = os.path.join(
-                _MAIN_SETTINGS['CACHE_PATH'], lang)
-        if 'STATIC_PATHS' not in overrides:
-            overrides['STATIC_PATHS'] = []
-        if ('THEME' not in overrides and 'THEME_STATIC_DIR' not in overrides and
-                'THEME_STATIC_PATHS' not in overrides):
-            relpath = relpath_to_site(lang, _MAIN_LANG)
-            overrides['THEME_STATIC_DIR'] = posixpath.join(
-                relpath, _MAIN_SETTINGS['THEME_STATIC_DIR'])
-            overrides['THEME_STATIC_PATHS'] = []
-        # to change what is perceived as translations
-        overrides['DEFAULT_LANG'] = lang
-
-
-def subscribe_filter_to_signals(settings):
-    '''Subscribe content filter to requested signals'''
-    for sig in settings.get('I18N_FILTER_SIGNALS', []):
-        sig.connect(filter_contents_translations)
-
-
-def initialize_plugin(pelican_obj):
-    '''Initialize plugin variables and Pelican settings'''
-    if _MAIN_SETTINGS is None:
-        initialize_dbs(pelican_obj.settings)
-        subscribe_filter_to_signals(pelican_obj.settings)
-
-
-def get_site_path(url):
-    '''Get the path component of an url, excludes siteurl
-
-    also normalizes '' to '/' for relpath to work,
-    otherwise it could be interpreted as a relative filesystem path
-    '''
-    path = urlparse(url).path
-    if path == '':
-        path = '/'
-    return path
-
-
-def relpath_to_site(lang, target_lang):
-    '''Get relative path from siteurl of lang to siteurl of base_lang
-
-    the output is cached in _SITES_RELPATH_DB
-    '''
-    path = _SITES_RELPATH_DB.get((lang, target_lang), None)
-    if path is None:
-        siteurl = _SITE_DB.get(lang, _MAIN_SITEURL)
-        target_siteurl = _SITE_DB.get(target_lang, _MAIN_SITEURL)
-        path = posixpath.relpath(get_site_path(target_siteurl),
-                                 get_site_path(siteurl))
-        _SITES_RELPATH_DB[(lang, target_lang)] = path
-    return path
-
-
-def save_generator(generator):
-    '''Save the generator for later use
-
-    initialize the removed content list
-    '''
-    _GENERATOR_DB[generator] = []
-
-
-def article2draft(article):
-    '''Transform an Article to Draft'''
-    draft = Draft(article._content, article.metadata, article.settings,
-                  article.source_path, article._context)
-    draft.status = 'draft'
-    return draft
-
-
-def page2hidden_page(page):
-    '''Transform a Page to a hidden Page'''
-    page.status = 'hidden'
-    return page
-
-
-class GeneratorInspector(object):
-    '''Inspector of generator instances'''
-
-    generators_info = {
-        ArticlesGenerator: {
-            'translations_lists': ['translations', 'drafts_translations'],
-            'contents_lists': [('articles', 'drafts')],
-            'hiding_func': article2draft,
-            'policy': 'I18N_UNTRANSLATED_ARTICLES',
-        },
-        PagesGenerator: {
-            'translations_lists': ['translations', 'hidden_translations'],
-            'contents_lists': [('pages', 'hidden_pages')],
-            'hiding_func': page2hidden_page,
-            'policy': 'I18N_UNTRANSLATED_PAGES',
-        },
-    }
-
-    def __init__(self, generator):
-        '''Identify the best known class of the generator instance
-
-        The class '''
-        self.generator = generator
-        self.generators_info.update(generator.settings.get(
-            'I18N_GENERATORS_INFO', {}))
-        for cls in generator.__class__.__mro__:
-            if cls in self.generators_info:
-                self.info = self.generators_info[cls]
-                break
-        else:
-            self.info = {}
-
-    def translations_lists(self):
-        '''Iterator over lists of content translations'''
-        return (getattr(self.generator, name) for name in
-                self.info.get('translations_lists', []))
-
-    def contents_list_pairs(self):
-        '''Iterator over pairs of normal and hidden contents'''
-        return (tuple(getattr(self.generator, name) for name in names)
-                for names in self.info.get('contents_lists', []))
-
-    def hiding_function(self):
-        '''Function for transforming content to a hidden version'''
-        hiding_func = self.info.get('hiding_func', lambda x: x)
-        return hiding_func
-
-    def untranslated_policy(self, default):
-        '''Get the policy for untranslated content'''
-        return self.generator.settings.get(self.info.get('policy', None),
-                                           default)
-
-    def all_contents(self):
-        '''Iterator over all contents'''
-        translations_iterator = chain(*self.translations_lists())
-        return chain(translations_iterator,
-                     *(pair[i] for pair in self.contents_list_pairs()
-                       for i in (0, 1)))
-
-
-def filter_contents_translations(generator):
-    '''Filter the content and translations lists of a generator
-
-    Filters out
-        1) translations which will be generated in a different site
-        2) content that is not in the language of the currently
-        generated site but in that of a different site, content in a
-        language which has no site is generated always. The filtering
-        method bay be modified by the respective untranslated policy
-    '''
-    inspector = GeneratorInspector(generator)
-    current_lang = generator.settings['DEFAULT_LANG']
-    langs_with_sites = _SITE_DB.keys()
-    removed_contents = _GENERATOR_DB[generator]
-
-    for translations in inspector.translations_lists():
-        for translation in translations[:]:    # copy to be able to remove
-            if translation.lang in langs_with_sites:
-                translations.remove(translation)
-                removed_contents.append(translation)
-
-    hiding_func = inspector.hiding_function()
-    untrans_policy = inspector.untranslated_policy(default='hide')
-    for (contents, other_contents) in inspector.contents_list_pairs():
-        for content in other_contents: # save any hidden native content first
-            if content.lang == current_lang: # in native lang
-                # save the native URL attr formatted in the current locale
-                _NATIVE_CONTENT_URL_DB[content.source_path] = content.url
-        for content in contents[:]:        # copy for removing in loop
-            if content.lang == current_lang: # in native lang
-                # save the native URL attr formatted in the current locale
-                _NATIVE_CONTENT_URL_DB[content.source_path] = content.url
-            elif content.lang in langs_with_sites and untrans_policy != 'keep':
-                contents.remove(content)
-                if untrans_policy == 'hide':
-                    other_contents.append(hiding_func(content))
-                elif untrans_policy == 'remove':
-                    removed_contents.append(content)
-
-
-def install_templates_translations(generator):
-    '''Install gettext translations in the jinja2.Environment
-
-    Only if the 'jinja2.ext.i18n' jinja2 extension is enabled
-    the translations for the current DEFAULT_LANG are installed.
-    '''
-    if 'JINJA_ENVIRONMENT' in generator.settings: # pelican 3.7+
-        jinja_extensions = generator.settings['JINJA_ENVIRONMENT'].get(
-            'extensions', [])
-    else:
-        jinja_extensions = generator.settings['JINJA_EXTENSIONS']
-
-    if 'jinja2.ext.i18n' in jinja_extensions:
-        domain = generator.settings.get('I18N_GETTEXT_DOMAIN', 'messages')
-        localedir = generator.settings.get('I18N_GETTEXT_LOCALEDIR')
-        if localedir is None:
-            localedir = os.path.join(generator.theme, 'translations')
-        current_lang = generator.settings['DEFAULT_LANG']
-        if current_lang == generator.settings.get('I18N_TEMPLATES_LANG',
-                                                  _MAIN_LANG):
-            translations = gettext.NullTranslations()
-        else:
-            langs = [current_lang]
-            try:
-                translations = gettext.translation(domain, localedir, langs)
-            except (IOError, OSError):
-                _LOGGER.error((
-                    "Cannot find translations for language '{}' in '{}' with "
-                    "domain '{}'. Installing NullTranslations.").format(
-                        langs[0], localedir, domain))
-                translations = gettext.NullTranslations()
-        newstyle = generator.settings.get('I18N_GETTEXT_NEWSTYLE', True)
-        generator.env.install_gettext_translations(translations, newstyle)
-
-
-def add_variables_to_context(generator):
-    '''Adds useful iterable variables to template context'''
-    context = generator.context             # minimize attr lookup
-    context['relpath_to_site'] = relpath_to_site
-    context['main_siteurl'] = _MAIN_SITEURL
-    context['main_lang'] = _MAIN_LANG
-    context['lang_siteurls'] = _SITE_DB
-    current_lang = generator.settings['DEFAULT_LANG']
-    extra_siteurls = _SITE_DB.copy()
-    extra_siteurls.pop(current_lang)
-    context['extra_siteurls'] = extra_siteurls
-
-
-def interlink_translations(content):
-    '''Link content to translations in their main language
-
-    so the URL (including localized month names) of the different subsites
-    will be honored
-    '''
-    lang = content.lang
-    # sort translations by lang
-    content.translations.sort(key=attrgetter('lang'))
-    for translation in content.translations:
-        relpath = relpath_to_site(lang, translation.lang)
-        url = _NATIVE_CONTENT_URL_DB[translation.source_path]
-        translation.override_url = posixpath.join(relpath, url)
-
-
-def interlink_translated_content(generator):
-    '''Make translations link to the native locations
-
-    for generators that may contain translated content
-    '''
-    inspector = GeneratorInspector(generator)
-    for content in inspector.all_contents():
-        interlink_translations(content)
-
-
-def interlink_removed_content(generator):
-    '''For all contents removed from generation queue update interlinks
-
-    link to the native location
-    '''
-    current_lang = generator.settings['DEFAULT_LANG']
-    for content in _GENERATOR_DB[generator]:
-        url = _NATIVE_CONTENT_URL_DB[content.source_path]
-        relpath = relpath_to_site(current_lang, content.lang)
-        content.override_url = posixpath.join(relpath, url)
-
-
-def interlink_static_files(generator):
-    '''Add links to static files in the main site if necessary'''
-    if generator.settings['STATIC_PATHS'] != []:
-        return                               # customized STATIC_PATHS
-    filenames = generator.context['filenames'] # minimize attr lookup
-    relpath = relpath_to_site(generator.settings['DEFAULT_LANG'], _MAIN_LANG)
-    for staticfile in _MAIN_STATIC_FILES:
-        if staticfile.get_relative_source_path() not in filenames:
-            staticfile = copy(staticfile) # prevent override in main site
-            staticfile.override_url = posixpath.join(relpath, staticfile.url)
-            generator.add_source_path(staticfile)
-
-
-def save_main_static_files(static_generator):
-    '''Save the static files generated for the main site'''
-    global _MAIN_STATIC_FILES
-    # test just for current lang as settings change in autoreload mode
-    if static_generator.settings['DEFAULT_LANG'] == _MAIN_LANG:
-        _MAIN_STATIC_FILES = static_generator.staticfiles
-
-
-def update_generators():
-    '''Update the context of all generators
-
-    Ads useful variables and translations into the template context
-    and interlink translations
-    '''
-    for generator in _GENERATOR_DB.keys():
-        install_templates_translations(generator)
-        add_variables_to_context(generator)
-        interlink_static_files(generator)
-        interlink_removed_content(generator)
-        interlink_translated_content(generator)
-
-
-def get_pelican_cls(settings):
-    '''Get the Pelican class requested in settings'''
-    cls = settings['PELICAN_CLASS']
-    if isinstance(cls, six.string_types):
-        module, cls_name = cls.rsplit('.', 1)
-        module = __import__(module)
-        cls = getattr(module, cls_name)
-    return cls
-
-
-def create_next_subsite(pelican_obj):
-    '''Create the next subsite using the lang-specific config
-
-    If there are no more subsites in the generation queue, update all
-    the generators (interlink translations and removed content, add
-    variables and translations to template context). Otherwise get the
-    language and overrides for next the subsite in the queue and apply
-    overrides.  Then generate the subsite using a PELICAN_CLASS
-    instance and its run method. Finally, restore the previous locale.
-    '''
-    global _MAIN_SETTINGS
-    if len(_SUBSITE_QUEUE) == 0:
-        _LOGGER.debug(
-            'i18n: Updating cross-site links and context of all generators.')
-        update_generators()
-        _MAIN_SETTINGS = None             # to initialize next time
-    else:
-        with temporary_locale():
-            settings = _MAIN_SETTINGS.copy()
-            lang, overrides = _SUBSITE_QUEUE.popitem()
-            settings.update(overrides)
-            settings = configure_settings(settings)      # to set LOCALE, etc.
-            cls = get_pelican_cls(settings)
-
-            new_pelican_obj = cls(settings)
-            _LOGGER.debug(("Generating i18n subsite for language '{}' "
-                           "using class {}").format(lang, cls))
-            new_pelican_obj.run()
-
-
-# map: signal name -> function name
-_SIGNAL_HANDLERS_DB = {
-    'get_generators': initialize_plugin,
-    'article_generator_pretaxonomy': filter_contents_translations,
-    'page_generator_finalized': filter_contents_translations,
-    'get_writer': create_next_subsite,
-    'static_generator_finalized': save_main_static_files,
-    'generator_init': save_generator,
-}
-
-
-def register():
-    '''Register the plugin only if required signals are available'''
-    for sig_name in _SIGNAL_HANDLERS_DB.keys():
-        if not hasattr(signals, sig_name):
-            _LOGGER.error((
-                'The i18n_subsites plugin requires the {} '
-                'signal available for sure in Pelican 3.4.0 and later, '
-                'plugin will not be used.').format(sig_name))
-            return
-
-    for sig_name, handler in _SIGNAL_HANDLERS_DB.items():
-        sig = getattr(signals, sig_name)
-        sig.connect(handler)
diff --git a/plugins/i18n_subsites/i18n_subsites.pyc b/plugins/i18n_subsites/i18n_subsites.pyc
deleted file mode 100644
index 0d52ca50ba28f189b25776769e583740828da146..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 17976
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

diff --git a/plugins/i18n_subsites/implementing_language_buttons.rst b/plugins/i18n_subsites/implementing_language_buttons.rst
deleted file mode 100644
index 43f8bb3..0000000
--- a/plugins/i18n_subsites/implementing_language_buttons.rst
+++ /dev/null
@@ -1,128 +0,0 @@
------------------------------
-Implementing language buttons
------------------------------
-
-Each article with translations has translations links, but that's the
-only way to switch between language subsites.
-
-For this reason it is convenient to add language buttons to the top
-menu bar to make it simple to switch between the language subsites on
-all pages.
-
-Example designs
----------------
-
-Language buttons showing other available languages
-..................................................
-
-The ``extra_siteurls`` dictionary is a mapping of all other (not the
-``DEFAULT_LANG`` of the current (sub-)site) languages to the
-``SITEURL`` of the respective (sub-)sites
-
-.. code-block:: jinja
-
-   <!-- SNIP -->
-   <nav><ul>
-   {% if extra_siteurls %}
-   {% for lang, url in extra_siteurls.items() %}
-   <li><a href="{{ url }}/">{{ lang }}</a></li>
-   {% endfor %}
-   <!-- separator -->
-   <li style="background-color: white; padding: 5px;">&nbsp</li>
-   {% endif %}
-   {% for title, link in MENUITEMS %}
-   <!-- SNIP -->
-
-Notice the slash ``/`` after ``{{ url }}``, this makes sure it works
-with local development when ``SITEURL == ''``.
-
-Language buttons showing all available languages, current is active
-...................................................................
-
-The ``extra_siteurls`` dictionary is a mapping of all languages to the
-``SITEURL`` of the respective (sub-)sites. This template sets the
-language of the current (sub-)site as active.
-
-.. code-block:: jinja
-
-   <!-- SNIP -->
-   <nav><ul>
-   {% if lang_siteurls %}
-   {% for lang, url in lang_siteurls.items() %}
-   <li{% if lang == DEFAULT_LANG %} class="active"{% endif %}><a href="{{ url }}/">{{ lang }}</a></li>
-   {% endfor %}
-   <!-- separator -->
-   <li style="background-color: white; padding: 5px;">&nbsp</li>
-   {% endif %}
-   {% for title, link in MENUITEMS %}
-   <!-- SNIP -->
-
-
-Tips and tricks
----------------
-
-Showing more than language codes
-................................
-
-If you want the language buttons to show e.g. the names of the
-languages or flags [#flags]_, not just the language codes, you can use
-a jinja filter to translate the language codes
-
-
-.. code-block:: python
-
-   languages_lookup = {
-		'en': 'English',
-		'cz': 'Čeština',
-		}
-
-   def lookup_lang_name(lang_code):
-       return languages_lookup[lang_code]
-
-   JINJA_FILTERS = {
-		...
-		'lookup_lang_name': lookup_lang_name,
-		}
-
-And then the link content becomes
-
-.. code-block:: jinja
-
-   <!-- SNIP -->
-   {% for lang, siteurl in lang_siteurls.items() %}
-   <li{% if lang == DEFAULT_LANG %} class="active"{% endif %}><a href="{{ siteurl }}/">{{ lang | lookup_lang_name }}</a></li>
-   {% endfor %}
-   <!-- SNIP -->
-
-
-Changing the order of language buttons
-......................................
-
-Because ``lang_siteurls`` and ``extra_siteurls`` are instances of
-``OrderedDict`` with ``main_lang`` being always the first key, you can
-change the order through a jinja filter.
-
-.. code-block:: python
-
-   def my_ordered_items(ordered_dict):
-       items = list(ordered_dict.items())
-       # swap first and last using tuple unpacking
-       items[0], items[-1] = items[-1], items[0]
-       return items
-
-   JINJA_FILTERS = {
-		...
-		'my_ordered_items': my_ordered_items,
-		}
-
-And then the ``for`` loop line in the template becomes
-
-.. code-block:: jinja
-
-   <!-- SNIP -->
-   {% for lang, siteurl in lang_siteurls | my_ordered_items %}
-   <!-- SNIP -->
-
-
-.. [#flags] Although it may look nice, `w3 discourages it
-            <http://www.w3.org/TR/i18n-html-tech-lang/#ri20040808.173208643>`_.
diff --git a/plugins/i18n_subsites/localizing_using_jinja2.rst b/plugins/i18n_subsites/localizing_using_jinja2.rst
deleted file mode 100644
index 6ffe654..0000000
--- a/plugins/i18n_subsites/localizing_using_jinja2.rst
+++ /dev/null
@@ -1,200 +0,0 @@
------------------------------
-Localizing themes with Jinja2
------------------------------
-
-1. Localize templates
----------------------
-
-To enable the |ext| extension in your templates, you must add it to
-``JINJA_EXTENSIONS`` in your Pelican configuration
-
-.. code-block:: python
-
-  JINJA_EXTENSIONS = ['jinja2.ext.i18n', ...]
-
-Then follow the `Jinja2 templating documentation for the I18N plugin
-<http://jinja.pocoo.org/docs/templates/#i18n>`_ to make your templates
-localizable. This usually means surrounding strings with the ``{%
-trans %}`` directive or using ``gettext()`` in expressions
-
-.. code-block:: jinja
-
-    {% trans %}translatable content{% endtrans %}
-    {{ gettext('a translatable string') }}
-
-For pluralization support, etc. consult the documentation.
-
-To enable `newstyle gettext calls
-<http://jinja.pocoo.org/docs/extensions/#newstyle-gettext>`_ the
-``I18N_GETTEXT_NEWSTYLE`` config variable must be set to ``True``
-(default).
-
-.. |ext| replace:: ``jinja2.ext.i18n``
-
-2. Specify translations location
---------------------------------
-
-The |ext| extension uses the `Python gettext library
-<http://docs.python.org/library/gettext.html>`_ for translating
-strings.
-
-In your Pelican config you can give the path in which to look for
-translations in the ``I18N_GETTEXT_LOCALEDIR`` variable. If not given,
-it is assumed to be the ``translations`` subfolder in the top folder
-of the theme specified by ``THEME``.
-
-The domain of the translations (the name of each translation file is
-``domain.mo``) is controlled by the ``I18N_GETTEXT_DOMAIN`` config
-variable (defaults to ``messages``).
-
-Example
-.......
-
-With the following in your Pelican settings file
-
-.. code-block:: python
-
-  I18N_GETTEXT_LOCALEDIR = 'some/path/'
-  I18N_GETTEXT_DOMAIN = 'my_domain'
-
-the translation for language 'cz' will be expected to be in
-``some/path/cz/LC_MESSAGES/my_domain.mo``
-
-
-3. Extract translatable strings and translate them
---------------------------------------------------
-
-There are many ways to extract translatable strings and create
-``gettext`` compatible translations. You can create the ``*.po`` and
-``*.mo`` message catalog files yourself, or you can use some helper
-tool as described in `the Python gettext library tutorial
-<http://docs.python.org/library/gettext.html#internationalizing-your-programs-and-modules>`_.
-
-You of course don't need to provide a translation for the language in
-which the templates are written which is assumed to be the original
-``DEFAULT_LANG``. This can be overridden in the
-``I18N_TEMPLATES_LANG`` variable.
-
-Recommended tool: babel
-.......................
-
-`Babel <http://babel.pocoo.org/>`_ makes it easy to extract
-translatable strings from the localized Jinja2 templates and assists
-with creating translations as documented in this `Jinja2-Babel
-tutorial
-<http://pythonhosted.org/Flask-Babel/#translating-applications>`_
-[#flask]_ on which the following is based.
-
-1. Add babel mapping
-~~~~~~~~~~~~~~~~~~~~
-
-Let's assume that you are localizing a theme in ``themes/my_theme/``
-and that you use the default settings, i.e. the default domain
-``messages`` and will put the translations in the ``translations``
-subdirectory of the theme directory as
-``themes/my_theme/translations/``.
-
-It is up to you where to store babel mappings and translation files
-templates (``*.pot``), but a convenient place is to put them in
-``themes/my_theme/`` and work in that directory. From now on let's
-assume that it will be our current working directory (CWD).
-
-To tell babel to extract translatable strings from the templates
-create a mapping file ``babel.cfg`` with the following line
-
-.. code-block:: cfg
-
-    [jinja2: templates/**.html]
-
-
-2. Extract translatable strings from templates
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Run the following command to create a ``messages.pot`` message catalog
-template file from extracted translatable strings
-
-.. code-block:: bash
-
-    pybabel extract --mapping babel.cfg --output messages.pot ./
-
-
-3. Initialize message catalogs
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-If you want to translate the template to language ``lang``, run the
-following command to create a message catalog
-``translations/lang/LC_MESSAGES/messages.po`` using the template
-``messages.pot``
-
-.. code-block:: bash
-
-    pybabel init --input-file messages.pot --output-dir translations/ --locale lang --domain messages
-
-babel expects ``lang`` to be a valid locale identifier, so if e.g. you
-are translating for language ``cz`` but the corresponding locale is
-``cs``, you have to use the locale identifier. Nevertheless, the
-gettext infrastructure should later correctly find the locale for a
-given language.
-
-4. Fill the message catalogs
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The message catalog files format is quite intuitive, it is fully
-documented in the `GNU gettext manual
-<http://www.gnu.org/software/gettext/manual/gettext.html#PO-Files>`_. Essentially,
-you fill in the ``msgstr`` strings
-
-
-.. code-block:: po
-
-    msgid "just a simple string"
-    msgstr "jenom jednoduchý řetězec"
-
-    msgid ""
-    "some multiline string"
-    "looks like this"
-    msgstr ""
-    "nějaký více řádkový řetězec"
-    "vypadá takto"
-
-You might also want to remove ``#,fuzzy`` flags once the translation
-is complete and reviewed to show that it can be compiled.
-
-5. Compile the message catalogs
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The message catalogs must be compiled into binary format using this
-command
-
-.. code-block:: bash
-
-    pybabel compile --directory translations/ --domain messages
-
-This command might complain about "fuzzy" translations, which means
-you should review the translations and once done, remove the fuzzy
-flag line.
-
-(6.) Update the catalogs when templates change
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-If you add any translatable patterns into your templates, you have to
-update your message catalogs too.  First you extract a new message
-catalog template as described in the 2. step. Then you run the
-following command [#pybabel_error]_
-
-.. code-block:: bash
-
-   pybabel update --input-file messages.pot --output-dir translations/ --domain messages
-
-This will merge the new patterns with the old ones. Once you review
-and fill them, you have to recompile them as described in the 5. step.
-
-.. [#flask] Although the tutorial is focused on Flask-based web
-            applications, the linked translation tutorial is not
-            Flask-specific.
-.. [#pybabel_error] If you get an error ``TypeError: must be str, not
-                    bytes`` with Python 3.3, it is likely you are
-                    suffering from this `bug
-                    <https://github.com/mitsuhiko/flask-babel/issues/43>`_.
-                    Until the fix is released, you can use babel with
-                    Python 2.7.
diff --git a/plugins/i18n_subsites/test_data/content/images/img.png b/plugins/i18n_subsites/test_data/content/images/img.png
deleted file mode 100644
index e69de29..0000000
diff --git a/plugins/i18n_subsites/test_data/content/pages/hidden-page-cz.rst b/plugins/i18n_subsites/test_data/content/pages/hidden-page-cz.rst
deleted file mode 100644
index c282faa..0000000
--- a/plugins/i18n_subsites/test_data/content/pages/hidden-page-cz.rst
+++ /dev/null
@@ -1,7 +0,0 @@
-404 stránka
-===========
-:slug: 404
-:lang: cz
-:status: hidden
-
-Jednoduchá 404 stránka.
diff --git a/plugins/i18n_subsites/test_data/content/pages/hidden-page-de.rst b/plugins/i18n_subsites/test_data/content/pages/hidden-page-de.rst
deleted file mode 100644
index d8410a1..0000000
--- a/plugins/i18n_subsites/test_data/content/pages/hidden-page-de.rst
+++ /dev/null
@@ -1,7 +0,0 @@
-Eine 404 Seite
-==============
-:slug: 404
-:lang: de
-:status: hidden
-
-Eine einfache 404 Seite.
diff --git a/plugins/i18n_subsites/test_data/content/pages/hidden-page-en.rst b/plugins/i18n_subsites/test_data/content/pages/hidden-page-en.rst
deleted file mode 100644
index 74a97d7..0000000
--- a/plugins/i18n_subsites/test_data/content/pages/hidden-page-en.rst
+++ /dev/null
@@ -1,7 +0,0 @@
-A 404 page
-==========
-:slug: 404
-:lang: en
-:status: hidden
-
-A simple 404 page.
diff --git a/plugins/i18n_subsites/test_data/content/pages/untranslated-page.rst b/plugins/i18n_subsites/test_data/content/pages/untranslated-page.rst
deleted file mode 100644
index ae4c2b8..0000000
--- a/plugins/i18n_subsites/test_data/content/pages/untranslated-page.rst
+++ /dev/null
@@ -1,5 +0,0 @@
-Untranslated page
-=================
-:lang: en
-
-This page has no translation.
diff --git a/plugins/i18n_subsites/test_data/content/translated_article-cz.rst b/plugins/i18n_subsites/test_data/content/translated_article-cz.rst
deleted file mode 100644
index 555a69d..0000000
--- a/plugins/i18n_subsites/test_data/content/translated_article-cz.rst
+++ /dev/null
@@ -1,8 +0,0 @@
-Přeložený článek
-================
-:slug: translated-article
-:lang: cz
-:date: 2014-09-15
-
-Jednoduchý článek s překlady.
-Zde je odkaz na `nějaký obrázek <{filename}/images/img.png>`_.
diff --git a/plugins/i18n_subsites/test_data/content/translated_article-de.rst b/plugins/i18n_subsites/test_data/content/translated_article-de.rst
deleted file mode 100644
index 01bf565..0000000
--- a/plugins/i18n_subsites/test_data/content/translated_article-de.rst
+++ /dev/null
@@ -1,8 +0,0 @@
-Ein übersetzter Artikel
-=======================
-:slug: translated-article
-:lang: de
-:date: 2014-09-14
-
-Ein einfacher Artikel mit einer Ãœbersetzung.
-Hier ist ein Link zur `einigem Bild <{filename}/images/img.png>`_.
diff --git a/plugins/i18n_subsites/test_data/content/translated_article-en.rst b/plugins/i18n_subsites/test_data/content/translated_article-en.rst
deleted file mode 100644
index d7f5dad..0000000
--- a/plugins/i18n_subsites/test_data/content/translated_article-en.rst
+++ /dev/null
@@ -1,8 +0,0 @@
-A translated article
-====================
-:slug: translated-article
-:lang: en
-:date: 2014-09-13
-
-A simple article with a translation.
-Here is a link to `some image <{filename}/images/img.png>`_.
diff --git a/plugins/i18n_subsites/test_data/content/untranslated_article-en.rst b/plugins/i18n_subsites/test_data/content/untranslated_article-en.rst
deleted file mode 100644
index 867ae5d..0000000
--- a/plugins/i18n_subsites/test_data/content/untranslated_article-en.rst
+++ /dev/null
@@ -1,9 +0,0 @@
-An untranslated article
-=======================
-:date: 2014-07-14
-:lang: en
-
-An article without a translation.
-Here is a link to an `untranslated page`_
-
-.. _`untranslated page`: {filename}/pages/untranslated-page.rst
diff --git a/plugins/i18n_subsites/test_data/localized_theme/babel.cfg b/plugins/i18n_subsites/test_data/localized_theme/babel.cfg
deleted file mode 100644
index 4406732..0000000
--- a/plugins/i18n_subsites/test_data/localized_theme/babel.cfg
+++ /dev/null
@@ -1,2 +0,0 @@
-[jinja2: templates/**.html]
-
diff --git a/plugins/i18n_subsites/test_data/localized_theme/messages.pot b/plugins/i18n_subsites/test_data/localized_theme/messages.pot
deleted file mode 100644
index 578917f..0000000
--- a/plugins/i18n_subsites/test_data/localized_theme/messages.pot
+++ /dev/null
@@ -1,23 +0,0 @@
-# Translations template for PROJECT.
-# Copyright (C) 2014 ORGANIZATION
-# This file is distributed under the same license as the PROJECT project.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: PROJECT VERSION\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-07-13 12:25+0200\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 1.3\n"
-
-#: templates/base.html:3
-msgid "Welcome to our"
-msgstr ""
-
diff --git a/plugins/i18n_subsites/test_data/localized_theme/static/style.css b/plugins/i18n_subsites/test_data/localized_theme/static/style.css
deleted file mode 100644
index e69de29..0000000
diff --git a/plugins/i18n_subsites/test_data/localized_theme/templates/base.html b/plugins/i18n_subsites/test_data/localized_theme/templates/base.html
deleted file mode 100644
index a24eb1d..0000000
--- a/plugins/i18n_subsites/test_data/localized_theme/templates/base.html
+++ /dev/null
@@ -1,7 +0,0 @@
-{% extends "!simple/base.html" %}
-
-{% block title %}{% trans %}Welcome to our{% endtrans %} {{ SITENAME }}{% endblock %}
-{% block head %}
-{{ super() }}
-<link rel="stylesheet" href="{{ SITEURL }}/{{ THEME_STATIC_DIR }}/style.css" />
-{% endblock %}
diff --git a/plugins/i18n_subsites/test_data/localized_theme/translations/de/LC_MESSAGES/messages.mo b/plugins/i18n_subsites/test_data/localized_theme/translations/de/LC_MESSAGES/messages.mo
deleted file mode 100644
index 239010221fe789ec007296b700578fd5114ab279..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 486
zcmZvYO-{ow5QPI`l?4lyh{do2flCtpD$^iJo1&tGR%w8>+YZ6t*p=-dV8Jao6?fn)
zxO4$XjP%KGq$khJ`&?Uj_gpPIHXOV2=2x|xUUkHdw<XU@-MjAiaN4^?F;NwQRiJ9^
z4Yhi}i6#9hxj}8Xk`#vd;4<kHaFgVt{@}{bai+8-nJM{{oY$oxg`$vT?S6XJ?soHJ
zH1daof^;-8>wX|zW|2Y^ga;%zCgDDW5seOaf+z@_k>vQq=ac^T9W8t*GnN#ZNh6q5
znnLe7P2sAYCD8ga`qWREENfOGDUekZrU<PxJrlg4bb0CzMXi}2J*6u{LC(Hg6Gtbo
zknxs;%^1RMKkH}7PYPip@H<Lclx~lgnLEhhv)!8s#^ni2?wK}d<J#Vl=8tc_?;UEA
y$cdVASyE_@x%DqlqIRLU_+BWSvoQ(?8~eU@%Y}GURfQ5p9O1RrP)mavwf6<Wv5AEM

diff --git a/plugins/i18n_subsites/test_data/localized_theme/translations/de/LC_MESSAGES/messages.po b/plugins/i18n_subsites/test_data/localized_theme/translations/de/LC_MESSAGES/messages.po
deleted file mode 100644
index 2eb4efb..0000000
--- a/plugins/i18n_subsites/test_data/localized_theme/translations/de/LC_MESSAGES/messages.po
+++ /dev/null
@@ -1,23 +0,0 @@
-# German translations for PROJECT.
-# Copyright (C) 2014 ORGANIZATION
-# This file is distributed under the same license as the PROJECT project.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: PROJECT VERSION\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-07-13 12:25+0200\n"
-"PO-Revision-Date: 2014-07-13 12:26+0200\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: de <LL@li.org>\n"
-"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 1.3\n"
-
-#: templates/base.html:3
-msgid "Welcome to our"
-msgstr "Willkommen Sie zur unserer"
-
diff --git a/plugins/i18n_subsites/test_data/output/an-untranslated-article.html b/plugins/i18n_subsites/test_data/output/an-untranslated-article.html
deleted file mode 100644
index f45a103..0000000
--- a/plugins/i18n_subsites/test_data/output/an-untranslated-article.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-          <title>Welcome to our Testing site</title>
-        <meta charset="utf-8" />
-        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testing site Full Atom Feed" />
-
-<link rel="stylesheet" href="http://example.com/test/theme/style.css" />
-
-
-
-</head>
-
-<body id="index" class="home">
-        <header id="banner" class="body">
-                <h1><a href="http://example.com/test/">Testing site <strong></strong></a></h1>
-        </header><!-- /#banner -->
-        <nav id="menu"><ul>
-            <li><a href="http://example.com/test/pages/untranslated-page.html">Untranslated page</a></li>
-        </ul></nav><!-- /#menu -->
-<section id="content" class="body">
-  <header>
-    <h2 class="entry-title">
-      <a href="http://example.com/test/an-untranslated-article.html" rel="bookmark"
-         title="Permalink to An untranslated article">An untranslated article</a></h2>
- 
-  </header>
-  <footer class="post-info">
-    <time class="published" datetime="2014-07-14T00:00:00+00:00">
-      Mon 14 July 2014
-    </time>
-    <address class="vcard author">
-      By           <a class="url fn" href="http://example.com/test/author/the-tester.html">The Tester</a>
-    </address>
-  </footer><!-- /.post-info -->
-  <div class="entry-content">
-    <p>An article without a translation.
-Here is a link to an <a class="reference external" href="http://example.com/test/pages/untranslated-page.html">untranslated page</a></p>
-
-  </div><!-- /.entry-content -->
-</section>
-        <footer id="contentinfo" class="body">
-                <address id="about" class="vcard body">
-                Proudly powered by <a href="http://getpelican.com/">Pelican</a>,
-                which takes great advantage of <a href="http://python.org">Python</a>.
-                </address><!-- /#about -->
-        </footer><!-- /#contentinfo -->
-</body>
-</html>
\ No newline at end of file
diff --git a/plugins/i18n_subsites/test_data/output/cz/an-untranslated-article-en.html b/plugins/i18n_subsites/test_data/output/cz/an-untranslated-article-en.html
deleted file mode 100644
index 1871ee6..0000000
--- a/plugins/i18n_subsites/test_data/output/cz/an-untranslated-article-en.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<!DOCTYPE html>
-<html lang="cz">
-<head>
-          <title>Welcome to our Testovací stránka</title>
-        <meta charset="utf-8" />
-        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testovací stránka Full Atom Feed" />
-
-<link rel="stylesheet" href="http://example.com/test/cz/../theme/style.css" />
-
-
-
-</head>
-
-<body id="index" class="home">
-        <header id="banner" class="body">
-                <h1><a href="http://example.com/test/cz/">Testovací stránka <strong></strong></a></h1>
-        </header><!-- /#banner -->
-        <nav id="menu"><ul>
-        </ul></nav><!-- /#menu -->
-<section id="content" class="body">
-  <header>
-    <h2 class="entry-title">
-      <a href="http://example.com/test/cz/an-untranslated-article-en.html" rel="bookmark"
-         title="Permalink to An untranslated article">An untranslated article</a></h2>
- 
-  </header>
-  <footer class="post-info">
-    <time class="published" datetime="2014-07-14T00:00:00+00:00">
-      Mon 14 July 2014
-    </time>
-    <address class="vcard author">
-      By           <a class="url fn" href="http://example.com/test/cz/author/test-testovic.html">Test Testovič</a>
-    </address>
-  </footer><!-- /.post-info -->
-  <div class="entry-content">
-    <p>An article without a translation.
-Here is a link to an <a class="reference external" href="http://example.com/test/cz/../pages/untranslated-page.html">untranslated page</a></p>
-
-  </div><!-- /.entry-content -->
-</section>
-        <footer id="contentinfo" class="body">
-                <address id="about" class="vcard body">
-                Proudly powered by <a href="http://getpelican.com/">Pelican</a>,
-                which takes great advantage of <a href="http://python.org">Python</a>.
-                </address><!-- /#about -->
-        </footer><!-- /#contentinfo -->
-</body>
-</html>
\ No newline at end of file
diff --git a/plugins/i18n_subsites/test_data/output/cz/feeds_all.atom.xml b/plugins/i18n_subsites/test_data/output/cz/feeds_all.atom.xml
deleted file mode 100644
index e6797c2..0000000
--- a/plugins/i18n_subsites/test_data/output/cz/feeds_all.atom.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<feed xmlns="http://www.w3.org/2005/Atom"><title>Testovací stránka</title><link href="http://example.com/test/cz/" rel="alternate"></link><link href="http://example.com/test/feeds_all.atom.xml" rel="self"></link><id>http://example.com/test/cz/</id><updated>2014-09-15T00:00:00+00:00</updated><entry><title>Přeložený článek</title><link href="http://example.com/test/cz/translated-article.html" rel="alternate"></link><published>2014-09-15T00:00:00+00:00</published><updated>2014-09-15T00:00:00+00:00</updated><author><name>Test Testovič</name></author><id>tag:example.com,2014-09-15:/test/cz/translated-article.html</id><summary type="html">&lt;p&gt;Jednoduchý článek s překlady.
-Zde je odkaz na &lt;a class="reference external" href="http://example.com/test/cz/../images/img.png"&gt;nějaký obrázek&lt;/a&gt;.&lt;/p&gt;
-</summary><content type="html">&lt;p&gt;Jednoduchý článek s překlady.
-Zde je odkaz na &lt;a class="reference external" href="http://example.com/test/cz/../images/img.png"&gt;nějaký obrázek&lt;/a&gt;.&lt;/p&gt;
-</content></entry><entry><title>Ein übersetzter Artikel</title><link href="http://example.com/test/cz/../de/translated-article.html" rel="alternate"></link><published>2014-09-14T00:00:00+00:00</published><updated>2014-09-14T00:00:00+00:00</updated><author><name>Test Testovič</name></author><id>tag:example.com,2014-09-14:/test/cz/../de/translated-article.html</id><summary type="html">&lt;p&gt;Ein einfacher Artikel mit einer Übersetzung.
-Hier ist ein Link zur &lt;a class="reference external" href="http://example.com/test/cz/../images/img.png"&gt;einigem Bild&lt;/a&gt;.&lt;/p&gt;
-</summary><content type="html">&lt;p&gt;Ein einfacher Artikel mit einer Ãœbersetzung.
-Hier ist ein Link zur &lt;a class="reference external" href="http://example.com/test/cz/../images/img.png"&gt;einigem Bild&lt;/a&gt;.&lt;/p&gt;
-</content></entry><entry><title>A translated article</title><link href="http://example.com/test/cz/../translated-article.html" rel="alternate"></link><published>2014-09-13T00:00:00+00:00</published><updated>2014-09-13T00:00:00+00:00</updated><author><name>Test Testovič</name></author><id>tag:example.com,2014-09-13:/test/cz/../translated-article.html</id><summary type="html">&lt;p&gt;A simple article with a translation.
-Here is a link to &lt;a class="reference external" href="http://example.com/test/cz/../images/img.png"&gt;some image&lt;/a&gt;.&lt;/p&gt;
-</summary><content type="html">&lt;p&gt;A simple article with a translation.
-Here is a link to &lt;a class="reference external" href="http://example.com/test/cz/../images/img.png"&gt;some image&lt;/a&gt;.&lt;/p&gt;
-</content></entry><entry><title>An untranslated article</title><link href="http://example.com/test/cz/an-untranslated-article-en.html" rel="alternate"></link><published>2014-07-14T00:00:00+00:00</published><updated>2014-07-14T00:00:00+00:00</updated><author><name>Test Testovič</name></author><id>tag:example.com,2014-07-14:/test/cz/an-untranslated-article-en.html</id><summary type="html">&lt;p&gt;An article without a translation.
-Here is a link to an &lt;a class="reference external" href="http://example.com/test/cz/../pages/untranslated-page.html"&gt;untranslated page&lt;/a&gt;&lt;/p&gt;
-</summary><content type="html">&lt;p&gt;An article without a translation.
-Here is a link to an &lt;a class="reference external" href="http://example.com/test/cz/../pages/untranslated-page.html"&gt;untranslated page&lt;/a&gt;&lt;/p&gt;
-</content></entry></feed>
\ No newline at end of file
diff --git a/plugins/i18n_subsites/test_data/output/cz/index.html b/plugins/i18n_subsites/test_data/output/cz/index.html
deleted file mode 100644
index 08dce15..0000000
--- a/plugins/i18n_subsites/test_data/output/cz/index.html
+++ /dev/null
@@ -1,54 +0,0 @@
-<!DOCTYPE html>
-<html lang="cz">
-<head>
-        <title>Welcome to our Testovací stránka</title>
-        <meta charset="utf-8" />
-        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testovací stránka Full Atom Feed" />
-
-<link rel="stylesheet" href="http://example.com/test/cz/../theme/style.css" />
-</head>
-
-<body id="index" class="home">
-        <header id="banner" class="body">
-                <h1><a href="http://example.com/test/cz/">Testovací stránka <strong></strong></a></h1>
-        </header><!-- /#banner -->
-        <nav id="menu"><ul>
-        </ul></nav><!-- /#menu -->
-<section id="content">
-<h2>All articles</h2>
-
-<ol id="post-list">
-        <li><article class="hentry">
-                <header> <h2 class="entry-title"><a href="http://example.com/test/cz/translated-article.html" rel="bookmark" title="Permalink to Přeložený článek">Přeložený článek</a></h2> </header>
-                <footer class="post-info">
-                    <time class="published" datetime="2014-09-15T00:00:00+00:00"> Mon 15 September 2014 </time>
-                    <address class="vcard author">By
-                        <a class="url fn" href="http://example.com/test/cz/author/test-testovic.html">Test Testovič</a>
-                    </address>
-                </footer><!-- /.post-info -->
-                <div class="entry-content"> <p>Jednoduchý článek s překlady.
-Zde je odkaz na <a class="reference external" href="http://example.com/test/cz/../images/img.png">nějaký obrázek</a>.</p>
- </div><!-- /.entry-content -->
-        </article></li>
-        <li><article class="hentry">
-                <header> <h2 class="entry-title"><a href="http://example.com/test/cz/an-untranslated-article-en.html" rel="bookmark" title="Permalink to An untranslated article">An untranslated article</a></h2> </header>
-                <footer class="post-info">
-                    <time class="published" datetime="2014-07-14T00:00:00+00:00"> Mon 14 July 2014 </time>
-                    <address class="vcard author">By
-                        <a class="url fn" href="http://example.com/test/cz/author/test-testovic.html">Test Testovič</a>
-                    </address>
-                </footer><!-- /.post-info -->
-                <div class="entry-content"> <p>An article without a translation.
-Here is a link to an <a class="reference external" href="http://example.com/test/cz/../pages/untranslated-page.html">untranslated page</a></p>
- </div><!-- /.entry-content -->
-        </article></li>
-</ol><!-- /#posts-list -->
-</section><!-- /#content -->
-        <footer id="contentinfo" class="body">
-                <address id="about" class="vcard body">
-                Proudly powered by <a href="http://getpelican.com/">Pelican</a>,
-                which takes great advantage of <a href="http://python.org">Python</a>.
-                </address><!-- /#about -->
-        </footer><!-- /#contentinfo -->
-</body>
-</html>
\ No newline at end of file
diff --git a/plugins/i18n_subsites/test_data/output/cz/pages/404.html b/plugins/i18n_subsites/test_data/output/cz/pages/404.html
deleted file mode 100644
index c6e659d..0000000
--- a/plugins/i18n_subsites/test_data/output/cz/pages/404.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<html lang="cz">
-<head>
-        <title>404 stránka</title>
-        <meta charset="utf-8" />
-        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testovací stránka Full Atom Feed" />
-
-<link rel="stylesheet" href="http://example.com/test/cz/../theme/style.css" />
-</head>
-
-<body id="index" class="home">
-        <header id="banner" class="body">
-                <h1><a href="http://example.com/test/cz/">Testovací stránka <strong></strong></a></h1>
-        </header><!-- /#banner -->
-        <nav id="menu"><ul>
-        </ul></nav><!-- /#menu -->
-    <h1>404 stránka</h1>
-    Translations: 
-<a href="http://example.com/test/cz/../de/pages/404.html">de</a>
-<a href="http://example.com/test/cz/../pages/404.html">en</a>
-
-
-    <p>Jednoduchá 404 stránka.</p>
-
-
-        <footer id="contentinfo" class="body">
-                <address id="about" class="vcard body">
-                Proudly powered by <a href="http://getpelican.com/">Pelican</a>,
-                which takes great advantage of <a href="http://python.org">Python</a>.
-                </address><!-- /#about -->
-        </footer><!-- /#contentinfo -->
-</body>
-</html>
\ No newline at end of file
diff --git a/plugins/i18n_subsites/test_data/output/cz/translated-article.html b/plugins/i18n_subsites/test_data/output/cz/translated-article.html
deleted file mode 100644
index 9402c9a..0000000
--- a/plugins/i18n_subsites/test_data/output/cz/translated-article.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!DOCTYPE html>
-<html lang="cz">
-<head>
-          <title>Welcome to our Testovací stránka</title>
-        <meta charset="utf-8" />
-        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testovací stránka Full Atom Feed" />
-
-<link rel="stylesheet" href="http://example.com/test/cz/../theme/style.css" />
-
-
-
-</head>
-
-<body id="index" class="home">
-        <header id="banner" class="body">
-                <h1><a href="http://example.com/test/cz/">Testovací stránka <strong></strong></a></h1>
-        </header><!-- /#banner -->
-        <nav id="menu"><ul>
-        </ul></nav><!-- /#menu -->
-<section id="content" class="body">
-  <header>
-    <h2 class="entry-title">
-      <a href="http://example.com/test/cz/translated-article.html" rel="bookmark"
-         title="Permalink to Přeložený článek">Přeložený článek</a></h2>
- Translations: 
-<a href="http://example.com/test/cz/../de/translated-article.html">de</a>
-<a href="http://example.com/test/cz/../translated-article.html">en</a>
-
-  </header>
-  <footer class="post-info">
-    <time class="published" datetime="2014-09-15T00:00:00+00:00">
-      Mon 15 September 2014
-    </time>
-    <address class="vcard author">
-      By           <a class="url fn" href="http://example.com/test/cz/author/test-testovic.html">Test Testovič</a>
-    </address>
-  </footer><!-- /.post-info -->
-  <div class="entry-content">
-    <p>Jednoduchý článek s překlady.
-Zde je odkaz na <a class="reference external" href="http://example.com/test/cz/../images/img.png">nějaký obrázek</a>.</p>
-
-  </div><!-- /.entry-content -->
-</section>
-        <footer id="contentinfo" class="body">
-                <address id="about" class="vcard body">
-                Proudly powered by <a href="http://getpelican.com/">Pelican</a>,
-                which takes great advantage of <a href="http://python.org">Python</a>.
-                </address><!-- /#about -->
-        </footer><!-- /#contentinfo -->
-</body>
-</html>
\ No newline at end of file
diff --git a/plugins/i18n_subsites/test_data/output/de/drafts/an-untranslated-article-en.html b/plugins/i18n_subsites/test_data/output/de/drafts/an-untranslated-article-en.html
deleted file mode 100644
index e58078f..0000000
--- a/plugins/i18n_subsites/test_data/output/de/drafts/an-untranslated-article-en.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<!DOCTYPE html>
-<html lang="de">
-<head>
-          <title>Willkommen Sie zur unserer Testseite</title>
-        <meta charset="utf-8" />
-        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testseite Full Atom Feed" />
-
-<link rel="stylesheet" href="http://example.com/test/de/../theme/style.css" />
-
-
-
-</head>
-
-<body id="index" class="home">
-        <header id="banner" class="body">
-                <h1><a href="http://example.com/test/de/">Testseite <strong></strong></a></h1>
-        </header><!-- /#banner -->
-        <nav id="menu"><ul>
-        </ul></nav><!-- /#menu -->
-<section id="content" class="body">
-  <header>
-    <h2 class="entry-title">
-      <a href="http://example.com/test/de/drafts/an-untranslated-article-en.html" rel="bookmark"
-         title="Permalink to An untranslated article">An untranslated article</a></h2>
- 
-  </header>
-  <footer class="post-info">
-    <time class="published" datetime="2014-07-14T00:00:00+00:00">
-      Mon 14 July 2014
-    </time>
-    <address class="vcard author">
-      By           <a class="url fn" href="http://example.com/test/de/author/der-tester.html">Der Tester</a>
-    </address>
-  </footer><!-- /.post-info -->
-  <div class="entry-content">
-    <p>An article without a translation.
-Here is a link to an <a class="reference external" href="http://example.com/test/de/pages/untranslated-page-en.html">untranslated page</a></p>
-
-  </div><!-- /.entry-content -->
-</section>
-        <footer id="contentinfo" class="body">
-                <address id="about" class="vcard body">
-                Proudly powered by <a href="http://getpelican.com/">Pelican</a>,
-                which takes great advantage of <a href="http://python.org">Python</a>.
-                </address><!-- /#about -->
-        </footer><!-- /#contentinfo -->
-</body>
-</html>
\ No newline at end of file
diff --git a/plugins/i18n_subsites/test_data/output/de/feeds_all.atom.xml b/plugins/i18n_subsites/test_data/output/de/feeds_all.atom.xml
deleted file mode 100644
index b5f596b..0000000
--- a/plugins/i18n_subsites/test_data/output/de/feeds_all.atom.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<feed xmlns="http://www.w3.org/2005/Atom"><title>Testseite</title><link href="http://example.com/test/de/" rel="alternate"></link><link href="http://example.com/test/feeds_all.atom.xml" rel="self"></link><id>http://example.com/test/de/</id><updated>2014-09-15T00:00:00+00:00</updated><entry><title>Přeložený článek</title><link href="http://example.com/test/de/../cz/translated-article.html" rel="alternate"></link><published>2014-09-15T00:00:00+00:00</published><updated>2014-09-15T00:00:00+00:00</updated><author><name>Der Tester</name></author><id>tag:example.com,2014-09-15:/test/de/../cz/translated-article.html</id><summary type="html">&lt;p&gt;Jednoduchý článek s překlady.
-Zde je odkaz na &lt;a class="reference external" href="http://example.com/test/de/../images/img.png"&gt;nějaký obrázek&lt;/a&gt;.&lt;/p&gt;
-</summary><content type="html">&lt;p&gt;Jednoduchý článek s překlady.
-Zde je odkaz na &lt;a class="reference external" href="http://example.com/test/de/../images/img.png"&gt;nějaký obrázek&lt;/a&gt;.&lt;/p&gt;
-</content></entry><entry><title>Ein übersetzter Artikel</title><link href="http://example.com/test/de/translated-article.html" rel="alternate"></link><published>2014-09-14T00:00:00+00:00</published><updated>2014-09-14T00:00:00+00:00</updated><author><name>Der Tester</name></author><id>tag:example.com,2014-09-14:/test/de/translated-article.html</id><summary type="html">&lt;p&gt;Ein einfacher Artikel mit einer Übersetzung.
-Hier ist ein Link zur &lt;a class="reference external" href="http://example.com/test/de/../images/img.png"&gt;einigem Bild&lt;/a&gt;.&lt;/p&gt;
-</summary><content type="html">&lt;p&gt;Ein einfacher Artikel mit einer Ãœbersetzung.
-Hier ist ein Link zur &lt;a class="reference external" href="http://example.com/test/de/../images/img.png"&gt;einigem Bild&lt;/a&gt;.&lt;/p&gt;
-</content></entry><entry><title>A translated article</title><link href="http://example.com/test/de/../translated-article.html" rel="alternate"></link><published>2014-09-13T00:00:00+00:00</published><updated>2014-09-13T00:00:00+00:00</updated><author><name>Der Tester</name></author><id>tag:example.com,2014-09-13:/test/de/../translated-article.html</id><summary type="html">&lt;p&gt;A simple article with a translation.
-Here is a link to &lt;a class="reference external" href="http://example.com/test/de/../images/img.png"&gt;some image&lt;/a&gt;.&lt;/p&gt;
-</summary><content type="html">&lt;p&gt;A simple article with a translation.
-Here is a link to &lt;a class="reference external" href="http://example.com/test/de/../images/img.png"&gt;some image&lt;/a&gt;.&lt;/p&gt;
-</content></entry></feed>
\ No newline at end of file
diff --git a/plugins/i18n_subsites/test_data/output/de/index.html b/plugins/i18n_subsites/test_data/output/de/index.html
deleted file mode 100644
index 8dee6a7..0000000
--- a/plugins/i18n_subsites/test_data/output/de/index.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!DOCTYPE html>
-<html lang="de">
-<head>
-        <title>Willkommen Sie zur unserer Testseite</title>
-        <meta charset="utf-8" />
-        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testseite Full Atom Feed" />
-
-<link rel="stylesheet" href="http://example.com/test/de/../theme/style.css" />
-</head>
-
-<body id="index" class="home">
-        <header id="banner" class="body">
-                <h1><a href="http://example.com/test/de/">Testseite <strong></strong></a></h1>
-        </header><!-- /#banner -->
-        <nav id="menu"><ul>
-        </ul></nav><!-- /#menu -->
-<section id="content">
-<h2>All articles</h2>
-
-<ol id="post-list">
-        <li><article class="hentry">
-                <header> <h2 class="entry-title"><a href="http://example.com/test/de/translated-article.html" rel="bookmark" title="Permalink to Ein übersetzter Artikel">Ein übersetzter Artikel</a></h2> </header>
-                <footer class="post-info">
-                    <time class="published" datetime="2014-09-14T00:00:00+00:00"> Sun 14 September 2014 </time>
-                    <address class="vcard author">By
-                        <a class="url fn" href="http://example.com/test/de/author/der-tester.html">Der Tester</a>
-                    </address>
-                </footer><!-- /.post-info -->
-                <div class="entry-content"> <p>Ein einfacher Artikel mit einer Ãœbersetzung.
-Hier ist ein Link zur <a class="reference external" href="http://example.com/test/de/../images/img.png">einigem Bild</a>.</p>
- </div><!-- /.entry-content -->
-        </article></li>
-</ol><!-- /#posts-list -->
-</section><!-- /#content -->
-        <footer id="contentinfo" class="body">
-                <address id="about" class="vcard body">
-                Proudly powered by <a href="http://getpelican.com/">Pelican</a>,
-                which takes great advantage of <a href="http://python.org">Python</a>.
-                </address><!-- /#about -->
-        </footer><!-- /#contentinfo -->
-</body>
-</html>
\ No newline at end of file
diff --git a/plugins/i18n_subsites/test_data/output/de/pages/404.html b/plugins/i18n_subsites/test_data/output/de/pages/404.html
deleted file mode 100644
index b1721f5..0000000
--- a/plugins/i18n_subsites/test_data/output/de/pages/404.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<html lang="de">
-<head>
-        <title>Eine 404 Seite</title>
-        <meta charset="utf-8" />
-        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testseite Full Atom Feed" />
-
-<link rel="stylesheet" href="http://example.com/test/de/../theme/style.css" />
-</head>
-
-<body id="index" class="home">
-        <header id="banner" class="body">
-                <h1><a href="http://example.com/test/de/">Testseite <strong></strong></a></h1>
-        </header><!-- /#banner -->
-        <nav id="menu"><ul>
-        </ul></nav><!-- /#menu -->
-    <h1>Eine 404 Seite</h1>
-    Translations: 
-<a href="http://example.com/test/de/../cz/pages/404.html">cz</a>
-<a href="http://example.com/test/de/../pages/404.html">en</a>
-
-
-    <p>Eine einfache 404 Seite.</p>
-
-
-        <footer id="contentinfo" class="body">
-                <address id="about" class="vcard body">
-                Proudly powered by <a href="http://getpelican.com/">Pelican</a>,
-                which takes great advantage of <a href="http://python.org">Python</a>.
-                </address><!-- /#about -->
-        </footer><!-- /#contentinfo -->
-</body>
-</html>
\ No newline at end of file
diff --git a/plugins/i18n_subsites/test_data/output/de/pages/untranslated-page-en.html b/plugins/i18n_subsites/test_data/output/de/pages/untranslated-page-en.html
deleted file mode 100644
index 9873cbd..0000000
--- a/plugins/i18n_subsites/test_data/output/de/pages/untranslated-page-en.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE html>
-<html lang="de">
-<head>
-        <title>Untranslated page</title>
-        <meta charset="utf-8" />
-        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testseite Full Atom Feed" />
-
-<link rel="stylesheet" href="http://example.com/test/de/../theme/style.css" />
-</head>
-
-<body id="index" class="home">
-        <header id="banner" class="body">
-                <h1><a href="http://example.com/test/de/">Testseite <strong></strong></a></h1>
-        </header><!-- /#banner -->
-        <nav id="menu"><ul>
-        </ul></nav><!-- /#menu -->
-    <h1>Untranslated page</h1>
-    
-
-    <p>This page has no translation.</p>
-
-
-        <footer id="contentinfo" class="body">
-                <address id="about" class="vcard body">
-                Proudly powered by <a href="http://getpelican.com/">Pelican</a>,
-                which takes great advantage of <a href="http://python.org">Python</a>.
-                </address><!-- /#about -->
-        </footer><!-- /#contentinfo -->
-</body>
-</html>
\ No newline at end of file
diff --git a/plugins/i18n_subsites/test_data/output/de/translated-article.html b/plugins/i18n_subsites/test_data/output/de/translated-article.html
deleted file mode 100644
index bd26a83..0000000
--- a/plugins/i18n_subsites/test_data/output/de/translated-article.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!DOCTYPE html>
-<html lang="de">
-<head>
-          <title>Willkommen Sie zur unserer Testseite</title>
-        <meta charset="utf-8" />
-        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testseite Full Atom Feed" />
-
-<link rel="stylesheet" href="http://example.com/test/de/../theme/style.css" />
-
-
-
-</head>
-
-<body id="index" class="home">
-        <header id="banner" class="body">
-                <h1><a href="http://example.com/test/de/">Testseite <strong></strong></a></h1>
-        </header><!-- /#banner -->
-        <nav id="menu"><ul>
-        </ul></nav><!-- /#menu -->
-<section id="content" class="body">
-  <header>
-    <h2 class="entry-title">
-      <a href="http://example.com/test/de/translated-article.html" rel="bookmark"
-         title="Permalink to Ein übersetzter Artikel">Ein übersetzter Artikel</a></h2>
- Translations: 
-<a href="http://example.com/test/de/../cz/translated-article.html">cz</a>
-<a href="http://example.com/test/de/../translated-article.html">en</a>
-
-  </header>
-  <footer class="post-info">
-    <time class="published" datetime="2014-09-14T00:00:00+00:00">
-      Sun 14 September 2014
-    </time>
-    <address class="vcard author">
-      By           <a class="url fn" href="http://example.com/test/de/author/der-tester.html">Der Tester</a>
-    </address>
-  </footer><!-- /.post-info -->
-  <div class="entry-content">
-    <p>Ein einfacher Artikel mit einer Ãœbersetzung.
-Hier ist ein Link zur <a class="reference external" href="http://example.com/test/de/../images/img.png">einigem Bild</a>.</p>
-
-  </div><!-- /.entry-content -->
-</section>
-        <footer id="contentinfo" class="body">
-                <address id="about" class="vcard body">
-                Proudly powered by <a href="http://getpelican.com/">Pelican</a>,
-                which takes great advantage of <a href="http://python.org">Python</a>.
-                </address><!-- /#about -->
-        </footer><!-- /#contentinfo -->
-</body>
-</html>
\ No newline at end of file
diff --git a/plugins/i18n_subsites/test_data/output/feeds_all.atom.xml b/plugins/i18n_subsites/test_data/output/feeds_all.atom.xml
deleted file mode 100644
index 609cf99..0000000
--- a/plugins/i18n_subsites/test_data/output/feeds_all.atom.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<feed xmlns="http://www.w3.org/2005/Atom"><title>Testing site</title><link href="http://example.com/test/" rel="alternate"></link><link href="http://example.com/test/feeds_all.atom.xml" rel="self"></link><id>http://example.com/test/</id><updated>2014-09-15T00:00:00+00:00</updated><entry><title>Přeložený článek</title><link href="http://example.com/test/cz/translated-article.html" rel="alternate"></link><published>2014-09-15T00:00:00+00:00</published><updated>2014-09-15T00:00:00+00:00</updated><author><name>The Tester</name></author><id>tag:example.com,2014-09-15:/test/cz/translated-article.html</id><summary type="html">&lt;p&gt;Jednoduchý článek s překlady.
-Zde je odkaz na &lt;a class="reference external" href="http://example.com/test/images/img.png"&gt;nějaký obrázek&lt;/a&gt;.&lt;/p&gt;
-</summary><content type="html">&lt;p&gt;Jednoduchý článek s překlady.
-Zde je odkaz na &lt;a class="reference external" href="http://example.com/test/images/img.png"&gt;nějaký obrázek&lt;/a&gt;.&lt;/p&gt;
-</content></entry><entry><title>Ein übersetzter Artikel</title><link href="http://example.com/test/de/translated-article.html" rel="alternate"></link><published>2014-09-14T00:00:00+00:00</published><updated>2014-09-14T00:00:00+00:00</updated><author><name>The Tester</name></author><id>tag:example.com,2014-09-14:/test/de/translated-article.html</id><summary type="html">&lt;p&gt;Ein einfacher Artikel mit einer Übersetzung.
-Hier ist ein Link zur &lt;a class="reference external" href="http://example.com/test/images/img.png"&gt;einigem Bild&lt;/a&gt;.&lt;/p&gt;
-</summary><content type="html">&lt;p&gt;Ein einfacher Artikel mit einer Ãœbersetzung.
-Hier ist ein Link zur &lt;a class="reference external" href="http://example.com/test/images/img.png"&gt;einigem Bild&lt;/a&gt;.&lt;/p&gt;
-</content></entry><entry><title>A translated article</title><link href="http://example.com/test/translated-article.html" rel="alternate"></link><published>2014-09-13T00:00:00+00:00</published><updated>2014-09-13T00:00:00+00:00</updated><author><name>The Tester</name></author><id>tag:example.com,2014-09-13:/test/translated-article.html</id><summary type="html">&lt;p&gt;A simple article with a translation.
-Here is a link to &lt;a class="reference external" href="http://example.com/test/images/img.png"&gt;some image&lt;/a&gt;.&lt;/p&gt;
-</summary><content type="html">&lt;p&gt;A simple article with a translation.
-Here is a link to &lt;a class="reference external" href="http://example.com/test/images/img.png"&gt;some image&lt;/a&gt;.&lt;/p&gt;
-</content></entry><entry><title>An untranslated article</title><link href="http://example.com/test/an-untranslated-article.html" rel="alternate"></link><published>2014-07-14T00:00:00+00:00</published><updated>2014-07-14T00:00:00+00:00</updated><author><name>The Tester</name></author><id>tag:example.com,2014-07-14:/test/an-untranslated-article.html</id><summary type="html">&lt;p&gt;An article without a translation.
-Here is a link to an &lt;a class="reference external" href="http://example.com/test/pages/untranslated-page.html"&gt;untranslated page&lt;/a&gt;&lt;/p&gt;
-</summary><content type="html">&lt;p&gt;An article without a translation.
-Here is a link to an &lt;a class="reference external" href="http://example.com/test/pages/untranslated-page.html"&gt;untranslated page&lt;/a&gt;&lt;/p&gt;
-</content></entry></feed>
\ No newline at end of file
diff --git a/plugins/i18n_subsites/test_data/output/images/img.png b/plugins/i18n_subsites/test_data/output/images/img.png
deleted file mode 100644
index e69de29..0000000
diff --git a/plugins/i18n_subsites/test_data/output/index.html b/plugins/i18n_subsites/test_data/output/index.html
deleted file mode 100644
index 5779f4f..0000000
--- a/plugins/i18n_subsites/test_data/output/index.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-        <title>Welcome to our Testing site</title>
-        <meta charset="utf-8" />
-        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testing site Full Atom Feed" />
-
-<link rel="stylesheet" href="http://example.com/test/theme/style.css" />
-</head>
-
-<body id="index" class="home">
-        <header id="banner" class="body">
-                <h1><a href="http://example.com/test/">Testing site <strong></strong></a></h1>
-        </header><!-- /#banner -->
-        <nav id="menu"><ul>
-            <li><a href="http://example.com/test/pages/untranslated-page.html">Untranslated page</a></li>
-        </ul></nav><!-- /#menu -->
-<section id="content">
-<h2>All articles</h2>
-
-<ol id="post-list">
-        <li><article class="hentry">
-                <header> <h2 class="entry-title"><a href="http://example.com/test/translated-article.html" rel="bookmark" title="Permalink to A translated article">A translated article</a></h2> </header>
-                <footer class="post-info">
-                    <time class="published" datetime="2014-09-13T00:00:00+00:00"> Sat 13 September 2014 </time>
-                    <address class="vcard author">By
-                        <a class="url fn" href="http://example.com/test/author/the-tester.html">The Tester</a>
-                    </address>
-                </footer><!-- /.post-info -->
-                <div class="entry-content"> <p>A simple article with a translation.
-Here is a link to <a class="reference external" href="http://example.com/test/images/img.png">some image</a>.</p>
- </div><!-- /.entry-content -->
-        </article></li>
-        <li><article class="hentry">
-                <header> <h2 class="entry-title"><a href="http://example.com/test/an-untranslated-article.html" rel="bookmark" title="Permalink to An untranslated article">An untranslated article</a></h2> </header>
-                <footer class="post-info">
-                    <time class="published" datetime="2014-07-14T00:00:00+00:00"> Mon 14 July 2014 </time>
-                    <address class="vcard author">By
-                        <a class="url fn" href="http://example.com/test/author/the-tester.html">The Tester</a>
-                    </address>
-                </footer><!-- /.post-info -->
-                <div class="entry-content"> <p>An article without a translation.
-Here is a link to an <a class="reference external" href="http://example.com/test/pages/untranslated-page.html">untranslated page</a></p>
- </div><!-- /.entry-content -->
-        </article></li>
-</ol><!-- /#posts-list -->
-</section><!-- /#content -->
-        <footer id="contentinfo" class="body">
-                <address id="about" class="vcard body">
-                Proudly powered by <a href="http://getpelican.com/">Pelican</a>,
-                which takes great advantage of <a href="http://python.org">Python</a>.
-                </address><!-- /#about -->
-        </footer><!-- /#contentinfo -->
-</body>
-</html>
\ No newline at end of file
diff --git a/plugins/i18n_subsites/test_data/output/pages/404.html b/plugins/i18n_subsites/test_data/output/pages/404.html
deleted file mode 100644
index 05300a3..0000000
--- a/plugins/i18n_subsites/test_data/output/pages/404.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-        <title>A 404 page</title>
-        <meta charset="utf-8" />
-        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testing site Full Atom Feed" />
-
-<link rel="stylesheet" href="http://example.com/test/theme/style.css" />
-</head>
-
-<body id="index" class="home">
-        <header id="banner" class="body">
-                <h1><a href="http://example.com/test/">Testing site <strong></strong></a></h1>
-        </header><!-- /#banner -->
-        <nav id="menu"><ul>
-            <li><a href="http://example.com/test/pages/untranslated-page.html">Untranslated page</a></li>
-        </ul></nav><!-- /#menu -->
-    <h1>A 404 page</h1>
-    Translations: 
-<a href="http://example.com/test/cz/pages/404.html">cz</a>
-<a href="http://example.com/test/de/pages/404.html">de</a>
-
-
-    <p>A simple 404 page.</p>
-
-
-        <footer id="contentinfo" class="body">
-                <address id="about" class="vcard body">
-                Proudly powered by <a href="http://getpelican.com/">Pelican</a>,
-                which takes great advantage of <a href="http://python.org">Python</a>.
-                </address><!-- /#about -->
-        </footer><!-- /#contentinfo -->
-</body>
-</html>
\ No newline at end of file
diff --git a/plugins/i18n_subsites/test_data/output/pages/untranslated-page.html b/plugins/i18n_subsites/test_data/output/pages/untranslated-page.html
deleted file mode 100644
index d97f634..0000000
--- a/plugins/i18n_subsites/test_data/output/pages/untranslated-page.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-        <title>Untranslated page</title>
-        <meta charset="utf-8" />
-        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testing site Full Atom Feed" />
-
-<link rel="stylesheet" href="http://example.com/test/theme/style.css" />
-</head>
-
-<body id="index" class="home">
-        <header id="banner" class="body">
-                <h1><a href="http://example.com/test/">Testing site <strong></strong></a></h1>
-        </header><!-- /#banner -->
-        <nav id="menu"><ul>
-            <li class="active"><a href="http://example.com/test/pages/untranslated-page.html">Untranslated page</a></li>
-        </ul></nav><!-- /#menu -->
-    <h1>Untranslated page</h1>
-    
-
-    <p>This page has no translation.</p>
-
-
-        <footer id="contentinfo" class="body">
-                <address id="about" class="vcard body">
-                Proudly powered by <a href="http://getpelican.com/">Pelican</a>,
-                which takes great advantage of <a href="http://python.org">Python</a>.
-                </address><!-- /#about -->
-        </footer><!-- /#contentinfo -->
-</body>
-</html>
\ No newline at end of file
diff --git a/plugins/i18n_subsites/test_data/output/theme/style.css b/plugins/i18n_subsites/test_data/output/theme/style.css
deleted file mode 100644
index e69de29..0000000
diff --git a/plugins/i18n_subsites/test_data/output/translated-article.html b/plugins/i18n_subsites/test_data/output/translated-article.html
deleted file mode 100644
index 77188ad..0000000
--- a/plugins/i18n_subsites/test_data/output/translated-article.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-          <title>Welcome to our Testing site</title>
-        <meta charset="utf-8" />
-        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testing site Full Atom Feed" />
-
-<link rel="stylesheet" href="http://example.com/test/theme/style.css" />
-
-
-
-</head>
-
-<body id="index" class="home">
-        <header id="banner" class="body">
-                <h1><a href="http://example.com/test/">Testing site <strong></strong></a></h1>
-        </header><!-- /#banner -->
-        <nav id="menu"><ul>
-            <li><a href="http://example.com/test/pages/untranslated-page.html">Untranslated page</a></li>
-        </ul></nav><!-- /#menu -->
-<section id="content" class="body">
-  <header>
-    <h2 class="entry-title">
-      <a href="http://example.com/test/translated-article.html" rel="bookmark"
-         title="Permalink to A translated article">A translated article</a></h2>
- Translations: 
-<a href="http://example.com/test/cz/translated-article.html">cz</a>
-<a href="http://example.com/test/de/translated-article.html">de</a>
-
-  </header>
-  <footer class="post-info">
-    <time class="published" datetime="2014-09-13T00:00:00+00:00">
-      Sat 13 September 2014
-    </time>
-    <address class="vcard author">
-      By           <a class="url fn" href="http://example.com/test/author/the-tester.html">The Tester</a>
-    </address>
-  </footer><!-- /.post-info -->
-  <div class="entry-content">
-    <p>A simple article with a translation.
-Here is a link to <a class="reference external" href="http://example.com/test/images/img.png">some image</a>.</p>
-
-  </div><!-- /.entry-content -->
-</section>
-        <footer id="contentinfo" class="body">
-                <address id="about" class="vcard body">
-                Proudly powered by <a href="http://getpelican.com/">Pelican</a>,
-                which takes great advantage of <a href="http://python.org">Python</a>.
-                </address><!-- /#about -->
-        </footer><!-- /#contentinfo -->
-</body>
-</html>
\ No newline at end of file
diff --git a/plugins/i18n_subsites/test_data/pelicanconf.py b/plugins/i18n_subsites/test_data/pelicanconf.py
deleted file mode 100644
index 55018f2..0000000
--- a/plugins/i18n_subsites/test_data/pelicanconf.py
+++ /dev/null
@@ -1,53 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*- #
-from __future__ import unicode_literals
-
-AUTHOR = 'The Tester'
-SITENAME = 'Testing site'
-SITEURL = 'http://example.com/test'
-
-# to make the test suite portable
-TIMEZONE = 'UTC'
-
-DEFAULT_LANG = 'en'
-LOCALE = 'en_US.UTF-8'
-
-# Generate only one feed
-FEED_ALL_ATOM = 'feeds_all.atom.xml'
-CATEGORY_FEED_ATOM = None
-TRANSLATION_FEED_ATOM = None
-AUTHOR_FEED_ATOM = None
-AUTHOR_FEED_RSS = None
-
-# Disable unnecessary pages
-CATEGORY_SAVE_AS = ''
-TAG_SAVE_AS = ''
-AUTHOR_SAVE_AS = ''
-ARCHIVES_SAVE_AS = ''
-AUTHORS_SAVE_AS = ''
-CATEGORIES_SAVE_AS = ''
-TAGS_SAVE_AS = ''
-
-PLUGIN_PATHS = ['../../']
-PLUGINS = ['i18n_subsites']
-
-THEME = 'localized_theme'
-JINJA_ENVIRONMENT = {'extensions': ['jinja2.ext.i18n']}
-
-from blinker import signal
-tmpsig = signal('tmpsig')
-I18N_FILTER_SIGNALS = [tmpsig]
-
-I18N_SUBSITES = {
-    'de': {
-        'SITENAME': 'Testseite',
-        'AUTHOR': 'Der Tester',
-        'LOCALE': 'de_DE.UTF-8',
-        },
-    'cz': {
-        'SITENAME': 'Testovací stránka',
-        'AUTHOR': 'Test Testovič',
-        'I18N_UNTRANSLATED_PAGES': 'remove',
-        'I18N_UNTRANSLATED_ARTICLES': 'keep',
-        },
-    }
diff --git a/plugins/i18n_subsites/test_i18n_subsites.py b/plugins/i18n_subsites/test_i18n_subsites.py
deleted file mode 100644
index c6c1d6a..0000000
--- a/plugins/i18n_subsites/test_i18n_subsites.py
+++ /dev/null
@@ -1,139 +0,0 @@
-'''Unit tests for the i18n_subsites plugin'''
-
-import os
-import locale
-import unittest
-import subprocess
-from tempfile import mkdtemp
-from shutil import rmtree
-
-from . import i18n_subsites as i18ns
-from pelican import Pelican
-from pelican.tests.support import get_settings
-from pelican.settings import read_settings
-
-
-class TestTemporaryLocale(unittest.TestCase):
-    '''Test the temporary locale context manager'''
-
-    def test_locale_restored(self):
-        '''Test that the locale is restored after exiting context'''
-        orig_locale = locale.setlocale(locale.LC_ALL)
-        with i18ns.temporary_locale():
-            locale.setlocale(locale.LC_ALL, 'C')
-            self.assertEqual(locale.setlocale(locale.LC_ALL), 'C')
-        self.assertEqual(locale.setlocale(locale.LC_ALL), orig_locale)
-
-    def test_temp_locale_set(self):
-        '''Test that the temporary locale is set'''
-        with i18ns.temporary_locale('C'):
-            self.assertEqual(locale.setlocale(locale.LC_ALL), 'C')
-
-
-class TestSettingsManipulation(unittest.TestCase):
-    '''Test operations on settings dict'''
-
-    def setUp(self):
-        '''Prepare default settings'''
-        self.settings = get_settings()
-
-    def test_get_pelican_cls_class(self):
-        '''Test that we get class given as an object'''
-        self.settings['PELICAN_CLASS'] = object
-        cls = i18ns.get_pelican_cls(self.settings)
-        self.assertIs(cls, object)
-        
-    def test_get_pelican_cls_str(self):
-        '''Test that we get correct class given by string'''
-        cls = i18ns.get_pelican_cls(self.settings)
-        self.assertIs(cls, Pelican)
-        
-
-class TestSitesRelpath(unittest.TestCase):
-    '''Test relative path between sites generation'''
-
-    def setUp(self):
-        '''Generate some sample siteurls'''
-        self.siteurl = 'http://example.com'
-        i18ns._SITE_DB['en'] = self.siteurl
-        i18ns._SITE_DB['de'] = self.siteurl + '/de'
-
-    def tearDown(self):
-        '''Remove sites from db'''
-        i18ns._SITE_DB.clear()
-
-    def test_get_site_path(self):
-        '''Test getting the path within a site'''
-        self.assertEqual(i18ns.get_site_path(self.siteurl), '/')
-        self.assertEqual(i18ns.get_site_path(self.siteurl + '/de'), '/de')
-
-    def test_relpath_to_site(self):
-        '''Test getting relative paths between sites'''
-        self.assertEqual(i18ns.relpath_to_site('en', 'de'), 'de')
-        self.assertEqual(i18ns.relpath_to_site('de', 'en'), '..')
-
-        
-class TestRegistration(unittest.TestCase):
-    '''Test plugin registration'''
-
-    def test_return_on_missing_signal(self):
-        '''Test return on missing required signal'''
-        i18ns._SIGNAL_HANDLERS_DB['tmp_sig'] = None
-        i18ns.register()
-        self.assertNotIn(id(i18ns.save_generator),
-                         i18ns.signals.generator_init.receivers)
-
-    def test_registration(self):
-        '''Test registration of all signal handlers'''
-        i18ns.register()
-        for sig_name, handler in i18ns._SIGNAL_HANDLERS_DB.items():
-            sig = getattr(i18ns.signals, sig_name)
-            self.assertIn(id(handler), sig.receivers)
-            # clean up
-            sig.disconnect(handler)
-        
-
-class TestFullRun(unittest.TestCase):
-    '''Test running Pelican with the Plugin'''
-
-    def setUp(self):
-        '''Create temporary output and cache folders'''
-        self.temp_path = mkdtemp(prefix='pelicantests.')
-        self.temp_cache = mkdtemp(prefix='pelican_cache.')
-
-    def tearDown(self):
-        '''Remove output and cache folders'''
-        rmtree(self.temp_path)
-        rmtree(self.temp_cache)
-
-    def test_sites_generation(self):
-        '''Test generation of sites with the plugin
-
-        Compare with recorded output via ``git diff``.
-        To generate output for comparison run the command
-        ``pelican -o test_data/output -s test_data/pelicanconf.py \
-        test_data/content``
-        Remember to remove the output/ folder before that.
-        '''
-        base_path = os.path.dirname(os.path.abspath(__file__))
-        base_path = os.path.join(base_path, 'test_data')
-        content_path = os.path.join(base_path, 'content')
-        output_path = os.path.join(base_path, 'output')
-        settings_path = os.path.join(base_path, 'pelicanconf.py')
-        settings = read_settings(path=settings_path, override={
-            'PATH': content_path,
-            'OUTPUT_PATH': self.temp_path,
-            'CACHE_PATH': self.temp_cache,
-            'PLUGINS': [i18ns],
-            }
-        )
-        pelican = Pelican(settings)
-        pelican.run()
-
-        # compare output
-        out, err = subprocess.Popen(
-            ['git', 'diff', '--no-ext-diff', '--exit-code', '-w', output_path,
-             self.temp_path], env={'PAGER': ''},
-            stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
-        self.assertFalse(out, 'non-empty `diff` stdout:\n{}'.format(out))
-        self.assertFalse(err, 'non-empty `diff` stderr:\n{}'.format(out))
diff --git a/plugins/math_render b/plugins/math_render
deleted file mode 160000
index 4aa206e..0000000
--- a/plugins/math_render
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 4aa206eda5af3626203b80062e0d2fbe3971fd82
diff --git a/plugins/tag_cloud/README.rst b/plugins/tag_cloud/README.rst
deleted file mode 100644
index 39b9dd0..0000000
--- a/plugins/tag_cloud/README.rst
+++ /dev/null
@@ -1,98 +0,0 @@
-tag_cloud
-=========
-
-This plugin generates a tag-cloud.
-
-Installation
-------------
-
-In order to use to use this plugin, you have to edit(*) or create(+) the following files::
-
-      blog/
-        ├── pelicanconf.py *
-        ├── content
-        ├── plugins +
-        │     └── tag_cloud.py +
-        └── themes
-              └── mytheme
-                    ├── templates
-                    │      └── base.html *
-                    └── static
-                          └── css
-                               └── style.css *
-
-In **pelicanconf.py** you have to activate the plugin::
-
-    PLUGIN_PATHS = ["plugins"]
-    PLUGINS = ["tag_cloud"]
-
-Into your **plugins** folder, you should add tag_cloud.py (from this repository).
-
-In your theme files, you should change **base.html** to apply formats (and sizes) defined in **style.css**, as specified in "Settings", below.
-
-Settings
---------
-
-================================================    =====================================================
-Setting name (followed by default value)            What does it do?
-================================================    =====================================================
-``TAG_CLOUD_STEPS = 4``                             Count of different font sizes in the tag
-                                                    cloud.
-``TAG_CLOUD_MAX_ITEMS = 100``                       Maximum number of tags in the cloud.
-``TAG_CLOUD_SORTING = 'random'``                    The tag cloud ordering scheme.  Valid values:
-                                                    random, alphabetically, alphabetically-rev, size and
-                                                    size-rev
-``TAG_CLOUD_BADGE = True``                          Optionnal setting : can bring **badges**, which mean
-                                                    say : display the number of each tags present
-                                                    on all articles.
-================================================    =====================================================
-
-The default theme does not include a tag cloud, but it is pretty easy to add one::
-
-    <ul class="tagcloud">
-        {% for tag in tag_cloud %}
-            <li class="tag-{{ tag.1 }}">
-                <a href="{{ SITEURL }}/{{ tag.0.url }}">
-                {{ tag.0 }}
-                    {% if TAG_CLOUD_BADGE %}
-                        <span class="badge">{{ tag.2 }}</span>
-                    {% endif %}
-                </a>
-            </li>
-        {% endfor %}
-    </ul>
-
-You should then also define CSS styles with appropriate classes (tag-1 to tag-N,
-where N matches ``TAG_CLOUD_STEPS``), tag-1 being the most frequent, and
-define a ``ul.tagcloud`` class with appropriate list-style to create the cloud.
-You should copy/paste this **badge** CSS rule ``ul.tagcloud .list-group-item <span>.badge``
-if you're using ``TAG_CLOUD_BADGE`` setting. (this rule, potentially long , is suggested to avoid
-conflicts with CSS libs as twitter Bootstrap)
-
-For example::
-
-    ul.tagcloud {
-      list-style: none;
-        padding: 0;
-    }
-
-    ul.tagcloud li {
-        display: inline-block;
-    }
-
-    li.tag-1 {
-        font-size: 150%;
-    }
-
-    li.tag-2 {
-        font-size: 120%;
-    }
-
-    ...
-
-    ul.tagcloud .list-group-item <span>.badge {
-        background-color: grey;
-        color: white;
-    }
-
-By default the tags in the cloud are sorted randomly, but if you prefers to have it alphabetically use the `alphabetically` (ascending) and `alphabetically-rev` (descending). Also is possible to sort the tags by it's size (number of articles with this specific tag) using the values `size` (ascending) and `size-rev` (descending).
\ No newline at end of file
diff --git a/plugins/tag_cloud/__init__.py b/plugins/tag_cloud/__init__.py
deleted file mode 100644
index a7004f5..0000000
--- a/plugins/tag_cloud/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-from .tag_cloud import *
-
diff --git a/plugins/tag_cloud/tag_cloud.py b/plugins/tag_cloud/tag_cloud.py
deleted file mode 100644
index 8a3bcf9..0000000
--- a/plugins/tag_cloud/tag_cloud.py
+++ /dev/null
@@ -1,89 +0,0 @@
-'''
-tag_cloud
-===================================
-
-This plugin generates a tag cloud from available tags
-'''
-from __future__ import unicode_literals
-
-from collections import defaultdict
-from operator import itemgetter
-
-import logging
-import math
-import random
-
-from pelican import signals
-
-logger = logging.getLogger(__name__)
-
-
-def set_default_settings(settings):
-    settings.setdefault('TAG_CLOUD_STEPS', 4)
-    settings.setdefault('TAG_CLOUD_MAX_ITEMS', 100)
-    settings.setdefault('TAG_CLOUD_SORTING', 'random')
-    settings.setdefault('TAG_CLOUD_BADGE', False)
-
-
-def init_default_config(pelican):
-    from pelican.settings import DEFAULT_CONFIG
-    set_default_settings(DEFAULT_CONFIG)
-    if(pelican):
-            set_default_settings(pelican.settings)
-
-
-def generate_tag_cloud(generator):
-    tag_cloud = defaultdict(int)
-    for article in generator.articles:
-        for tag in getattr(article, 'tags', []):
-            tag_cloud[tag] += 1
-
-    tag_cloud = sorted(tag_cloud.items(), key=itemgetter(1), reverse=True)
-    tag_cloud = tag_cloud[:generator.settings.get('TAG_CLOUD_MAX_ITEMS')]
-
-    tags = list(map(itemgetter(1), tag_cloud))
-    if tags:
-        max_count = max(tags)
-    steps = generator.settings.get('TAG_CLOUD_STEPS')
-
-    # calculate word sizes
-    def generate_tag(tag, count):
-        tag = (
-            tag,
-            int(math.floor(steps - (steps - 1) * math.log(count)
-                / (math.log(max_count)or 1)))
-        )
-        if generator.settings.get('TAG_CLOUD_BADGE'):
-            tag += (count,)
-        return tag
-
-    tag_cloud = [
-        generate_tag(tag, count)
-        for tag, count in tag_cloud
-    ]
-
-    sorting = generator.settings.get('TAG_CLOUD_SORTING')
-
-    if sorting == 'alphabetically':
-        tag_cloud.sort(key=lambda elem: elem[0].name)
-    elif sorting == 'alphabetically-rev':
-        tag_cloud.sort(key=lambda elem: elem[0].name, reverse=True)
-    elif sorting == 'size':
-        tag_cloud.sort(key=lambda elem: elem[1])
-    elif sorting == 'size-rev':
-        tag_cloud.sort(key=lambda elem: elem[1], reverse=True)
-    elif sorting == 'random':
-        random.shuffle(tag_cloud)
-    else:
-        logger.warning("setting for TAG_CLOUD_SORTING not recognized: %s, "
-                       "falling back to 'random'", sorting)
-        random.shuffle(tag_cloud)
-
-    # make available in context
-    generator.tag_cloud = tag_cloud
-    generator._update_context(['tag_cloud'])
-
-
-def register():
-    signals.initialized.connect(init_default_config)
-    signals.article_generator_finalized.connect(generate_tag_cloud)
diff --git a/plugins/tag_cloud/test_data/article_1.md b/plugins/tag_cloud/test_data/article_1.md
deleted file mode 100644
index bb44efe..0000000
--- a/plugins/tag_cloud/test_data/article_1.md
+++ /dev/null
@@ -1,4 +0,0 @@
-Title: Article1
-tags: fun, pelican, plugins
-
-content, yeah!
\ No newline at end of file
diff --git a/plugins/tag_cloud/test_data/article_2.md b/plugins/tag_cloud/test_data/article_2.md
deleted file mode 100644
index 74dbb63..0000000
--- a/plugins/tag_cloud/test_data/article_2.md
+++ /dev/null
@@ -1,5 +0,0 @@
-Title: Article2
-tags: pelican, plugins, python
-
-content2, yeah!
-
diff --git a/plugins/tag_cloud/test_data/article_3.md b/plugins/tag_cloud/test_data/article_3.md
deleted file mode 100644
index bc0cd5a..0000000
--- a/plugins/tag_cloud/test_data/article_3.md
+++ /dev/null
@@ -1,5 +0,0 @@
-Title: Article3
-tags: pelican, plugins
-
-content3, yeah!
-
diff --git a/plugins/tag_cloud/test_data/article_4.md b/plugins/tag_cloud/test_data/article_4.md
deleted file mode 100644
index 9a31320..0000000
--- a/plugins/tag_cloud/test_data/article_4.md
+++ /dev/null
@@ -1,5 +0,0 @@
-Title: Article4
-tags: pelican, fun
-
-content4, yeah!
-
diff --git a/plugins/tag_cloud/test_data/article_5.md b/plugins/tag_cloud/test_data/article_5.md
deleted file mode 100644
index 1d3f2ff..0000000
--- a/plugins/tag_cloud/test_data/article_5.md
+++ /dev/null
@@ -1,5 +0,0 @@
-Title: Article5
-tags: plugins, pelican, fun
-
-content5, yeah!
-
diff --git a/plugins/tag_cloud/test_tag_cloud.py b/plugins/tag_cloud/test_tag_cloud.py
deleted file mode 100644
index 210c15f..0000000
--- a/plugins/tag_cloud/test_tag_cloud.py
+++ /dev/null
@@ -1,103 +0,0 @@
-import unittest
-import os
-import six
-import tag_cloud
-
-from pelican.generators import ArticlesGenerator
-from pelican.tests.support import get_settings
-from pelican.urlwrappers import Tag
-
-CUR_DIR = os.path.dirname(__file__)
-CONTENT_DIR = os.path.join(CUR_DIR, 'test_data')
-
-
-class TestTagCloudGeneration(unittest.TestCase):
-
-    @classmethod
-    def setUpClass(cls):
-        cls._settings = get_settings(filenames={})
-        cls._settings['DEFAULT_CATEGORY'] = 'Default'
-        cls._settings['DEFAULT_DATE'] = (1970, 1, 1)
-        cls._settings['READERS'] = {'asc': None}
-        cls._settings['CACHE_CONTENT'] = False
-        tag_cloud.set_default_settings(cls._settings)
-
-        cls.generator = ArticlesGenerator(
-            context=cls._settings.copy(), settings=cls._settings,
-            path=CONTENT_DIR, theme=cls._settings['THEME'], output_path=None)
-        cls.generator.generate_context()
-
-    def test_tag_cloud_random(self):
-        self.generator.settings['TAG_CLOUD_STEPS'] = 10
-        self.generator.settings['TAG_CLOUD_BADGE'] = False
-        tag_cloud.generate_tag_cloud(self.generator)
-        expected = [
-            (Tag('pelican', self._settings), 1),
-            (Tag('plugins', self._settings), 2),
-            (Tag('fun', self._settings), 3),
-            (Tag('python', self._settings), 10)
-        ]
-        six.assertCountEqual(self, self.generator.tag_cloud, expected)
-
-    def test_tag_cloud_badge(self):
-        self.generator.settings['TAG_CLOUD_STEPS'] = 10
-        self.generator.settings['TAG_CLOUD_BADGE'] = True
-        tag_cloud.generate_tag_cloud(self.generator)
-        expected = [
-            (Tag('pelican', self._settings), 1, 5),
-            (Tag('plugins', self._settings), 2, 4),
-            (Tag('fun', self._settings), 3, 3),
-            (Tag('python', self._settings), 10, 1)
-        ]
-        six.assertCountEqual(self, self.generator.tag_cloud, expected)
-
-    def test_tag_cloud_alphabetical(self):
-        self.generator.settings['TAG_CLOUD_STEPS'] = 10
-        self.generator.settings['TAG_CLOUD_SORTING'] = 'alphabetically'
-        tag_cloud.generate_tag_cloud(self.generator)
-        expected = [
-            (Tag('fun', self._settings), 3),
-            (Tag('pelican', self._settings), 1),
-            (Tag('plugins', self._settings), 2),
-            (Tag('python', self._settings), 10)
-        ]
-        self.assertEqual(self.generator.tag_cloud, expected)
-
-    def test_tag_cloud_alphabetical_rev(self):
-        self.generator.settings['TAG_CLOUD_STEPS'] = 10
-        self.generator.settings['TAG_CLOUD_SORTING'] = 'alphabetically-rev'
-        tag_cloud.generate_tag_cloud(self.generator)
-        expected = [
-            (Tag('python', self._settings), 10),
-            (Tag('plugins', self._settings), 2),
-            (Tag('pelican', self._settings), 1),
-            (Tag('fun', self._settings), 3)
-        ]
-        self.assertEqual(self.generator.tag_cloud, expected)
-
-    def test_tag_cloud_size(self):
-        self.generator.settings['TAG_CLOUD_STEPS'] = 10
-        self.generator.settings['TAG_CLOUD_SORTING'] = 'size'
-        tag_cloud.generate_tag_cloud(self.generator)
-        expected = [
-            (Tag('pelican', self._settings), 1),
-            (Tag('plugins', self._settings), 2),
-            (Tag('fun', self._settings), 3),
-            (Tag('python', self._settings), 10)
-        ]
-        self.assertEqual(self.generator.tag_cloud, expected)
-
-    def test_tag_cloud_size_rev(self):
-        self.generator.settings['TAG_CLOUD_STEPS'] = 10
-        self.generator.settings['TAG_CLOUD_SORTING'] = 'size-rev'
-        tag_cloud.generate_tag_cloud(self.generator)
-        expected = [
-            (Tag('python', self._settings), 10),
-            (Tag('fun', self._settings), 3),
-            (Tag('plugins', self._settings), 2),
-            (Tag('pelican', self._settings), 1)
-        ]
-        self.assertEqual(self.generator.tag_cloud, expected)
-
-if __name__ == "__main__":
-    unittest.main()
diff --git a/requirements.txt b/requirements.txt
index 4e64cd4..c9c9983 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,19 +1,5 @@
-appdirs==1.4.3
-beautifulsoup4==4.5.3
-blinker==1.4
-docutils==0.13.1
-feedgenerator==1.9
-Jinja2==2.9.5
-lxml
-Markdown
-MarkupSafe==0.23
-packaging==16.8
-pelican==3.7.1
-Pygments==2.2.0
-pyparsing==2.2.0
-python-dateutil==2.6.0
-pytz==2016.10
-six==1.10.0
-smartypants==2.0.0
-typogrify==2.0.7
-Unidecode==0.4.20
+pelican
+pelican-i18n-subsites
+pelican-render-math
+pelican-tag-cloud
+beautifulsoup4
-- 
GitLab