diff --git a/.docker/build/kerberos/Dockerfile b/.docker/build/kerberos/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..511a636cdaef7727c6fdc7562ece01149a018482 --- /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 3bd603170a2e3d063af1bcd17ba3da4c24e9fcbd..0000000000000000000000000000000000000000 --- 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 0000000000000000000000000000000000000000..6e5028008ae451291329a28d167a89ff1e4f7061 --- /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 0000000000000000000000000000000000000000..7ec44b6356a75ee6309a5e81efd2e21b779d50f6 --- /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 0000000000000000000000000000000000000000..19b564fff0f09d58f865dbb8b9036feeb7cfbe78 --- /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 7a6eab454d4810c76aa31d414e0f766dfafc1450..6764631349e5119e35e5a610534b9341851bced3 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 519347d67c65427ead7d547c3b87b4462b7922f8..0000000000000000000000000000000000000000 --- 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 533e07a82a16c3c9e3936522db188fe9594b4ac8..767489b3a6419aaa547d3f20351023ec9c2f2381 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 2661df30b1982f4b50866a89593017bf456371f9..53cb99f5c029ae98222425ae6738832d76e5e8a4 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 c5807a357fffbde4bfaf9ce8b924ae2df9330ffd..189f9cb88aed8699aae784560e0638aa6bab0a68 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 12e113d3a747921e979461bf170e541078692eef..0000000000000000000000000000000000000000 --- 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 7dfbde09e42950bbd35d7f575da35cede36fd141..0000000000000000000000000000000000000000 --- 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 Binary files a/plugins/i18n_subsites/__init__.pyc and /dev/null differ diff --git a/plugins/i18n_subsites/i18n_subsites.py b/plugins/i18n_subsites/i18n_subsites.py deleted file mode 100644 index 388e758b2c592b8f79da651d277c6302e2ec8ec0..0000000000000000000000000000000000000000 --- 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 Binary files a/plugins/i18n_subsites/i18n_subsites.pyc and /dev/null differ diff --git a/plugins/i18n_subsites/implementing_language_buttons.rst b/plugins/i18n_subsites/implementing_language_buttons.rst deleted file mode 100644 index 43f8bb3da0694e573159b2caf7d537c664c404e9..0000000000000000000000000000000000000000 --- 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;"> </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;"> </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 6ffe65413593b097b3568bc0b09f37f3f5ac348e..0000000000000000000000000000000000000000 --- 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 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 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 c282faa7899e76ea8ea4ac70ce8a8558ba517199..0000000000000000000000000000000000000000 --- 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 d8410a152a08a7599686c7a3b7fda582197557ae..0000000000000000000000000000000000000000 --- 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 74a97d79e1c7a08c5642264753904b7a59c96e5b..0000000000000000000000000000000000000000 --- 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 ae4c2b867fc62e88132e2d315fdf3973b1bb5c3e..0000000000000000000000000000000000000000 --- 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 555a69d7d3513e1c2b255885e41350c175fd0dc6..0000000000000000000000000000000000000000 --- 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 01bf565f73a07f2e45323fd0c13e96635ba2442c..0000000000000000000000000000000000000000 --- 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 d7f5dad274e9c8db04e252e5b87885afbed12e7e..0000000000000000000000000000000000000000 --- 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 867ae5d86fad8d6d70c40c509f92a0897ecd4293..0000000000000000000000000000000000000000 --- 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 440673245823c4b5195689fef85e3ac0a6ab6684..0000000000000000000000000000000000000000 --- 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 578917f449f698444e37129086f2d3bd4063158c..0000000000000000000000000000000000000000 --- 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 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 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 a24eb1db8d0ed296b656a3aed62cf13599dbc6cb..0000000000000000000000000000000000000000 --- 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 Binary files a/plugins/i18n_subsites/test_data/localized_theme/translations/de/LC_MESSAGES/messages.mo and /dev/null differ 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 2eb4efbb6b21787423781c59cccffe0830618d1a..0000000000000000000000000000000000000000 --- 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 f45a10342ca12985761d7caf0a8872e50db36c9d..0000000000000000000000000000000000000000 --- 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 1871ee6b2bc57ecad9fa75a365b7d8f5c222ee13..0000000000000000000000000000000000000000 --- 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 e6797c25e7373a7809c1e8a0027a51f414947694..0000000000000000000000000000000000000000 --- 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"><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> -</summary><content type="html"><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> -</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"><p>Ein einfacher Artikel mit einer Ãœbersetzung. -Hier ist ein Link zur <a class="reference external" href="http://example.com/test/cz/../images/img.png">einigem Bild</a>.</p> -</summary><content type="html"><p>Ein einfacher Artikel mit einer Ãœbersetzung. -Hier ist ein Link zur <a class="reference external" href="http://example.com/test/cz/../images/img.png">einigem Bild</a>.</p> -</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"><p>A simple article with a translation. -Here is a link to <a class="reference external" href="http://example.com/test/cz/../images/img.png">some image</a>.</p> -</summary><content type="html"><p>A simple article with a translation. -Here is a link to <a class="reference external" href="http://example.com/test/cz/../images/img.png">some image</a>.</p> -</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"><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> -</summary><content type="html"><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> -</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 08dce152a6e3ed8d17b893abcb3601cd419691dc..0000000000000000000000000000000000000000 --- 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 c6e659d9ff015a050e375f81d4f62e8eb31367e7..0000000000000000000000000000000000000000 --- 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 9402c9a28fa09e0ea17c81eac45f0e9dd8c7549a..0000000000000000000000000000000000000000 --- 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 e58078f8c2b72a724e1bdc1227d500d9f63a543e..0000000000000000000000000000000000000000 --- 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 b5f596ba811bd99b0000a1d5849768cb5e66ce41..0000000000000000000000000000000000000000 --- 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"><p>Jednoduchý Älánek s pÅ™eklady. -Zde je odkaz na <a class="reference external" href="http://example.com/test/de/../images/img.png">nÄ›jaký obrázek</a>.</p> -</summary><content type="html"><p>Jednoduchý Älánek s pÅ™eklady. -Zde je odkaz na <a class="reference external" href="http://example.com/test/de/../images/img.png">nÄ›jaký obrázek</a>.</p> -</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"><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> -</summary><content type="html"><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> -</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"><p>A simple article with a translation. -Here is a link to <a class="reference external" href="http://example.com/test/de/../images/img.png">some image</a>.</p> -</summary><content type="html"><p>A simple article with a translation. -Here is a link to <a class="reference external" href="http://example.com/test/de/../images/img.png">some image</a>.</p> -</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 8dee6a7203c0a2b33d5d48dfb6fced45f9d83fc0..0000000000000000000000000000000000000000 --- 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 b1721f5cece46a745bed16ec4333210cdb6c4f58..0000000000000000000000000000000000000000 --- 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 9873cbd20f490ef8450ff3420a1667ec9e0d88df..0000000000000000000000000000000000000000 --- 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 bd26a8347b05756e0802b90141ea8f1424ab20fe..0000000000000000000000000000000000000000 --- 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 609cf994d9d4e3c305e32666032d95d5860aba07..0000000000000000000000000000000000000000 --- 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"><p>Jednoduchý Älánek s pÅ™eklady. -Zde je odkaz na <a class="reference external" href="http://example.com/test/images/img.png">nÄ›jaký obrázek</a>.</p> -</summary><content type="html"><p>Jednoduchý Älánek s pÅ™eklady. -Zde je odkaz na <a class="reference external" href="http://example.com/test/images/img.png">nÄ›jaký obrázek</a>.</p> -</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"><p>Ein einfacher Artikel mit einer Ãœbersetzung. -Hier ist ein Link zur <a class="reference external" href="http://example.com/test/images/img.png">einigem Bild</a>.</p> -</summary><content type="html"><p>Ein einfacher Artikel mit einer Ãœbersetzung. -Hier ist ein Link zur <a class="reference external" href="http://example.com/test/images/img.png">einigem Bild</a>.</p> -</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"><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> -</summary><content type="html"><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> -</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"><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> -</summary><content type="html"><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> -</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 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 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 5779f4f18d0ce4d09173da464175732a574eb072..0000000000000000000000000000000000000000 --- 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 05300a333a03a08388af46e8bb49a9a84598efa3..0000000000000000000000000000000000000000 --- 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 d97f63456a823ec4c57f674f59b3f0e8561cf451..0000000000000000000000000000000000000000 --- 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 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 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 77188adc5067812aecc2544714ab7a5834dddfaa..0000000000000000000000000000000000000000 --- 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 55018f27101df879c31f57903dad4e6c9e88201f..0000000000000000000000000000000000000000 --- 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 c6c1d6ac8a5e981a8c747578fe273797c13009fc..0000000000000000000000000000000000000000 --- 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 4aa206eda5af3626203b80062e0d2fbe3971fd82..0000000000000000000000000000000000000000 --- 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 39b9dd041aefce5a5332900237b9ce0c6c525b2b..0000000000000000000000000000000000000000 --- 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 a7004f504c8bb1f1c168b97633231099752a0f56..0000000000000000000000000000000000000000 --- 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 8a3bcf93582105a400808141844ef42fb8f7255c..0000000000000000000000000000000000000000 --- 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 bb44efefdcbfd8eb718ccc36eeaa2cc4796b621f..0000000000000000000000000000000000000000 --- 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 74dbb6346f3acce2570ba870e4656b13727f8375..0000000000000000000000000000000000000000 --- 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 bc0cd5aa1f9ff807ceec20bf7a10aa5d3362c920..0000000000000000000000000000000000000000 --- 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 9a3132062427e4420ce692b7e5722a1be0d6ab2f..0000000000000000000000000000000000000000 --- 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 1d3f2ffa72d378575489bf9c01674859ecef514a..0000000000000000000000000000000000000000 --- 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 210c15fe2993845e0179f71b4dd51d4265bbcc03..0000000000000000000000000000000000000000 --- 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 4e64cd4e0261ecdd15f289645ac2fab6eb6723ac..c9c998382983773aa63e44dacde09528df645cbb 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