[
  {
    "path": ".coveragerc",
    "content": "[report]\nomit =\n       pelican/tests/*\n       pelican/signals.py\n"
  },
  {
    "path": ".editorconfig",
    "content": "root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\nindent_size = 4\nindent_style = space\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n[*.py]\nmax_line_length = 88\n\n[*.{yml,yaml}]\nindent_size = 2\n"
  },
  {
    "path": ".git-blame-ignore-revs",
    "content": "# .git-blame-ignore-revs\n# Apply code style to project via: ruff format .\ncabdb26cee66e1173cf16cb31d3fe5f9fa4392e7\n# Upgrade code base for Python 3.8 and above\necd598f293161a52564aa6e8dfdcc8284dc93970\n# Apply Ruff and pyupgrade to Jinja templates\ndb241feaa445375dc05e189e69287000ffe5fa8e\n# Change pre-commit to run ruff and ruff-format with fixes\n6d8597addb17d5fa3027ead91427939e8e4e89ec\n# Upgrade Ruff from 0.1.x to 0.4.x\n0bd02c00c078fe041b65fbf4eab13601bb42676d\n# Apply more Ruff checks to code\n9d30c5608a58d202b1c02d55651e6ac746bfb173\n# Apply yet more Ruff checks to code\n7577dd7603f7cb3a09922d1edb65b6eafb6e2ac7\n# Indent Jinja templates, HTML, CSS, and JS via DjHTML\n4af40e80772a58eac8969360e5caeb99e3e26e78\n# Ruff UP031: Use F-string format specifiers instead of percent format\n30bde3823f50b9ba8ac5996c1c46bb72031aa6b8\n# Upgrade Ruff to 0.12.x & comply with new rules\n4dedf1795831db99d18941c707923ba48cc28ce7\n"
  },
  {
    "path": ".gitattributes",
    "content": "# Auto detect text files and perform LF normalization\n* text=auto\n\n# Improve accuracy of GitHub's Linguist-powered language statistics\npelican/tests/content/* linguist-vendored\npelican/tests/output/* linguist-vendored\npelican/tests/theme_overrides/* linguist-vendored\npelican/themes/notmyidea/templates/*.html linguist-language=Jinja\npelican/themes/simple/templates/*.html linguist-language=Jinja\nsamples/* linguist-vendored\n*.html linguist-vendored\n"
  },
  {
    "path": ".github/CODEOWNERS",
    "content": ".github/workflows/github_pages.yml @seanh\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "---\n\ngithub: justinmayer\ncustom: https://donate.getpelican.com\nliberapay: pelican\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/---bug-report.md",
    "content": "---\nname: \"\\U0001F41E Bug Report\"\nabout: Did you find a bug?\ntitle: ''\nlabels: bug\nassignees: ''\n\n---\n\n<!--\n  Hi there! Thank you for discovering and submitting an issue.\n\n  Before you submit this, let’s make sure of a few things.\n  Please make sure the following boxes are ticked if they are correct.\n  If not, please try and fulfill them first.\n-->\n\n<!-- Checked checkbox should look like this: [x] -->\n- [ ] I have read the [Filing Issues](https://docs.getpelican.com/en/latest/contribute.html#filing-issues) and subsequent “How to Get Help” sections of the documentation.\n- [ ] I can reproduce this problem with stock/default settings file, theme, and sample content (as described in above “How to Get Help” sections of the documentation).\n- [ ] I have searched the [issues](https://github.com/getpelican/pelican/issues?q=is%3Aissue) (including closed ones) and believe that this is not a duplicate.\n\n<!--\n  If you cannot reproduce the problem with stock/default settings file, theme, and sample content,\n  please close this tab and ask your question in the Discussions area instead:\n  <https://github.com/getpelican/pelican/discussions>\n  Otherwise, once the above boxes are checked, please fill out the following list\n  of information, which would be very helpful for maintainers.\n-->\n\n- **OS version and name**: <!-- Replace with version + name -->\n- **Python version**: <!-- Replace with version -->\n- **Pelican version**: <!-- Replace with version -->\n- **Link to theme**: <!-- Replace with link to the theme you are using -->\n- **Links to plugins**: <!-- Replace with list of links to plugins you are using -->\n- **Link to your site**: <!-- If available, replace with link to your site -->\n- **Link to your source**: <!-- If available, replace with link to relevant source repository -->\n- **Link to a [Gist](https://gist.github.com/) with the contents of your settings file**: <!-- If your source is not accessible, put Gist link here -->\n\n## Issue\n<!--\n  Now feel free to write your issue. Please avoid vague phrases like “[…] doesn’t work”.\n  Be descriptive! Thanks again 🙌 ❤️\n-->\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/---documentation.md",
    "content": "---\nname: \"\\U0001F4DA Documentation\"\nabout: Did you find errors, problems, or anything unclear in the docs (https://docs.getpelican.com/)?\ntitle: ''\nlabels: docs\nassignees: ''\n\n---\n\n<!--\n  Hi there! Thank you for discovering and submitting an issue with our documentation.\n\n  Before you submit this, let’s make sure of a few things.\n  Please make sure the following boxes are ticked if they are correct.\n  If not, please try and fulfill them first.\n-->\n\n<!-- Checked checkbox should look like this: [x] -->\n- [ ] I have searched the [issues](https://github.com/getpelican/pelican/issues?q=is%3Aissue) (including closed ones) and believe that this is not a duplicate.\n\n## Issue\n<!-- Now feel free to write your issue, but please be descriptive! Thanks again 🙌 ❤️ -->\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/---enhancement-request.md",
    "content": "---\nname: \"\\U0001F381 Feature Request\"\nabout: Do you have ideas for new features and improvements?\ntitle: ''\nlabels: enhancement\nassignees: ''\n\n---\n\n<!--\n  Hi there! Thank you for wanting to make Pelican better.\n\n  Before you submit this, let’s make sure of a few things.\n  Please make sure the following boxes are ticked if they are correct.\n  If not, please try and fulfill them first. The last one is optional but encouraged.\n-->\n\n<!-- Checked checkbox should look like this: [x] -->\n- [ ] I have searched the [issues](https://github.com/getpelican/pelican/issues?q=is%3Aissue) (including closed ones) and believe that this is not a duplicate.\n- [ ] I have searched the [documentation](https://docs.getpelican.com/) and believe that my question is not covered.\n- [ ] I am willing to lend a hand to help implement this feature. <!-- optional but encouraged -->\n\n## Feature Request\n<!-- Now feel free to write your idea for improvement. Thanks again 🙌 ❤️ -->\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "---\n# Ref: https://help.github.com/en/github/building-a-strong-community/configuring-issue-templates-for-your-repository#configuring-the-template-chooser\nblank_issues_enabled: false\ncontact_links:\n- name: '🗃️ Everything Else'\n  url: https://github.com/getpelican/pelican/discussions\n  about: |\n    Do you have a question/issue that does not fall into any of the other categories?\n- name: '💬 Pelican IRC Channel'\n  url: https://web.libera.chat/?#pelican\n  about: |\n    Chat with the community, ask questions, and learn about best practices.\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "# See https://docs.github.com/en/free-pro-team@latest/\n#  github/administering-a-repository/enabling-and-disabling-version-updates\n---\nversion: 2\nupdates:\n  - package-ecosystem: \"github-actions\"\n    directory: \"/\"\n    schedule:\n      interval: \"monthly\"\n    open-pull-requests-limit: 0\n"
  },
  {
    "path": ".github/pull_request_template.md",
    "content": "# Pull Request Checklist\n\nResolves: #issue-number-here <!-- Only if related issue *already* exists — otherwise remove this line -->\n\n<!-- This is just a reminder about the most common mistakes. Please make sure that you tick all *appropriate* boxes. Also, please read our [contribution guide](https://docs.getpelican.com/en/latest/contribute.html#contributing-code) at least once — it will save you unnecessary review cycles! -->\n\n- [ ] Ensured **tests pass** and (if applicable) updated functional test output\n- [ ] Conformed to **code style guidelines** by running appropriate linting tools\n- [ ] Added **tests** for changed code\n- [ ] Updated **documentation** for changed code\n\n<!-- If you have *any* questions to *any* of the points above, just **submit and ask**! This checklist is here to *help* you, not to deter you from contributing! -->\n"
  },
  {
    "path": ".github/stale.yml",
    "content": "# Configuration for probot-stale - https://github.com/probot/stale\n\n# Number of days of inactivity before an Issue or Pull Request becomes stale\ndaysUntilStale: 60\n\n# Number of days of inactivity before an Issue or Pull Request with the stale label is closed.\ndaysUntilClose: 30\n\n# Set to true to ignore issues in a project (defaults to false)\nexemptProjects: true\n\n# Set to true to ignore issues in a milestone (defaults to false)\nexemptMilestones: true\n\n# Set to true to ignore issues with an assignee (defaults to false)\nexemptAssignees: true\n\n# Label to use when marking as stale\nstaleLabel: stale\n\n# Comment to post when marking as stale. Set to `false` to disable\nmarkComment: >\n  This issue has been automatically marked as stale because it has not had\n  recent activity. It will be closed if no further activity occurs. Thank you\n  for your participation and understanding.\n\n# Limit the number of actions per hour, from 1-30. Default is 30\nlimitPerRun: 1\n\n# Limit to only `issues` or `pulls`\nonly: issues\n"
  },
  {
    "path": ".github/workflows/github_pages.yml",
    "content": "# Workflow for building the site and (optionally) publishing it to GitHub Pages.\nname: Deploy to GitHub Pages\non:\n  workflow_call:\n    inputs:\n      settings:\n        required: true\n        description: \"The path to your Pelican settings file (`pelican`'s `--settings` option), for example: 'publishconf.py'\"\n        type: string\n      requirements:\n        required: false\n        default: \"pelican\"\n        description: \"The Python requirements to install, for example to enable markdown and typogrify use: 'pelican[markdown] typogrify' or if you have a requirements file use: '-r requirements.txt'\"\n        type: string\n      output-path:\n        required: false\n        default: \"output/\"\n        description: \"Where to output the generated files (`pelican`'s `--output` option)\"\n        type: string\n      theme:\n        required: false\n        default: \"\"\n        description: \"The GitHub repo URL of a custom theme to use, for example: 'https://github.com/seanh/sidecar.git'\"\n        type: string\n      theme-checkout:\n        required: false\n        default: \"\"\n        description: \"Git ref (branch, tag or commit) of the theme repo to checkout. This can be used to pin the version of your theme. If not specified defaults to the theme repo's default branch.\"\n        type: string\n      python:\n        required: false\n        default: \"3.14\"\n        description: \"The version of Python to use, for example: '3.14' (to use the most recent version of Python 3.14, this is faster) or '3.14.0' (to use an exact version, slower)\"\n        type: string\n      siteurl:\n        required: false\n        default: \"\"\n        description: \"The base URL of your web site (Pelican's SITEURL setting). If not passed this will default to the URL of your GitHub Pages site, which is correct in most cases.\"\n        type: string\n      feed_domain:\n        required: false\n        default: \"\"\n        description: \"The domain to be prepended to feed URLs (Pelican's FEED_DOMAIN setting). If not passed this will default to the URL of your GitHub Pages site, which is correct in most cases.\"\n        type: string\n      deploy:\n        required: false\n        default: true\n        description: \"Whether to deploy the site. If true then build the site and deploy it. If false then just test that the site builds successfully but don't deploy anything.\"\n        type: boolean\n      stork:\n        required: false\n        default: false\n        description: \"Whether to add Stork search tool. If true, it will be installed on runner.\"\n        type: boolean\npermissions:\n  contents: read\n  pages: write\n  id-token: write\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v6\n      - name: Set up Python\n        uses: actions/setup-python@v5\n        with:\n          python-version: ${{ inputs.python }}\n      - name: Clone theme\n        if: ${{ inputs.theme }}\n        run: git clone '${{ inputs.theme }}' .theme\n      - name: Checkout theme ref\n        if: ${{ inputs.theme && inputs.theme-checkout }}\n        run: git -C .theme checkout '${{ inputs.theme-checkout }}'\n      - name: Configure GitHub Pages\n        id: pages\n        uses: actions/configure-pages@v5\n      - name: Install Stork\n        if: ${{ inputs.stork }}\n        run: cargo install stork-search --locked\n      - name: Install requirements\n        run: pip install ${{ inputs.requirements }}\n      - name: Build Pelican site\n        shell: python\n        run: |\n          import subprocess\n\n          cmd = \"pelican\"\n          cmd += \" --settings ${{ inputs.settings }}\"\n          cmd += \" --extra-settings\"\n          cmd += \"\"\" SITEURL='\"${{ inputs.siteurl || steps.pages.outputs.base_url }}\"'\"\"\"\n          cmd += \"\"\" FEED_DOMAIN='\"${{ inputs.feed_domain || steps.pages.outputs.base_url }}\"'\"\"\"\n          cmd += \" --output ${{ inputs.output-path }}\"\n\n          if \"${{ inputs.theme }}\":\n              cmd += \" --theme-path .theme\"\n\n          subprocess.run(cmd, shell=True, check=True)\n      - name: Fix permissions\n        run: |\n          chmod -c -R +rX \"${{ inputs.output-path }}\" | while read -r line; do\n            echo \"::warning title=Invalid file permissions automatically fixed::$line\"\n          done\n      - name: Archive artifact\n        shell: sh\n        run: |\n          echo \"::group::Archive artifact\"\n          tar \\\n            --dereference \\\n            --hard-dereference \\\n            --directory \"$OUTPUT_PATH\" \\\n            -cvf \"$RUNNER_TEMP/artifact.tar\" \\\n            --exclude=.git \\\n            --exclude=.github \\\n            .\n          echo \"::endgroup::\"\n        env:\n          OUTPUT_PATH: ${{ inputs.output-path }}\n      - name: Upload artifact\n        uses: actions/upload-artifact@v5\n        with:\n          name: github-pages\n          path: ${{ runner.temp }}/artifact.tar\n          retention-days: 1\n          if-no-files-found: error\n  deploy:\n    concurrency:\n      group: \"pages\"\n      cancel-in-progress: false\n    if: ${{ inputs.deploy }}\n    environment:\n      name: github-pages\n      url: ${{ steps.deployment.outputs.page_url }}\n    runs-on: ubuntu-latest\n    needs: build\n    steps:\n      - name: Deploy to GitHub Pages\n        id: deployment\n        uses: actions/deploy-pages@v4\n"
  },
  {
    "path": ".github/workflows/main.yml",
    "content": "name: build\n\non: [push, pull_request]\n\nenv:\n  # color output for pytest and tox\n  PYTEST_ADDOPTS: \"--color=yes\"\n  PY_COLORS: 1\n\njobs:\n  test:\n    name: Test - ${{ matrix.python }} - ${{ matrix.os }}\n    runs-on: ${{ matrix.os }}-latest\n\n    strategy:\n      matrix:\n        os: [ubuntu, macos, windows]\n        python: [\"3.10\", \"3.11\", \"3.12\", \"3.13\", \"3.14\"]\n\n    steps:\n      - uses: actions/checkout@v6\n      - name: Set up Python ${{ matrix.python }}\n        uses: actions/setup-python@v6\n        with:\n          python-version: ${{ matrix.python }}\n          cache: \"pip\"\n          cache-dependency-path: \"**/requirements/*\"\n      - name: Install locale (Linux)\n        if: startsWith(runner.os, 'Linux')\n        run: sudo locale-gen fr_FR.UTF-8 tr_TR.UTF-8\n      - name: Install pandoc\n        uses: r-lib/actions/setup-pandoc@v2\n        with:\n          pandoc-version: \"2.9.2\"\n      - name: Install tox\n        run: python -m pip install -U pip tox\n      - name: Info\n        run: |\n          echo \"=====  PYTHON  =====\"\n          python --version\n          echo \"=====  PANDOC  =====\"\n          pandoc --version | head -2\n      - name: Run tests\n        run: tox -e py${{ matrix.python }}\n\n  lint:\n    name: Lint\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v6\n      - uses: pdm-project/setup-pdm@v4\n        with:\n          python-version: \"3.11\"\n          cache: true\n          cache-dependency-path: ./pyproject.toml\n      - name: Install dependencies\n        run: |\n          pdm install --no-default --dev\n      - name: Run linters\n        run: pdm lint --diff\n      - name: Run pre-commit checks on all files\n        uses: pre-commit/action@v3.0.1\n\n  build:\n    name: Test build\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v6\n      - uses: pdm-project/setup-pdm@v4\n        with:\n          python-version: \"3.11\"\n          cache: true\n          cache-dependency-path: ./pyproject.toml\n      - name: Install dependencies\n        run: pdm install --dev\n      - name: Build package\n        run: pdm build\n      - name: Test build\n        run: pdm run pytest --check-build=dist  pelican/tests/build_test\n\n  docs:\n    name: Build docs\n    runs-on: ubuntu-latest\n\n    steps:\n      - uses: actions/checkout@v6\n      - name: Set up Python\n        uses: actions/setup-python@v6\n        with:\n          python-version: \"3.11\"\n          cache: \"pip\"\n          cache-dependency-path: \"**/requirements/*\"\n      - name: Install tox\n        run: python -m pip install -U pip tox\n      - name: Check\n        run: tox -e docs\n      - name: cache the docs for inspection\n        uses: actions/upload-artifact@v5\n        with:\n          name: docs\n          path: docs/_build/html/\n\n  deploy:\n    name: Deploy\n    environment: Deployment\n    needs: [test, lint, docs, build]\n    runs-on: ubuntu-latest\n    if: github.ref=='refs/heads/main' && github.event_name!='pull_request' && github.repository == 'getpelican/pelican'\n\n    permissions:\n      contents: write\n      id-token: write\n\n    steps:\n      - uses: actions/checkout@v6\n        with:\n          token: ${{ secrets.GH_TOKEN }}\n\n      - name: Set up Python\n        uses: actions/setup-python@v6\n        with:\n          python-version: \"3.11\"\n\n      - name: Check release\n        id: check_release\n        run: |\n          python -m pip install --upgrade pip\n          python -m pip install autopub[github]\n          autopub check\n\n      - name: Publish\n        if: ${{ steps.check_release.outputs.autopub_release=='true' }}\n        env:\n          GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}\n        run: |\n          autopub prepare\n          autopub commit\n          autopub build\n          autopub githubrelease\n\n      - name: Upload package to PyPI\n        if: ${{ steps.check_release.outputs.autopub_release=='true' }}\n        uses: pypa/gh-action-pypi-publish@release/v1\n"
  },
  {
    "path": ".gitignore",
    "content": "*.egg-info\n.*.swp\n.*.swo\n*.pyc\n.DS_Store\ndocs/_build\ndocs/*/_build\nbuild\ndist\ntags\n.tox\n.coverage\nhtmlcov\n*.orig\nvenv\nsamples/output\n*.pem\n*.lock\n.pdm-python\n.vale\n.venv\n**/LC_MESSAGES/*.mo\n\n# direnv\n.envrc\n\n# IDE cruft\n.idea\n.vscode\n"
  },
  {
    "path": ".mailmap",
    "content": "Alexis Métaireau <alexis@notmyidea.org>\nAlexis Métaireau <alexis@notmyidea.org> <alexis, notmyidea, org>\nAlexis Métaireau <alexis@notmyidea.org> <ametaireau@gmail.com>\nAxel Haustant <noirbizarre@gmail.com> <axel.haustant.ext@mappy.com>\nAxel Haustant <noirbizarre@gmail.com> <axel.haustant@valtech.fr>\nDave Mankoff <mankyd@gmail.com>\nFeth Arezki <feth@tuttu.info>\nGuillaume <guillaume@lame.homelinux.com>\nGuillaume <guillaume@lame.homelinux.com> <guillaume@mint.(none)>\nGuillaume B <guitreize@gmail.com>\nGuillermo López <guilan70@hotmail.com>\nGuillermo López <guilan70@hotmail.com> <guillermo.lopez@outlook.com>\nJomel Imperio <jimperio@gmail.com>\nJustin Mayer <entrop@gmail.com>\nJustin Mayer <entrop@gmail.com> <entroP@gmail.com>\nMarco Milanesi <kpanic@gnufunk.org> <marcom@openquake.org>\nMassimo Santini <santini@dsi.unimi.it> <santini@spillane.docenti.dsi.unimi.it>\nRémy HUBSCHER <hubscher.remy@gmail.com> <remy.hubscher@ionyse.com>\nSimon Conseil <contact@saimon.org>\nSimon Liedtke <liedtke.simon@googlemail.com>\nSkami18 <skami@skami-laptop.dyndns.org>\nStuart Colville <muffinresearchlabs@gmail.com> <muffinresearch@gmail.com>\nStéphane Bunel <stephane@lutetium.(none)>\ntBunnyMan <WagThatTail@Me.com>\n"
  },
  {
    "path": ".pre-commit-config.yaml",
    "content": "---\n# See https://pre-commit.com/hooks.html for info on hooks\nrepos:\n  - repo: https://github.com/pre-commit/pre-commit-hooks\n    rev: v5.0.0\n    hooks:\n      - id: check-added-large-files\n      - id: check-ast\n      - id: check-toml\n      - id: check-yaml\n      - id: debug-statements\n      - id: detect-private-key\n      - id: end-of-file-fixer\n      - id: forbid-new-submodules\n      - id: trailing-whitespace\n\n  - repo: https://github.com/astral-sh/ruff-pre-commit\n    # ruff version should match the one in pyproject.toml\n    rev: v0.12.7\n    hooks:\n      - id: ruff-check\n        args: [--fix, --exit-non-zero-on-fix]\n      - id: ruff-format\n\n  - repo: https://github.com/rtts/djhtml\n    rev: '3.0.8'\n    hooks:\n      - id: djhtml\n      - id: djcss\n      - id: djjs\n"
  },
  {
    "path": ".readthedocs.yaml",
    "content": "---\n# Read the Docs configuration file\n# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details\n\n# Required\nversion: 2\n\n# Set the OS, Python version, and any other needed tools\nbuild:\n  os: ubuntu-22.04\n  tools:\n    python: \"3.10\"\n\n# Build HTML & PDF formats\nformats:\n  - htmlzip\n  - pdf\n\n# Build documentation in the docs/ directory with Sphinx\nsphinx:\n  configuration: docs/conf.py\n\n# Version of Python and requirements required to build the docs\npython:\n  install:\n    - requirements: requirements/developer.pip\n    - method: pip\n      path: .\n"
  },
  {
    "path": ".vale.ini",
    "content": "StylesPath = .vale/styles\n\nVocab = Pelican\n\nMinAlertLevel = suggestion\n\nPackages = proselint, alex\n\n[*]\nBasedOnStyles = Vale, proselint, alex\n"
  },
  {
    "path": "CONTRIBUTING.rst",
    "content": "Filing issues\n=============\n\n* Before you submit a new issue, try `asking for help`_ first.\n* If determined to create a new issue, first search `Pelican Discussions`_\n  and `existing issues`_ (open and closed) to see if your question has already\n  been answered previously.\n\n.. _`asking for help`: `How to get help`_\n.. _`Pelican Discussions`: https://github.com/getpelican/pelican/discussions\n.. _`existing issues`: https://github.com/getpelican/pelican/issues\n\nHow to get help\n===============\n\nBefore you ask for help, please make sure you do the following:\n\n1. Read the documentation_ thoroughly. If in a hurry, at least use the search\n   field that is provided at top-left on the documentation_ pages. Make sure\n   you read the docs for the Pelican version you are using.\n2. Use a search engine (e.g., DuckDuckGo, Google) to search for a solution to\n   your problem. Someone may have already found a solution, perhaps in the\n   form of a ':pelican-doc:`plugins` or a specific combination of settings.\n\n3. Try reproducing the issue in a clean environment, ensuring you are using:\n\n* latest Pelican release (or an up-to-date Git clone of Pelican ``main`` branch)\n* latest releases of libraries used by Pelican\n* no plugins or only those related to the issue\n\n**NOTE:** The most common sources of problems are anomalies in (1) themes, (2)\nplugins, (3) settings files, and (4) ``make``/``invoke`` automation wrappers.\nIf you can't reproduce your problem when using the following steps to generate\nyour site, then the problem is almost certainly with one of the above-listed\nelements (and not Pelican itself)::\n\n    cd ~/projects/your-site\n    git clone https://github.com/getpelican/pelican ~/projects/pelican\n    pelican content -s ~/projects/pelican/samples/pelican.conf.py -t ~/projects/pelican/pelican/themes/notmyidea\n\nIf you can generate your site without problems using the steps above, then your\nproblem is unlikely to be caused by Pelican itself, and therefore please\nconsider reaching out to the maintainers of the plugins/theme you are using\ninstead of raising the topic with the Pelican core community.\n\nIf despite the above efforts you still cannot resolve your problem, be sure to\ninclude in your inquiry the following information, preferably in the form of\nlinks to content uploaded to a `paste service`_, GitHub repository, or other\npublicly-accessible location:\n\n* Describe what version of Pelican you are running (output of ``pelican --version``\n  or the HEAD commit hash if you cloned the repo) and how exactly you installed\n  it (the full command you used, e.g. ``python -m pip install pelican``).\n* If you are looking for a way to get some end result, prepare a detailed\n  description of what the end result should look like (preferably in the form of\n  an image or a mock-up page) and explain in detail what you have done so far to\n  achieve it.\n* If you are trying to solve some issue, prepare a detailed description of how\n  to reproduce the problem. If the issue cannot be easily reproduced, it cannot\n  be debugged by developers or volunteers. Describe only the **minimum steps**\n  necessary to reproduce it (no extra plugins, etc.).\n* Upload your settings file or any other custom code that would enable people to\n  reproduce the problem or to see what you have already tried to achieve the\n  desired end result.\n* Upload detailed and **complete** output logs and backtraces (remember to add\n  the ``--debug`` flag: ``pelican --debug content [...]``)\n\n.. _documentation: https://docs.getpelican.com/\n.. _`paste service`: https://dpaste.com\n\nOnce the above preparation is ready, you can post your query as a new thread in\n`Pelican Discussions`_. Remember to include all the information you prepared.\n\nContributing code\n=================\n\nBefore you submit a contribution, please ask whether it is desired so that you\ndon't spend a lot of time working on something that would be rejected for a\nknown reason. Consider also whether your new feature might be better suited as\na ':pelican-doc:`plugins` — you can `ask for help`_  to make that determination.\n\nAlso, if you intend to submit a pull request to address something for which there\nis no existing issue, there is no need to create a new issue and then immediately\nsubmit a pull request that closes it. You can submit the pull request by itself.\n\nUsing Git and GitHub\n--------------------\n\n* `Create a new branch`_ specific to your change (as opposed to making\n  your commits in the ``main`` branch).\n* **Don't put multiple unrelated fixes/features in the same branch / pull request.**\n  For example, if you're working on a new feature and find a bugfix that\n  doesn't *require* your new feature, **make a new distinct branch and pull\n  request** for the bugfix. Similarly, any proposed changes to code style\n  formatting should be in a completely separate pull request.\n* Add a ``RELEASE.md`` file in the root of the project that contains the\n  release type (major, minor, patch) and a summary of the changes that will be\n  used as the release changelog entry. For example::\n\n       Release type: minor\n\n       Reload browser window upon changes to content, settings, or theme\n\n* Check for unnecessary whitespace via ``git diff --check`` before committing.\n* First line of your commit message should start with present-tense verb, be 50\n  characters or less, and include the relevant issue number(s) if applicable.\n  *Example:* ``Ensure proper PLUGIN_PATH behavior. Refs #428.`` If the commit\n  *completely fixes* an existing bug report, please use ``Fixes #585`` or ``Fix\n  #585`` syntax (so the relevant issue is automatically closed upon PR merge).\n* After the first line of the commit message, add a blank line and then a more\n  detailed explanation (when relevant).\n* `Squash your commits`_ to eliminate merge commits and ensure a clean and\n  readable commit history.\n* After you have issued a pull request, the continuous integration (CI) system\n  will run the test suite on all supported Python versions and check for code style\n  compliance. If any of these checks fail, you should fix them. (If tests fail\n  on the CI system but seem to pass locally, ensure that local test runs aren't\n  skipping any tests.)\n\nContribution quality standards\n------------------------------\n\n* Adhere to the project's code style standards. See: `Development Environment`_\n* Ensure your code is compatible with the `officially-supported Python releases`_.\n* Add docs and tests for your changes. Undocumented and untested features will\n  not be accepted.\n* :pelican-doc:`Run all the tests <contribute>` **on all versions of Python\n  supported by Pelican** to ensure nothing was accidentally broken.\n\nCheck out our `Git Tips`_ page or `ask for help`_ if you\nneed assistance or have any questions about these guidelines.\n\n.. _`plugin`: https://docs.getpelican.com/en/latest/plugins.html\n.. _`Create a new branch`: https://github.com/getpelican/pelican/wiki/Git-Tips#making-your-changes\n.. _`Squash your commits`: https://github.com/getpelican/pelican/wiki/Git-Tips#squashing-commits\n.. _`Git Tips`: https://github.com/getpelican/pelican/wiki/Git-Tips\n.. _`ask for help`: `How to get help`_\n.. _`Development Environment`: https://docs.getpelican.com/en/latest/contribute.html#setting-up-the-development-environment\n.. _`officially-supported Python releases`: https://devguide.python.org/versions/#versions\n"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU AFFERO GENERAL PUBLIC LICENSE\n                       Version 3, 19 November 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://www.fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU Affero General Public License is a free, copyleft license for\nsoftware and other kinds of works, specifically designed to ensure\ncooperation with the community in the case of network server software.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nour General Public Licenses are intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  Developers that use our General Public Licenses protect your rights\nwith two steps: (1) assert copyright on the software, and (2) offer\nyou this License which gives you legal permission to copy, distribute\nand/or modify the software.\n\n  A secondary benefit of defending all users' freedom is that\nimprovements made in alternate versions of the program, if they\nreceive widespread use, become available for other developers to\nincorporate.  Many developers of free software are heartened and\nencouraged by the resulting cooperation.  However, in the case of\nsoftware used on network servers, this result may fail to come about.\nThe GNU General Public License permits making a modified version and\nletting the public access it on a server without ever releasing its\nsource code to the public.\n\n  The GNU Affero General Public License is designed specifically to\nensure that, in such cases, the modified source code becomes available\nto the community.  It requires the operator of a network server to\nprovide the source code of the modified version running there to the\nusers of that server.  Therefore, public use of a modified version, on\na publicly accessible server, gives the public access to the source\ncode of the modified version.\n\n  An older license, called the Affero General Public License and\npublished by Affero, was designed to accomplish similar goals.  This is\na different license, not a version of the Affero GPL, but Affero has\nreleased a new version of the Affero GPL which permits relicensing under\nthis license.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU Affero General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Remote Network Interaction; Use with the GNU General Public License.\n\n  Notwithstanding any other provision of this License, if you modify the\nProgram, your modified version must prominently offer all users\ninteracting with it remotely through a computer network (if your version\nsupports such interaction) an opportunity to receive the Corresponding\nSource of your version by providing access to the Corresponding Source\nfrom a network server at no charge, through some standard or customary\nmeans of facilitating copying of software.  This Corresponding Source\nshall include the Corresponding Source for any work covered by version 3\nof the GNU General Public License that is incorporated pursuant to the\nfollowing paragraph.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the work with which it is combined will remain governed by version\n3 of the GNU General Public License.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU Affero General Public License from time to time.  Such new versions\nwill be similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU Affero General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU Affero General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU Affero General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If your software can interact with users remotely through a computer\nnetwork, you should also make sure that it provides a way for users to\nget its source.  For example, if your program is a web application, its\ninterface could display a \"Source\" link that leads users to an archive\nof the code.  There are many ways you could offer source, and different\nsolutions will be better for different programs; see section 13 for the\nspecific requirements.\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU AGPL, see\n<https://www.gnu.org/licenses/>.\n"
  },
  {
    "path": "README.rst",
    "content": "Pelican |build-status| |pypi-version| |downloads| |repology|\n============================================================\n\nPelican is a static site generator, written in Python_, that allows you to create\nweb sites by composing text files in formats such as Markdown, reStructuredText, and HTML.\n\nWith Pelican, you can create web sites without worrying about databases or server-side programming.\nPelican generates static sites that can be served via any web server or hosting service.\n\nYou can perform the following functions with Pelican:\n\n* Compose content in Markdown_ or reStructuredText_ using your editor of choice\n* Simple command-line tool (re)generates HTML, CSS, and JS from your source content\n* Easy to interface with version control systems and web hooks\n* Completely static output is simple to host anywhere\n\n\nFeatures\n--------\n\nPelican’s feature highlights include:\n\n* Chronological content (e.g., articles, blog posts) as well as static pages\n* Integration with external services\n* Site themes (created using Jinja2_ templates)\n* Publication of articles in multiple languages\n* Generation of Atom and RSS feeds\n* Code syntax highlighting via Pygments_\n* Import existing content from WordPress, Dotclear, or RSS feeds\n* Fast rebuild times due to content caching and selective output writing\n* Extensible via a rich plugin ecosystem: `Pelican Plugins`_\n\nCheck out the `Pelican documentation`_ for further information.\n\n\nHow to get help, contribute, or provide feedback\n------------------------------------------------\n\nSee our `contribution submission and feedback guidelines <CONTRIBUTING.rst>`_.\n\n\nSource code\n-----------\n\nPelican’s source code is `hosted on GitHub`_. For information on how it works,\nhave a look at `Pelican's internals`_.\n\n\nWhy the name “Pelican”?\n-----------------------\n\n“Pelican” is an anagram of *calepin*, which means “notebook” in French.\n\n\n.. Links\n\n.. _Python: https://www.python.org/\n.. _reStructuredText: http://docutils.sourceforge.net/rst.html\n.. _Markdown: https://daringfireball.net/projects/markdown/\n.. _Jinja2: https://palletsprojects.com/p/jinja/\n.. _Pygments: https://pygments.org/\n.. _`Pelican Plugins`: https://github.com/pelican-plugins\n.. _`Pelican documentation`: https://docs.getpelican.com/\n.. _`Pelican's internals`: https://docs.getpelican.com/en/latest/internals.html\n.. _`hosted on GitHub`: https://github.com/getpelican/pelican\n\n.. |build-status| image:: https://img.shields.io/github/actions/workflow/status/getpelican/pelican/main.yml?branch=main\n   :target: https://github.com/getpelican/pelican/actions/workflows/main.yml?query=branch%3Amain\n   :alt: GitHub Actions CI: continuous integration status\n.. |pypi-version| image:: https://img.shields.io/pypi/v/pelican.svg\n   :target: https://pypi.org/project/pelican/\n   :alt: PyPI: the Python Package Index\n.. |downloads| image:: https://img.shields.io/pypi/dm/pelican.svg\n   :target: https://pypi.org/project/pelican/\n   :alt: Monthly Downloads from PyPI\n.. |repology| image:: https://repology.org/badge/tiny-repos/pelican.svg\n   :target: https://repology.org/project/pelican/versions\n   :alt: Repology: the packaging hub\n"
  },
  {
    "path": "THANKS",
    "content": "Pelican is a project led by Justin Mayer <https://justinmayer.com/>\nand originally created by Alexis Métaireau <https://blog.notmyidea.org/>, but\nthere are a large number of people that have contributed or implemented key\nfeatures over time. We do our best to keep this list up-to-date, but you can\nalso have a look at the nice contributor graphs produced by GitHub:\nhttps://github.com/getpelican/pelican/graphs/contributors\n\nIf you want to contribute, check the documentation section about how to do so:\n<https://docs.getpelican.com/en/latest/contribute.html>\n\nAaron Kavlie\nAbhishek L\nAlbrecht Mühlenschulte\nAldiantoro Nugroho\nAlen Mujezinovic\nAlessandro Martin\nAlexander Artemenko\nAlexandre RODIERE\nAlexis Daboville\nAlexis Métaireau\nAllan Whatmough\nAndrea Crotti\nAndrew Laski\nAndrew Spiers\nArnaud BOS\nasselinpaul\nAxel Haustant\nBen Rosser (TC01)\nBen Sturmfels\nBenoît HERVIER\nBernhard Scheirle\nBorgar\nBrandon W Maister\nBrendan Wholihan\nBrian C. Lane\nBrian Hsu\nBrian St. Pierre\nBruno Binet\nBunnyMan\nChenguang Wang\nChris Elston\nChris McDonald (Wraithan)\nChris Streeter\nChristophe Chauvet\nClint Howarth\nColin Dunklau\nDafydd Crosby\nDana Woodman\nDave King\nDave Mankoff\nDavid Beitey\nDavid Marble\nDeniz Turgut (Avaris)\nderdon\nDirkjan Ochtman\nDirk Makowski\ndraftcode\nEdward Delaporte\nEmily Strickland\nepatters\nEric Case\nErik Hetzner\nFELD Boris\nFeth Arezki\nFlorian Jacob\nFlorian Preinstorfer\nFélix Delval\nFrederik Ring\nFreeculture\nGeorge V. Reilly\nGuillaume\nGuillaume B\nGuillermo López\nguillermooo\nIan Cordasco\nIgor Kalnitsky\nIrfan Ahmad\nIuri de Silvio\nIvan Dyedov\nJames King\nJames Rowe\nJason K. Moore\njawher\nJered Boxman\nJerome\nJiachen Yang\nJochen Breuer\njoe di castro\nJohn Kristensen\nJohn Mastro\nJökull Sólberg Auðunsson\nJomel Imperio\nJonas Borges\nJoseph Reagle\nJoshua Adelman\nJulian Berman\nJustin Mayer\nKevin Deldycke\nKevin Yap\nKyle Fuller\nLaureline Guerin\nLeonard Huang\nLeonardo Giordani\nLeroy Jiang\nLucas Cimon\nMarcel Hellkamp\nMarco Milanesi\nMarcus Fredriksson\nMario Rodas\nMark Caudill\nMartin Brochhaus\nMassimo Santini\nMatt Bowcock\nMatt Layman\nMeir Kriheli\nMichael Guntsche\nMichael Reneer\nMichael Yanovich\nMike Yumatov\nMikhail Korobov\nMirek Długosz\nm-r-r\nmviera\nNam Nguyen\nNianQing Yao\nNico Di Rocco\nNicolas Duhamel\nNicolas Perriault\nNicolas Steinmetz\nPaolo Melchiorre\nPaul Asselin\nPavel Puchkin\nPerry Roper\nPeter Desmet\nPeter Sabaini\nPetr Viktorin\nPhilippe Pepiot\nRachid Belaid\nRandall Degges\nRanjhith Kalisamy\nRemi Rampin\nRémy HUBSCHER\nrenhbo\nRichard Duivenvoorde\nRogdham\nRomain Porte\nRoman Skvazh\nRonny Pfannschmidt\nRory McCann\nRıdvan Örsvuran\nsaghul\nsam\nSamrat Man Singh\nSimon Conseil\nSimon Liedtke\nSkami18\nsolsTiCe d'Hiver\nSteve Schwarz\nStéphane Bunel\nStéphane Raimbault\nStuart Colville\nTalha Mansoor\nTarek Ziade\nThanos Lefteris\nThomas Thurman\nTobias\nTom Adler\nTomi Pieviläinen\nTrae Blain\nTristan Miller\nTshepang Lekhonkhobe\nValentin-Costel Hăloiu\nVlad Niculae\nWilliam Light\nWilliam Minchin\nWladislaw Merezhko\nW. Trevor King\nZoresvit\n"
  },
  {
    "path": "docs/Makefile",
    "content": "# Makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line.\nSPHINXOPTS    =\nSPHINXBUILD   = sphinx-build\nPAPER         =\nBUILDDIR      = _build\n\n# Internal variables.\nPAPEROPT_a4     = -D latex_paper_size=a4\nPAPEROPT_letter = -D latex_paper_size=letter\nALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .\n\n.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest\n\nhelp:\n\t@echo \"Please use \\`make <target>' where <target> is one of\"\n\t@echo \"  html       to make standalone HTML files\"\n\t@echo \"  dirhtml    to make HTML files named index.html in directories\"\n\t@echo \"  singlehtml to make a single large HTML file\"\n\t@echo \"  pickle     to make pickle files\"\n\t@echo \"  json       to make JSON files\"\n\t@echo \"  htmlhelp   to make HTML files and a HTML help project\"\n\t@echo \"  qthelp     to make HTML files and a qthelp project\"\n\t@echo \"  devhelp    to make HTML files and a Devhelp project\"\n\t@echo \"  epub       to make an epub\"\n\t@echo \"  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter\"\n\t@echo \"  latexpdf   to make LaTeX files and run them through pdflatex\"\n\t@echo \"  text       to make text files\"\n\t@echo \"  man        to make manual pages\"\n\t@echo \"  changes    to make an overview of all changed/added/deprecated items\"\n\t@echo \"  linkcheck  to check all external links for integrity\"\n\t@echo \"  doctest    to run all doctests embedded in the documentation (if enabled)\"\n\nclean:\n\t-rm -rf $(BUILDDIR)/*\n\nhtml:\n\t$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html\n\t@echo\n\t@echo \"Build finished. The HTML pages are in $(BUILDDIR)/html.\"\n\ndirhtml:\n\t$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml\n\t@echo\n\t@echo \"Build finished. The HTML pages are in $(BUILDDIR)/dirhtml.\"\n\nsinglehtml:\n\t$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml\n\t@echo\n\t@echo \"Build finished. The HTML page is in $(BUILDDIR)/singlehtml.\"\n\npickle:\n\t$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle\n\t@echo\n\t@echo \"Build finished; now you can process the pickle files.\"\n\njson:\n\t$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json\n\t@echo\n\t@echo \"Build finished; now you can process the JSON files.\"\n\nhtmlhelp:\n\t$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp\n\t@echo\n\t@echo \"Build finished; now you can run HTML Help Workshop with the\" \\\n\t      \".hhp project file in $(BUILDDIR)/htmlhelp.\"\n\nqthelp:\n\t$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp\n\t@echo\n\t@echo \"Build finished; now you can run \"qcollectiongenerator\" with the\" \\\n\t      \".qhcp project file in $(BUILDDIR)/qthelp, like this:\"\n\t@echo \"# qcollectiongenerator $(BUILDDIR)/qthelp/Raclette.qhcp\"\n\t@echo \"To view the help file:\"\n\t@echo \"# assistant -collectionFile $(BUILDDIR)/qthelp/Raclette.qhc\"\n\ndevhelp:\n\t$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp\n\t@echo\n\t@echo \"Build finished.\"\n\t@echo \"To view the help file:\"\n\t@echo \"# mkdir -p $$HOME/.local/share/devhelp/Raclette\"\n\t@echo \"# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Raclette\"\n\t@echo \"# devhelp\"\n\nepub:\n\t$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub\n\t@echo\n\t@echo \"Build finished. The epub file is in $(BUILDDIR)/epub.\"\n\nlatex:\n\t$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex\n\t@echo\n\t@echo \"Build finished; the LaTeX files are in $(BUILDDIR)/latex.\"\n\t@echo \"Run \\`make' in that directory to run these through (pdf)latex\" \\\n\t      \"(use \\`make latexpdf' here to do that automatically).\"\n\nlatexpdf:\n\t$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex\n\t@echo \"Running LaTeX files through pdflatex...\"\n\tmake -C $(BUILDDIR)/latex all-pdf\n\t@echo \"pdflatex finished; the PDF files are in $(BUILDDIR)/latex.\"\n\ntext:\n\t$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text\n\t@echo\n\t@echo \"Build finished. The text files are in $(BUILDDIR)/text.\"\n\nman:\n\t$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man\n\t@echo\n\t@echo \"Build finished. The manual pages are in $(BUILDDIR)/man.\"\n\nchanges:\n\t$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes\n\t@echo\n\t@echo \"The overview file is in $(BUILDDIR)/changes.\"\n\nlinkcheck:\n\t$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck\n\t@echo\n\t@echo \"Link check complete; look for any errors in the above output \" \\\n\t      \"or in $(BUILDDIR)/linkcheck/output.txt.\"\n\ndoctest:\n\t$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest\n\t@echo \"Testing of doctests in the sources finished, look at the \" \\\n\t      \"results in $(BUILDDIR)/doctest/output.txt.\"\n"
  },
  {
    "path": "docs/_static/theme_overrides.css",
    "content": "\n/* override table width restrictions */\n.wy-table-responsive table td, .wy-table-responsive table th {\n    /* !important prevents the common CSS stylesheets from\n       overriding this as on RTD they are loaded after this stylesheet */\n    white-space: normal !important;\n}\n\n.wy-table-responsive {\n    overflow: visible !important;\n}\n"
  },
  {
    "path": "docs/_templates/page.html",
    "content": "{% extends \"base.html\" %}\n\n{% block body -%}\n  {{ super() }}\n  {% include \"partials/icons.html\" %}\n\n  <input type=\"checkbox\" class=\"sidebar-toggle\" name=\"__navigation\" id=\"__navigation\" aria-label=\"Toggle site navigation sidebar\">\n  <input type=\"checkbox\" class=\"sidebar-toggle\" name=\"__toc\" id=\"__toc\" aria-label=\"Toggle table of contents sidebar\">\n  <label class=\"overlay sidebar-overlay\" for=\"__navigation\"></label>\n  <label class=\"overlay toc-overlay\" for=\"__toc\"></label>\n\n  <a class=\"skip-to-content muted-link\" href=\"#furo-main-content\">\n    {%- trans -%}\n      Skip to content\n    {%- endtrans -%}\n  </a>\n\n  {% if theme_announcement -%}\n    <div class=\"announcement\">\n      <aside class=\"announcement-content\">\n        {% block announcement %} {{ theme_announcement }} {% endblock announcement %}\n      </aside>\n    </div>\n  {%- endif %}\n\n  <div class=\"page\">\n    <header class=\"mobile-header\">\n      <div class=\"header-left\">\n        <label class=\"nav-overlay-icon\" for=\"__navigation\">\n          <span class=\"icon\"><svg><use href=\"#svg-menu\"></use></svg></span>\n        </label>\n      </div>\n      <div class=\"header-center\">\n        <a href=\"{{ pathto(master_doc) }}\"><div class=\"brand\">{{ docstitle if docstitle else project }}</div></a>\n      </div>\n      <div class=\"header-right\">\n        <div class=\"theme-toggle-container theme-toggle-header\">\n          <button class=\"theme-toggle\" aria-label=\"Toggle Light / Dark / Auto color theme\">\n            <svg class=\"theme-icon-when-auto-light\"><use href=\"#svg-sun-with-moon\"></use></svg>\n            <svg class=\"theme-icon-when-auto-dark\"><use href=\"#svg-moon-with-sun\"></use></svg>\n            <svg class=\"theme-icon-when-dark\"><use href=\"#svg-moon\"></use></svg>\n            <svg class=\"theme-icon-when-light\"><use href=\"#svg-sun\"></use></svg>\n          </button>\n        </div>\n        <label class=\"toc-overlay-icon toc-header-icon{% if furo_hide_toc %} no-toc{% endif %}\" for=\"__toc\">\n          <span class=\"icon\"><svg><use href=\"#svg-toc\"></use></svg></span>\n        </label>\n      </div>\n    </header>\n    <aside class=\"sidebar-drawer\">\n      <div class=\"sidebar-container\">\n        {% block left_sidebar %}\n          <div class=\"sidebar-sticky\">\n            {%- for sidebar_section in sidebars %}\n              {%- include sidebar_section %}\n            {%- endfor %}\n          </div>\n        {% endblock left_sidebar %}\n      </div>\n    </aside>\n    <div class=\"main\">\n      <div class=\"content\">\n        <div class=\"article-container\">\n          <a href=\"#\" class=\"back-to-top muted-link\">\n            <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n              <path d=\"M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z\"></path>\n            </svg>\n            <span>{% trans %}Back to top{% endtrans %}</span>\n          </a>\n          <div class=\"content-icon-container\">\n            {% if theme_top_of_page_button != \"edit\" -%}\n              {{ warning(\"Got configuration for 'top_of_page_button': this is deprecated.\") }}\n            {%- endif -%}\n\n            {%- if theme_top_of_page_buttons == \"\" -%}\n              {% if theme_top_of_page_button == None -%}\n              {#- We respect the old configuration of disabling all the buttons -#}\n                {%- set theme_top_of_page_buttons = [] -%}\n              {% else %}\n                {%- set theme_top_of_page_buttons = [\"view\", \"edit\"] -%}\n              {%- endif -%}\n            {% else -%}\n              {% if theme_top_of_page_button != \"edit\" -%}\n                {%- set theme_top_of_page_buttons = [] -%}\n                {{ warning(\"Got configuration for both 'top_of_page_button' and 'top_of_page_buttons', ignoring both and removing all top of page buttons.\") }}\n              {%- endif -%}\n            {%- endif -%}\n            {% for button in theme_top_of_page_buttons -%}\n              {% if button == \"view\" %}\n                {%- include \"components/view-this-page.html\" with context -%}\n              {% elif button == \"edit\" %}\n                {%- include \"components/edit-this-page.html\" with context -%}\n              {% else %}\n                {{ warning(\"Got an unsupported value in 'top_of_page_buttons' for theme configuration\") }}\n              {% endif %}\n            {%- endfor -%}\n          {#- Theme toggle -#}\n            <div class=\"theme-toggle-container theme-toggle-content\">\n              <button class=\"theme-toggle\" aria-label=\"Toggle Light / Dark / Auto color theme\">\n                <svg class=\"theme-icon-when-auto-light\"><use href=\"#svg-sun-with-moon\"></use></svg>\n                <svg class=\"theme-icon-when-auto-dark\"><use href=\"#svg-moon-with-sun\"></use></svg>\n                <svg class=\"theme-icon-when-dark\"><use href=\"#svg-moon\"></use></svg>\n                <svg class=\"theme-icon-when-light\"><use href=\"#svg-sun\"></use></svg>\n              </button>\n            </div>\n            <label class=\"toc-overlay-icon toc-content-icon{% if furo_hide_toc %} no-toc{% endif %}\" for=\"__toc\">\n              <span class=\"icon\"><svg><use href=\"#svg-toc\"></use></svg></span>\n            </label>\n          </div>\n          <article role=\"main\" id=\"furo-main-content\">\n            {% block content %}{{ body }}{% endblock %}\n          </article>\n        </div>\n        <footer>\n          {% block footer %}\n            <div class=\"related-pages\">\n              {% if next -%}\n                <a class=\"next-page\" href=\"{{ next.link }}\">\n                  <div class=\"page-info\">\n                    <div class=\"context\">\n                      <span>{{ _(\"Next\") }}</span>\n                    </div>\n                    <div class=\"title\">{{ next.title }}</div>\n                  </div>\n                  <svg class=\"furo-related-icon\"><use href=\"#svg-arrow-right\"></use></svg>\n                </a>\n              {%- endif %}\n              {% if prev -%}\n                <a class=\"prev-page\" href=\"{{ prev.link }}\">\n                  <svg class=\"furo-related-icon\"><use href=\"#svg-arrow-right\"></use></svg>\n                  <div class=\"page-info\">\n                    <div class=\"context\">\n                      <span>{{ _(\"Previous\") }}</span>\n                    </div>\n                    {% if prev.link == pathto(master_doc) %}\n                      <div class=\"title\">{{ _(\"Home\") }}</div>\n                    {% else %}\n                      <div class=\"title\">{{ prev.title }}</div>\n                    {% endif %}\n                  </div>\n                </a>\n              {%- endif %}\n            </div>\n            <div class=\"bottom-of-page\">\n              <div class=\"left-details\">\n                {%- if show_copyright %}\n                  <div class=\"copyright\">\n                    {%- if hasdoc('copyright') %}\n                      {% trans path=pathto('copyright'), copyright=copyright|e -%}\n                        <a href=\"{{ path }}\">Copyright</a> &#169; {{ copyright }}\n                      {%- endtrans %}\n                    {%- else %}\n                      {% trans copyright=copyright|e -%}\n                        Copyright &#169; {{ copyright }}, <a href=\"https://justinmayer.com\">Justin Mayer</a>, Alexis Metaireau, and contributors\n                      {%- endtrans %}\n                    {%- endif %}\n                  </div>\n                {%- endif %}\n                {%- if last_updated -%}\n                  <div class=\"last-updated\">\n                    {% trans last_updated=last_updated|e -%}\n                      Last updated on {{ last_updated }}\n                    {%- endtrans -%}\n                  </div>\n                {%- endif %}\n              </div>\n              <div class=\"right-details\">\n                {% if theme_footer_icons or READTHEDOCS -%}\n                  <div class=\"icons\">\n                    {% if theme_footer_icons -%}\n                      {% for icon_dict in theme_footer_icons -%}\n                        <a class=\"muted-link {{ icon_dict.class }}\" href=\"{{ icon_dict.url }}\" aria-label=\"{{ icon_dict.name }}\">\n                          {{- icon_dict.html -}}\n                        </a>\n                      {% endfor %}\n                    {%- else -%}\n              {#- Show Read the Docs project -#}\n                      {%- if READTHEDOCS and slug -%}\n                        <a class=\"muted-link\" href=\"https://readthedocs.org/projects/{{ slug }}\" aria-label=\"On Read the Docs\">\n                          <svg x=\"0px\" y=\"0px\" viewBox=\"-125 217 360 360\" xml:space=\"preserve\">\n                            <path fill=\"currentColor\" d=\"M39.2,391.3c-4.2,0.6-7.1,4.4-6.5,8.5c0.4,3,2.6,5.5,5.5,6.3 c0,0,18.5,6.1,50,8.7c25.3,2.1,54-1.8,54-1.8c4.2-0.1,7.5-3.6,7.4-7.8c-0.1-4.2-3.6-7.5-7.8-7.4c-0.5,0-1,0.1-1.5,0.2 c0,0-28.1,3.5-50.9,1.6c-30.1-2.4-46.5-7.9-46.5-7.9C41.7,391.3,40.4,391.1,39.2,391.3z M39.2,353.6c-4.2,0.6-7.1,4.4-6.5,8.5 c0.4,3,2.6,5.5,5.5,6.3c0,0,18.5,6.1,50,8.7c25.3,2.1,54-1.8,54-1.8c4.2-0.1,7.5-3.6,7.4-7.8c-0.1-4.2-3.6-7.5-7.8-7.4 c-0.5,0-1,0.1-1.5,0.2c0,0-28.1,3.5-50.9,1.6c-30.1-2.4-46.5-7.9-46.5-7.9C41.7,353.6,40.4,353.4,39.2,353.6z M39.2,315.9 c-4.2,0.6-7.1,4.4-6.5,8.5c0.4,3,2.6,5.5,5.5,6.3c0,0,18.5,6.1,50,8.7c25.3,2.1,54-1.8,54-1.8c4.2-0.1,7.5-3.6,7.4-7.8 c-0.1-4.2-3.6-7.5-7.8-7.4c-0.5,0-1,0.1-1.5,0.2c0,0-28.1,3.5-50.9,1.6c-30.1-2.4-46.5-7.9-46.5-7.9 C41.7,315.9,40.4,315.8,39.2,315.9z M39.2,278.3c-4.2,0.6-7.1,4.4-6.5,8.5c0.4,3,2.6,5.5,5.5,6.3c0,0,18.5,6.1,50,8.7 c25.3,2.1,54-1.8,54-1.8c4.2-0.1,7.5-3.6,7.4-7.8c-0.1-4.2-3.6-7.5-7.8-7.4c-0.5,0-1,0.1-1.5,0.2c0,0-28.1,3.5-50.9,1.6 c-30.1-2.4-46.5-7.9-46.5-7.9C41.7,278.2,40.4,278.1,39.2,278.3z M-13.6,238.5c-39.6,0.3-54.3,12.5-54.3,12.5v295.7 c0,0,14.4-12.4,60.8-10.5s55.9,18.2,112.9,19.3s71.3-8.8,71.3-8.8l0.8-301.4c0,0-25.6,7.3-75.6,7.7c-49.9,0.4-61.9-12.7-107.7-14.2 C-8.2,238.6-10.9,238.5-13.6,238.5z M19.5,257.8c0,0,24,7.9,68.3,10.1c37.5,1.9,75-3.7,75-3.7v267.9c0,0-19,10-66.5,6.6 C59.5,536.1,19,522.1,19,522.1L19.5,257.8z M-3.6,264.8c4.2,0,7.7,3.4,7.7,7.7c0,4.2-3.4,7.7-7.7,7.7c0,0-12.4,0.1-20,0.8 c-12.7,1.3-21.4,5.9-21.4,5.9c-3.7,2-8.4,0.5-10.3-3.2c-2-3.7-0.5-8.4,3.2-10.3c0,0,0,0,0,0c0,0,11.3-6,27-7.5 C-16,264.9-3.6,264.8-3.6,264.8z M-11,302.6c4.2-0.1,7.4,0,7.4,0c4.2,0.5,7.2,4.3,6.7,8.5c-0.4,3.5-3.2,6.3-6.7,6.7 c0,0-12.4,0.1-20,0.8c-12.7,1.3-21.4,5.9-21.4,5.9c-3.7,2-8.4,0.5-10.3-3.2c-2-3.7-0.5-8.4,3.2-10.3c0,0,11.3-6,27-7.5 C-20.5,302.9-15.2,302.7-11,302.6z M-3.6,340.2c4.2,0,7.7,3.4,7.7,7.7s-3.4,7.7-7.7,7.7c0,0-12.4-0.1-20,0.7 c-12.7,1.3-21.4,5.9-21.4,5.9c-3.7,2-8.4,0.5-10.3-3.2c-2-3.7-0.5-8.4,3.2-10.3c0,0,11.3-6,27-7.5C-16,340.1-3.6,340.2-3.6,340.2z\" />\n                          </svg>\n                        </a>\n                      {%- endif -%}\n              {#- Show GitHub repository home -#}\n                      {%- if READTHEDOCS and display_github and github_user != \"None\" and github_repo != \"None\" -%}\n                        <a class=\"muted-link\" href=\"https://github.com/{{ github_user }}/{{ github_repo }}\" aria-label=\"On GitHub\">\n                          <svg stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" viewBox=\"0 0 16 16\">\n                            <path fill-rule=\"evenodd\" d=\"M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8z\"></path>\n                          </svg>\n                        </a>\n                      {%- endif -%}\n                    {%- endif %}\n                  </div>\n                {%- endif %}\n              </div>\n            </div>\n          {% endblock footer %}\n        </footer>\n      </div>\n      <aside class=\"toc-drawer{% if furo_hide_toc %} no-toc{% endif %}\">\n        {% block right_sidebar %}\n          {% if not furo_hide_toc %}\n            <div class=\"toc-sticky toc-scroll\">\n              <div class=\"toc-title-container\">\n                <span class=\"toc-title\">\n                  {{ _(\"On this page\") }}\n                </span>\n              </div>\n              <div class=\"toc-tree-container\">\n                <div class=\"toc-tree\">\n                  {{ toc }}\n                </div>\n              </div>\n            </div>\n          {% endif %}\n        {% endblock right_sidebar %}\n      </aside>\n    </div>\n  </div>\n{%- endblock %}\n"
  },
  {
    "path": "docs/changelog.rst",
    "content": "Release history\n###############\n\n4.11.0 - 2025-01-15\n===================\n\n- Add setting to selectively omit Typogrify filters `(#3439) <https://github.com/getpelican/pelican/pull/3439>`_\n- Add more blocks to the Simple theme’s base template, making it easier to create new themes by inheriting from the Simple theme `(#3405) <https://github.com/getpelican/pelican/pull/3405>`_\n- Fix auto-reload behavior upon changes to the theme, content or settings. Make default ``IGNORE_FILES`` recursively ignore all hidden files as well as the `default filters <https://watchfiles.helpmanual.io/api/filters/#watchfiles.DefaultFilter.ignore_dirs>`_ from ``watchfiles.DefaultFilter``. `(#3441) <https://github.com/getpelican/pelican/pull/3441>`_\n- Get current year from the ``SOURCE_DATE_EPOCH`` environment variable, if available `(#3430) <https://github.com/getpelican/pelican/pull/3430>`_\n- Add Python 3.13 to test matrix and remove Python 3.8 `(#3435) <https://github.com/getpelican/pelican/pull/3435>`_\n- Require Typogrify 2.1+ and Pygments <2.19\n\n4.10.2 - 2024-11-27\n===================\n\n- Change ``IGNORE_FILES`` setting default to ignore all hidden files\n- Fix ``SUMMARY_MAX_PARAGRAPHS`` not being respected in some combinations with ``SUMMARY_MAX_LENGTH``\n\n4.10.1 - 2024-09-28\n===================\n\n- Fix error when running ``pelican -r -l``\n- Fix symlink handling in ``pelican-themes``\n\n4.10.0 - 2024-09-16\n===================\n\n- Add setting to specify summary via paragraph count\n- Add new status to skip generation of a post\n- Add setting to append ``ref`` parameter to links in feeds\n- Configure logging handler via ``--log-handler`` CLI option\n- Resolve intra-site links in summaries\n- Warn when files are not processed due to disabled readers\n- Add Medium post importer\n- Improve GitHub Pages workflow\n- Improve code test coverage\n- Translate documentation into Simplified Chinese\n\n4.9.1 - 2023-11-15\n==================\n\n* Ensure ``tzdata`` dependency is installed on Windows\n\n4.9.0 - 2023-11-12\n==================\n\n* Upgrade code to new minimum supported Python version: 3.8\n* Settings support for ``pathlib.Path`` `(#2758) <https://github.com/getpelican/pelican/pull/2758>`_\n* Various improvements to Simple theme (`#2976 <https://github.com/getpelican/pelican/pull/2976>`_ & `#3234 <https://github.com/getpelican/pelican/pull/3234>`_)\n* Use Furo as Sphinx documentation theme `(#3023) <https://github.com/getpelican/pelican/pull/3023>`_\n* Default to 100 articles maximum in feeds `(#3127) <https://github.com/getpelican/pelican/pull/3127>`_\n* Add ``period_archives common context`` variable `(#3148) <https://github.com/getpelican/pelican/pull/3148>`_\n* Use ``watchfiles`` as the file-watching backend `(#3151) <https://github.com/getpelican/pelican/pull/3151>`_\n* Add GitHub Actions workflow for GitHub Pages `(#3189) <https://github.com/getpelican/pelican/pull/3189>`_\n* Allow dataclasses in settings `(#3204) <https://github.com/getpelican/pelican/pull/3204>`_\n* Switch build tool to PDM instead of Setuptools/Poetry `(#3220) <https://github.com/getpelican/pelican/pull/3220>`_\n* Provide a ``plugin_enabled`` Jinja test for themes `(#3235) <https://github.com/getpelican/pelican/pull/3235>`_\n* Preserve connection order in Blinker `(#3238) <https://github.com/getpelican/pelican/pull/3238>`_\n* Remove social icons from default ``notmyidea`` theme `(#3240) <https://github.com/getpelican/pelican/pull/3240>`_\n* Remove unreliable ``WRITE_SELECTED`` feature `(#3243) <https://github.com/getpelican/pelican/pull/3243>`_\n* Importer: Report broken embedded video links when importing from Tumblr `(#3177) <https://github.com/getpelican/pelican/issues/3177>`_\n* Importer: Remove newline addition when iterating Photo post types `(#3178) <https://github.com/getpelican/pelican/issues/3178>`_\n* Importer: Force timestamp conversion in Tumblr importer to be UTC with offset `(#3221) <https://github.com/getpelican/pelican/pull/3221>`_\n* Importer: Use tempfile for intermediate HTML file for Pandoc `(#3221) <https://github.com/getpelican/pelican/pull/3221>`_\n* Switch linters to Ruff `(#3223) <https://github.com/getpelican/pelican/pull/3223>`_\n\n4.8.0 - 2022-07-11\n==================\n\n* Use JSON values for extra settings in Invoke tasks template `(#2994) <https://github.com/getpelican/pelican/pull/2994>`_\n* Add content tag for links, which can help with things like Twitter social cards `(#3001) <https://github.com/getpelican/pelican/pull/3001>`_\n* Improve word count behavior when generating summary `(#3002) <https://github.com/getpelican/pelican/pull/3002>`_\n\n4.7.2 - 2022-02-09\n==================\n\n* Fix incorrect parsing of parameters specified via `-e` / `--extra-settings` option flags `(#2938) <https://github.com/getpelican/pelican/pull/2938>`_\n* Add ``categories.html`` template to default theme `(#2973) <https://github.com/getpelican/pelican/pull/2973>`_\n* Document how to use plugins to inject content `(#2922) <https://github.com/getpelican/pelican/pull/2922>`_\n\n4.7.1 - 2021-10-12\n==================\n\n* Extend rich logging to server component `(#2927) <https://github.com/getpelican/pelican/pull/2927>`_\n* Fix an issue where metadata flagged to be discarded was being cached `(#2926) <https://github.com/getpelican/pelican/pull/2926>`_\n* Adjust suffix in server to allow redirection when needed `(#2931) <https://github.com/getpelican/pelican/pull/2931>`_\n* Add MIME types for web fonts `(#2929) <https://github.com/getpelican/pelican/pull/2929>`_\n* Distribute sample data used to run tests `(#2935) <https://github.com/getpelican/pelican/pull/2935>`_\n* Add Python 3.10 to test matrix\n\n4.7.0 - 2021-10-01\n==================\n\n* Improve default theme rendering on mobile and other small screen devices `(#2914) <https://github.com/getpelican/pelican/pull/2914>`_\n* Add support for hidden articles `(#2866) <https://github.com/getpelican/pelican/pull/2866>`_\n* Improve word count behavior when generating summary CJK & other locales `(#2864) <https://github.com/getpelican/pelican/pull/2864>`_\n* Add progress spinner during generation `(#2869) <https://github.com/getpelican/pelican/pull/2869>`_\n  and richer logging `(#2897) <https://github.com/getpelican/pelican/pull/2897>`_, both via `Rich <https://github.com/willmcgugan/rich>`_\n* Invoke tasks ``serve`` and ``livereload`` now auto-open a web browser pointing to the locally-served web site `(#2764) <https://github.com/getpelican/pelican/pull/2764>`_\n* Support some date format codes used by ISO dates `(#2902) <https://github.com/getpelican/pelican/pull/2902>`_\n* Document how to add a new writer `(#2901) <https://github.com/getpelican/pelican/pull/2901>`_\n\n4.6.0 - 2021-03-23\n==================\n\n* Add new URL pattern to ``PAGINATION_PATTERNS`` for the last page in the list `(#1401) <https://github.com/getpelican/pelican/issues/1401>`_\n* Speed up ``livereload`` Invoke task via caching `(#2847) <https://github.com/getpelican/pelican/pull/2847>`_\n* Ignore ``None`` return value from ``get_generators`` signal `(#2850) <https://github.com/getpelican/pelican/pull/2850>`_\n* Relax dependency minimum versions and remove upper bounds\n\n4.5.4 - 2021-01-04\n==================\n\nReplace plugin definitions in settings with string representations after registering, so they can be cached correctly `(#2828) <https://github.com/getpelican/pelican/issues/2828>`_.\n\n4.5.3 - 2020-12-01\n==================\n\nFix a mistake made in PR #2821\n\n4.5.2 - 2020-11-22\n==================\n\nImprove logging of generators and writer loaders\n\n4.5.1 - 2020-11-02\n==================\n\n* Refactor intra-site link discovery in order to match more permissively `(#2646) <https://github.com/getpelican/pelican/issues/2646>`_\n* Fix plugins running twice in auto-reload mode `(#2817) <https://github.com/getpelican/pelican/issues/2817>`_\n* Add notice to use ``from pelican import signals`` instead of ``import pelican.signals`` `(#2805) <https://github.com/getpelican/pelican/issues/2805>`_\n\n4.5.0 - 2020-08-20\n==================\n\n* Add namespace plugin support; list plugins via ``pelican-plugins`` command\n* Override settings via ``-e`` / ``--extra-settings`` CLI option flags\n* Add settings for custom Jinja globals and tests\n* Customize article summary ellipsis via ``SUMMARY_END_SUFFIX`` setting\n* Customize Typogrify dash handling via new ``TYPOGRIFY_DASHES`` setting\n* Support Unicode when generating slugs\n* Support Asciidoc ``.adoc`` file generation in Pelican importer\n* Improve user experience when ``pelican --listen`` web server is quit\n* Improve Invoke tasks template\n* Include tests in source distributions\n* Switch CI from Travis to GitHub Actions\n* Remove support for Python 2.7\n\n4.2.0 - 2019-10-17\n==================\n\n* Support inline SVGs; don't treat titles in SVGs as HTML titles\n* Add category to feeds (in addition to tags)\n* Improve content metadata field docs\n* Add docs for including other Markdown/reST files in content\n\n4.1.3 - 2019-10-09\n==================\n\n* Fix quick-start docs regarding ``pelican --listen``\n* Set default listen address to 127.0.0.1\n* Add extra/optional Markdown dependency to setup.py\n* Use correct SSH port syntax for rsync in tasks.py\n* Place all deprecated settings handling together\n* Add related project URLs for display on PyPI\n* Skip some tests on Windows that can't pass due to filesystem differences\n\n4.1.2 - 2019-09-23\n==================\n\nFix pelican.settings.load_source to avoid caching issues - PR #2621\n\n4.1.1 - 2019-08-23\n==================\n\n* Add AutoPub to auto-publish releases on PR merge\n* Add CSS classes for reStructuredText figures\n* Pass ``argv`` to Pelican ``main`` entrypoint\n* Set default content status to a blank string rather than ``None``\n\n4.1.0 - 2019-07-14\n==================\n\n* Live browser reload upon changed files (provided via Invoke task)\n* Add ``pyproject.toml``, managed by Poetry\n* Support for invoking ``python -m pelican``\n* Add relative source path attribute to content\n* Allow directories in ``EXTRA_PATH_METADATA``\n* Add ``all_articles`` variable to period pages (for recent posts functionality)\n* Improve debug mode output\n* Remove blank or duplicate summaries from Atom feed\n* Fix bugs in pagination, pelican-import, pelican-quickstart, and feed importer\n\n4.0.1 (2018-11-30)\n==================\n\n* Refactor ``pelican.server`` logging\n* Fix bug in which all static files were processed as \"draft\"\n* Bug fixes for Invoke/Makefile automation, Importer, and other miscellanea\n\nIf upgrading from 3.7.x or earlier, please note that slug-related settings in\n4.0+ use ``{slug}`` and/or ``{lang}`` rather than ``%s``. If ``%s``-style\nsettings are encountered, Pelican will emit a warning and fall back to the\ndefault setting. Some user-submitted themes might try to format setting values\nbut fail upon site build with a ``TypeError``. In such cases, the theme needs\nto be updated. For example, instead of ``TAG_FEED_ATOM|format(tag.slug)``, use\n``TAG_FEED_ATOM.format(slug=tag.slug)``\n\n4.0.0 (2018-11-13)\n==================\n\n* Replace ``develop_server.sh`` script with ``pelican --listen``\n* Improved copy/link behavior for large static files (e.g., videos)\n* New ``{static}`` syntax to link to static content; content linked to by\n  ``{static}`` and ``{attach}`` is automatically copied over even if not in\n  ``STATIC_PATHS``\n* Pages can now have ``draft`` status\n* Show current settings via new ``--print-settings`` flag\n* All settings for slugs now use ``{slug}`` and/or ``{lang}`` rather than\n  ``%s``. If ``%s``-style settings are encountered, Pelican will emit a warning\n  and fallback to the default setting.\n* New signals: ``feed_generated`` and ``page_generated_write_page``\n* Replace Fabric with Invoke and ``fabfile.py`` template with ``tasks.py``\n* Replace ``PAGINATED_DIRECT_TEMPLATES`` by ``PAGINATED_TEMPLATES``, extending\n  control over pagination to all templates and making page size variable\n* Replace ``SLUG_SUBSTITUTIONS`` (and friends) by ``SLUG_REGEX_SUBSTITUTIONS``\n  for more finegrained control\n* ``'{base_name}'`` value in ``PAGINATION_PATTERNS`` setting no longer strips\n  ``'bar'`` from ``'foo/bar.html'`` (unless ``'bar' == 'index'``).\n* ``ARTICLE_ORDER_BY`` and ``PAGE_ORDER_BY`` now also affect 1) category, tag\n  and author pages 2) feeds 3) draft and hidden articles and pages\n* New ``ARTICLE_TRANSLATION_ID`` and ``PAGE_TRANSLATION_ID`` settings to\n  specify metadata attributes used to identify/disable translations\n* Make the HTML reader parse multiple occurrences of metadata tags as a list\n* New Blogger XML backup importer\n* Wordpress importer now updates file links to point to local copies if the\n  files were downloaded with ``--wp-attach``.\n* Importer no longer inserts extra newlines, to prevent breaking of HTML\n  attributes.\n* Pelican server now prioritises ``foo.html`` and ``foo/index.html`` over\n  ``foo/`` when resolving ``foo``.\n\n3.7.1 (2017-01-10)\n==================\n\n* Fix locale issues in Quickstart script\n* Specify encoding for README and CHANGELOG in setup.py\n\n3.7.0 (2016-12-12)\n==================\n\n* Atom feeds output ``<content>`` in addition to ``<summary>``\n* Atom feeds use ``<published>`` for the original publication date and\n  ``<updated>`` for modifications\n* Simplify Atom feed ID generation and support URL fragments\n* Produce category feeds with category-specific titles\n* RSS feeds now default to summary instead of full content;\n  set ``RSS_FEED_SUMMARY_ONLY = False`` to revert to previous behavior\n* Replace ``MD_EXTENSIONS`` with ``MARKDOWN`` setting\n* Replace ``JINJA_EXTENSIONS`` with more-robust ``JINJA_ENVIRONMENT`` setting\n* Improve summary truncation logic to handle special characters and tags that\n  span multiple lines, using HTML parser instead of regular expressions\n* Include summary when looking for intra-site link substitutions\n* Link to authors and index via ``{author}name`` and ``{index}`` syntax\n* Override widget names via ``LINKS_WIDGET_NAME`` and ``SOCIAL_WIDGET_NAME``\n* Add ``INDEX_SAVE_AS`` option to override default ``index.html`` value\n* Remove ``PAGES`` context variable for themes in favor of ``pages``\n* ``SLUG_SUBSTITUTIONS`` now accepts 3-tuple elements, allowing URL slugs to\n  contain non-alphanumeric characters\n* Tag and category slugs can be controlled with greater precision using the\n  ``TAG_SUBSTITUTIONS`` and ``CATEGORY_SUBSTITUTIONS`` settings\n* Author slugs can be controlled with greater precision using the\n  ``AUTHOR_SUBSTITUTIONS`` setting\n* ``DEFAULT_DATE`` can be defined as a string\n* Use ``mtime`` instead of ``ctime`` when ``DEFAULT_DATE = 'fs'``\n* Add ``--fatal=errors|warnings`` option for use with continuous integration\n* When using generator-level caching, ensure previously-cached files are\n  processed instead of just new files.\n* Add Python and Pelican version information to debug output\n* Improve compatibility with Python 3.5\n* Comply with and enforce PEP8 guidelines\n* Replace tables in settings documentation with ``data::`` directives\n\n3.6.3 (2015-08-14)\n==================\n\n* Fix permissions issue in release tarball\n\n3.6.2 (2015-08-01)\n==================\n\n* Fix installation errors related to Unicode in tests\n* Don't show pagination in ``notmyidea`` theme if there's only one page\n* Make hidden pages available in context\n* Improve URLWrapper comparison\n\n3.6.0 (2015-06-15)\n==================\n\n* Disable caching by default in order to prevent potential confusion\n* Improve caching behavior, replacing ``pickle`` with ``cpickle``\n* Allow Markdown or reST content in metadata fields other than ``summary``\n* Support semicolon-separated author/tag lists\n* Improve flexibility of article sorting\n* Add ``--relative-urls`` argument\n* Support devserver listening on addresses other than localhost\n* Unify HTTP server handlers to ``pelican.server`` throughout\n* Handle intra-site links to draft posts\n* Move ``tag_cloud`` from core to plugin\n* Load default theme's external resources via HTTPS\n* Import drafts from WordPress XML\n* Improve support for Windows users\n* Enhance logging and test suite\n* Clean up and refactor codebase\n* New signals: ``all_generators_finalized`` and ``page_writer_finalized``\n\n3.5.0 (2014-11-04)\n==================\n\n* Introduce ``ARTICLE_ORDER_BY`` and ``PAGE_ORDER_BY`` settings to control the\n  order of articles and pages.\n* Include time zone information in dates rendered in templates.\n* Expose the reader name in the metadata for articles and pages.\n* Add the ability to store static files along with content in the same\n  directory as articles and pages using ``{attach}`` in the path.\n* Prevent Pelican from raising an exception when there are duplicate pieces of\n  metadata in a Markdown file.\n* Introduce the ``TYPOGRIFY_IGNORE_TAGS`` setting to add HTML tags to be\n  ignored by Typogrify.\n* Add the ability to use ``-`` in date formats to strip leading zeros. For\n  example, ``%-d/%-m/%y`` will now result in the date ``9/8/12``.\n* Ensure feed generation is correctly disabled during quickstart configuration.\n* Fix ``PAGE_EXCLUDES`` and ``ARTICLE_EXCLUDES`` from incorrectly matching\n  sub-directories.\n* Introduce ``STATIC_EXCLUDE`` setting to add static file excludes.\n* Fix an issue when using ``PAGINATION_PATTERNS`` while ``RELATIVE_URLS``\n  is enabled.\n* Fix feed generation causing links to use the wrong language for month\n  names when using other locales.\n* Fix an issue where the authors list in the simple template wasn't correctly\n  formatted.\n* Fix an issue when parsing non-string URLs from settings.\n* Improve consistency of debug and warning messages.\n\n3.4.0 (2014-07-01)\n==================\n\n* Speed up content generation via new caching mechanism\n* Add selective post generation (instead of always building entire site)\n* Many documentation improvements, including switching to prettier RtD theme\n* Add support for multiple content and plugin paths\n* Add ``:modified:`` metadata field to complement ``:date:``.\n  Used to specify the last date and time an article was updated independently\n  from the date and time it was published.\n* Add support for multiple authors via new ``:authors:`` metadata field\n* Watch for changes in static directories when in auto-regeneration mode\n* Add filters to limit log output when desired\n* Add language support to drafts\n* Add ``SLUGIFY_SOURCE`` setting to control how post slugs are generated\n* Fix many issues relating to locale and encoding\n* Apply Typogrify filter to post summary\n* Preserve file metadata (e.g. time stamps) when copying static files to output\n* Move AsciiDoc support from Pelican core into separate plugin\n* Produce inline links instead of reference-style links when importing content\n* Improve handling of ``IGNORE_FILES`` setting behavior\n* Properly escape symbol characters in tag names (e.g., ``C++``)\n* Minor tweaks for Python 3.4 compatibility\n* Add several new signals\n\n3.3.0 (2013-09-24)\n==================\n\n* Drop Python 3.2 support in favor of Python 3.3\n* Add ``Fabfile`` so Fabric can be used for workflow automation instead of Make\n* ``OUTPUT_RETENTION`` setting can be used to preserve metadata (e.g., VCS\n  data such as ``.hg`` and ``.git``) from being removed from output directory\n* Tumblr import\n* Improve logic and consistency when cleaning output folder\n* Improve documentation versioning and release automation\n* Improve pagination flexibility\n* Rename signals for better consistency (some plugins may need to be updated)\n* Move metadata extraction from generators to readers; metadata extraction no\n  longer article-specific\n* Deprecate ``FILES_TO_COPY`` in favor of ``STATIC_PATHS`` and\n  ``EXTRA_PATH_METADATA``\n* Summaries in Markdown posts no longer include footnotes\n* Remove unnecessary whitespace in output via ``lstrip_blocks`` Jinja parameter\n* Move PDF generation from core to plugin\n* Replace ``MARKUP`` setting with ``READERS``\n* Add warning if img tag is missing ``alt`` attribute\n* Add support for ``{}`` in relative links syntax, besides ``||``\n* Add support for ``{tag}`` and ``{category}`` relative links\n* Add a ``content_written`` signal\n\n3.2.1 and 3.2.2\n===============\n\n* Facilitate inclusion in FreeBSD Ports Collection\n\n3.2 (2013-04-24)\n================\n\n* Support for Python 3!\n* Override page save-to location from meta-data (enables using a static page as\n  the site's home page, for example)\n* Time period archives (per-year, per-month, and per-day archives of posts)\n* Posterous blog import\n* Improve WordPress blog import\n* Migrate plugins to separate repository\n* Improve HTML parser\n* Provide ability to show or hide categories from menu using\n  ``DISPLAY_CATEGORIES_ON_MENU`` option\n* Auto-regeneration can be told to ignore files via ``IGNORE_FILES`` setting\n* Improve post-generation feedback to user\n* For multilingual posts, use meta-data to designate which is the original\n  and which is the translation\n* Add ``.mdown`` to list of supported Markdown file extensions\n* Document-relative URL generation (``RELATIVE_URLS``) is now off by default\n\n3.1 (2012-12-04)\n================\n\n* Importer now stores slugs within files by default. This can be disabled with\n  the ``--disable-slugs`` option.\n* Improve handling of links to intra-site resources\n* Ensure WordPress import adds paragraphs for all types of line endings\n  in post content\n* Decode HTML entities within WordPress post titles on import\n* Improve appearance of LinkedIn icon in default theme\n* Add GitHub and Google+ social icons support in default theme\n* Optimize social icons\n* Add ``FEED_ALL_ATOM`` and ``FEED_ALL_RSS`` to generate feeds containing all\n  posts regardless of their language\n* Split ``TRANSLATION_FEED`` into ``TRANSLATION_FEED_ATOM`` and\n  ``TRANSLATION_FEED_RSS``\n* Different feeds can now be enabled/disabled individually\n* Allow for blank author: if ``AUTHOR`` setting is not set, author won't\n  default to ``${USER}`` anymore, and a post won't contain any author\n  information if the post author is empty\n* Move LESS and Webassets support from Pelican core to plugin\n* The ``DEFAULT_DATE`` setting now defaults to ``None``, which means that\n  articles won't be generated unless date metadata is specified\n* Add ``FILENAME_METADATA`` setting to support metadata extraction from\n  filename\n* Add ``gzip_cache`` plugin to compress common text files into a ``.gz``\n  file within the same directory as the original file, preventing the server\n  (e.g. Nginx) from having to compress files during an HTTP call\n* Add support for AsciiDoc-formatted content\n* Add ``USE_FOLDER_AS_CATEGORY`` setting so that feature can be toggled on/off\n* Support arbitrary Jinja template files\n* Restore basic functional tests\n* New signals: ``generator_init``, ``get_generators``, and\n  ``article_generate_preread``\n\n3.0 (2012-08-08)\n================\n\n* Refactored the way URLs are handled\n* Improved the English documentation\n* Fixed packaging using ``setuptools`` entrypoints\n* Added ``typogrify`` support\n* Added a way to disable feed generation\n* Added support for ``DIRECT_TEMPLATES``\n* Allow multiple extensions for content files\n* Added LESS support\n* Improved the import script\n* Added functional tests\n* Rsync support in the generated Makefile\n* Improved feed support (easily pluggable with Feedburner for instance)\n* Added support for ``abbr`` in reST\n* Fixed a bunch of bugs :-)\n\n2.8 (2012-02-28)\n==================\n\n* Dotclear importer\n* Allow the usage of Markdown extensions\n* Themes are now easily extensible\n* Don't output pagination information if there is only one page\n* Add a page per author, with all their articles\n* Improved the test suite\n* Made the themes easier to extend\n* Removed Skribit support\n* Added a ``pelican-quickstart`` script\n* Fixed timezone-related issues\n* Added some scripts for Windows support\n* Date can be specified in seconds\n* Never fail when generating posts (skip and continue)\n* Allow the use of future dates\n* Support having different timezones per language\n* Enhanced the documentation\n\n2.7 (2011-06-11)\n==================\n\n* Use ``logging`` rather than echoing to stdout\n* Support custom Jinja filters\n* Compatibility with Python 2.5\n* Added a theme manager\n* Packaged for Debian\n* Added draft support\n\n2.6 (2011-03-08)\n==================\n\n* Changes in the output directory structure\n* Makes templates easier to work with / create\n* Added RSS support (was Atom-only)\n* Added tag support for the feeds\n* Enhance the documentation\n* Added another theme (brownstone)\n* Added translations\n* Added a way to use cleaner URLs with a rewrite url module (or equivalent)\n* Added a tag cloud\n* Added an autoreloading feature: the blog is automatically regenerated each\n  time a modification is detected\n* Translate the documentation into French\n* Import a blog from an RSS feed\n* Pagination support\n* Added Skribit support\n\n2.5 (2010-11-20)\n==================\n\n* Import from WordPress\n* Added some new themes (martyalchin / wide-notmyidea)\n* First bug report!\n* Linkedin support\n* Added a FAQ\n* Google Analytics support\n* Twitter support\n* Use relative URLs, not static ones\n\n2.4 (2010-11-06)\n================\n\n* Minor themes changes\n* Add Disqus support (so we have comments)\n* Another code refactoring\n* Added config settings about pages\n* Blog entries can also be generated in PDF\n\n2.3 (2010-10-31)\n================\n\n* Markdown support\n\n2.2 (2010-10-30)\n================\n\n* Prettify output\n* Manages static pages as well\n\n2.1 (2010-10-30)\n================\n\n* Make notmyidea the default theme\n\n2.0 (2010-10-30)\n================\n\n* Refactoring to be more extensible\n* Change into the setting variables\n\n1.2 (2010-09-28)\n================\n\n* Added a debug option\n* Added per-category feeds\n* Use filesystem to get dates if no metadata is provided\n* Add Pygments support\n\n1.1 (2010-08-19)\n================\n\n* First working version\n"
  },
  {
    "path": "docs/conf.py",
    "content": "import datetime\nimport os\nimport sys\nimport time\n\nif sys.version_info >= (3, 11):\n    import tomllib\nelse:\n    import tomli as tomllib\n\n\nsys.path.append(os.path.abspath(os.pardir))\n\n\nwith open(\"../pyproject.toml\", \"rb\") as f:\n    project_data = tomllib.load(f).get(\"project\")\n    if project_data is None:\n        raise KeyError(\"project data is not found\")\n\n\n# -- General configuration ----------------------------------------------------\ntemplates_path = [\"_templates\"]\nlocale_dirs = [\"locale/\"]\ngettext_compact = False\ngettext_uuid = True\nextensions = [\n    \"sphinx.ext.autodoc\",\n    \"sphinx.ext.extlinks\",\n    \"sphinxext.opengraph\",\n]\nsource_suffix = \".rst\"\nmaster_doc = \"index\"\nproject = project_data.get(\"name\").upper()\nyear = datetime.datetime.fromtimestamp(\n    int(os.environ.get(\"SOURCE_DATE_EPOCH\", time.time())), datetime.timezone.utc\n).year\nproject_copyright = f\"2010–{year}\"  # noqa: RUF001\nexclude_patterns = [\"_build\"]\nrelease = project_data.get(\"version\")\nversion = \".\".join(release.split(\".\")[:1])\nlast_stable = project_data.get(\"version\")\nrst_prolog = f\"\"\"\n.. |last_stable| replace:: :pelican-doc:`{last_stable}`\n.. |min_python| replace:: {project_data.get(\"requires-python\").split(\",\")[0]}\n\"\"\"\n\nextlinks = {\"pelican-doc\": (\"https://docs.getpelican.com/en/latest/%s.html\", \"%s\")}\n\n# -- Options for HTML output --------------------------------------------------\n\nhtml_theme = \"furo\"\nhtml_title = f\"<strong>{project}</strong> <i>{release}</i>\"\nhtml_static_path = [\"_static\"]\nhtml_theme_options = {\n    \"light_logo\": \"pelican-logo.svg\",\n    \"dark_logo\": \"pelican-logo.svg\",\n    \"navigation_with_keys\": True,\n}\n\n# Output file base name for HTML help builder.\nhtmlhelp_basename = \"Pelicandoc\"\n\nhtml_use_smartypants = True\n\n# If false, no module index is generated.\nhtml_use_modindex = False\n\n# If false, no index is generated.\nhtml_use_index = False\n\n# If true, links to the reST sources are added to the pages.\nhtml_show_sourcelink = False\n\n\ndef setup(app):\n    # overrides for wide tables in RTD theme\n    app.add_css_file(\"theme_overrides.css\")  # path relative to _static\n\n\n# -- Options for LaTeX output -------------------------------------------------\nlatex_documents = [\n    (\"index\", \"Pelican.tex\", \"Pelican Documentation\", \"Justin Mayer\", \"manual\"),\n]\n\n# -- Options for manual page output -------------------------------------------\nman_pages = [\n    (\"index\", \"pelican\", \"pelican documentation\", [\"Justin Mayer\"], 1),\n    (\n        \"pelican-themes\",\n        \"pelican-themes\",\n        \"A theme manager for Pelican\",\n        [\"Mickaël Raybaud\"],\n        1,\n    ),\n    (\n        \"themes\",\n        \"pelican-theming\",\n        \"How to create themes for Pelican\",\n        [\"The Pelican contributors\"],\n        1,\n    ),\n]\n"
  },
  {
    "path": "docs/content.rst",
    "content": "Writing content\n###############\n\nArticles and pages\n==================\n\nPelican considers \"articles\" to be chronological content, such as posts on a\nblog, and thus associated with a date.\n\nThe idea behind \"pages\" is that they are usually not temporal in nature and are\nused for content that does not change very often (e.g., \"About\" or \"Contact\"\npages).\n\nYou can find sample content in the repository at ``samples/content/``.\n\n.. _internal_metadata:\n\nFile metadata\n=============\n\nPelican tries to be smart enough to get the information it needs from the\nfile system (for instance, about the category of your articles), but some\ninformation you need to provide in the form of metadata inside your files.\n\nIf you are writing your content in reStructuredText format, you can provide\nthis metadata in text files via the following syntax (give your file the\n``.rst`` extension)::\n\n    My super title\n    ##############\n\n    :date: 2010-10-03 10:20\n    :modified: 2010-10-04 18:40\n    :tags: thats, awesome\n    :category: yeah\n    :slug: my-super-post\n    :authors: Alexis Metaireau, Conan Doyle\n    :summary: Short version for index and feeds\n\nAuthor and tag lists may be semicolon-separated instead, which allows\nyou to write authors and tags containing commas::\n\n    :tags: pelican, publishing tool; pelican, bird\n    :authors: Metaireau, Alexis; Doyle, Conan\n\nPelican implements an extension to reStructuredText to enable support for the\n``abbr`` HTML tag. To use it, write something like this in your post::\n\n    This will be turned into :abbr:`HTML (HyperText Markup Language)`.\n\nYou can also use Markdown syntax (with a file ending in ``.md``, ``.markdown``,\n``.mkd``, or ``.mdown``). Markdown generation requires that you first\nexplicitly install the Python-Markdown_ package, which can be done via ``pip\ninstall Markdown``.\n\nPelican also supports `Markdown Extensions`_, which might have to be installed\nseparately if they are not included in the default ``Markdown`` package and can\nbe configured and loaded via the ``MARKDOWN`` setting.\n\nMetadata syntax for Markdown posts should follow this pattern::\n\n    Title: My super title\n    Date: 2010-12-03 10:20\n    Modified: 2010-12-05 19:30\n    Category: Python\n    Tags: pelican, publishing\n    Slug: my-super-post\n    Authors: Alexis Metaireau, Conan Doyle\n    Summary: Short version for index and feeds\n\n    This is the content of my super blog post.\n\nYou can also have your own metadata keys (so long as they don't conflict with\nreserved metadata keywords) for use in your templates. The following table\ncontains a list of reserved metadata keywords:\n\n=============== ===============================================================\n    Metadata                              Description\n=============== ===============================================================\n``title``       Title of the article or page\n``date``        Publication date (e.g., ``YYYY-MM-DD HH:SS``)\n``modified``    Modification date (e.g., ``YYYY-MM-DD HH:SS``)\n``tags``        Content tags, separated by commas\n``keywords``    Content keywords, separated by commas (HTML content only)\n``category``    Content category (one only — not multiple)\n``slug``        Identifier used in URLs and translations\n``author``      Content author, when there is only one\n``authors``     Content authors, when there are multiple\n``summary``     Brief description of content for index pages\n``lang``        Content language ID (``en``, ``fr``, etc.)\n``translation`` If content is a translation of another (``true`` or ``false``)\n``status``      Content status: ``draft``, ``hidden``, ``skip``, or ``published``\n``template``    Name of template to use to generate content (without extension)\n``save_as``     Save content to this relative file path\n``url``         URL to use for this article/page\n=============== ===============================================================\n\nReaders for additional formats (such as AsciiDoc_) are available via plugins,\nwhich you can find via the `Pelican Plugins`_ collection as well as the legacy\n`pelican-plugins`_ repository.\n\nPelican can also process HTML files ending in ``.html`` and ``.htm``. Pelican\ninterprets the HTML in a very straightforward manner, reading metadata from\n``meta`` tags, the title from the ``title`` tag, and the body out from the\n``body`` tag::\n\n    <html>\n        <head>\n            <title>My super title</title>\n            <meta name=\"tags\" content=\"thats, awesome\" />\n            <meta name=\"date\" content=\"2012-07-09 22:28\" />\n            <meta name=\"modified\" content=\"2012-07-10 20:14\" />\n            <meta name=\"category\" content=\"yeah\" />\n            <meta name=\"authors\" content=\"Alexis Métaireau, Conan Doyle\" />\n            <meta name=\"summary\" content=\"Short version for index and feeds\" />\n        </head>\n        <body>\n            This is the content of my super blog post.\n        </body>\n    </html>\n\nWith HTML, there is one simple exception to the standard metadata: tags can be\nspecified either via the ``tags`` metadata, as is standard in Pelican, or via\nthe ``keywords`` metadata, as is standard in HTML. The two can be used\ninterchangeably.\n\nNote that, aside from the title, none of this content metadata is mandatory:\nif the date is not specified and ``DEFAULT_DATE`` is set to ``'fs'``, Pelican\nwill rely on the file's \"mtime\" timestamp, and the category can be determined\nby the directory in which the file resides. For example, a file located at\n``python/foobar/myfoobar.rst`` will have a category of ``foobar``. If you would\nlike to organize your files in other ways where the name of the subfolder would\nnot be a good category name, you can set the setting ``USE_FOLDER_AS_CATEGORY``\nto ``False``.  When parsing dates given in the page metadata, Pelican supports\nthe W3C's `suggested subset ISO 8601`__.\n\nSo the title is the only required metadata. If that bothers you, worry not.\nInstead of manually specifying a title in your metadata each time, you can use\nthe source content file name as the title. For example, a Markdown source file\nnamed ``Publishing via Pelican.md`` would automatically be assigned a title of\n*Publishing via Pelican*. If you would prefer this behavior, add the following\nline to your settings file::\n\n    FILENAME_METADATA = '(?P<title>.*)'\n\n.. note::\n\n   When experimenting with different settings (especially the metadata\n   ones) caching may interfere and the changes may not be visible. In\n   such cases disable caching with ``LOAD_CONTENT_CACHE = False`` or\n   use the ``--ignore-cache`` command-line switch.\n\n__ `W3C ISO 8601`_\n\n``modified`` should be last time you updated the article, and defaults to\n``date`` if not specified. Besides you can show ``modified`` in the templates,\nfeed entries in feed readers will be updated automatically when you set\n``modified`` to the current date after you modified your article.\n\n``authors`` is a comma-separated list of article authors. If there's only one\nauthor you can use ``author`` field.\n\nIf you do not explicitly specify summary metadata for a given post, the\n``SUMMARY_MAX_LENGTH`` setting can be used to specify how many words from the\nbeginning of an article are used as the summary. You can also use an article's\nfirst N paragraphs as its summary using the ``SUMMARY_MAX_PARAGRAPHS`` setting.\nIf both settings are in use, the specified number of paragraphs will\nbe used but may be truncated to respect the specified maximum length.\n\nYou can also extract any metadata from the filename through a regular\nexpression to be set in the ``FILENAME_METADATA`` setting. All named groups\nthat are matched will be set in the metadata object. The default value for the\n``FILENAME_METADATA`` setting will only extract the date from the filename. For\nexample, if you would like to extract both the date and the slug, you could set\nsomething like: ``'(?P<date>\\d{4}-\\d{2}-\\d{2})_(?P<slug>.*)'``\n\nPlease note that the metadata available inside your files takes precedence over\nthe metadata extracted from the filename.\n\nPages\n=====\n\nIf you create a folder named ``pages`` inside the content folder, all the\nfiles in it will be used to generate static pages, such as **About** or\n**Contact** pages. (See example filesystem layout below.)\n\nYou can use the ``DISPLAY_PAGES_ON_MENU`` setting to control whether all those\npages are displayed in the primary navigation menu. (Default is ``True``.)\n\nIf you want to exclude any pages from being linked to or listed in the menu,\nthen add a ``status: hidden`` attribute to its metadata. This is useful for\nthings like making error pages that fit the generated theme of your site.\n\nStatic content\n==============\n\nStatic files are files other than articles and pages that are copied to the\noutput folder as-is, without processing. You can control which static files\nare copied over with the ``STATIC_PATHS`` setting of the project's\n``pelicanconf.py`` file. Pelican's default configuration includes the\n``images`` directory for this, but others must be added manually. In addition,\nstatic files that are explicitly linked to are included (see below).\n\n.. note::\n\n   In the default configuration, all files with a valid content file suffix\n   (``.html``, ``.rst``, ``.md``, ...) get processed by the article and page\n   generators *before* the static generator. This is avoided by altering the\n   ``*_EXCLUDE`` settings appropriately.\n\nMixed content in the same directory\n-----------------------------------\n\nStarting with Pelican 3.5, static files can safely share a source directory\nwith page source files, without exposing the page sources in the generated\nsite. Any such directory must be added to both ``STATIC_PATHS`` and\n``PAGE_PATHS`` (or ``STATIC_PATHS`` and ``ARTICLE_PATHS``). Pelican will\nidentify and process the page source files normally, and copy the remaining\nfiles as if they lived in a separate directory reserved for static files.\n\nNote: Placing static and content source files together in the same source\ndirectory does not guarantee that they will end up in the same place in the\ngenerated site. The easiest way to do this is by using the ``{attach}`` link\nsyntax (described below). Alternatively, the ``STATIC_SAVE_AS``,\n``PAGE_SAVE_AS``, and ``ARTICLE_SAVE_AS`` settings (and the corresponding\n``*_URL`` settings) can be configured to place files of different types\ntogether, just as they could in earlier versions of Pelican.\n\n.. _ref-linking-to-internal-content:\n\nLinking to internal content\n===========================\n\nFrom Pelican 3.1 onwards, it is now possible to specify intra-site links to\nfiles in the *source content* hierarchy instead of files in the *generated*\nhierarchy. This makes it easier to link from the current post to other content\nthat may be sitting alongside that post (instead of having to determine where\nthe other content will be placed after site generation).\n\nTo link to internal content (files in the ``content`` directory), use the\nfollowing syntax for the link target: ``{filename}path/to/file``.\nNote: forward slashes, ``/``,\nare the required path separator in the ``{filename}`` directive\non all operating systems, including Windows.\n\nFor example, a Pelican project might be structured like this::\n\n    website/\n    ├── content\n    │   ├── category/\n    │   │   └── article1.rst\n    │   ├── article2.md\n    │   └── pages\n    │       └── about.md\n    └── pelican.conf.py\n\nIn this example, ``article1.rst`` could look like this::\n\n    The first article\n    #################\n\n    :date: 2012-12-01 10:02\n\n    See below intra-site link examples in reStructuredText format.\n\n    `a link relative to the current file <{filename}../article2.md>`_\n    `a link relative to the content root <{filename}/article2.md>`_\n\nand ``article2.md``::\n\n    Title: The second article\n    Date: 2012-12-01 10:02\n\n    See below intra-site link examples in Markdown format.\n\n    [a link relative to the current file]({filename}category/article1.rst)\n    [a link relative to the content root]({filename}/category/article1.rst)\n\nLinking to static files\n-----------------------\n\nYou can link to static content using ``{static}path/to/file``. Files linked to\nwith this syntax will automatically be copied to the output directory, even if\nthe source directories containing them are not included in the ``STATIC_PATHS``\nsetting of the project's ``pelicanconf.py`` file.\n\nFor example, a project's content directory might be structured like this::\n\n    content\n    ├── images\n    │   └── han.jpg\n    ├── pdfs\n    │   └── menu.pdf\n    └── pages\n        └── test.md\n\n``test.md`` would include::\n\n    ![Alt Text]({static}/images/han.jpg)\n    [Our Menu]({static}/pdfs/menu.pdf)\n\nSite generation would then copy ``han.jpg`` to ``output/images/han.jpg``,\n``menu.pdf`` to ``output/pdfs/menu.pdf``, and write the appropriate links\nin ``test.md``.\n\nIf you use ``{static}`` to link to an article or a page, this will be turned\ninto a link to its source code.\n\nAttaching static files\n----------------------\n\nStarting with Pelican 3.5, static files can be \"attached\" to a page or article\nusing this syntax for the link target: ``{attach}path/to/file``. This works\nlike the ``{static}`` syntax, but also relocates the static file into the\nlinking document's output directory. If the static file originates from a\nsubdirectory beneath the linking document's source, that relationship will be\npreserved on output. Otherwise, it will become a sibling of the linking\ndocument.\n\nThis only works for linking to static files.\n\nFor example, a project's content directory might be structured like this::\n\n    content\n    ├── blog\n    │   ├── icons\n    │   │   └── icon.png\n    │   ├── photo.jpg\n    │   └── testpost.md\n    └── downloads\n        └── archive.zip\n\n``pelicanconf.py`` would include::\n\n    PATH = 'content'\n    ARTICLE_PATHS = ['blog']\n    ARTICLE_SAVE_AS = '{date:%Y}/{slug}.html'\n    ARTICLE_URL = '{date:%Y}/{slug}.html'\n\n``testpost.md`` would include::\n\n    Title: Test Post\n    Category: test\n    Date: 2014-10-31\n\n    ![Icon]({attach}icons/icon.png)\n    ![Photo]({attach}photo.jpg)\n    [Downloadable File]({attach}/downloads/archive.zip)\n\nSite generation would then produce an output directory structured like this::\n\n    output\n    └── 2014\n        ├── archive.zip\n        ├── icons\n        │   └── icon.png\n        ├── photo.jpg\n        └── test-post.html\n\nNotice that all the files linked using ``{attach}`` ended up in or beneath\nthe article's output directory.\n\nIf a static file is linked multiple times, the relocating feature of\n``{attach}`` will only work in the first of those links to be processed.\nAfter the first link, Pelican will treat ``{attach}`` like ``{static}``.\nThis avoids breaking the already-processed links.\n\n**Be careful when linking to a file from multiple documents:**\nSince the first link to a file finalizes its location and Pelican does\nnot define the order in which documents are processed, using ``{attach}`` on a\nfile linked by multiple documents can cause its location to change from one\nsite build to the next. (Whether this happens in practice will depend on the\noperating system, file system, version of Pelican, and documents being added,\nmodified, or removed from the project.) Any external sites linking to the\nfile's old location might then find their links broken. **It is therefore\nadvisable to use {attach} only if you use it in all links to a file, and only\nif the linking documents share a single directory.** Under these conditions,\nthe file's output location will not change in future builds. In cases where\nthese precautions are not possible, consider using ``{static}`` links instead\nof ``{attach}``, and letting the file's location be determined by the project's\n``STATIC_SAVE_AS`` and ``STATIC_URL`` settings. (Per-file ``save_as`` and\n``url`` overrides can still be set in ``EXTRA_PATH_METADATA``.)\n\n.. note::\n    When using ``{attach}``, any parent directory in ``*_URL`` / ``*_SAVE_AS``\n    settings should match each other. See also: :ref:`url-settings`\n\nLinking to authors, categories, index and tags\n----------------------------------------------\n\nYou can link to authors, categories, index and tags using the ``{author}name``,\n``{category}foobar``, ``{index}`` and ``{tag}tagname`` syntax.\n\nDeprecated internal link syntax\n-------------------------------\n\nTo remain compatible with earlier versions, Pelican still supports vertical\nbars (``||``) in addition to curly braces (``{}``) for internal links. For\nexample: ``|filename|an_article.rst``, ``|tag|tagname``, ``|category|foobar``.\nThe syntax was changed from ``||`` to ``{}`` to avoid collision with Markdown\nextensions or reST directives. Similarly, Pelican also still supports linking\nto static content with ``{filename}``. The syntax was changed to ``{static}``\nto allow linking to both generated articles and pages and their static sources.\n\nSupport for the old syntax may eventually be removed.\n\nIncluding other files\n---------------------\nBoth Markdown and reStructuredText syntaxes provide mechanisms for this.\n\nFollowing below are some examples for **reStructuredText** using `the include directive`_:\n\n    .. code-block:: rst\n\n        .. include:: file.rst\n\nInclude a fragment of a file delimited by two identifiers, highlighted as C++ (slicing based on line numbers is also possible):\n\n    .. code-block:: rst\n\n        .. include:: main.cpp\n            :code: c++\n            :start-after: // begin\n            :end-before: // end\n\nInclude a raw HTML file (or an inline SVG) and put it directly into the output without any processing:\n\n    .. code-block:: rst\n\n        .. raw:: html\n            :file: table.html\n\nFor **Markdown**, one must rely on an extension. For example, using the `mdx_include plugin`_:\n\n    .. code-block:: none\n\n        ```html\n        {! template.html !}\n        ```\n\n\nImporting an existing site\n==========================\n\nIt is possible to import your site from several other blogging sites\n(like WordPress, Tumblr, ..) using a simple script. See :ref:`import`.\n\nTranslations\n============\n\nIt is possible to translate articles. To do so, you need to add a ``lang`` meta\nattribute to your articles/pages and set a ``DEFAULT_LANG`` setting (which is\nEnglish [en] by default). With those settings in place, only articles with the\ndefault language will be listed, and each article will be accompanied by a list\nof available translations for that article.\n\n.. note::\n\n   This core Pelican functionality does not create sub-sites\n   (e.g. ``example.com/de``) with translated templates for each\n   language. For such advanced functionality the `i18n_subsites\n   plugin`_ can be used.\n\nBy default, Pelican uses the article's URL \"slug\" to determine if two or more\narticles are translations of one another. (This can be changed with the\n``ARTICLE_TRANSLATION_ID`` setting.) The slug can be set manually in the file's\nmetadata; if not set explicitly, Pelican will auto-generate the slug from the\ntitle of the article.\n\nHere is an example of two articles, one in English and the other in French.\n\nThe English article::\n\n    Foobar is not dead\n    ##################\n\n    :slug: foobar-is-not-dead\n    :lang: en\n\n    That's true, foobar is still alive!\n\nAnd the French version::\n\n    Foobar n'est pas mort !\n    #######################\n\n    :slug: foobar-is-not-dead\n    :lang: fr\n\n    Oui oui, foobar est toujours vivant !\n\nPost content quality notwithstanding, you can see that only item in common\nbetween the two articles is the slug, which is functioning here as an\nidentifier. If you'd rather not explicitly define the slug this way, you must\nthen instead ensure that the translated article titles are identical, since the\nslug will be auto-generated from the article title.\n\nIf you do not want the original version of one specific article to be detected\nby the ``DEFAULT_LANG`` setting, use the ``translation`` metadata to specify\nwhich posts are translations::\n\n    Foobar is not dead\n    ##################\n\n    :slug: foobar-is-not-dead\n    :lang: en\n    :translation: true\n\n    That's true, foobar is still alive!\n\n\n.. _internal_pygments_options:\n\nSyntax highlighting\n===================\n\nPelican can provide colorized syntax highlighting for your code blocks.\nTo do so, you must use the following conventions inside your content files.\n\nFor reStructuredText, use the ``code-block`` directive to specify the type\nof code to be highlighted (in these examples, we'll use ``python``)::\n\n    .. code-block:: python\n\n       print(\"Pelican is a static site generator.\")\n\nFor Markdown, which utilizes the `CodeHilite extension`_ to provide syntax\nhighlighting, include the language identifier just above the code block,\nindenting both the identifier and the code::\n\n    There are two ways to specify the identifier:\n\n        :::python\n        print(\"The triple-colon syntax will *not* show line numbers.\")\n\n    To display line numbers, use a path-less shebang instead of colons:\n\n        #!python\n        print(\"The path-less shebang syntax *will* show line numbers.\")\n\nThe specified identifier (e.g. ``python``, ``ruby``) should be one that\nappears on the `list of available lexers <https://pygments.org/docs/lexers/>`_.\n\nWhen using reStructuredText the following options are available in the\n`code-block` directive:\n\n=============   ============  =========================================\nOption          Valid values  Description\n=============   ============  =========================================\nanchorlinenos   N/A           If present, wrap line numbers in ``<a>`` tags.\nclassprefix     string        String to prepend to token class names\nhl_lines        numbers       List of lines to be highlighted, where\n                              line numbers to highlight are separated\n                              by a space. This is similar to\n                              ``emphasize-lines`` in Sphinx, but it\n                              does not support a range of line numbers\n                              separated by a hyphen, or comma-separated\n                              line numbers.\nlineanchors     string        Wrap each line in an anchor using this\n                              string and -linenumber.\nlinenos         string        If present or set to \"table\", output line\n                              numbers in a table; if set to\n                              \"inline\", output them inline. \"none\" means\n                              do not output the line numbers for this\n                              table.\nlinenospecial   number        If set, every nth line will be given the\n                              'special' CSS class.\nlinenostart     number        Line number for the first line.\nlinenostep      number        Print every nth line number.\nlineseparator   string        String to print between lines of code,\n                              '\\n' by default.\nlinespans       string        Wrap each line in a span using this and\n                              -linenumber.\nnobackground    N/A           If set, do not output background color for\n                              the wrapping element\nnowrap          N/A           If set, do not wrap the tokens at all.\ntagsfile        string        ctags file to use for name definitions.\ntagurlformat    string        format for the ctag links.\n=============   ============  =========================================\n\nNote that, depending on the version, your Pygments module might not have\nall of these options available. Refer to the *HtmlFormatter* section of the\n`Pygments documentation <https://pygments.org/docs/formatters/>`_ for more\ndetails on each of the options.\n\nFor example, the following code block enables line numbers, starting at 153,\nand prefixes the Pygments CSS classes with *pgcss* to make the names\nmore unique and avoid possible CSS conflicts::\n\n    .. code-block:: identifier\n        :classprefix: pgcss\n        :linenos: table\n        :linenostart: 153\n\n       <indented code block goes here>\n\nIt is also possible to specify the ``PYGMENTS_RST_OPTIONS`` variable in your\nPelican settings file to include options that will be automatically applied to\nevery code block.\n\nFor example, if you want to have line numbers displayed for every code block\nand a CSS prefix, you would set this variable to::\n\n    PYGMENTS_RST_OPTIONS = {'classprefix': 'pgcss', 'linenos': 'table'}\n\nIf specified, settings for individual code blocks will override the defaults in\nyour settings file.\n\nPublishing drafts\n=================\n\nIf you want to publish an article or a page as a draft (for friends to review\nbefore publishing, for example), you can add a ``Status: draft`` attribute to\nits metadata. That article will then be output to the ``drafts`` folder and not\nlisted on the index page nor on any category or tag page.\n\nIf your articles should be automatically published as a draft (to not\naccidentally publish an article before it is finished), include the status in\nthe ``DEFAULT_METADATA``::\n\n    DEFAULT_METADATA = {\n        'status': 'draft',\n    }\n\nTo publish a post when the default status is ``draft``, update the post's\nmetadata to include ``Status: published``.\n\nHidden Posts\n============\n\nLike pages, posts can also be marked as ``hidden`` with the ``Status: hidden``\nattribute. Hidden posts will be output to ``ARTICLE_SAVE_AS`` as expected, but\nare not included by default in tag, category, and author indexes, nor in the\nmain article feed. This has the effect of creating an \"unlisted\" post.\n\nSkip Posts\n==========\n\nPosts marked with ``skip`` status are ignored entirely. They are not processed\nnor output to the ``ARTICLE_SAVE_AS`` path. Such posts will similarly not be\nincluded in indexes or feeds.\n\n.. _W3C ISO 8601: https://www.w3.org/TR/NOTE-datetime\n.. _AsciiDoc: https://asciidoc.org\n.. _Pelican Plugins: https://github.com/pelican-plugins\n.. _pelican-plugins: https://github.com/getpelican/pelican-plugins\n.. _Python-Markdown: https://github.com/Python-Markdown/markdown\n.. _Markdown Extensions: https://python-markdown.github.io/extensions/\n.. _CodeHilite extension: https://python-markdown.github.io/extensions/code_hilite/#syntax\n.. _i18n_subsites plugin: https://github.com/getpelican/pelican-plugins/tree/master/i18n_subsites\n.. _the include directive: http://docutils.sourceforge.net/docs/ref/rst/directives.html#include\n.. _mdx_include plugin: https://github.com/neurobin/mdx_include\n"
  },
  {
    "path": "docs/contribute.rst",
    "content": "Contributing and feedback guidelines\n####################################\n\nThere are many ways to contribute to Pelican. You can improve the\ndocumentation, add missing features, and fix bugs (or just report them). You\ncan also help out by reviewing and commenting on\n`existing issues <https://github.com/getpelican/pelican/issues>`_.\n\nDon't hesitate to fork Pelican and submit an issue or pull request on GitHub.\nWhen doing so, please consider the following guidelines.\n\n.. include:: ../CONTRIBUTING.rst\n\nSetting up the development environment\n======================================\n\nWhile there are many ways to set up one's development environment, the following\ninstructions will utilize Pip_ and PDM_. These tools facilitate managing\nvirtual environments for separate Python projects that are isolated from one\nanother, so you can use different packages (and package versions) for each.\n\nPlease note that Python |min_python| is required for Pelican development.\n\n*(Optional)* If you prefer to `install PDM <https://pdm.fming.dev/latest/#installation>`_ once for use with multiple projects,\nyou can install it via::\n\n    curl -sSL https://pdm.fming.dev/install-pdm.py | python3 -\n\nPoint your web browser to the `Pelican repository`_ and tap the **Fork** button\nat top-right. Then clone the source for your fork and add the upstream project\nas a Git remote::\n\n    mkdir ~/projects\n    git clone https://github.com/YOUR_USERNAME/pelican.git ~/projects/pelican\n    cd ~/projects/pelican\n    git remote add upstream https://github.com/getpelican/pelican.git\n\nWhile PDM can dynamically create and manage virtual environments, we're going\nto manually create and activate a virtual environment::\n\n    mkdir ~/virtualenvs && cd ~/virtualenvs\n    python3 -m venv pelican\n    source ~/virtualenvs/pelican/*/activate\n\nInstall the needed dependencies and set up the project::\n\n    python -m pip install invoke\n    invoke setup\n\nYour local environment should now be ready to go!\n\n.. _Pip: https://pip.pypa.io/\n.. _PDM: https://pdm.fming.dev/latest/\n.. _Pelican repository: https://github.com/getpelican/pelican\n\nDevelopment\n===========\n\nOnce Pelican has been set up for local development, create a topic branch for\nyour bug fix or feature::\n\n    git checkout -b name-of-your-bugfix-or-feature\n\nNow you can make changes to Pelican, its documentation, and/or other aspects of\nthe project.\n\nSetting up ``git blame`` (optional)\n-----------------------------------\n\n``git blame`` annotates lines in a file with information about the pull request\nthat last modified it. Sweeping shallow changes (like formatting) can make that\ninformation less useful, so we keep a list of such changes to be ignored. Run the\nfollowing command to set this up in your repository, adding ``--global`` if you\nwant this setting to apply to all repositories::\n\n    git config blame.ignoreRevsFile .git-blame-ignore-revs\n\nAs noted in a `useful article`_ about ``git blame``, there are other related\nsettings you may find to be beneficial::\n\n    # Add `?` to any lines that have had a commit skipped using --ignore-rev\n    git config --global blame.markIgnoredLines true\n    # Add `*` to any lines that were added in a skipped commit and can not be attributed\n    git config --global blame.markUnblamableLines true\n\n.. _useful article: https://www.michaelheap.com/git-ignore-rev/\n\nRunning the test suite\n----------------------\n\nEach time you make changes to Pelican, there are two things to do regarding\ntests: check that the existing tests pass, and add tests for any new features\nor bug fixes. The tests are located in ``pelican/tests``, and you can run them\nvia::\n\n    invoke tests\n\n(For more on Invoke, see ``invoke -l`` to list tasks, or\nhttps://pyinvoke.org for documentation.)\n\nIn addition to running the test suite, it is important to also ensure that any\nlines you changed conform to code style guidelines. You can check that via::\n\n    invoke lint\n\nIf style violations are found, many of them can be addressed automatically via::\n\n    invoke lint --fix\n    invoke format\n\nIf code style violations are found in lines you changed, correct those lines\nand re-run the ``invoke lint`` command until they have all been fixed. You do\nnot need to address style violations, if any, for code lines you did not touch.\n\nAfter making your changes and running the tests, you may see a test failure\nmentioning that \"some generated files differ from the expected functional tests\noutput.\" If you have made changes that affect the HTML output generated by\nPelican, and the changes to that output are expected and deemed correct given\nthe nature of your changes, then you should update the output used by the\nfunctional tests. To do so, **make sure you have both** ``en_EN.utf8`` **and**\n``fr_FR.utf8`` **locales installed**, and then run the following command::\n\n    invoke update-functional-tests\n\nYou may also find that some tests are skipped because some dependency (e.g.,\nPandoc) is not installed. This does not automatically mean that these tests\nhave passed; you should at least verify that any skipped tests are not affected\nby your changes.\n\nYou should run the test suite under each of the supported versions of Python.\nThis is best done by creating a separate Python environment for each version.\nTox_ is a useful tool to automate running tests inside ``virtualenv``\nenvironments.\n\n.. _Tox: https://tox.readthedocs.io/en/latest/\n\nRunning a code coverage report\n------------------------------\n\nCode is more likely to stay robust if it is tested. Coverage_ is a library that\nmeasures how much of the code is tested. To run it::\n\n    invoke coverage\n\nThis will show overall coverage, coverage per file, and even line-by-line coverage.\nThere is also an HTML report available::\n\n    open htmlcov/index.html\n\n.. _Coverage: https://github.com/nedbat/coveragepy\n\nBuilding the docs\n-----------------\n\nIf you make changes to the documentation, you should build and inspect your\nchanges before committing them::\n\n    invoke docserve\n\nOpen http://localhost:8000 in your browser to review the documentation. While\nthe above task is running, any changes you make and save to the documentation\nshould automatically appear in the browser, as it live-reloads when it detects\nchanges to the documentation source files.\n\nPlugin development\n------------------\n\nTo create a *new* Pelican plugin, please refer to the `plugin template`_\nrepository for detailed instructions.\n\nIf you want to contribute to an *existing* Pelican plugin, follow the steps\nabove to set up Pelican for local development, and then create a directory to\nstore cloned plugin repositories::\n\n   mkdir -p ~/projects/pelican-plugins\n\nAssuming you wanted to contribute to the Simple Footnotes plugin, you would\nfirst browse to the `Simple Footnotes`_ repository on GitHub and tap the **Fork**\nbutton at top-right. Then clone the source for your fork and add the upstream\nproject as a Git remote::\n\n    git clone https://github.com/YOUR_USERNAME/simple-footnotes.git ~/projects/pelican-plugins/simple-footnotes\n    cd ~/projects/pelican-plugins/simple-footnotes\n    git remote add upstream https://github.com/pelican-plugins/simple-footnotes.git\n\nInstall the needed dependencies and set up the project::\n\n    invoke setup\n\nCreate a topic branch for your plugin bug fix or feature::\n\n    git checkout -b name-of-your-bugfix-or-feature\n\nAfter writing new tests for your plugin changes, run the plugin test suite and\ncheck for code style compliance via::\n\n    invoke tests\n    invoke lint\n\nIf style violations are found, many of them can be addressed automatically via::\n\n    invoke lint --fix\n    invoke format\n\nIf style violations are found even after running the above auto-formatters,\nyou will need to make additional manual changes until ``invoke lint`` no longer\nreports any code style violations.\n\n.. _plugin template: https://github.com/getpelican/cookiecutter-pelican-plugin\n.. _Simple Footnotes: https://github.com/pelican-plugins/simple-footnotes\n\nSubmitting your changes\n-----------------------\n\nAssuming linting validation and tests pass, add a ``RELEASE.md`` file in the root\nof the project that contains the release type (major, minor, patch) and a\nsummary of the changes that will be used as the release changelog entry.\nFor example::\n\n    Release type: patch\n\n    Fix browser reloading upon changes to content, settings, or theme\n\nCommit your changes and push your topic branch::\n\n    git add .\n    git commit -m \"Your detailed description of your changes\"\n    git push origin name-of-your-bugfix-or-feature\n\nFinally, browse to your repository fork on GitHub and submit a pull request.\n\n\nLogging tips\n============\n\nTry to use logging with appropriate levels.\n\nFor logging messages that are not repeated, use the usual Python way::\n\n    # at top of file\n    import logging\n    logger = logging.getLogger(__name__)\n\n    # when needed\n    logger.warning(\"A warning with %s formatting\", arg_to_be_formatted)\n\nDo not format log messages yourself. Use ``%s`` formatting in messages and pass\narguments to logger. This is important, because the Pelican logger will\npreprocess some arguments, such as exceptions.\n\nLimiting extraneous log messages\n--------------------------------\n\nIf the log message can occur several times, you may want to limit the log to\nprevent flooding. In order to do that, use the ``extra`` keyword argument for\nthe logging message in the following format::\n\n    logger.warning(\"A warning with %s formatting\", arg_to_be_formatted,\n        extra={'limit_msg': 'A generic message for too many warnings'})\n\nOptionally, you can also set ``'limit_args'`` as a tuple of arguments in\n``extra`` dict if your generic message needs formatting.\n\nLimit is set to ``5``, i.e, first four logs with the same ``'limit_msg'`` are\noutputted normally but the fifth one will be logged using ``'limit_msg'`` (and\n``'limit_args'`` if present). After the fifth, corresponding log messages will\nbe ignored.\n\nFor example, if you want to log missing resources, use the following code::\n\n    for resource in resources:\n        if resource.is_missing:\n            logger.warning(\n                'The resource %s is missing', resource.name,\n                extra={'limit_msg': 'Other resources were missing'})\n\nThe log messages will be displayed as follows::\n\n    WARNING: The resource prettiest_cat.jpg is missing\n    WARNING: The resource best_cat_ever.jpg is missing\n    WARNING: The resource cutest_cat.jpg is missing\n    WARNING: The resource lolcat.jpg is missing\n    WARNING: Other resources were missing\n\n\nOutputting traceback in the logs\n--------------------------------\n\nIf you're logging inside an ``except`` block, you may want to provide the\ntraceback information as well. You can do that by setting ``exc_info`` keyword\nargument to ``True`` during logging. However, doing so by default can be\nundesired because tracebacks are long and can be confusing to regular users.\nTry to limit them to ``--debug`` mode like the following::\n\n    try:\n        some_action()\n    except Exception as e:\n        logger.error('Exception occurred: %s', e,\n            exc_info=settings.get('DEBUG', False))\n"
  },
  {
    "path": "docs/faq.rst",
    "content": "Frequently Asked Questions (FAQ)\n################################\n\nHere are some frequently asked questions about Pelican.\n\nWhat's the best way to communicate a problem, question, or suggestion?\n======================================================================\n\nPlease read our :doc:`feedback guidelines <contribute>`.\n\nHow can I help?\n===============\n\nThere are several ways to help out. First, you can communicate any Pelican\nsuggestions or problems you might have via `Pelican Discussions\n<https://github.com/getpelican/pelican/discussions>`_. Please first check the\nexisting list of discussions and issues (both open and closed) in order to\navoid submitting topics that have already been covered before.\n\nIf you want to contribute, please fork `the Git repository\n<https://github.com/getpelican/pelican/>`_, create a new feature branch, make\nyour changes, and issue a pull request. Someone will review your changes as\nsoon as possible. Please refer to the :doc:`How to Contribute <contribute>`\nsection for more details.\n\nYou can also contribute by creating themes and improving the documentation.\n\nIs the Pelican settings file mandatory?\n=======================================\n\nConfiguration files are optional and are just an easy way to configure Pelican.\nFor basic operations, it's possible to specify options while invoking Pelican\nvia the command line. See ``pelican --help`` for more information.\n\nChanges to the settings file take no effect\n===========================================\n\nWhen experimenting with different settings (especially the metadata ones)\ncaching may interfere and the changes may not be visible. In such cases, ensure\nthat caching is disabled via ``LOAD_CONTENT_CACHE = False`` or use the\n``--ignore-cache`` command-line switch.\n\nI'm creating my own theme. How do I use Pygments for syntax highlighting?\n=========================================================================\n\nPygments adds some classes to the generated content. These classes are used by\nthemes to style code syntax highlighting via CSS. Specifically, you can\ncustomize the appearance of your syntax highlighting via the ``.highlight pre``\nclass in your theme's CSS file. To see how various styles can be used to render\nDjango code, for example, use the style selector drop-down at top-right on the\n`Pygments project demo site <https://pygments.org/demo/>`_.\n\nYou can use the following example commands to generate a starting CSS file from\na Pygments built-in style (in this case, \"monokai\") and then copy the generated\nCSS file to your new theme::\n\n    pygmentize -S monokai -f html -a .highlight > pygment.css\n    cp pygment.css path/to/theme/static/css/\n\nDon't forget to import your ``pygment.css`` file from your main CSS file.\n\nHow do I create my own theme?\n=============================\n\nPlease refer to :ref:`theming-pelican`.\n\nCan I override individual templates without forking the whole theme?\n====================================================================\n\nYes, you can override existing templates of the theme that you are using, or\nadd new templates, via the ``THEME_TEMPLATES_OVERRIDES`` variable. For example,\nto override the page template, you can define the location for your templates\nlike this::\n\n    THEME_TEMPLATES_OVERRIDES = [\"templates\"]\n\nYou can then define a custom template in ``templates/page.html``.\nSee :ref:`settings/themes` for details.\n\nI want to use Markdown, but I got an error.\n===========================================\n\nIf you try to generate Markdown content without first installing the Markdown\nlibrary, you may see a message that says ``No valid files found in content``.\nMarkdown is not a hard dependency for Pelican, so if you have content in\nMarkdown format, you will need to explicitly install the Markdown library. You\ncan do so by typing the following command, prepending ``sudo`` if permissions\nrequire it::\n\n    python -m pip install markdown\n\nCan I use arbitrary metadata in my templates?\n=============================================\n\nYes. For example, to include a modified date in a Markdown post, one could\ninclude the following at the top of the article::\n\n    Modified: 2012-08-08\n\nFor reStructuredText, this metadata should of course be prefixed with a colon::\n\n    :Modified: 2012-08-08\n\nThis metadata can then be accessed in templates such as ``article.html`` via::\n\n    {% if article.modified %}\n    Last modified: {{ article.modified }}\n    {% endif %}\n\nIf you want to include metadata in templates outside the article context (e.g.,\n``base.html``), the ``if`` statement should instead be::\n\n    {% if article and article.modified %}\n\n.. note::\n\n    Because the colon symbol (``:``) is used as a separator, be aware that\n    metadata field names *containing* a colon will probably not work.\n\nHow do I make my output folder structure identical to my content hierarchy?\n===========================================================================\n\nTry these settings::\n\n    USE_FOLDER_AS_CATEGORY = False\n    PATH_METADATA = r\"(?P<path_no_ext>.*)\\..*\"\n    ARTICLE_URL = ARTICLE_SAVE_AS = PAGE_URL = PAGE_SAVE_AS = \"{path_no_ext}.html\"\n\nHow do I assign custom templates on a per-page basis?\n=====================================================\n\nIt's as simple as adding an extra line of metadata to any page or article that\nyou want to have its own template. For example, this is how it would be handled\nfor content in reST format::\n\n    :template: template_name\n\nFor content in Markdown format::\n\n    Template: template_name\n\nThen just make sure your theme contains the relevant template file (e.g.\n``template_name.html``). If you just want to add a new custom template to an\nexisting theme, you can also provide it in a directory specified by ``THEME_TEMPLATES_OVERRIDES`` (see :ref:`settings/themes`).\n\nHow can I override the generated URL of a specific page or article?\n===================================================================\n\nInclude ``url`` and ``save_as`` metadata in any pages or articles that you want\nto override the generated URL. Here is an example page in reST format::\n\n    Override url/save_as page\n    #########################\n\n    :url: override/url/\n    :save_as: override/url/index.html\n\nWith this metadata, the page will be written to ``override/url/index.html``\nand Pelican will use the URL ``override/url/`` to link to this page.\n\nHow can I use a static page as my home page?\n============================================\n\nThe override feature mentioned above can be used to specify a static page as\nyour home page. The following Markdown example could be stored in\n``content/pages/home.md``::\n\n    Title: Welcome to My Site\n    URL:\n    save_as: index.html\n\n    Thank you for visiting. Welcome!\n\nIf the original blog index is still wanted, it can then be saved in a\ndifferent location by setting ``INDEX_SAVE_AS = 'blog_index.html'`` for\nthe ``'index'`` direct template.\n\nWhat if I want to disable feed generation?\n==========================================\n\nTo disable feed generation, all feed settings should be set to ``None``. All\nbut three feed settings already default to ``None``, so if you want to disable\nall feed generation, you only need to specify the following settings::\n\n    FEED_ALL_ATOM = None\n    CATEGORY_FEED_ATOM = None\n    TRANSLATION_FEED_ATOM = None\n    AUTHOR_FEED_ATOM = None\n    AUTHOR_FEED_RSS = None\n\nThe word ``None`` should not be surrounded by quotes. Please note that ``None``\nand ``''`` are not the same thing.\n\nI'm getting a warning about feeds generated without SITEURL being set properly\n==============================================================================\n\n`RSS and Atom feeds require all URL links to be absolute\n<https://validator.w3.org/feed/docs/rss2.html#comments>`_. In order to properly\ngenerate links in Pelican you will need to set ``SITEURL`` to the full path of\nyour site.\n\nFeeds are still generated when this warning is displayed, but links within may\nbe malformed and thus the feed may not validate.\n\nCan I force Atom feeds to show only summaries instead of article content?\n=========================================================================\n\nInstead of having to open a separate browser window to read articles, the\noverwhelming majority of folks who use feed readers prefer to read content\nwithin the feed reader itself. Mainly for that reason, Pelican does not support\nrestricting Atom feeds to only contain summaries. Unlike Atom feeds, the RSS\nfeed specification does not include a separate ``content`` field, so by default\nPelican publishes RSS feeds that only contain summaries (but can optionally be\nset to instead publish full content RSS feeds). So the default feed generation\nbehavior provides users with a choice: subscribe to Atom feeds for full content\nor to RSS feeds for just the summaries.\n\nIs Pelican only suitable for blogs?\n===================================\n\nNo. Pelican can be easily configured to create and maintain any type of static\nsite. This may require a little customization of your theme and Pelican\nconfiguration. For example, if you are building a launch site for your product\nand do not need tags on your site, you could remove the relevant HTML code from\nyour theme. You can also disable generation of tag-related pages via::\n\n    TAGS_SAVE_AS = ''\n    TAG_SAVE_AS = ''\n\nWhy does Pelican always write all HTML files even with content caching enabled?\n===============================================================================\n\nIn order to reliably determine whether the HTML output is different before\nwriting it, a large part of the generation environment including the template\ncontexts, imported plugins, etc. would have to be saved and compared, at least\nin the form of a hash (which would require special handling of unhashable\ntypes), because of all the possible combinations of plugins, pagination, etc.\nwhich may change in many different ways. This would require a lot more\nprocessing time and memory and storage space. Simply writing the files each\ntime is a lot faster and a lot more reliable.\n\nHowever, this means that the modification time of the files changes every time,\nso a ``rsync`` based upload will transfer them even if their content hasn't\nchanged. A simple solution is to make ``rsync`` use the ``--checksum`` option,\nwhich will make it compare the file checksums in a much faster way than Pelican\nwould.\n\nHow to process only a subset of all articles?\n=============================================\n\nIt is often useful to process only e.g. 10 articles for debugging purposes.\nThis can be achieved by explicitly specifying only the filenames of those\narticles in ``ARTICLE_PATHS``. A list of such filenames could be found using a\ncommand similar to ``cd content; find -name '*.md' | head -n 10``.\n\nMy tag cloud is missing/broken since I upgraded Pelican\n=======================================================\n\nIn an ongoing effort to streamline Pelican, tag cloud generation has been\nmoved out of Pelican core and into a separate `plugin\n<https://github.com/pelican-plugins/tag-cloud>`_. See the :ref:`plugins`\ndocumentation for further information about the Pelican plugin system.\n\nSince I upgraded Pelican my pages are no longer rendered\n========================================================\n\nPages were available to themes as lowercase ``pages`` and uppercase ``PAGES``.\nTo bring this inline with the :ref:`templates-variables` section, ``PAGES`` has\nbeen removed. This is quickly resolved by updating your theme to iterate over\n``pages`` instead of ``PAGES``. Just replace::\n\n    {% for pg in PAGES %}\n\nwith something like::\n\n    {% for pg in pages %}\n\nHow can I stop Pelican from trying to parse my static files as content?\n=======================================================================\n\nPelican's article and page generators run before it's static generator. That\nmeans if you use a setup similar to the default configuration, where a static\nsource directory is defined inside a ``*_PATHS`` setting, all files that have a\nvalid content file ending (``.html``, ``.rst``, ``.md``, ...) will be treated\nas articles or pages before they get treated as static files.\n\nTo circumvent this issue either use the appropriate ``*_EXCLUDES`` setting or\ndisable the offending reader via ``READERS`` if you don't need it.\n\nWhy is [arbitrary Markdown syntax] not supported?\n=================================================\n\nPelican does not directly handle Markdown processing and instead delegates that\ntask to the Python-Markdown_ project, the core of which purposefully follows\nthe original Markdown syntax rules and not the myriad Markdown \"flavors\" that\nhave subsequently propagated. That said, Python-Markdown_ is quite modular, and\nthe syntax you are looking for may be provided by one of the many available\n`Markdown Extensions`_. Alternatively, some folks have created Pelican plugins\nthat support Markdown variants, so that may be your best choice if there is a\nparticular variant you want to use when writing your content.\n\n\n.. _Python-Markdown: https://github.com/Python-Markdown/markdown\n.. _Markdown Extensions: https://python-markdown.github.io/extensions/\n"
  },
  {
    "path": "docs/importer.rst",
    "content": ".. _import:\n\nImporting an existing site\n##########################\n\nDescription\n===========\n\n``pelican-import`` is a command-line tool for converting articles from other\nsoftware to reStructuredText or Markdown. The supported import formats are:\n\n- Blogger XML export\n- Dotclear export\n- Medium export\n- Tumblr API\n- WordPress XML export\n- RSS/Atom feed\n\nThe conversion from HTML to reStructuredText or Markdown relies on `Pandoc`_.\nFor Dotclear, if the source posts are written with Markdown syntax, they will\nnot be converted (as Pelican also supports Markdown).\n\n.. note::\n\n   Unlike Pelican, Wordpress supports multiple categories per article. These\n   are imported as a comma-separated string. You have to resolve these\n   manually, or use a plugin such as `More Categories`_ that enables multiple\n   categories per article.\n\n.. note::\n\n   Imported pages may contain links to images that still point to the original site.\n   So you might want to download those images into your local content and manually\n   re-link them from the relevant pages of your site.\n\nDependencies\n============\n\n``pelican-import`` has some dependencies not required by the rest of Pelican:\n\n- *BeautifulSoup4* and *lxml*, for WordPress and Dotclear import. Can be\n  installed like any other Python package (``pip install BeautifulSoup4\n  lxml``).\n- *Feedparser*, for feed import (``pip install feedparser``).\n- *Pandoc*, see the `Pandoc site`_ for installation instructions on your\n  operating system.\n\n.. _Pandoc: https://pandoc.org/\n.. _Pandoc site: https://pandoc.org/installing.html\n\n\nUsage\n=====\n\n::\n\n    pelican-import [-h] [--blogger] [--dotclear] [--tumblr] [--wpfile] [--feed]\n                   [-o OUTPUT] [-m MARKUP] [--dir-cat] [--dir-page] [--strip-raw] [--wp-custpost]\n                   [--wp-attach] [--disable-slugs] [-b BLOGNAME]\n                   input|api_key\n\nPositional arguments\n--------------------\n  =============         ============================================================================\n  ``input``             The input file to read\n  ``api_key``           (Tumblr only) api_key can be obtained from https://www.tumblr.com/oauth/apps\n  =============         ============================================================================\n\nOptional arguments\n------------------\n\n  -h, --help            Show this help message and exit\n  --blogger             Blogger XML export (default: False)\n  --dotclear            Dotclear export (default: False)\n  --medium              Medium export (default: False)\n  --tumblr              Tumblr API (default: False)\n  --wpfile              WordPress XML export (default: False)\n  --feed                Feed to parse (default: False)\n  -o OUTPUT, --output OUTPUT\n                        Output path (default: content)\n  -m MARKUP, --markup MARKUP\n                        Output markup format: ``rst``, ``markdown``, or ``asciidoc``\n                        (default: ``rst``)\n  --dir-cat             Put files in directories with categories name\n                        (default: False)\n  --dir-page            Put files recognised as pages in \"pages/\" sub-\n                          directory (blogger and wordpress import only)\n                          (default: False)\n  --filter-author       Import only post from the specified author\n  --strip-raw           Strip raw HTML code that can't be converted to markup\n                        such as flash embeds or iframes (default: False)\n  --wp-custpost         Put wordpress custom post types in directories. If\n                        used with --dir-cat option directories will be created\n                        as \"/post_type/category/\" (wordpress import only)\n  --wp-attach           Download files uploaded to wordpress as attachments.\n                        Files will be added to posts as a list in the post\n                        header and links to the files within the post will be\n                        updated. All files will be downloaded, even if they\n                        aren't associated with a post. Files will be downloaded\n                        with their original path inside the output directory,\n                        e.g. \"output/wp-uploads/date/postname/file.jpg\".\n                        (wordpress import only) (requires an internet\n                        connection)\n  --disable-slugs       Disable storing slugs from imported posts within\n                        output. With this disabled, your Pelican URLs may not\n                        be consistent with your original posts. (default:\n                        False)\n  -b BLOGNAME, --blogname=BLOGNAME\n                        Blog name used in Tumblr API\n\n\nExamples\n========\n\nFor Blogger::\n\n    $ pelican-import --blogger -o ~/output ~/posts.xml\n\nFor Dotclear::\n\n    $ pelican-import --dotclear -o ~/output ~/backup.txt\n\nFor Medium::\n\n    $ pelican-import --medium -o ~/output ~/medium-export/posts/\n\nThe Medium export is a zip file.  Unzip it, and point this tool to the\n\"posts\" subdirectory.  For more information on how to export, see\nhttps://help.medium.com/hc/en-us/articles/115004745787-Export-your-account-data.\n\nFor Tumblr::\n\n    $ pelican-import --tumblr -o ~/output --blogname=<blogname> <api_key>\n\nFor WordPress::\n\n    $ pelican-import --wpfile -o ~/output ~/posts.xml\n\nFor Medium (an example of using an RSS feed):\n\n    $ python -m pip install feedparser\n    $ pelican-import --feed https://medium.com/feed/@username\n\n.. note::\n\n   The RSS feed may only return the most recent posts — not all of them.\n\nTests\n=====\n\nTo test the module, one can use sample files:\n\n- for WordPress: https://www.wpbeginner.com/wp-themes/how-to-add-dummy-content-for-theme-development-in-wordpress/\n- for Dotclear: http://media.dotaddict.org/tda/downloads/lorem-backup.txt\n\n.. _More Categories: https://github.com/pelican-plugins/more-categories\n"
  },
  {
    "path": "docs/index.rst",
    "content": "Pelican |release|\n=================\n\nPelican is a static site generator, written in Python_. Highlights include:\n\n* Write your content directly with your editor of choice in reStructuredText_\n  or Markdown_ formats\n* Includes a simple CLI tool to (re)generate your site\n* Easy to interface with distributed version control systems and web hooks\n* Completely static output is easy to host anywhere\n\nReady to get started? Check out the :doc:`Quickstart<quickstart>` guide.\n\nFeatures\n--------\n\nPelican’s feature highlights include:\n\n* Articles (e.g., blog posts) and pages (e.g., \"About\", \"Projects\", \"Contact\")\n* Integration with external services\n* Site themes (created using Jinja2_ templates)\n* Publication of articles in multiple languages\n* Generation of Atom and RSS feeds\n* Code syntax highlighting\n* Import existing content from WordPress, Dotclear, or RSS feeds\n* Fast rebuild times thanks to content caching and selective output writing\n* Extensible via a rich plugin ecosystem: `Pelican Plugins`_\n\nWhy the name \"Pelican\"?\n-----------------------\n\n\"Pelican\" is an anagram for *calepin*, which means \"notebook\" in French. ;)\n\nSource code\n-----------\n\nYou can access the source code at: https://github.com/getpelican/pelican\n\nHow to get help, contribute, or provide feedback\n------------------------------------------------\n\nSee our :doc:`feedback and contribution submission guidelines <contribute>`.\n\nDocumentation\n-------------\n\n.. toctree::\n   :maxdepth: 2\n\n   quickstart\n   install\n   content\n   publish\n   settings\n   plugins\n   themes\n   pelican-themes\n   importer\n   faq\n   tips\n   contribute\n   internals\n   report\n   changelog\n\n.. Links\n\n.. _Python: https://www.python.org/\n.. _reStructuredText: http://docutils.sourceforge.net/rst.html\n.. _Markdown: https://daringfireball.net/projects/markdown/\n.. _Jinja2: https://palletsprojects.com/p/jinja/\n.. _`Pelican documentation`: https://docs.getpelican.com/latest/\n.. _`Pelican's internals`: https://docs.getpelican.com/en/latest/internals.html\n.. _`Pelican Plugins`: https://github.com/pelican-plugins\n"
  },
  {
    "path": "docs/install.rst",
    "content": "Installing Pelican\n##################\n\nPelican currently runs best on |min_python|; earlier versions of Python are not supported.\n\nYou can install Pelican via several different methods. The simplest is via Pip_::\n\n    python -m pip install pelican\n\nOr, if you plan on using Markdown::\n\n    python -m pip install \"pelican[markdown]\"\n\n(Keep in mind that some operating systems will require you to prefix the above\ncommand with ``sudo`` in order to install Pelican system-wide.)\n\nWhile the above is the simplest method, the recommended approach is to create a\nvirtual environment for Pelican via virtualenv_ before installing Pelican.\nAssuming you have virtualenv_ installed, you can then open a new terminal\nsession and create a new virtual environment for Pelican::\n\n    virtualenv ~/virtualenvs/pelican\n    cd ~/virtualenvs/pelican\n    source bin/activate\n\nOnce the virtual environment has been created and activated, Pelican can be\ninstalled via ``python -m pip install pelican`` as noted above. Alternatively, if you\nhave the project source, you can install Pelican using the setuptools method::\n\n    cd path-to-Pelican-source\n    python -m pip install .\n\nIf you have Git installed and prefer to install the latest bleeding-edge\nversion of Pelican rather than a stable release, use the following command::\n\n    python -m pip install -e \"git+https://github.com/getpelican/pelican.git#egg=pelican\"\n\nOnce Pelican is installed, you can run ``pelican --help`` to see basic usage\noptions. For more detail, refer to the :doc:`Publish<publish>` section.\n\nOptional packages\n-----------------\n\nIf you plan on using `Markdown <https://pypi.org/project/Markdown/>`_ as a\nmarkup format, you can install Pelican with Markdown support::\n\n    python -m pip install \"pelican[markdown]\"\n\nTypographical enhancements can be enabled in your settings file, but first the\nrequisite `Typogrify <https://pypi.org/project/typogrify/>`_ library must be\ninstalled::\n\n    python -m pip install typogrify\n\nDependencies\n------------\n\nWhen Pelican is installed, the following dependent Python packages should be\nautomatically installed without any action on your part:\n\n* `feedgenerator <https://pypi.org/project/feedgenerator/>`_, to generate the\n  Atom feeds\n* `jinja2 <https://pypi.org/project/Jinja2/>`_, for templating support\n* `pygments <https://pypi.org/project/Pygments/>`_, for syntax highlighting\n* `docutils <https://pypi.org/project/docutils/>`_, for supporting\n  reStructuredText as an input format\n* `blinker <https://pypi.org/project/blinker/>`_, an object-to-object and\n  broadcast signaling system\n* `unidecode <https://pypi.org/project/Unidecode/>`_, for ASCII\n  transliterations of Unicode text\n  utilities\n* `MarkupSafe <https://pypi.org/project/MarkupSafe/>`_, for a markup-safe\n  string implementation\n* `python-dateutil <https://pypi.org/project/python-dateutil/>`_, to read\n  the date metadata\n\nUpgrading\n---------\n\nIf you installed a stable Pelican release via Pip_ and wish to upgrade to\nthe latest stable release, you can do so by adding ``--upgrade``::\n\n    python -m pip install --upgrade pelican\n\nIf you installed Pelican via distutils or the bleeding-edge method, simply\nperform the same step to install the most recent version.\n\nKickstart your site\n-------------------\n\nOnce Pelican has been installed, you can create a skeleton project via the\n``pelican-quickstart`` command, which begins by asking some questions about\nyour site::\n\n    pelican-quickstart\n\nIf run inside an activated virtual environment, ``pelican-quickstart`` will\nlook for an associated project path inside ``$VIRTUAL_ENV/.project``. If that\nfile exists and contains a valid directory path, the new Pelican project will\nbe saved at that location. Otherwise, the default is the current working\ndirectory. To set the new project path on initial invocation, use:\n``pelican-quickstart --path /your/desired/directory``\n\nOnce you finish answering all the questions, your project will consist of the\nfollowing hierarchy (except for *pages* — shown in parentheses below — which\nyou can optionally add yourself if you plan to create non-chronological\ncontent)::\n\n    yourproject/\n    ├── content\n    │   └── (pages)\n    ├── output\n    ├── tasks.py\n    ├── Makefile\n    ├── pelicanconf.py       # Main settings file\n    └── publishconf.py       # Settings to use when ready to publish\n\nThe next step is to begin to adding content to the *content* folder that has\nbeen created for you.\n\n.. _Pip: https://pip.pypa.io/\n.. _virtualenv: https://virtualenv.pypa.io/en/latest/\n"
  },
  {
    "path": "docs/internals.rst",
    "content": "Pelican internals\n#################\n\nThis section describe how Pelican works internally. As you'll see, it's quite\nsimple, but a bit of documentation doesn't hurt.  :)\n\nYou can also find in the :doc:`report` section an excerpt of a report the\noriginal author wrote with some software design information.\n\n.. _report: :doc:`report`\n\nOverall structure\n=================\n\nWhat Pelican does is take a list of files and process them into some sort of\noutput. Usually, the input files are reStructuredText and Markdown files, and\nthe output is a blog, but both input and output can be anything you want.\n\nThe logic is separated into different classes and concepts:\n\n* **Writers** are responsible for writing files: .html files, RSS feeds, and so\n  on. Since those operations are commonly used, the object is created once and\n  then passed to the generators.\n\n* **Readers** are used to read from various formats (HTML, Markdown and\n  reStructuredText for now, but the system is extensible). Given a file, they\n  return metadata (author, tags, category, etc.) and content (HTML-formatted).\n\n* **Generators** generate the different outputs. For instance, Pelican comes\n  with ``ArticlesGenerator`` and ``PageGenerator``. Given a configuration, they\n  can do whatever they want. Most of the time, it's generating files from\n  inputs.\n\n* Pelican also uses templates, so it's easy to write your own theme. The\n  syntax is `Jinja2 <https://palletsprojects.com/p/jinja/>`_ and is very easy to learn, so\n  don't hesitate to jump in and build your own theme.\n\nHow to implement a new reader?\n==============================\n\nIs there an awesome markup language you want to add to Pelican? Well, the only\nthing you have to do is to create a class with a ``read`` method that returns\nHTML content and some metadata.\n\nTake a look at the Markdown reader::\n\n    from pelican.readers import BaseReader\n    from pelican.utils import pelican_open\n    from markdown import Markdown\n\n    class MarkdownReader(BaseReader):\n        enabled = True\n\n        def read(self, source_path):\n            \"\"\"Parse content and metadata of markdown files\"\"\"\n\n            with pelican_open(source_path) as text:\n                md_extensions = {'markdown.extensions.meta': {},\n                                 'markdown.extensions.codehilite': {}}\n                md = Markdown(extensions=md_extensions.keys(),\n                              extension_configs=md_extensions)\n                content = md.convert(text)\n\n            metadata = {}\n            for name, value in md.Meta.items():\n                name = name.lower()\n                meta = self.process_metadata(name, value[0])\n                metadata[name] = meta\n            return content, metadata\n\nSimple, isn't it?\n\nIf your new reader requires additional Python dependencies, then you should\nwrap their ``import`` statements in a ``try...except`` block.  Then inside the\nreader's class, set the ``enabled`` class attribute to mark import success or\nfailure. This makes it possible for users to continue using their favourite\nmarkup method without needing to install modules for formats they don't use.\n\nHow to implement a new generator?\n=================================\n\nGenerators have two important methods. You're not forced to create both; only\nthe existing ones will be called.\n\n* ``generate_context``, that is called first, for all the generators.\n  Do whatever you have to do, and update the global context if needed. This\n  context is shared between all generators, and will be passed to the\n  templates. For instance, the ``PageGenerator`` ``generate_context`` method\n  finds all the pages, transforms them into objects, and populates the context\n  with them. Be careful *not* to output anything using this context at this\n  stage, as it is likely to change by the effect of other generators.\n\n* ``generate_output`` is then called. And guess what is it made for? Oh,\n  generating the output.  :) It's here that you may want to look at the context\n  and call the methods of the ``writer`` object that is passed as the first\n  argument of this function. In the ``PageGenerator`` example, this method will\n  look at all the pages recorded in the global context and output a file on the\n  disk (using the writer method ``write_file``) for each page encountered.\n"
  },
  {
    "path": "docs/locale/zh_CN/LC_MESSAGES/changelog.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) 2010–2024\n# This file is distributed under the same license as the PELICAN package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, 2024.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PELICAN 4\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2025-07-13 11:46+0800\\n\"\n\"PO-Revision-Date: 2024-06-27 19:00+0800\\n\"\n\"Last-Translator: GeorgeHu <dhxxhch@163.com>\\n\"\n\"Language: zh_CN\\n\"\n\"Language-Team: \\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=utf-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Generated-By: Babel 2.17.0\\n\"\n\n#: ../../changelog.rst:2 0742e96cabd04fc99355bbfa66fcb719\nmsgid \"Release history\"\nmsgstr \"更新日志\"\n\n#: ../../changelog.rst:5 2a6b4d6833884393bf6eb0f664f07027\nmsgid \"4.11.0 - 2025-01-15\"\nmsgstr \"\"\n\n#: ../../changelog.rst:7 eb554022ed4445b4886e5fb7b1ffda48\nmsgid \"\"\n\"Add setting to selectively omit Typogrify filters `(#3439) \"\n\"<https://github.com/getpelican/pelican/pull/3439>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:8 b4296b7abe7a411faedd991310af951f\nmsgid \"\"\n\"Add more blocks to the Simple theme’s base template, making it easier to \"\n\"create new themes by inheriting from the Simple theme `(#3405) \"\n\"<https://github.com/getpelican/pelican/pull/3405>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:9 da7911e453434d5fa2a24bb9bad85d5f\nmsgid \"\"\n\"Fix auto-reload behavior upon changes to the theme, content or settings. \"\n\"Make default ``IGNORE_FILES`` recursively ignore all hidden files as well\"\n\" as the `default filters \"\n\"<https://watchfiles.helpmanual.io/api/filters/#watchfiles.DefaultFilter.ignore_dirs>`_\"\n\" from ``watchfiles.DefaultFilter``. `(#3441) \"\n\"<https://github.com/getpelican/pelican/pull/3441>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:10 ad022a2dbbe74c28ab78757f64791daa\nmsgid \"\"\n\"Get current year from the ``SOURCE_DATE_EPOCH`` environment variable, if \"\n\"available `(#3430) <https://github.com/getpelican/pelican/pull/3430>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:11 c7270f10045541f992ea76f9b8f938bc\nmsgid \"\"\n\"Add Python 3.13 to test matrix and remove Python 3.8 `(#3435) \"\n\"<https://github.com/getpelican/pelican/pull/3435>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:12 c913ff7038e2445e831be08ce7a2d95f\nmsgid \"Require Typogrify 2.1+ and Pygments <2.19\"\nmsgstr \"\"\n\n#: ../../changelog.rst:15 47b916504e6c4a33a499718574212ed2\nmsgid \"4.10.2 - 2024-11-27\"\nmsgstr \"\"\n\n#: ../../changelog.rst:17 6ccca5efc34c43fc9e6549ce27d07b1a\nmsgid \"Change ``IGNORE_FILES`` setting default to ignore all hidden files\"\nmsgstr \"\"\n\n#: ../../changelog.rst:18 b541de728f0d4480bf6a3cb93a331134\nmsgid \"\"\n\"Fix ``SUMMARY_MAX_PARAGRAPHS`` not being respected in some combinations \"\n\"with ``SUMMARY_MAX_LENGTH``\"\nmsgstr \"\"\n\n#: ../../changelog.rst:21 47b916504e6c4a33a499718574212ed2\nmsgid \"4.10.1 - 2024-09-28\"\nmsgstr \"\"\n\n#: ../../changelog.rst:23 33731d204a8f42d6972a5b41035bf6fa\nmsgid \"Fix error when running ``pelican -r -l``\"\nmsgstr \"\"\n\n#: ../../changelog.rst:24 0c82e22bd70f497880747a23445a279e\nmsgid \"Fix symlink handling in ``pelican-themes``\"\nmsgstr \"\"\n\n#: ../../changelog.rst:27 2a6b4d6833884393bf6eb0f664f07027\nmsgid \"4.10.0 - 2024-09-16\"\nmsgstr \"\"\n\n#: ../../changelog.rst:29 c5b7388ced0246df9383968b896cee1d\nmsgid \"Add setting to specify summary via paragraph count\"\nmsgstr \"\"\n\n#: ../../changelog.rst:30 55bef71482124d7ba15dcc13def666b4\nmsgid \"Add new status to skip generation of a post\"\nmsgstr \"\"\n\n#: ../../changelog.rst:31 74aa099718c64ec3864fb4b54e8c7e7b\nmsgid \"Add setting to append ``ref`` parameter to links in feeds\"\nmsgstr \"\"\n\n#: ../../changelog.rst:32 be0d21b2ffd648f9aad935e95fa2e9b2\nmsgid \"Configure logging handler via ``--log-handler`` CLI option\"\nmsgstr \"\"\n\n#: ../../changelog.rst:33 f582b79f9b19462988607337626e92e8\nmsgid \"Resolve intra-site links in summaries\"\nmsgstr \"\"\n\n#: ../../changelog.rst:34 00e8752d88364591a1e7844b3605963c\nmsgid \"Warn when files are not processed due to disabled readers\"\nmsgstr \"\"\n\n#: ../../changelog.rst:35 0de52c3ba40b44f0816cc8dabf7913ab\nmsgid \"Add Medium post importer\"\nmsgstr \"\"\n\n#: ../../changelog.rst:36 051bf922a7304dd798e894ddcfb64635\nmsgid \"Improve GitHub Pages workflow\"\nmsgstr \"\"\n\n#: ../../changelog.rst:37 7db880406e9540de9b2d5b023cc10147\nmsgid \"Improve code test coverage\"\nmsgstr \"\"\n\n#: ../../changelog.rst:38 c4327d2df9e34af384a4b0c96031e7e1\nmsgid \"Translate documentation into Simplified Chinese\"\nmsgstr \"\"\n\n#: ../../changelog.rst:41 75bd952da32744868b68714fa89d62ec\nmsgid \"4.9.1 - 2023-11-15\"\nmsgstr \"\"\n\n#: ../../changelog.rst:43 f896a982ada348e3bf763a9cf620d432\nmsgid \"Ensure ``tzdata`` dependency is installed on Windows\"\nmsgstr \"\"\n\n#: ../../changelog.rst:46 f7893a294e2c4c44bd82d68283421096\nmsgid \"4.9.0 - 2023-11-12\"\nmsgstr \"\"\n\n#: ../../changelog.rst:48 3fc89471c16044349176c6bf58daef61\nmsgid \"Upgrade code to new minimum supported Python version: 3.8\"\nmsgstr \"\"\n\n#: ../../changelog.rst:49 361eb8523ae54e6c965c4957d5af9a0b\nmsgid \"\"\n\"Settings support for ``pathlib.Path`` `(#2758) \"\n\"<https://github.com/getpelican/pelican/pull/2758>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:50 7ea2147f8b6c4bc1af0e926b897fbbc7\nmsgid \"\"\n\"Various improvements to Simple theme (`#2976 \"\n\"<https://github.com/getpelican/pelican/pull/2976>`_ & `#3234 \"\n\"<https://github.com/getpelican/pelican/pull/3234>`_)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:51 fc0e0bb6fd8a49bca130f352208d4e65\nmsgid \"\"\n\"Use Furo as Sphinx documentation theme `(#3023) \"\n\"<https://github.com/getpelican/pelican/pull/3023>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:52 1767e84116304b62bff9c66576c8b530\nmsgid \"\"\n\"Default to 100 articles maximum in feeds `(#3127) \"\n\"<https://github.com/getpelican/pelican/pull/3127>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:53 1f42290cb97f4c22b71b49bfd4e1d763\nmsgid \"\"\n\"Add ``period_archives common context`` variable `(#3148) \"\n\"<https://github.com/getpelican/pelican/pull/3148>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:54 8e70999f32d743d8be9d7a09a7b8440e\nmsgid \"\"\n\"Use ``watchfiles`` as the file-watching backend `(#3151) \"\n\"<https://github.com/getpelican/pelican/pull/3151>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:55 eb554022ed4445b4886e5fb7b1ffda48\nmsgid \"\"\n\"Add GitHub Actions workflow for GitHub Pages `(#3189) \"\n\"<https://github.com/getpelican/pelican/pull/3189>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:56 aee78c33fc074a5aa2a3e7b6b074a2d1\nmsgid \"\"\n\"Allow dataclasses in settings `(#3204) \"\n\"<https://github.com/getpelican/pelican/pull/3204>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:57 b302dcfa9ab347c7a4190e35a2fec468\nmsgid \"\"\n\"Switch build tool to PDM instead of Setuptools/Poetry `(#3220) \"\n\"<https://github.com/getpelican/pelican/pull/3220>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:58 39c35ce577d6418ebe1bdb8bd83855da\nmsgid \"\"\n\"Provide a ``plugin_enabled`` Jinja test for themes `(#3235) \"\n\"<https://github.com/getpelican/pelican/pull/3235>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:59 10520c5ebec34d02996410cc1d611162\nmsgid \"\"\n\"Preserve connection order in Blinker `(#3238) \"\n\"<https://github.com/getpelican/pelican/pull/3238>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:60 e3e01fbe72ff48578ee636044d930861\nmsgid \"\"\n\"Remove social icons from default ``notmyidea`` theme `(#3240) \"\n\"<https://github.com/getpelican/pelican/pull/3240>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:61 0e0d4fc6f77947a79bc3864dbcfd3025\nmsgid \"\"\n\"Remove unreliable ``WRITE_SELECTED`` feature `(#3243) \"\n\"<https://github.com/getpelican/pelican/pull/3243>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:62 3945b50f56c849e8b756418a049e8bd5\nmsgid \"\"\n\"Importer: Report broken embedded video links when importing from Tumblr \"\n\"`(#3177) <https://github.com/getpelican/pelican/issues/3177>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:63 91a65ac386d64de293807b14a1ee66c1\nmsgid \"\"\n\"Importer: Remove newline addition when iterating Photo post types \"\n\"`(#3178) <https://github.com/getpelican/pelican/issues/3178>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:64 5965fc057a0a4c94a2507956a2227789\nmsgid \"\"\n\"Importer: Force timestamp conversion in Tumblr importer to be UTC with \"\n\"offset `(#3221) <https://github.com/getpelican/pelican/pull/3221>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:65 f4a79028bfa946debc9a6924670e5456\nmsgid \"\"\n\"Importer: Use tempfile for intermediate HTML file for Pandoc `(#3221) \"\n\"<https://github.com/getpelican/pelican/pull/3221>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:66 ac3ff1ef109f49898c54eb75bb9d4bf3\nmsgid \"\"\n\"Switch linters to Ruff `(#3223) \"\n\"<https://github.com/getpelican/pelican/pull/3223>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:69 87b5ee37dea84dce9c75361f533e8057\nmsgid \"4.8.0 - 2022-07-11\"\nmsgstr \"\"\n\n#: ../../changelog.rst:71 858d9945de86466eb1507d7859efc304\nmsgid \"\"\n\"Use JSON values for extra settings in Invoke tasks template `(#2994) \"\n\"<https://github.com/getpelican/pelican/pull/2994>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:72 ad022a2dbbe74c28ab78757f64791daa\nmsgid \"\"\n\"Add content tag for links, which can help with things like Twitter social\"\n\" cards `(#3001) <https://github.com/getpelican/pelican/pull/3001>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:73 889f590d0fda46dbb6a14336644f265e\nmsgid \"\"\n\"Improve word count behavior when generating summary `(#3002) \"\n\"<https://github.com/getpelican/pelican/pull/3002>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:76 c6c9bfd44396439c8e3a04b083dfc9b3\nmsgid \"4.7.2 - 2022-02-09\"\nmsgstr \"\"\n\n#: ../../changelog.rst:78 21432dcec96e438c8f21de585540e9b9\nmsgid \"\"\n\"Fix incorrect parsing of parameters specified via `-e` / `--extra-\"\n\"settings` option flags `(#2938) \"\n\"<https://github.com/getpelican/pelican/pull/2938>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:79 250cb0b205ea4bc091bcbfa18a688398\nmsgid \"\"\n\"Add ``categories.html`` template to default theme `(#2973) \"\n\"<https://github.com/getpelican/pelican/pull/2973>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:80 f404aaef8abe40d89a8394f71043767b\nmsgid \"\"\n\"Document how to use plugins to inject content `(#2922) \"\n\"<https://github.com/getpelican/pelican/pull/2922>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:83 ea47463991054e678639e2d5afee8733\nmsgid \"4.7.1 - 2021-10-12\"\nmsgstr \"\"\n\n#: ../../changelog.rst:85 52f38102dca542dcaa5e901ba9cff484\nmsgid \"\"\n\"Extend rich logging to server component `(#2927) \"\n\"<https://github.com/getpelican/pelican/pull/2927>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:86 e2f47cedaac946b6b3877063c1531849\nmsgid \"\"\n\"Fix an issue where metadata flagged to be discarded was being cached \"\n\"`(#2926) <https://github.com/getpelican/pelican/pull/2926>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:87 c7270f10045541f992ea76f9b8f938bc\nmsgid \"\"\n\"Adjust suffix in server to allow redirection when needed `(#2931) \"\n\"<https://github.com/getpelican/pelican/pull/2931>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:88 25eecc81230442e8be149c26afebcba8\nmsgid \"\"\n\"Add MIME types for web fonts `(#2929) \"\n\"<https://github.com/getpelican/pelican/pull/2929>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:89 28bdcfa53bcf4bf5908acd39b88b1264\nmsgid \"\"\n\"Distribute sample data used to run tests `(#2935) \"\n\"<https://github.com/getpelican/pelican/pull/2935>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:90 90855b72a6744760a57195ca0566401c\nmsgid \"Add Python 3.10 to test matrix\"\nmsgstr \"\"\n\n#: ../../changelog.rst:93 a5d1ee359c9a472bac01a3c953358994\nmsgid \"4.7.0 - 2021-10-01\"\nmsgstr \"\"\n\n#: ../../changelog.rst:95 1b28838f5000456aa396f8768c307102\nmsgid \"\"\n\"Improve default theme rendering on mobile and other small screen devices \"\n\"`(#2914) <https://github.com/getpelican/pelican/pull/2914>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:96 e080e2f741464f92b7d988da7e3dba5d\nmsgid \"\"\n\"Add support for hidden articles `(#2866) \"\n\"<https://github.com/getpelican/pelican/pull/2866>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:97 71036c834cc4480ba38566d039d9b50a\nmsgid \"\"\n\"Improve word count behavior when generating summary CJK & other locales \"\n\"`(#2864) <https://github.com/getpelican/pelican/pull/2864>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:98 dad2c8c0f0d84a4db5b0139e8dc4bec8\nmsgid \"\"\n\"Add progress spinner during generation `(#2869) \"\n\"<https://github.com/getpelican/pelican/pull/2869>`_ and richer logging \"\n\"`(#2897) <https://github.com/getpelican/pelican/pull/2897>`_, both via \"\n\"`Rich <https://github.com/willmcgugan/rich>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:100 ad420f41f0fb44809f0f88d2638ed6b9\nmsgid \"\"\n\"Invoke tasks ``serve`` and ``livereload`` now auto-open a web browser \"\n\"pointing to the locally-served web site `(#2764) \"\n\"<https://github.com/getpelican/pelican/pull/2764>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:101 34794ceaec054ec4b47706297e65a498\nmsgid \"\"\n\"Support some date format codes used by ISO dates `(#2902) \"\n\"<https://github.com/getpelican/pelican/pull/2902>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:102 cd9520f44e004be6a7d7fb27032d37a6\nmsgid \"\"\n\"Document how to add a new writer `(#2901) \"\n\"<https://github.com/getpelican/pelican/pull/2901>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:105 278990583126431793bd184ef69e4315\nmsgid \"4.6.0 - 2021-03-23\"\nmsgstr \"\"\n\n#: ../../changelog.rst:107 a7a02445adbd4dd58d066f6f8fa5810b\nmsgid \"\"\n\"Add new URL pattern to ``PAGINATION_PATTERNS`` for the last page in the \"\n\"list `(#1401) <https://github.com/getpelican/pelican/issues/1401>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:108 e5e2fd04bc8a40edb8a0d1c088a95708\nmsgid \"\"\n\"Speed up ``livereload`` Invoke task via caching `(#2847) \"\n\"<https://github.com/getpelican/pelican/pull/2847>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:109 e37a383072324f98a8f5698edab71384\nmsgid \"\"\n\"Ignore ``None`` return value from ``get_generators`` signal `(#2850) \"\n\"<https://github.com/getpelican/pelican/pull/2850>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:110 ea446fad671d4e1e8b3220a35ffe170b\nmsgid \"Relax dependency minimum versions and remove upper bounds\"\nmsgstr \"\"\n\n#: ../../changelog.rst:113 3e38341f147e414ba7b10c339d28a0d4\nmsgid \"4.5.4 - 2021-01-04\"\nmsgstr \"\"\n\n#: ../../changelog.rst:115 b4296b7abe7a411faedd991310af951f\nmsgid \"\"\n\"Replace plugin definitions in settings with string representations after \"\n\"registering, so they can be cached correctly `(#2828) \"\n\"<https://github.com/getpelican/pelican/issues/2828>`_.\"\nmsgstr \"\"\n\n#: ../../changelog.rst:118 7fc32eaefef846d28cd834cabfa8dee9\nmsgid \"4.5.3 - 2020-12-01\"\nmsgstr \"\"\n\n#: ../../changelog.rst:120 5e0db3263ddd42bca058026426cf06e6\nmsgid \"Fix a mistake made in PR #2821\"\nmsgstr \"\"\n\n#: ../../changelog.rst:123 1ef29d1cc4de42d1aa3c0c163df3514a\nmsgid \"4.5.2 - 2020-11-22\"\nmsgstr \"\"\n\n#: ../../changelog.rst:125 c7c77959e6d04be4a6a6c7ace8d64c0d\nmsgid \"Improve logging of generators and writer loaders\"\nmsgstr \"\"\n\n#: ../../changelog.rst:128 00572ddf9ed24457aedc3f744b684404\nmsgid \"4.5.1 - 2020-11-02\"\nmsgstr \"\"\n\n#: ../../changelog.rst:130 85d67c71b8664cf3900c982deba934b5\nmsgid \"\"\n\"Refactor intra-site link discovery in order to match more permissively \"\n\"`(#2646) <https://github.com/getpelican/pelican/issues/2646>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:131 0ae962176dac4745a0929eac1cb0a671\nmsgid \"\"\n\"Fix plugins running twice in auto-reload mode `(#2817) \"\n\"<https://github.com/getpelican/pelican/issues/2817>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:132 6c9d2b7c8f5c40d9830f38cc39807326\nmsgid \"\"\n\"Add notice to use ``from pelican import signals`` instead of ``import \"\n\"pelican.signals`` `(#2805) \"\n\"<https://github.com/getpelican/pelican/issues/2805>`_\"\nmsgstr \"\"\n\n#: ../../changelog.rst:135 cc543240f72d4e15bafa37e8cbe86c54\nmsgid \"4.5.0 - 2020-08-20\"\nmsgstr \"\"\n\n#: ../../changelog.rst:137 3b3db764e63f49c0b00d2b1cc71755f2\nmsgid \"Add namespace plugin support; list plugins via ``pelican-plugins`` command\"\nmsgstr \"\"\n\n#: ../../changelog.rst:138 ad62f8bcd989447e97326c5845ec146b\nmsgid \"Override settings via ``-e`` / ``--extra-settings`` CLI option flags\"\nmsgstr \"\"\n\n#: ../../changelog.rst:139 f12bccb1dc904d0bbffb0d9e5291ad3d\nmsgid \"Add settings for custom Jinja globals and tests\"\nmsgstr \"\"\n\n#: ../../changelog.rst:140 c569ff52ef904228971c38b1a958847f\nmsgid \"Customize article summary ellipsis via ``SUMMARY_END_SUFFIX`` setting\"\nmsgstr \"\"\n\n#: ../../changelog.rst:141 733087bf4e14447095fb364a1d5b606f\nmsgid \"Customize Typogrify dash handling via new ``TYPOGRIFY_DASHES`` setting\"\nmsgstr \"\"\n\n#: ../../changelog.rst:142 9e0de47310964a99bf1ec0a87f810036\nmsgid \"Support Unicode when generating slugs\"\nmsgstr \"\"\n\n#: ../../changelog.rst:143 c496a287d95b47759425578bc29d4cf3\nmsgid \"Support Asciidoc ``.adoc`` file generation in Pelican importer\"\nmsgstr \"\"\n\n#: ../../changelog.rst:144 1f8597af3f9946129cfb150e9728c25c\nmsgid \"Improve user experience when ``pelican --listen`` web server is quit\"\nmsgstr \"\"\n\n#: ../../changelog.rst:145 418a06eb1d9d4332945b5b1729734579\nmsgid \"Improve Invoke tasks template\"\nmsgstr \"\"\n\n#: ../../changelog.rst:146 8b63e2e5d29a4cde830ea8c1df058ab1\nmsgid \"Include tests in source distributions\"\nmsgstr \"\"\n\n#: ../../changelog.rst:147 68105e5e919a43518ac6af8b88957e44\nmsgid \"Switch CI from Travis to GitHub Actions\"\nmsgstr \"\"\n\n#: ../../changelog.rst:148 053f40c3741c4d54bc840f2ad32f34eb\nmsgid \"Remove support for Python 2.7\"\nmsgstr \"\"\n\n#: ../../changelog.rst:151 6190d59940dd4c57a603140e0813f9b5\nmsgid \"4.2.0 - 2019-10-17\"\nmsgstr \"\"\n\n#: ../../changelog.rst:153 5f11442743c841ff91d46b643698dfa9\nmsgid \"Support inline SVGs; don't treat titles in SVGs as HTML titles\"\nmsgstr \"\"\n\n#: ../../changelog.rst:154 a68bbd4f2a024c7a84c259aee8fcb621\nmsgid \"Add category to feeds (in addition to tags)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:155 dd3937b7cb38480a84e6a5daed48e113\nmsgid \"Improve content metadata field docs\"\nmsgstr \"\"\n\n#: ../../changelog.rst:156 87030fc248dc46e5902d3e7681702351\nmsgid \"Add docs for including other Markdown/reST files in content\"\nmsgstr \"\"\n\n#: ../../changelog.rst:159 85163f7808a64f7cac3dd54f98c2a2fd\nmsgid \"4.1.3 - 2019-10-09\"\nmsgstr \"\"\n\n#: ../../changelog.rst:161 486947a4cc584437aff9364d721eeb41\nmsgid \"Fix quick-start docs regarding ``pelican --listen``\"\nmsgstr \"\"\n\n#: ../../changelog.rst:162 cf68238f21bd40b081eb670527e5ad88\nmsgid \"Set default listen address to 127.0.0.1\"\nmsgstr \"\"\n\n#: ../../changelog.rst:163 21aed223e69549038ee7b840fe0e45a5\nmsgid \"Add extra/optional Markdown dependency to setup.py\"\nmsgstr \"\"\n\n#: ../../changelog.rst:164 5c5c50a24bf945babe1fea501be5b672\nmsgid \"Use correct SSH port syntax for rsync in tasks.py\"\nmsgstr \"\"\n\n#: ../../changelog.rst:165 cafa64aa81c94212a964ece5f6d00ea6\nmsgid \"Place all deprecated settings handling together\"\nmsgstr \"\"\n\n#: ../../changelog.rst:166 92ad7248e4d848f5b9955653a132ba1d\nmsgid \"Add related project URLs for display on PyPI\"\nmsgstr \"\"\n\n#: ../../changelog.rst:167 f97dcb0a8c6f41ca8e6a249f975688ab\nmsgid \"Skip some tests on Windows that can't pass due to filesystem differences\"\nmsgstr \"\"\n\n#: ../../changelog.rst:170 cb1b18c4628a48f3a7b59e4447057291\nmsgid \"4.1.2 - 2019-09-23\"\nmsgstr \"\"\n\n#: ../../changelog.rst:172 1cc7ba6aab5a43e9a3fbb04a8cf4c954\nmsgid \"Fix pelican.settings.load_source to avoid caching issues - PR #2621\"\nmsgstr \"\"\n\n#: ../../changelog.rst:175 808b70fac79147a7a30cb263bfc091d5\nmsgid \"4.1.1 - 2019-08-23\"\nmsgstr \"\"\n\n#: ../../changelog.rst:177 3515525c09794e3eb685696916e9b4a8\nmsgid \"Add AutoPub to auto-publish releases on PR merge\"\nmsgstr \"\"\n\n#: ../../changelog.rst:178 e3958153de2543ab8af7b27e424a5199\nmsgid \"Add CSS classes for reStructuredText figures\"\nmsgstr \"\"\n\n#: ../../changelog.rst:179 469aba039b0e4bb5b08bd7bc9fd455f9\nmsgid \"Pass ``argv`` to Pelican ``main`` entrypoint\"\nmsgstr \"\"\n\n#: ../../changelog.rst:180 08494f27a31149a8a4e662d7160d334a\nmsgid \"Set default content status to a blank string rather than ``None``\"\nmsgstr \"\"\n\n#: ../../changelog.rst:183 4e7e6da9e1a94e5886de5c7bb90da964\nmsgid \"4.1.0 - 2019-07-14\"\nmsgstr \"\"\n\n#: ../../changelog.rst:185 de8697dee456433f8fd5592c79dc1235\nmsgid \"Live browser reload upon changed files (provided via Invoke task)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:186 67db4943813d410386e77969e6aea98f\nmsgid \"Add ``pyproject.toml``, managed by Poetry\"\nmsgstr \"\"\n\n#: ../../changelog.rst:187 a6388203f3c44a31b2458bd0961c9e91\nmsgid \"Support for invoking ``python -m pelican``\"\nmsgstr \"\"\n\n#: ../../changelog.rst:188 b526c18ddea74343b14a62d3933c31db\nmsgid \"Add relative source path attribute to content\"\nmsgstr \"\"\n\n#: ../../changelog.rst:189 98e5827380d24bb2b640c709ee1fa5bf\nmsgid \"Allow directories in ``EXTRA_PATH_METADATA``\"\nmsgstr \"\"\n\n#: ../../changelog.rst:190 7372879d036e4c19967f008fed50bcfb\nmsgid \"\"\n\"Add ``all_articles`` variable to period pages (for recent posts \"\n\"functionality)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:191 8b41c0640e9a4c4ca9458eea777c6c72\nmsgid \"Improve debug mode output\"\nmsgstr \"\"\n\n#: ../../changelog.rst:192 00af35668b044b6da9e934104b73eac9\nmsgid \"Remove blank or duplicate summaries from Atom feed\"\nmsgstr \"\"\n\n#: ../../changelog.rst:193 97c5594b58d94c45ada8a9efdb2216c8\nmsgid \"\"\n\"Fix bugs in pagination, pelican-import, pelican-quickstart, and feed \"\n\"importer\"\nmsgstr \"\"\n\n#: ../../changelog.rst:196 496531289a9c446c97d5e1842e5761f9\nmsgid \"4.0.1 (2018-11-30)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:198 48f43697fb824914a518283bab0ab39d\nmsgid \"Refactor ``pelican.server`` logging\"\nmsgstr \"\"\n\n#: ../../changelog.rst:199 7f431162613848738f2267518e0f435e\nmsgid \"Fix bug in which all static files were processed as \\\"draft\\\"\"\nmsgstr \"\"\n\n#: ../../changelog.rst:200 7c9866081cc0478aab4bcbb65f241b2b\nmsgid \"Bug fixes for Invoke/Makefile automation, Importer, and other miscellanea\"\nmsgstr \"\"\n\n#: ../../changelog.rst:202 b4f0a6a574f54e8baec02108e3cdf121\n#, python-brace-format, python-format\nmsgid \"\"\n\"If upgrading from 3.7.x or earlier, please note that slug-related \"\n\"settings in 4.0+ use ``{slug}`` and/or ``{lang}`` rather than ``%s``. If \"\n\"``%s``-style settings are encountered, Pelican will emit a warning and \"\n\"fall back to the default setting. Some user-submitted themes might try to\"\n\" format setting values but fail upon site build with a ``TypeError``. In \"\n\"such cases, the theme needs to be updated. For example, instead of \"\n\"``TAG_FEED_ATOM|format(tag.slug)``, use \"\n\"``TAG_FEED_ATOM.format(slug=tag.slug)``\"\nmsgstr \"\"\n\n#: ../../changelog.rst:211 963535bf97cb4048b11dd47fa7fe5cb1\nmsgid \"4.0.0 (2018-11-13)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:213 be207dbf17cc4c38ab4c8617ece18d43\nmsgid \"Replace ``develop_server.sh`` script with ``pelican --listen``\"\nmsgstr \"\"\n\n#: ../../changelog.rst:214 bfeb93e653cc44b4a6e65c1b5978e0d2\nmsgid \"Improved copy/link behavior for large static files (e.g., videos)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:215 0f6be38dbd8942c8a8692c377624a26a\n#, python-brace-format\nmsgid \"\"\n\"New ``{static}`` syntax to link to static content; content linked to by \"\n\"``{static}`` and ``{attach}`` is automatically copied over even if not in\"\n\" ``STATIC_PATHS``\"\nmsgstr \"\"\n\n#: ../../changelog.rst:218 6d42f604ef724c72b0d691d52cced384\nmsgid \"Pages can now have ``draft`` status\"\nmsgstr \"\"\n\n#: ../../changelog.rst:219 c6513f293ae04b9fb1cee4ef355de4bd\nmsgid \"Show current settings via new ``--print-settings`` flag\"\nmsgstr \"\"\n\n#: ../../changelog.rst:220 63636f2fc7184030bc83647b4f81d63a\n#, python-brace-format, python-format\nmsgid \"\"\n\"All settings for slugs now use ``{slug}`` and/or ``{lang}`` rather than \"\n\"``%s``. If ``%s``-style settings are encountered, Pelican will emit a \"\n\"warning and fallback to the default setting.\"\nmsgstr \"\"\n\n#: ../../changelog.rst:223 594a958f9f9c495c86c4eb15ee1d353e\nmsgid \"New signals: ``feed_generated`` and ``page_generated_write_page``\"\nmsgstr \"\"\n\n#: ../../changelog.rst:224 4c1a13c890d04aea9bdb43ba3a85f98e\nmsgid \"Replace Fabric with Invoke and ``fabfile.py`` template with ``tasks.py``\"\nmsgstr \"\"\n\n#: ../../changelog.rst:225 05c5bacea3de4d159dc464bb80d3b70d\nmsgid \"\"\n\"Replace ``PAGINATED_DIRECT_TEMPLATES`` by ``PAGINATED_TEMPLATES``, \"\n\"extending control over pagination to all templates and making page size \"\n\"variable\"\nmsgstr \"\"\n\n#: ../../changelog.rst:227 d4c57ccd147b409bafd324580546ce89\nmsgid \"\"\n\"Replace ``SLUG_SUBSTITUTIONS`` (and friends) by \"\n\"``SLUG_REGEX_SUBSTITUTIONS`` for more finegrained control\"\nmsgstr \"\"\n\n#: ../../changelog.rst:229 5fcdd3851c4348ffb6f9f30e21d01cca\n#, python-brace-format\nmsgid \"\"\n\"``'{base_name}'`` value in ``PAGINATION_PATTERNS`` setting no longer \"\n\"strips ``'bar'`` from ``'foo/bar.html'`` (unless ``'bar' == 'index'``).\"\nmsgstr \"\"\n\n#: ../../changelog.rst:231 f21a405be2434ee78cac35d1f653b6ba\nmsgid \"\"\n\"``ARTICLE_ORDER_BY`` and ``PAGE_ORDER_BY`` now also affect 1) category, \"\n\"tag and author pages 2) feeds 3) draft and hidden articles and pages\"\nmsgstr \"\"\n\n#: ../../changelog.rst:233 781dd286cb154c46a9e2036e697bcf7f\nmsgid \"\"\n\"New ``ARTICLE_TRANSLATION_ID`` and ``PAGE_TRANSLATION_ID`` settings to \"\n\"specify metadata attributes used to identify/disable translations\"\nmsgstr \"\"\n\n#: ../../changelog.rst:235 ae7fd53c1d6047eb8027016c4a00bd65\nmsgid \"Make the HTML reader parse multiple occurrences of metadata tags as a list\"\nmsgstr \"\"\n\n#: ../../changelog.rst:236 dca4b981c67c42a080e5724d65ddf825\nmsgid \"New Blogger XML backup importer\"\nmsgstr \"\"\n\n#: ../../changelog.rst:237 f92482bf76ec447186de98f4a471dd55\nmsgid \"\"\n\"Wordpress importer now updates file links to point to local copies if the\"\n\" files were downloaded with ``--wp-attach``.\"\nmsgstr \"\"\n\n#: ../../changelog.rst:239 0778a52f39704e629fed5df26deeaeb6\nmsgid \"\"\n\"Importer no longer inserts extra newlines, to prevent breaking of HTML \"\n\"attributes.\"\nmsgstr \"\"\n\n#: ../../changelog.rst:241 6b21bcb847014ebcb4e658aaf54fd591\nmsgid \"\"\n\"Pelican server now prioritises ``foo.html`` and ``foo/index.html`` over \"\n\"``foo/`` when resolving ``foo``.\"\nmsgstr \"\"\n\n#: ../../changelog.rst:245 d9c7906de4814a988e96a0f836121773\nmsgid \"3.7.1 (2017-01-10)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:247 dee875ace0cf4cf4a84e968613c64f1e\nmsgid \"Fix locale issues in Quickstart script\"\nmsgstr \"\"\n\n#: ../../changelog.rst:248 0735e4ab311648fba920ba433eb5c81b\nmsgid \"Specify encoding for README and CHANGELOG in setup.py\"\nmsgstr \"\"\n\n#: ../../changelog.rst:251 713d99ebaa1f446a857751b754b63677\nmsgid \"3.7.0 (2016-12-12)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:253 0330d842ba514f58965a9b625db18791\nmsgid \"Atom feeds output ``<content>`` in addition to ``<summary>``\"\nmsgstr \"\"\n\n#: ../../changelog.rst:254 7e5d0a914d214dbfb969b4e270f148c5\nmsgid \"\"\n\"Atom feeds use ``<published>`` for the original publication date and \"\n\"``<updated>`` for modifications\"\nmsgstr \"\"\n\n#: ../../changelog.rst:256 4f0ed4869e00418b8b16a7e692516126\nmsgid \"Simplify Atom feed ID generation and support URL fragments\"\nmsgstr \"\"\n\n#: ../../changelog.rst:257 cdc742c1ed2c44a1b76a5cf7374c1374\nmsgid \"Produce category feeds with category-specific titles\"\nmsgstr \"\"\n\n#: ../../changelog.rst:258 6a89fde3d1084e0d91e8b89b293a851c\nmsgid \"\"\n\"RSS feeds now default to summary instead of full content; set \"\n\"``RSS_FEED_SUMMARY_ONLY = False`` to revert to previous behavior\"\nmsgstr \"\"\n\n#: ../../changelog.rst:260 dbe1f00b9a114bf6a5e7728eb15cbfd2\nmsgid \"Replace ``MD_EXTENSIONS`` with ``MARKDOWN`` setting\"\nmsgstr \"\"\n\n#: ../../changelog.rst:261 e8d183ddfb3a4b2bbb4ccc523ff1ce4d\nmsgid \"\"\n\"Replace ``JINJA_EXTENSIONS`` with more-robust ``JINJA_ENVIRONMENT`` \"\n\"setting\"\nmsgstr \"\"\n\n#: ../../changelog.rst:262 c4044fb542ce4772bc469c06f3606f88\nmsgid \"\"\n\"Improve summary truncation logic to handle special characters and tags \"\n\"that span multiple lines, using HTML parser instead of regular \"\n\"expressions\"\nmsgstr \"\"\n\n#: ../../changelog.rst:264 6f6a8c2b60324ad6b00feb9f492c4d45\nmsgid \"Include summary when looking for intra-site link substitutions\"\nmsgstr \"\"\n\n#: ../../changelog.rst:265 e121d156b37b4f59a8846b700e1769ea\n#, python-brace-format\nmsgid \"Link to authors and index via ``{author}name`` and ``{index}`` syntax\"\nmsgstr \"\"\n\n#: ../../changelog.rst:266 1d210456ced542c1babb622b06b2c4f4\nmsgid \"Override widget names via ``LINKS_WIDGET_NAME`` and ``SOCIAL_WIDGET_NAME``\"\nmsgstr \"\"\n\n#: ../../changelog.rst:267 6104e9c05e844436b12e538008947f47\nmsgid \"Add ``INDEX_SAVE_AS`` option to override default ``index.html`` value\"\nmsgstr \"\"\n\n#: ../../changelog.rst:268 0f875978cade45889a49f818c6664093\nmsgid \"Remove ``PAGES`` context variable for themes in favor of ``pages``\"\nmsgstr \"\"\n\n#: ../../changelog.rst:269 bd6d148038524dbd8889ef4479115f15\nmsgid \"\"\n\"``SLUG_SUBSTITUTIONS`` now accepts 3-tuple elements, allowing URL slugs \"\n\"to contain non-alphanumeric characters\"\nmsgstr \"\"\n\n#: ../../changelog.rst:271 84e180ffd01640e39c8a02616d665f92\nmsgid \"\"\n\"Tag and category slugs can be controlled with greater precision using the\"\n\" ``TAG_SUBSTITUTIONS`` and ``CATEGORY_SUBSTITUTIONS`` settings\"\nmsgstr \"\"\n\n#: ../../changelog.rst:273 c42874e842584772a9c6abda4cf1d2b2\nmsgid \"\"\n\"Author slugs can be controlled with greater precision using the \"\n\"``AUTHOR_SUBSTITUTIONS`` setting\"\nmsgstr \"\"\n\n#: ../../changelog.rst:275 c3ad7f1d581d4a848a0d80425732faaa\nmsgid \"``DEFAULT_DATE`` can be defined as a string\"\nmsgstr \"\"\n\n#: ../../changelog.rst:276 28824188813542f08ef3546d48faeb4d\nmsgid \"Use ``mtime`` instead of ``ctime`` when ``DEFAULT_DATE = 'fs'``\"\nmsgstr \"\"\n\n#: ../../changelog.rst:277 4cbfd98d99134eaba723b0a98dd38fdd\nmsgid \"Add ``--fatal=errors|warnings`` option for use with continuous integration\"\nmsgstr \"\"\n\n#: ../../changelog.rst:278 e0346ee13c104f26a360952f415db7ca\nmsgid \"\"\n\"When using generator-level caching, ensure previously-cached files are \"\n\"processed instead of just new files.\"\nmsgstr \"\"\n\n#: ../../changelog.rst:280 3faa472e3d4440dfacb1e40b20cdbb36\nmsgid \"Add Python and Pelican version information to debug output\"\nmsgstr \"\"\n\n#: ../../changelog.rst:281 7ca51c4375d641d18777b07bedb86f2c\nmsgid \"Improve compatibility with Python 3.5\"\nmsgstr \"\"\n\n#: ../../changelog.rst:282 cf9b150420fa47369ff0c95e8edc002b\nmsgid \"Comply with and enforce PEP8 guidelines\"\nmsgstr \"\"\n\n#: ../../changelog.rst:283 889cf4339a4b4d8daf520a7fb9985d8b\nmsgid \"Replace tables in settings documentation with ``data::`` directives\"\nmsgstr \"\"\n\n#: ../../changelog.rst:286 586aeb301e8941fcb2171458f12ad198\nmsgid \"3.6.3 (2015-08-14)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:288 5499ed424969406c924c504f6f62f63e\nmsgid \"Fix permissions issue in release tarball\"\nmsgstr \"\"\n\n#: ../../changelog.rst:291 da9c552726b940a3b07c45b4233657ce\nmsgid \"3.6.2 (2015-08-01)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:293 d29fcc033a634d8aac8f656c5eb9674f\nmsgid \"Fix installation errors related to Unicode in tests\"\nmsgstr \"\"\n\n#: ../../changelog.rst:294 1276e0c3d1a9447d84e25c3ad9e7abe7\nmsgid \"Don't show pagination in ``notmyidea`` theme if there's only one page\"\nmsgstr \"\"\n\n#: ../../changelog.rst:295 c12da2ed75d64539af457cd49216fd7b\nmsgid \"Make hidden pages available in context\"\nmsgstr \"\"\n\n#: ../../changelog.rst:296 22195be7d66d49b5a2536d4125dbb247\nmsgid \"Improve URLWrapper comparison\"\nmsgstr \"\"\n\n#: ../../changelog.rst:299 3fa9c04278aa4a6daaaacf03bcbc86c4\nmsgid \"3.6.0 (2015-06-15)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:301 743e2686d8584c64bba2ff52de34b282\nmsgid \"Disable caching by default in order to prevent potential confusion\"\nmsgstr \"\"\n\n#: ../../changelog.rst:302 5b7083ceed2642178328e7faf6c2e3d7\nmsgid \"Improve caching behavior, replacing ``pickle`` with ``cpickle``\"\nmsgstr \"\"\n\n#: ../../changelog.rst:303 de23594147fd4549af0d010d938b04b1\nmsgid \"Allow Markdown or reST content in metadata fields other than ``summary``\"\nmsgstr \"\"\n\n#: ../../changelog.rst:304 7d11607580c449709f22c3a7f1dd8cf1\nmsgid \"Support semicolon-separated author/tag lists\"\nmsgstr \"\"\n\n#: ../../changelog.rst:305 1b78213ac5644a09b8d58bac7c132b30\nmsgid \"Improve flexibility of article sorting\"\nmsgstr \"\"\n\n#: ../../changelog.rst:306 24fc473a1dcc409fbceb231cc61bf0db\nmsgid \"Add ``--relative-urls`` argument\"\nmsgstr \"\"\n\n#: ../../changelog.rst:307 a56f975051ca406b8ba80ed2b688316e\nmsgid \"Support devserver listening on addresses other than localhost\"\nmsgstr \"\"\n\n#: ../../changelog.rst:308 e1c6f89208aa43768200ae0b5cb667e4\nmsgid \"Unify HTTP server handlers to ``pelican.server`` throughout\"\nmsgstr \"\"\n\n#: ../../changelog.rst:309 c2543badc27243f1aadd684351852866\nmsgid \"Handle intra-site links to draft posts\"\nmsgstr \"\"\n\n#: ../../changelog.rst:310 3c111a7e2c7b43c683c7bef6a78058a7\nmsgid \"Move ``tag_cloud`` from core to plugin\"\nmsgstr \"\"\n\n#: ../../changelog.rst:311 5e8d38af8ae647ba80edfb065967c18a\nmsgid \"Load default theme's external resources via HTTPS\"\nmsgstr \"\"\n\n#: ../../changelog.rst:312 8577b7a1315f4c0caa8a68379c7b9da6\nmsgid \"Import drafts from WordPress XML\"\nmsgstr \"\"\n\n#: ../../changelog.rst:313 e2debaa9a5224d09af847e937c1446a6\nmsgid \"Improve support for Windows users\"\nmsgstr \"\"\n\n#: ../../changelog.rst:314 b2042bbb92e74fe5ae51df03addf61da\nmsgid \"Enhance logging and test suite\"\nmsgstr \"\"\n\n#: ../../changelog.rst:315 373b2ce42e7b4b10b4302660f177b137\nmsgid \"Clean up and refactor codebase\"\nmsgstr \"\"\n\n#: ../../changelog.rst:316 ad174f831fc7487c9efec8f1b1ebc937\nmsgid \"New signals: ``all_generators_finalized`` and ``page_writer_finalized``\"\nmsgstr \"\"\n\n#: ../../changelog.rst:319 a0e616e94c144183bb7cd8f0d0f9f253\nmsgid \"3.5.0 (2014-11-04)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:321 d4c1d004789b4cfa9187a2994e2f3613\nmsgid \"\"\n\"Introduce ``ARTICLE_ORDER_BY`` and ``PAGE_ORDER_BY`` settings to control \"\n\"the order of articles and pages.\"\nmsgstr \"\"\n\n#: ../../changelog.rst:323 8532ec7e6c884d6d886c75690a860810\nmsgid \"Include time zone information in dates rendered in templates.\"\nmsgstr \"\"\n\n#: ../../changelog.rst:324 399b4302a06c4d71853eb69309edaec9\nmsgid \"Expose the reader name in the metadata for articles and pages.\"\nmsgstr \"\"\n\n#: ../../changelog.rst:325 03f44d912342475d981539bfc28e893b\n#, python-brace-format\nmsgid \"\"\n\"Add the ability to store static files along with content in the same \"\n\"directory as articles and pages using ``{attach}`` in the path.\"\nmsgstr \"\"\n\n#: ../../changelog.rst:327 aad755538ae5458bb0266537ce3a3488\nmsgid \"\"\n\"Prevent Pelican from raising an exception when there are duplicate pieces\"\n\" of metadata in a Markdown file.\"\nmsgstr \"\"\n\n#: ../../changelog.rst:329 6ccca5efc34c43fc9e6549ce27d07b1a\nmsgid \"\"\n\"Introduce the ``TYPOGRIFY_IGNORE_TAGS`` setting to add HTML tags to be \"\n\"ignored by Typogrify.\"\nmsgstr \"\"\n\n#: ../../changelog.rst:331 3a07ce5e47fb446f935a8aef182feda9\n#, python-format\nmsgid \"\"\n\"Add the ability to use ``-`` in date formats to strip leading zeros. For \"\n\"example, ``%-d/%-m/%y`` will now result in the date ``9/8/12``.\"\nmsgstr \"\"\n\n#: ../../changelog.rst:333 2b9865f51d2c431cad79bb1ad85dcf13\nmsgid \"\"\n\"Ensure feed generation is correctly disabled during quickstart \"\n\"configuration.\"\nmsgstr \"\"\n\n#: ../../changelog.rst:334 900fd70063554c06b56e0c13084c5e56\nmsgid \"\"\n\"Fix ``PAGE_EXCLUDES`` and ``ARTICLE_EXCLUDES`` from incorrectly matching \"\n\"sub-directories.\"\nmsgstr \"\"\n\n#: ../../changelog.rst:336 bef97ccdcc354bf68f7a738fefee44d0\nmsgid \"Introduce ``STATIC_EXCLUDE`` setting to add static file excludes.\"\nmsgstr \"\"\n\n#: ../../changelog.rst:337 96218c06cbc84b9884f17d4b3c2782d4\nmsgid \"\"\n\"Fix an issue when using ``PAGINATION_PATTERNS`` while ``RELATIVE_URLS`` \"\n\"is enabled.\"\nmsgstr \"\"\n\n#: ../../changelog.rst:339 0c2ccbc6e9e74f69912fecf3a9812535\nmsgid \"\"\n\"Fix feed generation causing links to use the wrong language for month \"\n\"names when using other locales.\"\nmsgstr \"\"\n\n#: ../../changelog.rst:341 ddc6d5315bfa4dd1888de8ff606e1efe\nmsgid \"\"\n\"Fix an issue where the authors list in the simple template wasn't \"\n\"correctly formatted.\"\nmsgstr \"\"\n\n#: ../../changelog.rst:343 28013aa7b4734809bd162e47c5bded8f\nmsgid \"Fix an issue when parsing non-string URLs from settings.\"\nmsgstr \"\"\n\n#: ../../changelog.rst:344 4fe13830f2ed4449820e4a126e29db74\nmsgid \"Improve consistency of debug and warning messages.\"\nmsgstr \"\"\n\n#: ../../changelog.rst:347 e412e8ca8ce94736a1bd9b64260a17c7\nmsgid \"3.4.0 (2014-07-01)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:349 1153f4eed1394ce3a12d65af79337222\nmsgid \"Speed up content generation via new caching mechanism\"\nmsgstr \"\"\n\n#: ../../changelog.rst:350 78911d6e2e8f43ce879ae634815c16a4\nmsgid \"Add selective post generation (instead of always building entire site)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:351 4fe3d9df73aa40f986e1a6f7602c3b09\nmsgid \"Many documentation improvements, including switching to prettier RtD theme\"\nmsgstr \"\"\n\n#: ../../changelog.rst:352 517fbe1c874c48c2ab429e1ea5633fe3\nmsgid \"Add support for multiple content and plugin paths\"\nmsgstr \"\"\n\n#: ../../changelog.rst:353 ebcfb3cf3a3a4841a4e144fa186ab023\nmsgid \"\"\n\"Add ``:modified:`` metadata field to complement ``:date:``. Used to \"\n\"specify the last date and time an article was updated independently from \"\n\"the date and time it was published.\"\nmsgstr \"\"\n\n#: ../../changelog.rst:356 350a9e23a1e24e8d927ea35835b92ca0\nmsgid \"Add support for multiple authors via new ``:authors:`` metadata field\"\nmsgstr \"\"\n\n#: ../../changelog.rst:357 0b0f1d5303444f29990c75b5e071be14\nmsgid \"Watch for changes in static directories when in auto-regeneration mode\"\nmsgstr \"\"\n\n#: ../../changelog.rst:358 29aafd6e485d45188d102fdb72feaafe\nmsgid \"Add filters to limit log output when desired\"\nmsgstr \"\"\n\n#: ../../changelog.rst:359 a77cea47df51490595f9ee1b8e05fdd1\nmsgid \"Add language support to drafts\"\nmsgstr \"\"\n\n#: ../../changelog.rst:360 4bd686906beb45ddab847c0cdac33be8\nmsgid \"Add ``SLUGIFY_SOURCE`` setting to control how post slugs are generated\"\nmsgstr \"\"\n\n#: ../../changelog.rst:361 6ce9976300e64d7dadb2048080424994\nmsgid \"Fix many issues relating to locale and encoding\"\nmsgstr \"\"\n\n#: ../../changelog.rst:362 da577863fe4844d9b74218625a26f6ad\nmsgid \"Apply Typogrify filter to post summary\"\nmsgstr \"\"\n\n#: ../../changelog.rst:363 faa72319441d4e8698e29c1bf829189f\nmsgid \"\"\n\"Preserve file metadata (e.g. time stamps) when copying static files to \"\n\"output\"\nmsgstr \"\"\n\n#: ../../changelog.rst:364 d2b92229d5494bea903ad60e6a5c8335\nmsgid \"Move AsciiDoc support from Pelican core into separate plugin\"\nmsgstr \"\"\n\n#: ../../changelog.rst:365 61a9b4aa9cb44033b2f4229d2b167c64\nmsgid \"\"\n\"Produce inline links instead of reference-style links when importing \"\n\"content\"\nmsgstr \"\"\n\n#: ../../changelog.rst:366 d94f8c5cce634cc8ba784a3b59fb4819\nmsgid \"Improve handling of ``IGNORE_FILES`` setting behavior\"\nmsgstr \"\"\n\n#: ../../changelog.rst:367 e3d657b677384a4588da385c9b21080a\nmsgid \"Properly escape symbol characters in tag names (e.g., ``C++``)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:368 d519c9f50e564647987ec969d7ec0ccf\nmsgid \"Minor tweaks for Python 3.4 compatibility\"\nmsgstr \"\"\n\n#: ../../changelog.rst:369 5ce6f5c727f447c9a432d1fd363e2c29\nmsgid \"Add several new signals\"\nmsgstr \"\"\n\n#: ../../changelog.rst:372 dae29c0187c44c27972be55b01c69ef8\nmsgid \"3.3.0 (2013-09-24)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:374 17fad8c0afd94ba5a3b660e70b74a282\nmsgid \"Drop Python 3.2 support in favor of Python 3.3\"\nmsgstr \"\"\n\n#: ../../changelog.rst:375 ad9c00a4712845a9a13423e6b9b02a92\nmsgid \"\"\n\"Add ``Fabfile`` so Fabric can be used for workflow automation instead of \"\n\"Make\"\nmsgstr \"\"\n\n#: ../../changelog.rst:376 cd23162f223245a685ff1a9881b8b195\nmsgid \"\"\n\"``OUTPUT_RETENTION`` setting can be used to preserve metadata (e.g., VCS \"\n\"data such as ``.hg`` and ``.git``) from being removed from output \"\n\"directory\"\nmsgstr \"\"\n\n#: ../../changelog.rst:378 2d4af689970445558506be64942cda4d\nmsgid \"Tumblr import\"\nmsgstr \"\"\n\n#: ../../changelog.rst:379 94cb151962db4a4186070048cf9a52d1\nmsgid \"Improve logic and consistency when cleaning output folder\"\nmsgstr \"\"\n\n#: ../../changelog.rst:380 4f24e4305c8f49baba762604f81a009b\nmsgid \"Improve documentation versioning and release automation\"\nmsgstr \"\"\n\n#: ../../changelog.rst:381 fd8868d0c4ee4ec5b998c117e60fe784\nmsgid \"Improve pagination flexibility\"\nmsgstr \"\"\n\n#: ../../changelog.rst:382 eb2be9edbc6e470f952a97cac0a8c012\nmsgid \"\"\n\"Rename signals for better consistency (some plugins may need to be \"\n\"updated)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:383 89f9707a3d1e443389b024a5bc34f87e\nmsgid \"\"\n\"Move metadata extraction from generators to readers; metadata extraction \"\n\"no longer article-specific\"\nmsgstr \"\"\n\n#: ../../changelog.rst:385 41bb6f6c43cd493ab89c900de7aa6628\nmsgid \"\"\n\"Deprecate ``FILES_TO_COPY`` in favor of ``STATIC_PATHS`` and \"\n\"``EXTRA_PATH_METADATA``\"\nmsgstr \"\"\n\n#: ../../changelog.rst:387 86a7dff5bc8645c3be130a8ae4add149\nmsgid \"Summaries in Markdown posts no longer include footnotes\"\nmsgstr \"\"\n\n#: ../../changelog.rst:388 009790743d7f42ba8278f18c392db041\nmsgid \"\"\n\"Remove unnecessary whitespace in output via ``lstrip_blocks`` Jinja \"\n\"parameter\"\nmsgstr \"\"\n\n#: ../../changelog.rst:389 38b06c9a766c4c93b6d8e2869a5b3711\nmsgid \"Move PDF generation from core to plugin\"\nmsgstr \"\"\n\n#: ../../changelog.rst:390 bb68b5bb0de84b9abfcd65987be9c368\nmsgid \"Replace ``MARKUP`` setting with ``READERS``\"\nmsgstr \"\"\n\n#: ../../changelog.rst:391 4a0c9f70f0f24261a597ce1b155e0800\nmsgid \"Add warning if img tag is missing ``alt`` attribute\"\nmsgstr \"\"\n\n#: ../../changelog.rst:392 dcabdeff1f5e4ee69292730bb31c9131\n#, python-brace-format\nmsgid \"Add support for ``{}`` in relative links syntax, besides ``||``\"\nmsgstr \"\"\n\n#: ../../changelog.rst:393 9fde536f5fca40e6a620b5f07049a0c3\n#, python-brace-format\nmsgid \"Add support for ``{tag}`` and ``{category}`` relative links\"\nmsgstr \"\"\n\n#: ../../changelog.rst:394 b241cd3f2847484bb7a56631c58d5ba4\nmsgid \"Add a ``content_written`` signal\"\nmsgstr \"\"\n\n#: ../../changelog.rst:397 b6077687c2a64ddeafa187b1448c048f\nmsgid \"3.2.1 and 3.2.2\"\nmsgstr \"\"\n\n#: ../../changelog.rst:399 bf6c37fc7c2e47f0aee3ee9cb0cb5306\nmsgid \"Facilitate inclusion in FreeBSD Ports Collection\"\nmsgstr \"\"\n\n#: ../../changelog.rst:402 3e800dbf3fe24766b77a043bc8da3c09\nmsgid \"3.2 (2013-04-24)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:404 17cb561f2e184679831d2e3ac7eda3de\nmsgid \"Support for Python 3!\"\nmsgstr \"\"\n\n#: ../../changelog.rst:405 faee303362bb40ad952cc4581036f070\nmsgid \"\"\n\"Override page save-to location from meta-data (enables using a static \"\n\"page as the site's home page, for example)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:407 3fc6523eaace489494b61380def294d1\nmsgid \"Time period archives (per-year, per-month, and per-day archives of posts)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:408 3eafb73945bf414cbcb903a9695ff8de\nmsgid \"Posterous blog import\"\nmsgstr \"\"\n\n#: ../../changelog.rst:409 cc3982d7a21146319745d929a38b43d9\nmsgid \"Improve WordPress blog import\"\nmsgstr \"\"\n\n#: ../../changelog.rst:410 165fdfe5bfe1415c8b6cd56af637f3d4\nmsgid \"Migrate plugins to separate repository\"\nmsgstr \"\"\n\n#: ../../changelog.rst:411 2f62212ada534de6ade55404aae98383\nmsgid \"Improve HTML parser\"\nmsgstr \"\"\n\n#: ../../changelog.rst:412 66b0bf3a2b4a47c78a5a936c80c0e4fb\nmsgid \"\"\n\"Provide ability to show or hide categories from menu using \"\n\"``DISPLAY_CATEGORIES_ON_MENU`` option\"\nmsgstr \"\"\n\n#: ../../changelog.rst:414 d316333413c3459f803d9ec694450dab\nmsgid \"Auto-regeneration can be told to ignore files via ``IGNORE_FILES`` setting\"\nmsgstr \"\"\n\n#: ../../changelog.rst:415 7a199ee7396d485aaa55496b32e8a5c0\nmsgid \"Improve post-generation feedback to user\"\nmsgstr \"\"\n\n#: ../../changelog.rst:416 6deb9ccecfab4fcba7157680ce6a35b9\nmsgid \"\"\n\"For multilingual posts, use meta-data to designate which is the original \"\n\"and which is the translation\"\nmsgstr \"\"\n\n#: ../../changelog.rst:418 be2051f4c2304904b3264bd61da6bb3b\nmsgid \"Add ``.mdown`` to list of supported Markdown file extensions\"\nmsgstr \"\"\n\n#: ../../changelog.rst:419 be4c498c73604b7289bd908490b820fe\nmsgid \"Document-relative URL generation (``RELATIVE_URLS``) is now off by default\"\nmsgstr \"\"\n\n#: ../../changelog.rst:422 26c902ee59b54f5199b53dbd841981ce\nmsgid \"3.1 (2012-12-04)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:424 1dce4c50db964039b0d0b4a27e19ce96\nmsgid \"\"\n\"Importer now stores slugs within files by default. This can be disabled \"\n\"with the ``--disable-slugs`` option.\"\nmsgstr \"\"\n\n#: ../../changelog.rst:426 247f3c4937844361a98a9bbc557774cb\nmsgid \"Improve handling of links to intra-site resources\"\nmsgstr \"\"\n\n#: ../../changelog.rst:427 baf6646be1424810853be748d7a15129\nmsgid \"\"\n\"Ensure WordPress import adds paragraphs for all types of line endings in \"\n\"post content\"\nmsgstr \"\"\n\n#: ../../changelog.rst:429 4cefab609bb64186a2f597cedad65b61\nmsgid \"Decode HTML entities within WordPress post titles on import\"\nmsgstr \"\"\n\n#: ../../changelog.rst:430 8b1e222311f749a5b50858f0dc34466d\nmsgid \"Improve appearance of LinkedIn icon in default theme\"\nmsgstr \"\"\n\n#: ../../changelog.rst:431 bd4f42ac16a040d6b0e5cb1e9f5d5977\nmsgid \"Add GitHub and Google+ social icons support in default theme\"\nmsgstr \"\"\n\n#: ../../changelog.rst:432 d65513f7ff4d4294a5a4b755f6aa65c4\nmsgid \"Optimize social icons\"\nmsgstr \"\"\n\n#: ../../changelog.rst:433 9c930d0296f9464490df06094597739f\nmsgid \"\"\n\"Add ``FEED_ALL_ATOM`` and ``FEED_ALL_RSS`` to generate feeds containing \"\n\"all posts regardless of their language\"\nmsgstr \"\"\n\n#: ../../changelog.rst:435 c3c18b3ea6ce4a24abb55abd44b7164f\nmsgid \"\"\n\"Split ``TRANSLATION_FEED`` into ``TRANSLATION_FEED_ATOM`` and \"\n\"``TRANSLATION_FEED_RSS``\"\nmsgstr \"\"\n\n#: ../../changelog.rst:437 9994413cfc6347fd8b9879e117b2b889\nmsgid \"Different feeds can now be enabled/disabled individually\"\nmsgstr \"\"\n\n#: ../../changelog.rst:438 ca5c45416f784c87bed555ace354af21\n#, python-brace-format\nmsgid \"\"\n\"Allow for blank author: if ``AUTHOR`` setting is not set, author won't \"\n\"default to ``${USER}`` anymore, and a post won't contain any author \"\n\"information if the post author is empty\"\nmsgstr \"\"\n\n#: ../../changelog.rst:441 5270ac00aa8f4f2d98f2a3a57a6bf03c\nmsgid \"Move LESS and Webassets support from Pelican core to plugin\"\nmsgstr \"\"\n\n#: ../../changelog.rst:442 a8e64d393d0a4e3195dbdc1215302f9c\nmsgid \"\"\n\"The ``DEFAULT_DATE`` setting now defaults to ``None``, which means that \"\n\"articles won't be generated unless date metadata is specified\"\nmsgstr \"\"\n\n#: ../../changelog.rst:444 e9d682bcd1de45f3a1a98ae17193aced\nmsgid \"\"\n\"Add ``FILENAME_METADATA`` setting to support metadata extraction from \"\n\"filename\"\nmsgstr \"\"\n\n#: ../../changelog.rst:446 fe3a4d2bc15d4b4fba48fc8af3569336\nmsgid \"\"\n\"Add ``gzip_cache`` plugin to compress common text files into a ``.gz`` \"\n\"file within the same directory as the original file, preventing the \"\n\"server (e.g. Nginx) from having to compress files during an HTTP call\"\nmsgstr \"\"\n\n#: ../../changelog.rst:449 c44353005d5d4e1293cc9a1878517726\nmsgid \"Add support for AsciiDoc-formatted content\"\nmsgstr \"\"\n\n#: ../../changelog.rst:450 dcdc1aff409544f1b60d7c22a7a41b6b\nmsgid \"\"\n\"Add ``USE_FOLDER_AS_CATEGORY`` setting so that feature can be toggled \"\n\"on/off\"\nmsgstr \"\"\n\n#: ../../changelog.rst:451 f6675e347a114c75a3952ef5ef5f1e29\nmsgid \"Support arbitrary Jinja template files\"\nmsgstr \"\"\n\n#: ../../changelog.rst:452 87ba44c075b144ee8c4734e4f6f4e4c9\nmsgid \"Restore basic functional tests\"\nmsgstr \"\"\n\n#: ../../changelog.rst:453 0354818a87df49e59ac35a7d738c8e83\nmsgid \"\"\n\"New signals: ``generator_init``, ``get_generators``, and \"\n\"``article_generate_preread``\"\nmsgstr \"\"\n\n#: ../../changelog.rst:457 1256b71b526e43dbb94823c0604f0bc6\nmsgid \"3.0 (2012-08-08)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:459 e79ee10015eb41fea71877bff6453a0b\nmsgid \"Refactored the way URLs are handled\"\nmsgstr \"\"\n\n#: ../../changelog.rst:460 f41008aff59344b0a964a38304c8f27d\nmsgid \"Improved the English documentation\"\nmsgstr \"\"\n\n#: ../../changelog.rst:461 9cfcf344ed0d41c0aa20d2e4178de487\nmsgid \"Fixed packaging using ``setuptools`` entrypoints\"\nmsgstr \"\"\n\n#: ../../changelog.rst:462 75d4a7f700424bb69bd8fbba899fe5f2\nmsgid \"Added ``typogrify`` support\"\nmsgstr \"\"\n\n#: ../../changelog.rst:463 e9e8e0933822437381e4a099118d17a8\nmsgid \"Added a way to disable feed generation\"\nmsgstr \"\"\n\n#: ../../changelog.rst:464 c9746121791347a18725b210eb69fca6\nmsgid \"Added support for ``DIRECT_TEMPLATES``\"\nmsgstr \"\"\n\n#: ../../changelog.rst:465 84b68057366c4c1eb56502f64a42bb73\nmsgid \"Allow multiple extensions for content files\"\nmsgstr \"\"\n\n#: ../../changelog.rst:466 36450fadc3a1446898365333ebd9a369\nmsgid \"Added LESS support\"\nmsgstr \"\"\n\n#: ../../changelog.rst:467 1e1d7cc4e8b647c1b9c5be55374c43f0\nmsgid \"Improved the import script\"\nmsgstr \"\"\n\n#: ../../changelog.rst:468 bbb3522bded542c9af30ade57961b005\nmsgid \"Added functional tests\"\nmsgstr \"\"\n\n#: ../../changelog.rst:469 06d82b81708d4234911c4552adb21aa3\nmsgid \"Rsync support in the generated Makefile\"\nmsgstr \"\"\n\n#: ../../changelog.rst:470 9e0ef37470e4457d91f43b9a7ceb77aa\nmsgid \"Improved feed support (easily pluggable with Feedburner for instance)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:471 5a84812ef2d440b5953327383ac064ed\nmsgid \"Added support for ``abbr`` in reST\"\nmsgstr \"\"\n\n#: ../../changelog.rst:472 3e899ccc01a94cca8886244190cf5944\nmsgid \"Fixed a bunch of bugs :-)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:475 73ed385ee1c143dcb9d1f5a2aa21a101\nmsgid \"2.8 (2012-02-28)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:477 e037cd34f3af4d2c826ccc7a949f2df8\nmsgid \"Dotclear importer\"\nmsgstr \"\"\n\n#: ../../changelog.rst:478 994601f5041a465086869af70ae072dc\nmsgid \"Allow the usage of Markdown extensions\"\nmsgstr \"\"\n\n#: ../../changelog.rst:479 0830c593481e4e5ea1526f4d1a8848fa\nmsgid \"Themes are now easily extensible\"\nmsgstr \"\"\n\n#: ../../changelog.rst:480 3ff0b224c93e442684a1b686d8666ced\nmsgid \"Don't output pagination information if there is only one page\"\nmsgstr \"\"\n\n#: ../../changelog.rst:481 ec4ec66862df420caf61a32c472f972b\nmsgid \"Add a page per author, with all their articles\"\nmsgstr \"\"\n\n#: ../../changelog.rst:482 864df61f6eef43e4980bf957b14ac26e\nmsgid \"Improved the test suite\"\nmsgstr \"\"\n\n#: ../../changelog.rst:483 285e4cb5a43241558e3d2bf1876c0ee5\nmsgid \"Made the themes easier to extend\"\nmsgstr \"\"\n\n#: ../../changelog.rst:484 7597e818692d42039cffc1fb67513c52\nmsgid \"Removed Skribit support\"\nmsgstr \"\"\n\n#: ../../changelog.rst:485 867bceffc3cf431a919f92d33691870a\nmsgid \"Added a ``pelican-quickstart`` script\"\nmsgstr \"\"\n\n#: ../../changelog.rst:486 bdbf4396e57242af8f2be7c4c20ea455\nmsgid \"Fixed timezone-related issues\"\nmsgstr \"\"\n\n#: ../../changelog.rst:487 2a8752a2c1d14916aa78eaf4878db4f9\nmsgid \"Added some scripts for Windows support\"\nmsgstr \"\"\n\n#: ../../changelog.rst:488 67d470d30d8d41d38022c6a7024f3c62\nmsgid \"Date can be specified in seconds\"\nmsgstr \"\"\n\n#: ../../changelog.rst:489 fcdf6b71286b4951ac69786e590c7649\nmsgid \"Never fail when generating posts (skip and continue)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:490 9cba8ad7120b4ea0bdd385d5facb119f\nmsgid \"Allow the use of future dates\"\nmsgstr \"\"\n\n#: ../../changelog.rst:491 4ded329080034fac931b6be8f801ce2d\nmsgid \"Support having different timezones per language\"\nmsgstr \"\"\n\n#: ../../changelog.rst:492 5a5f49be18c449fba6a8aeaa2b36b14e\nmsgid \"Enhanced the documentation\"\nmsgstr \"\"\n\n#: ../../changelog.rst:495 d49c481caef348f59c74d194bcca6579\nmsgid \"2.7 (2011-06-11)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:497 7d8c241cc73642d8a5214b44dcfe30ca\nmsgid \"Use ``logging`` rather than echoing to stdout\"\nmsgstr \"\"\n\n#: ../../changelog.rst:498 670a6095a13c4970aac3016915813b9c\nmsgid \"Support custom Jinja filters\"\nmsgstr \"\"\n\n#: ../../changelog.rst:499 be2c4c82052b4cb48e02ca0dca49eeb6\nmsgid \"Compatibility with Python 2.5\"\nmsgstr \"\"\n\n#: ../../changelog.rst:500 773398476e4d45df89d7d958d2e496e6\nmsgid \"Added a theme manager\"\nmsgstr \"\"\n\n#: ../../changelog.rst:501 963c80928b8e4d92a9c549a4daa58cb9\nmsgid \"Packaged for Debian\"\nmsgstr \"\"\n\n#: ../../changelog.rst:502 c37c96fad3ad438395e73f2b2fdd5678\nmsgid \"Added draft support\"\nmsgstr \"\"\n\n#: ../../changelog.rst:505 7c215208f8a34f53ae0d22361f9305af\nmsgid \"2.6 (2011-03-08)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:507 deeb4eb9a00547bea54a8f4486cea948\nmsgid \"Changes in the output directory structure\"\nmsgstr \"\"\n\n#: ../../changelog.rst:508 5719cd5592b442549b860851c95ace8a\nmsgid \"Makes templates easier to work with / create\"\nmsgstr \"\"\n\n#: ../../changelog.rst:509 a14ed59f0b7d43b7b64033cbda6fa1b3\nmsgid \"Added RSS support (was Atom-only)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:510 2b78e48ee5c04ee88a19e82dd5736b08\nmsgid \"Added tag support for the feeds\"\nmsgstr \"\"\n\n#: ../../changelog.rst:511 129c8684dfe34773943a63f7294422dc\nmsgid \"Enhance the documentation\"\nmsgstr \"\"\n\n#: ../../changelog.rst:512 865503839227447ca15dae5cccbbd7f8\nmsgid \"Added another theme (brownstone)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:513 ecbde1d7724c445283ca769b43684207\nmsgid \"Added translations\"\nmsgstr \"\"\n\n#: ../../changelog.rst:514 6877cc6c1e92490fab2840698dadba59\nmsgid \"Added a way to use cleaner URLs with a rewrite url module (or equivalent)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:515 4b937b4f363b4bfd86d3447d61ac79e0\nmsgid \"Added a tag cloud\"\nmsgstr \"\"\n\n#: ../../changelog.rst:516 61ebc53121c34b96bb6edf9bd95b385e\nmsgid \"\"\n\"Added an autoreloading feature: the blog is automatically regenerated \"\n\"each time a modification is detected\"\nmsgstr \"\"\n\n#: ../../changelog.rst:518 79b3ebc425c64a60a5e9914da9e43752\nmsgid \"Translate the documentation into French\"\nmsgstr \"\"\n\n#: ../../changelog.rst:519 a1446ce9b3e147ac9926754b1db32746\nmsgid \"Import a blog from an RSS feed\"\nmsgstr \"\"\n\n#: ../../changelog.rst:520 0d427fc4738a447fbdae05b78559171e\nmsgid \"Pagination support\"\nmsgstr \"\"\n\n#: ../../changelog.rst:521 d70488ef9cea45db8389a99209fe9d9a\nmsgid \"Added Skribit support\"\nmsgstr \"\"\n\n#: ../../changelog.rst:524 ee9730d28c0a4e378618499401e1e399\nmsgid \"2.5 (2010-11-20)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:526 41764632aa2a46a9864a41bfa73b3d58\nmsgid \"Import from WordPress\"\nmsgstr \"\"\n\n#: ../../changelog.rst:527 b3ee93bdd46e4699adea39b8e99ba3c4\nmsgid \"Added some new themes (martyalchin / wide-notmyidea)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:528 1a023f24ad50438c947a0c980213819a\nmsgid \"First bug report!\"\nmsgstr \"\"\n\n#: ../../changelog.rst:529 573a4f64b2d2486f80416c4f98e5a3e4\nmsgid \"Linkedin support\"\nmsgstr \"\"\n\n#: ../../changelog.rst:530 c3c6ab49cad54f60a2f167abc9888764\nmsgid \"Added a FAQ\"\nmsgstr \"\"\n\n#: ../../changelog.rst:531 7cf0a7d9c46545dd81397ed03bcd542e\nmsgid \"Google Analytics support\"\nmsgstr \"\"\n\n#: ../../changelog.rst:532 de467a7c0a654db0a31ec42908c83b39\nmsgid \"Twitter support\"\nmsgstr \"\"\n\n#: ../../changelog.rst:533 455af156688d454f8dea6b8dcca0cb48\nmsgid \"Use relative URLs, not static ones\"\nmsgstr \"\"\n\n#: ../../changelog.rst:536 12dceabc363e493599eb83725eb0d891\nmsgid \"2.4 (2010-11-06)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:538 0d24870c616a4d02a6e23758a1022a0c\nmsgid \"Minor themes changes\"\nmsgstr \"\"\n\n#: ../../changelog.rst:539 4d8d6c48d9824e258c6789afe95ffb4e\nmsgid \"Add Disqus support (so we have comments)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:540 74cd4df65f8b41a1967033aedead1c87\nmsgid \"Another code refactoring\"\nmsgstr \"\"\n\n#: ../../changelog.rst:541 a44c01fa1c1242ab86a6ab32851e0284\nmsgid \"Added config settings about pages\"\nmsgstr \"\"\n\n#: ../../changelog.rst:542 c4519c5267eb4606b7f5de643028429e\nmsgid \"Blog entries can also be generated in PDF\"\nmsgstr \"\"\n\n#: ../../changelog.rst:545 7164d3eacbd946c8a317dc16929ba48d\nmsgid \"2.3 (2010-10-31)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:547 ca062e8a7c1a43f2a678bbfe22484d6a\nmsgid \"Markdown support\"\nmsgstr \"\"\n\n#: ../../changelog.rst:550 fc9a53b1a9034f809688d3c4114b412c\nmsgid \"2.2 (2010-10-30)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:552 121f2a61adc043a79c029fb4acc3ea0d\nmsgid \"Prettify output\"\nmsgstr \"\"\n\n#: ../../changelog.rst:553 f6a56a02617e458089148229dd92bd08\nmsgid \"Manages static pages as well\"\nmsgstr \"\"\n\n#: ../../changelog.rst:556 c4d2a7150f2a46f7a87e1d810777b5be\nmsgid \"2.1 (2010-10-30)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:558 739f08f2d6a746199390e3809f4a27f1\nmsgid \"Make notmyidea the default theme\"\nmsgstr \"\"\n\n#: ../../changelog.rst:561 2596c0b20ea947a5845cd92f3190f32e\nmsgid \"2.0 (2010-10-30)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:563 a023ea05a0864c2085b91526bfa23554\nmsgid \"Refactoring to be more extensible\"\nmsgstr \"\"\n\n#: ../../changelog.rst:564 a411e0742c7a4751b1b5d8f7848cbf2b\nmsgid \"Change into the setting variables\"\nmsgstr \"\"\n\n#: ../../changelog.rst:567 d8933a28653242fc942087162ac6a4c9\nmsgid \"1.2 (2010-09-28)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:569 66415309e0d64d06a490ecaef4efb36d\nmsgid \"Added a debug option\"\nmsgstr \"\"\n\n#: ../../changelog.rst:570 ceaef7c8b0fe4df79600738d71b8d094\nmsgid \"Added per-category feeds\"\nmsgstr \"\"\n\n#: ../../changelog.rst:571 6bac9fd70e104b28bfd06a936d71e32a\nmsgid \"Use filesystem to get dates if no metadata is provided\"\nmsgstr \"\"\n\n#: ../../changelog.rst:572 1f663ceee61b4c0595834cc72a9e3e7d\nmsgid \"Add Pygments support\"\nmsgstr \"\"\n\n#: ../../changelog.rst:575 1df408a7787943e68de9384710331200\nmsgid \"1.1 (2010-08-19)\"\nmsgstr \"\"\n\n#: ../../changelog.rst:577 7e611ea96d6c4b4db5751229abbfec38\nmsgid \"First working version\"\nmsgstr \"\"\n"
  },
  {
    "path": "docs/locale/zh_CN/LC_MESSAGES/content.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) 2010–2024\n# This file is distributed under the same license as the PELICAN package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, 2024.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PELICAN 4\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2024-09-15 09:23+0800\\n\"\n\"PO-Revision-Date: 2024-06-25 19:00+0800\\n\"\n\"Last-Translator: GeorgeHu <dhxxhch@163.com>\\n\"\n\"Language: zh_CN\\n\"\n\"Language-Team: \\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=utf-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Generated-By: Babel 2.15.0\\n\"\n\n#: ../../content.rst:2 0e0d4e5751154cd4a5002b3f93cce14a\nmsgid \"Writing content\"\nmsgstr \"创作内容\"\n\n#: ../../content.rst:5 4316c31e97f740239cb3daaa533c0b64\nmsgid \"Articles and pages\"\nmsgstr \"文章和页面\"\n\n#: ../../content.rst:7 66e59f17488f4914a6d5c4538214dd91\nmsgid \"\"\n\"Pelican considers \\\"articles\\\" to be chronological content, such as posts\"\n\" on a blog, and thus associated with a date.\"\nmsgstr \"Pelican将“文章”（article）视为有时间顺序的内容，例如博客上的博文就是文章。\"\n\n#: ../../content.rst:10 ed244e3e671f450daf0617a80274878b\nmsgid \"\"\n\"The idea behind \\\"pages\\\" is that they are usually not temporal in nature\"\n\" and are used for content that does not change very often (e.g., \"\n\"\\\"About\\\" or \\\"Contact\\\" pages).\"\nmsgstr \"“页面”（page）指的是不经常改变的内容，例如“关于”“联系我们”这样的。\"\n\n#: ../../content.rst:14 f30d12684e0043438418655ba9f5cf25\nmsgid \"You can find sample content in the repository at ``samples/content/``.\"\nmsgstr \"\"\n\"在代码仓库的 ``samples/content/`` \"\n\"文件夹下有一些内容示例供您查看。（译者注：原文档中还有post与content的说法，一般既指代文章又指代页面，后文统一将其翻译为推文）\"\n\n#: ../../content.rst:19 370562db18eb42f19935009d087595b4\nmsgid \"File metadata\"\nmsgstr \"文件元数据\"\n\n#: ../../content.rst:21 e9e758d40aeb42a78a5e25ddbca35a3b\nmsgid \"\"\n\"Pelican tries to be smart enough to get the information it needs from the\"\n\" file system (for instance, about the category of your articles), but \"\n\"some information you need to provide in the form of metadata inside your \"\n\"files.\"\nmsgstr \"Pelican可以从文件系统中自动地获取一些信息（例如文章的分类），但是有些信息需要您以元数据的形式在文件中提供。\"\n\n#: ../../content.rst:25 276a3d27de8c41a784b3c4fa6b0b9f1b\nmsgid \"\"\n\"If you are writing your content in reStructuredText format, you can \"\n\"provide this metadata in text files via the following syntax (give your \"\n\"file the ``.rst`` extension)::\"\nmsgstr \"如果您用reStructuredText的格式进行内容创作，您可以按照下面的语法在文本文件中提供元数据（请给文本文件加上 ``.rst`` 后缀）：\"\n\n#: ../../content.rst:40 b5d99eedf95a4b6bbf760eccb4add31b\nmsgid \"\"\n\"Author and tag lists may be semicolon-separated instead, which allows you\"\n\" to write authors and tags containing commas::\"\nmsgstr \"如果有多个作者或多个文章标签，需要将他们以分号分隔，这样就可以在作者或标签中使用逗号了：\"\n\n#: ../../content.rst:46 18ae0e8b1cae406381a546bf2462c1e6\nmsgid \"\"\n\"Pelican implements an extension to reStructuredText to enable support for\"\n\" the ``abbr`` HTML tag. To use it, write something like this in your \"\n\"post::\"\nmsgstr \"Pelican在reStructuredText上实现了 ``abbr`` HTML标签的使用支持。在正文部分按照下面的形式书写即可。\"\n\n#: ../../content.rst:51 62c068f033f0498d888dd72f23f9d231\nmsgid \"\"\n\"You can also use Markdown syntax (with a file ending in ``.md``, \"\n\"``.markdown``, ``.mkd``, or ``.mdown``). Markdown generation requires \"\n\"that you first explicitly install the Python-Markdown_ package, which can\"\n\" be done via ``pip install Markdown``.\"\nmsgstr \"\"\n\"Pelican同时也支持Markdown语法（文件的扩展名需要为 ``.md`` 、 ``.markdown``、 ``.mkd`` 或 \"\n\"``.mdown`` ）要让Pelican进行Markdown的生成，需要先通过 ``pip install Markdown`` 安装 \"\n\"Python-Markdown_ 。\"\n\n#: ../../content.rst:56 f39e1de0f9ea4533942c5bf0bff7866f\nmsgid \"\"\n\"Pelican also supports `Markdown Extensions`_, which might have to be \"\n\"installed separately if they are not included in the default ``Markdown``\"\n\" package and can be configured and loaded via the ``MARKDOWN`` setting.\"\nmsgstr \"\"\n\"Pelican同样支持 `Markdown扩展`_ ，可以是 ``Markdown`` 包自带的扩展，也可以是另外安装的，可以通过 \"\n\"``MARKDOWN`` 配置项管理这些扩展。\"\n\n#: ../../content.rst:60 c9f3ab98c3d54b53bf647ba9202b5386\nmsgid \"Metadata syntax for Markdown posts should follow this pattern::\"\nmsgstr \"Markdown中的元数据语法需要按照下面的格式书写：\"\n\n#: ../../content.rst:73 ba840c208e4b4198ac0a2bd672a94f36\nmsgid \"\"\n\"You can also have your own metadata keys (so long as they don't conflict \"\n\"with reserved metadata keywords) for use in your templates. The following\"\n\" table contains a list of reserved metadata keywords:\"\nmsgstr \"您也可以定义自己的元数据类型（只要和保留的元数据关键字不冲突），这些自定义的元数据关键字可以用在自定义的模板中。下面的列出了所有保留的元数据关键字。\"\n\n#: ../../content.rst:78 a9537c5593d9458d9193dacc82c27f2f\nmsgid \"Metadata\"\nmsgstr \"元数据类型\"\n\n#: ../../content.rst:78 ../../content.rst:548 827ac866a3914692ac5fc9eaa1921aac\n#: a55315aa4aee4e30a7768bc54d7063da\nmsgid \"Description\"\nmsgstr \"描述\"\n\n#: ../../content.rst:80 d5e5b3902b9f46e3a827c551e26d84bd\nmsgid \"``title``\"\nmsgstr \"``title``\"\n\n#: ../../content.rst:80 07eb7d1b1a5f458084564729052749e7\nmsgid \"Title of the article or page\"\nmsgstr \"文章或页面的标题\"\n\n#: ../../content.rst:81 37abd449ffca4436a505f0dc35343cea\nmsgid \"``date``\"\nmsgstr \"``date``\"\n\n#: ../../content.rst:81 a13a424e96f643068af63b0d0d2dbb27\nmsgid \"Publication date (e.g., ``YYYY-MM-DD HH:SS``)\"\nmsgstr \"发布日期（需要以 ``YYYY-MM-DD HH:SS`` 的格式）\"\n\n#: ../../content.rst:82 7534c5908891457797988ef7a67b17db\nmsgid \"``modified``\"\nmsgstr \"``modified``\"\n\n#: ../../content.rst:82 6cc7d4c20ee44e31bb54173b24aa9afe\nmsgid \"Modification date (e.g., ``YYYY-MM-DD HH:SS``)\"\nmsgstr \"最后修改日期（需要以 ``YYYY-MM-DD HH:SS`` 的格式）\"\n\n#: ../../content.rst:83 0f7d30bb91bf46f7a0e2dd5ab186955d\nmsgid \"``tags``\"\nmsgstr \"``tags``\"\n\n#: ../../content.rst:83 e07fee37f1de414f82b38e7ff5e9051b\nmsgid \"Content tags, separated by commas\"\nmsgstr \"推文标签，以逗号分隔\"\n\n#: ../../content.rst:84 cc730907be1c4bb6a4d1f4e551f1bb13\nmsgid \"``keywords``\"\nmsgstr \"``keywords``\"\n\n#: ../../content.rst:84 b4185fda72084329b551f26b6eff5bd5\nmsgid \"Content keywords, separated by commas (HTML content only)\"\nmsgstr \"推文关键字，以逗号分隔（只能在HTML内容中使用）\"\n\n#: ../../content.rst:85 98438d6e0fbf4783a580516079fa5f3b\nmsgid \"``category``\"\nmsgstr \"``category``\"\n\n#: ../../content.rst:85 48e04733764e4962bfe4d16828b34d79\nmsgid \"Content category (one only — not multiple)\"\nmsgstr \"推文分类（只能归属到一个分类中，不支持多个）\"\n\n#: ../../content.rst:86 275265cdeaaf4515b8f84dd79d29e181\nmsgid \"``slug``\"\nmsgstr \"``slug``\"\n\n#: ../../content.rst:86 d910b7a82ea540179d561f639e531b9d\nmsgid \"Identifier used in URLs and translations\"\nmsgstr \"URL和翻译的唯一标识符\"\n\n#: ../../content.rst:87 ac2a927028d647a0b4f5edb14e5b1851\nmsgid \"``author``\"\nmsgstr \"``author``\"\n\n#: ../../content.rst:87 bd27267c861f470db23499a67a631854\nmsgid \"Content author, when there is only one\"\nmsgstr \"当只有一个作者时可以使用这个元数据\"\n\n#: ../../content.rst:88 9616ecb488914e4eaa192ecb4e437ba0\nmsgid \"``authors``\"\nmsgstr \"``authors``\"\n\n#: ../../content.rst:88 762660408c274f5690dba81dcc88c662\nmsgid \"Content authors, when there are multiple\"\nmsgstr \"当有多个作者时需要使用这个元数据\"\n\n#: ../../content.rst:89 40d65df77e0f4e75a26615d60775a382\nmsgid \"``summary``\"\nmsgstr \"``summary``\"\n\n#: ../../content.rst:89 f072a97cf1c54b7fbd383f205732f1c2\nmsgid \"Brief description of content for index pages\"\nmsgstr \"简短的推文概要，会显示在首页上\"\n\n#: ../../content.rst:90 69018dfa7f9b4e74b518fc1940af8908\nmsgid \"``lang``\"\nmsgstr \"``lang``\"\n\n#: ../../content.rst:90 f139c5b2a2774ee3bb83d4bd3b523a93\nmsgid \"Content language ID (``en``, ``fr``, etc.)\"\nmsgstr \"推文所用语言的ID（例如 ``en`` 、 ``fr`` 、 ``zh-cn`` 等）\"\n\n#: ../../content.rst:91 13757ce4c6a84096b4d131232eaeb8b4\nmsgid \"``translation``\"\nmsgstr \"``translation``\"\n\n#: ../../content.rst:91 9b3f475397bc4d60a1eb911f6763285f\nmsgid \"If content is a translation of another (``true`` or ``false``)\"\nmsgstr \"手动指定当前内容是否是某个翻译版本（该元数据的值只能是 ``true`` 或 ``false``）\"\n\n#: ../../content.rst:92 3f294461641949eead16c79e7bffdb22\nmsgid \"``status``\"\nmsgstr \"``status``\"\n\n#: ../../content.rst:92 f6ab65a6adf64379a14fb89d300d9eaa\nmsgid \"Content status: ``draft``, ``hidden``, ``skip``, or ``published``\"\nmsgstr \"推文的状态： ``draft``、 ``hidden`` 、 ``skip`` 或 ``published`` \"\n\n#: ../../content.rst:93 d9aefdcc77aa462d9934eb49f2b39095\nmsgid \"``template``\"\nmsgstr \"``template``\"\n\n#: ../../content.rst:93 41ecae4039714f31b0220f0d0f45a0c7\nmsgid \"Name of template to use to generate content (without extension)\"\nmsgstr \"用于指定要使用的生成模板，只需要写模板的名字，不需要模板文件的后缀名\"\n\n#: ../../content.rst:94 892e239c7a9145beb61b2f583284f448\nmsgid \"``save_as``\"\nmsgstr \"``save_as``\"\n\n#: ../../content.rst:94 3bc3792a6a5c4e79bcf8f77fc48f313b\nmsgid \"Save content to this relative file path\"\nmsgstr \"将内容保存到指定的相对文件路径\"\n\n#: ../../content.rst:95 8c3ed87a54734ca1bba051448d8169f9\nmsgid \"``url``\"\nmsgstr \"``url``\"\n\n#: ../../content.rst:95 2b55b515c7ce40e48eae20fbc67107bb\nmsgid \"URL to use for this article/page\"\nmsgstr \"指定本篇文章或页面要使用的URL\"\n\n#: ../../content.rst:98 81c7cc35f7b74566b7dd9083c2fc17f1\nmsgid \"\"\n\"Readers for additional formats (such as AsciiDoc_) are available via \"\n\"plugins, which you can find via the `Pelican Plugins`_ collection as well\"\n\" as the legacy `pelican-plugins`_ repository.\"\nmsgstr \"\"\n\"对其他格式的支持（例如 AsciiDoc_ ）可以通过插件实现，在 `Pelican插件`_ 集中可以查看所有插件。当然，在老的 \"\n\"`pelican-plugins`_ 仓库中也可以查看。\"\n\n#: ../../content.rst:102 b808c2914ee14c1380fe53e5e1f378f7\nmsgid \"\"\n\"Pelican can also process HTML files ending in ``.html`` and ``.htm``. \"\n\"Pelican interprets the HTML in a very straightforward manner, reading \"\n\"metadata from ``meta`` tags, the title from the ``title`` tag, and the \"\n\"body out from the ``body`` tag::\"\nmsgstr \"\"\n\"Pelican还能处理后缀名为 ``.html`` 和 ``.htm`` \"\n\"的HTML文件Pelican在解释转换HTML文件时用的方法非常直接，会从 ``meta`` HTML标签中获取元数据信息，从 ``title``\"\n\" HTML标签中获取标题，从 ``body`` 标签中获取文章的正文内容：\"\n\n#: ../../content.rst:122 289c3761b4b94691bee5ef07e8ab25ff\nmsgid \"\"\n\"With HTML, there is one simple exception to the standard metadata: tags \"\n\"can be specified either via the ``tags`` metadata, as is standard in \"\n\"Pelican, or via the ``keywords`` metadata, as is standard in HTML. The \"\n\"two can be used interchangeably.\"\nmsgstr \"\"\n\"当使用HTML文件时，上述的众多元数据中有一个比较特殊的存在——tags。这个元数据在HTML文档中有两种方式可以指定，一种是Pelican中定义的\"\n\" ``tags`` （上面的例子中用的就是这种）；另一种是使用HTML中定义的 ``keywords`` \"\n\"（即将name属性的“tags”换成“keywords”）。\"\n\n#: ../../content.rst:127 9af1403c5c624860bd73aba6f6ad642f\nmsgid \"\"\n\"Note that, aside from the title, none of this content metadata is \"\n\"mandatory: if the date is not specified and ``DEFAULT_DATE`` is set to \"\n\"``'fs'``, Pelican will rely on the file's \\\"mtime\\\" timestamp, and the \"\n\"category can be determined by the directory in which the file resides. \"\n\"For example, a file located at ``python/foobar/myfoobar.rst`` will have a\"\n\" category of ``foobar``. If you would like to organize your files in \"\n\"other ways where the name of the subfolder would not be a good category \"\n\"name, you can set the setting ``USE_FOLDER_AS_CATEGORY`` to ``False``.  \"\n\"When parsing dates given in the page metadata, Pelican supports the W3C's\"\n\" `suggested subset ISO 8601`__.\"\nmsgstr \"\"\n\"需要注意的是，除了title外，其他所有元数据都是可以缺省的。若未指定日期元数据并且将 ``DEFAULT_DATE`` 设为了 \"\n\"``'fs'``，Pelican就会从文件的 “mtime” 时间戳中获取日期信息；文件所在目录的名称会被作为category。例如 \"\n\"``python/foobar/myfoobar.rst`` 的category元数据值就会被设为 ``foobar`` \"\n\"。如果您不希望子目录的名称成为category的值，则需要在设置中将 ``USE_FOLDER_AS_CATEGORY`` 设为 \"\n\"``False`` 。进行日期元数据的解析时，Pelican支持W3C的 `suggested subset ISO 8601`__ 标准。\"\n\n#: ../../content.rst:137 0f142fac1e9e41eeb0cf4cc70a42f72b\nmsgid \"\"\n\"So the title is the only required metadata. If that bothers you, worry \"\n\"not. Instead of manually specifying a title in your metadata each time, \"\n\"you can use the source content file name as the title. For example, a \"\n\"Markdown source file named ``Publishing via Pelican.md`` would \"\n\"automatically be assigned a title of *Publishing via Pelican*. If you \"\n\"would prefer this behavior, add the following line to your settings \"\n\"file::\"\nmsgstr \"\"\n\"总而言之，标题是唯一必须指定的元数据。如果您甚至懒得写标题，也不用担心，Pelican会自动将文件名作为内容的标题。例如，Markdown源文件 \"\n\"``Publishing via Pelican.md`` 的标题会自动设为 *Publishing via \"\n\"Pelican*。如果您希望启用这个特性，请在设置文件中添加下面这么一行：\"\n\n#: ../../content.rst:148 481919b7e3974c8293d420886105941f\nmsgid \"\"\n\"When experimenting with different settings (especially the metadata ones)\"\n\" caching may interfere and the changes may not be visible. In such cases \"\n\"disable caching with ``LOAD_CONTENT_CACHE = False`` or use the \"\n\"``--ignore-cache`` command-line switch.\"\nmsgstr \"\"\n\"在您尝试不同的设置时（特别是在设置元数据时），缓存可能会对您造成干扰，导致设置更改不起作用。若您遇到了这种问题，可以在配置文件中加上 \"\n\"``LOAD_CONTENT_CACHE = False`` ，或是在使用命令行生成站点时加上 ``--ignore-cache`` 参数。\"\n\n#: ../../content.rst:155 466fa8d713b343d1a8ae8266c3031479\nmsgid \"\"\n\"``modified`` should be last time you updated the article, and defaults to\"\n\" ``date`` if not specified. Besides you can show ``modified`` in the \"\n\"templates, feed entries in feed readers will be updated automatically \"\n\"when you set ``modified`` to the current date after you modified your \"\n\"article.\"\nmsgstr \"\"\n\"``modified`` 元数据中应该为文章最后一次的修改时间，若没有指定，会自动与 ``date`` 保持一致。在您修改文章并将 \"\n\"``modified`` 设为当前日期后，除了在模板中显示 ``modified`` 之外，feed阅读器中的feed条目也会自动更新。\"\n\n#: ../../content.rst:160 e7c9358cd2a74e64863af04736d10775\nmsgid \"\"\n\"``authors`` is a comma-separated list of article authors. If there's only\"\n\" one author you can use ``author`` field.\"\nmsgstr \"``authors`` 元数据中是文章作者的列表，各个作者之间用逗号分隔。若只有一个作者，可以使用 ``author`` 。\"\n\n#: ../../content.rst:163 15bdeea8538244948ca509ee57ef8f63\nmsgid \"\"\n\"If you do not explicitly specify summary metadata for a given post, the \"\n\"``SUMMARY_MAX_LENGTH`` setting can be used to specify how many words from\"\n\" the beginning of an article are used as the summary. You can also use an\"\n\" article's first N paragraphs as its summary using the \"\n\"``SUMMARY_MAX_PARAGRAPHS`` setting. If both settings are in use, the \"\n\"specified number of paragraphs will be used but may be truncated to \"\n\"respect the specified maximum length.\"\nmsgstr \"\"\n\"若您没有显式地指定summary元数据，Pelican会自动从推文开头截取 ``SUMMARY_MAX_LENGTH`` \"\n\"指定长度的内容作为summary。另外，您也可以使用配置项 ``SUMMARY_MAX_PARAGRAPHS`` \"\n\"指定推文开头前N段内容作为summary。若同时指定了这两个配置项，首先会考虑 ``SUMMARY_MAX_PARAGRAPHS`` \"\n\"，若前N段的总长度超过 ``SUMMARY_MAX_LENGTH`` ，还是会按照 ``SUMMARY_MAX_LENGTH`` 进行截断。\"\n\n#: ../../content.rst:170 64a7dcd4911447338ac1871083242a83\nmsgid \"\"\n\"You can also extract any metadata from the filename through a regular \"\n\"expression to be set in the ``FILENAME_METADATA`` setting. All named \"\n\"groups that are matched will be set in the metadata object. The default \"\n\"value for the ``FILENAME_METADATA`` setting will only extract the date \"\n\"from the filename. For example, if you would like to extract both the \"\n\"date and the slug, you could set something like: \"\n\"``'(?P<date>\\\\d{4}-\\\\d{2}-\\\\d{2})_(?P<slug>.*)'``\"\nmsgstr \"\"\n\"您可以通过 ``FILENAME_METADATA`` \"\n\"设置来使用正则表达式从文件名中提取元数据。正则匹配到的每个命名分组都被看成一个元数据。预设的 ``FILENAME_METADATA`` \"\n\"只会从文件名中提取date和slug。例如，可以使用 \"\n\"``'(?P<date>\\\\d{4}-\\\\d{2}-\\\\d{2})_(?P<slug>.*)'`` 提取date和slug。\"\n\n#: ../../content.rst:177 0b6aaca5fc60494fafd2bdf345f25ab3\nmsgid \"\"\n\"Please note that the metadata available inside your files takes \"\n\"precedence over the metadata extracted from the filename.\"\nmsgstr \"请注意，您在推文中直接指定的元数据的优先级是大于从文件名中提取的。\"\n\n#: ../../content.rst:181 463df99e715d44c09a48770ddda1e139\nmsgid \"Pages\"\nmsgstr \"页面\"\n\n#: ../../content.rst:183 d2dd51b7abe14dc4921adcf50b8218fb\nmsgid \"\"\n\"If you create a folder named ``pages`` inside the content folder, all the\"\n\" files in it will be used to generate static pages, such as **About** or \"\n\"**Contact** pages. (See example filesystem layout below.)\"\nmsgstr \"\"\n\"如果您在content文件夹下创建了一个 ``pages`` 文件夹，那么Pelican会为其中的每个文件生成一个例如 **关于** \"\n\"、**联系我们** 这样的静态页面。（具体可以看下面项目文件组织的例子）\"\n\n#: ../../content.rst:187 3ac83019ba9c44e781a7b67c837c99d6\nmsgid \"\"\n\"You can use the ``DISPLAY_PAGES_ON_MENU`` setting to control whether all \"\n\"those pages are displayed in the primary navigation menu. (Default is \"\n\"``True``.)\"\nmsgstr \"您可以通过 ``DISPLAY_PAGES_ON_MENU`` 设置来决定页面是否被列在主导航菜单中（默认值为 ``True`` ）。\"\n\n#: ../../content.rst:190 56486e599f334e0fbc976bcf2d22bd5e\nmsgid \"\"\n\"If you want to exclude any pages from being linked to or listed in the \"\n\"menu, then add a ``status: hidden`` attribute to its metadata. This is \"\n\"useful for things like making error pages that fit the generated theme of\"\n\" your site.\"\nmsgstr \"\"\n\"如果您希望让某些页面不会被链接并且也不列在任何菜单中，可以为它加上元数据属性 ``status: hidden`` \"\n\"。这在将错误页面适配到所用主题时很有用。\"\n\n#: ../../content.rst:195 0205a4cab1a040a4aef74a3c375855a4\nmsgid \"Static content\"\nmsgstr \"静态内容\"\n\n#: ../../content.rst:197 2a86301465bd4f41944964cb0edf1572\nmsgid \"\"\n\"Static files are files other than articles and pages that are copied to \"\n\"the output folder as-is, without processing. You can control which static\"\n\" files are copied over with the ``STATIC_PATHS`` setting of the project's\"\n\" ``pelicanconf.py`` file. Pelican's default configuration includes the \"\n\"``images`` directory for this, but others must be added manually. In \"\n\"addition, static files that are explicitly linked to are included (see \"\n\"below).\"\nmsgstr \"\"\n\"静态文件与文章、页面不同，会原模原样地复制到输出文件夹中。当然，您也通过设置 ``STATIC_PATHS`` \"\n\"更改复制时的目标文件夹。Pelican的默认配置中只包含了 ``images`` \"\n\"一个文件夹，其他的需要手动添加。另外静态文件也包含那些被显式链接的（详见后文）。\"\n\n#: ../../content.rst:206 3b74472b747e4cd494aae142ec4deecc\nmsgid \"\"\n\"In the default configuration, all files with a valid content file suffix \"\n\"(``.html``, ``.rst``, ``.md``, ...) get processed by the article and page\"\n\" generators *before* the static generator. This is avoided by altering \"\n\"the ``*_EXCLUDE`` settings appropriately.\"\nmsgstr \"\"\n\"在默认配置下，所有后缀名有效的文件（ ``.html`` 、 ``.rst`` 、 ``.md`` , \"\n\"...）都会由文章/页面生成器处理，这是在静态文件处理之前完成的。若这些文件中的某一些是静态文件，可以合理使用 ``*_EXCLUDE`` \"\n\"配置项将他们排除（例如 ``ARTICLE_EXCLUDES`` 、 ``PAGE_EXCLUDES``）。\"\n\n#: ../../content.rst:212 ab263a1d5b5a4fb0a705257701b8b6c3\nmsgid \"Mixed content in the same directory\"\nmsgstr \"在同一个目录下存放不同类型的内容\"\n\n#: ../../content.rst:214 dfec139d8f98465ea117dcd02f3e7870\nmsgid \"\"\n\"Starting with Pelican 3.5, static files can safely share a source \"\n\"directory with page source files, without exposing the page sources in \"\n\"the generated site. Any such directory must be added to both \"\n\"``STATIC_PATHS`` and ``PAGE_PATHS`` (or ``STATIC_PATHS`` and \"\n\"``ARTICLE_PATHS``). Pelican will identify and process the page source \"\n\"files normally, and copy the remaining files as if they lived in a \"\n\"separate directory reserved for static files.\"\nmsgstr \"\"\n\"从Pelican 3.5开始，静态文件就可以和页面源文件安全地放在同一目录下了。这些包含了不同类型内容文件的目录需要添加到 \"\n\"``STATIC_PATHS`` 和 ``PAGE_PATHS`` 中（或者 ``STATIC_PATHS`` 和 \"\n\"``ARTICLE_PATHS`` \"\n\"中）。Pelican会正常地识别和处理文章和页面源文件，然后再把静态文件复制，和处理处于单独一个文件夹的静态文件行为一致。\"\n\n#: ../../content.rst:221 de484f74c05a48e4ac84631e56309bf6\nmsgid \"\"\n\"Note: Placing static and content source files together in the same source\"\n\" directory does not guarantee that they will end up in the same place in \"\n\"the generated site. The easiest way to do this is by using the \"\n\"``{attach}`` link syntax (described below). Alternatively, the \"\n\"``STATIC_SAVE_AS``, ``PAGE_SAVE_AS``, and ``ARTICLE_SAVE_AS`` settings \"\n\"(and the corresponding ``*_URL`` settings) can be configured to place \"\n\"files of different types together, just as they could in earlier versions\"\n\" of Pelican.\"\nmsgstr \"\"\n\"请注意：Pelican不保证放在同一个源目录下的静态文件和内容文件在站点生成完后最终出现在同一个地方。要让他们出现在一个地方，可以使用 \"\n\"``{attach}`` 链接语法（下面会提到）。此外，还可以通过设置 ``STATIC_SAVE_AS`` 、 ``PAGE_SAVE_AS``\"\n\" 和 ``ARTICLE_SAVE_AS`` (还有相应的 ``*_URL`` 设置)让不同类型的文件最终放在一起。\"\n\n#: ../../content.rst:232 6733f6cc9bbb4ee0995d7f818c24b850\nmsgid \"Linking to internal content\"\nmsgstr \"内部链接\"\n\n#: ../../content.rst:234 e0f9e61fef924c82aa7950ad20c0b686\nmsgid \"\"\n\"From Pelican 3.1 onwards, it is now possible to specify intra-site links \"\n\"to files in the *source content* hierarchy instead of files in the \"\n\"*generated* hierarchy. This makes it easier to link from the current post\"\n\" to other content that may be sitting alongside that post (instead of \"\n\"having to determine where the other content will be placed after site \"\n\"generation).\"\nmsgstr \"\"\n\"从Pelican 3.1开始，站内链接可以在 *源文件* 层次下指定，而不是只能在 *生成后的站点* \"\n\"层次下指定。当需要在当前推文链接到邻近位置的内容时，可以直接从源内容文件的位置开始链接（而不需要考虑在站点生成后文件会被放在哪儿）。\"\n\n#: ../../content.rst:240 8de8953b665841818066d12cec9631d4\nmsgid \"\"\n\"To link to internal content (files in the ``content`` directory), use the\"\n\" following syntax for the link target: ``{filename}path/to/file``. Note: \"\n\"forward slashes, ``/``, are the required path separator in the \"\n\"``{filename}`` directive on all operating systems, including Windows.\"\nmsgstr \"\"\n\"要链接到站内（即在 ``content`` 目录下的文件），使用下述的目标链接语法： ``{filename}path/to/file`` \"\n\"。注意，在所有操作系统（当然也包括Windows）上，路径的分隔符都要使用正斜杠 ``/`` 。\"\n\n#: ../../content.rst:246 dbd1404fa9fe47b7ba2594d1cc5d84f5\nmsgid \"For example, a Pelican project might be structured like this::\"\nmsgstr \"例如，某Pelican项目的文件结构组织如下：\"\n\n#: ../../content.rst:257 04b1728643124b6e903acb6c32d6c970\nmsgid \"In this example, ``article1.rst`` could look like this::\"\nmsgstr \"在这个例子中， ``article1.rst`` 的内容如下：\"\n\n#: ../../content.rst:269 9197b32aca1c4af6ac2f2b56e7498206\nmsgid \"and ``article2.md``::\"\nmsgstr \"``article2.md`` 的内容如下：\"\n\n#: ../../content.rst:280 baccc8dc58cd482cb42bd44d78d16d42\nmsgid \"Linking to static files\"\nmsgstr \"链接到静态文件\"\n\n#: ../../content.rst:282 33067c5bbb554baea7306b0c2f0b5356\nmsgid \"\"\n\"You can link to static content using ``{static}path/to/file``. Files \"\n\"linked to with this syntax will automatically be copied to the output \"\n\"directory, even if the source directories containing them are not \"\n\"included in the ``STATIC_PATHS`` setting of the project's \"\n\"``pelicanconf.py`` file.\"\nmsgstr \"\"\n\"您可以通过 ``{static}path/to/file`` 链接到静态内容。使用这个指令链接的文件都会被自动复制到输出目录中，即使它没有包含在 \"\n\"``STATIC_PATHS`` 中。\"\n\n#: ../../content.rst:287 ../../content.rst:322 533a9aee68e5452db609cc5e1e569381\n#: 7c9993b8f8c44863975e5db9d5ce1cb8\nmsgid \"For example, a project's content directory might be structured like this::\"\nmsgstr \"例如，某Pelican项目的文件结构组织如下：\"\n\n#: ../../content.rst:297 7c70d916da684551b499f25fd9567e11\nmsgid \"``test.md`` would include::\"\nmsgstr \"``test.md`` 的文件内容如下：\"\n\n#: ../../content.rst:302 8921fb6dfbba4e6ea4c0220650617dc6\nmsgid \"\"\n\"Site generation would then copy ``han.jpg`` to ``output/images/han.jpg``,\"\n\" ``menu.pdf`` to ``output/pdfs/menu.pdf``, and write the appropriate \"\n\"links in ``test.md``.\"\nmsgstr \"\"\n\"站点生成时会将 ``han.jpg`` 拷贝到 ``output/images/han.jpg`` 、将 ``menu.pdf`` 拷贝到 \"\n\"``output/pdfs/menu.pdf`` ，同时也会自动把 ``test.md`` 中的相关链接都替换为正确的。\"\n\n#: ../../content.rst:306 244c1bb923ec4b7ab33c039f2deefe94\nmsgid \"\"\n\"If you use ``{static}`` to link to an article or a page, this will be \"\n\"turned into a link to its source code.\"\nmsgstr \"如果您使用 ``{static}`` 链接到文章或页面，会链接到他们的源文件而不是渲染后的文章或页面。\"\n\n#: ../../content.rst:310 50d69d50e26d4b48b4b1fb2643efa0e6\nmsgid \"Attaching static files\"\nmsgstr \"将静态文件作为附件\"\n\n#: ../../content.rst:312 f28e37fba55b49a99f03bbafc669ef87\nmsgid \"\"\n\"Starting with Pelican 3.5, static files can be \\\"attached\\\" to a page or \"\n\"article using this syntax for the link target: ``{attach}path/to/file``. \"\n\"This works like the ``{static}`` syntax, but also relocates the static \"\n\"file into the linking document's output directory. If the static file \"\n\"originates from a subdirectory beneath the linking document's source, \"\n\"that relationship will be preserved on output. Otherwise, it will become \"\n\"a sibling of the linking document.\"\nmsgstr \"\"\n\"从Pelican 3.5开始，静态文件可以使用下述语法 “附” 在页面或文章上： ``{attach}path/to/file`` 。这和 \"\n\"``{static}`` \"\n\"语法很像，也会将静态文件重定位到文章或页面的对应输出目录中。当推文所链接的静态文件处于其源文件所在位置的子目录下时，这种父子关系在输出目录中会得以保留。否则，默认情况下，静态文件会和对应的文档输出到同一目录层级下。\"\n\n#: ../../content.rst:320 dba2dfdd8ef14b41b37f9db53ebb9704\nmsgid \"This only works for linking to static files.\"\nmsgstr \"这只在链接到静态文件时起作用。\"\n\n#: ../../content.rst:333 a523bb1926b54025908733f0aca757c5\nmsgid \"``pelicanconf.py`` would include::\"\nmsgstr \"例如对于某设置文件 ``pelicanconf.py`` \"\n\n#: ../../content.rst:340 d12e170143234a51862ac73d04acb16b\nmsgid \"``testpost.md`` would include::\"\nmsgstr \"``testpost.md`` 的内容如下：\"\n\n#: ../../content.rst:350 8628f5e27e51444fad84dc68aa8a74bb\nmsgid \"\"\n\"Site generation would then produce an output directory structured like \"\n\"this::\"\nmsgstr \"对应生成输出的站点目录结构如下：\"\n\n#: ../../content.rst:360 8f74e3a043b84a088708bc046118b327\nmsgid \"\"\n\"Notice that all the files linked using ``{attach}`` ended up in or \"\n\"beneath the article's output directory.\"\nmsgstr \"可以注意到，使用 ``{attach}`` 链接的文件要么和文章输出处于同级目录，要么就是在文章所在位置的子目录下。\"\n\n#: ../../content.rst:363 cdaf8ffc246645da8614e76072a6704d\nmsgid \"\"\n\"If a static file is linked multiple times, the relocating feature of \"\n\"``{attach}`` will only work in the first of those links to be processed. \"\n\"After the first link, Pelican will treat ``{attach}`` like ``{static}``. \"\n\"This avoids breaking the already-processed links.\"\nmsgstr \"\"\n\"若一个静态文件被多次链接， ``{attach}`` 只会在该静态文件第一次被链接时进行重定位处理（即按照上面的规则复制到对应目录）。之后使用 \"\n\"``{attach}`` 进行的链接的效果就和 ``{static}`` 一模一样了。这样子就可以避免破坏已经生成好的链接。\"\n\n#: ../../content.rst:368 0783ef45de914a48af081fbf5978ae93\nmsgid \"\"\n\"**Be careful when linking to a file from multiple documents:** Since the \"\n\"first link to a file finalizes its location and Pelican does not define \"\n\"the order in which documents are processed, using ``{attach}`` on a file \"\n\"linked by multiple documents can cause its location to change from one \"\n\"site build to the next. (Whether this happens in practice will depend on \"\n\"the operating system, file system, version of Pelican, and documents \"\n\"being added, modified, or removed from the project.) Any external sites \"\n\"linking to the file's old location might then find their links broken. \"\n\"**It is therefore advisable to use {attach} only if you use it in all \"\n\"links to a file, and only if the linking documents share a single \"\n\"directory.** Under these conditions, the file's output location will not \"\n\"change in future builds. In cases where these precautions are not \"\n\"possible, consider using ``{static}`` links instead of ``{attach}``, and \"\n\"letting the file's location be determined by the project's \"\n\"``STATIC_SAVE_AS`` and ``STATIC_URL`` settings. (Per-file ``save_as`` and\"\n\" ``url`` overrides can still be set in ``EXTRA_PATH_METADATA``.)\"\nmsgstr \"\"\n\"**当同一文件被多个推文链接时需要尤其小心：** \"\n\"第一次链接到文件时，Pelican就会确定其最终位置，而Pelican处理推文的顺序是不能确定的，因此多个推文使用 ``{attach}`` \"\n\"链接到同一文件时，每一次站点生成后该文件的最终位置是无法确定的（这种情况发生与否取决于操作系统、文件系统、Pelican的版本、推文从项目中的添加修改移除）。当这种情况发生时，其他站点到本站点文件旧位置的链接就会损坏。**因此，只有当静态文件只被一篇推文链接，或链接到某静态文件的推文都在同一目录下时才使用\"\n\" {attach}**。在这种情况下，该文件的输出位置在站点构建中不会变化。如果无法保证上述条件来预防链接损坏，可以考虑使用 \"\n\"``{static}`` 来替换 ``{attach}`` 。如此，文件的最终位置就由 ``STATIC_SAVE_AS`` 和 \"\n\"``STATIC_URL`` 来决定。（每个文件的 ``save_as`` 和 ``url`` 仍然可以通过更改 \"\n\"``EXTRA_PATH_METADATA`` 设置来覆盖）\"\n\n#: ../../content.rst:385 85347094a7f741ac96f2489969660181\nmsgid \"\"\n\"When using ``{attach}``, any parent directory in ``*_URL`` / \"\n\"``*_SAVE_AS`` settings should match each other. See also: :ref:`url-\"\n\"settings`\"\nmsgstr \"\"\n\"当使用{attach}时， ``*_URL`` / ``*_SAVE_AS`` 设置中的所有父目录都应该互相对应。具体请参见 \"\n\":ref:`URL配置<url-settings>` 。\"\n\n#: ../../content.rst:389 eaefe7d009be4a5797cabee8bf1230a4\nmsgid \"Linking to authors, categories, index and tags\"\nmsgstr \"链接到作者、分类、索引、标签\"\n\n#: ../../content.rst:391 2c5b13a80a6b49acadeed0ff3d71236f\nmsgid \"\"\n\"You can link to authors, categories, index and tags using the \"\n\"``{author}name``, ``{category}foobar``, ``{index}`` and ``{tag}tagname`` \"\n\"syntax.\"\nmsgstr \"\"\n\"您可以通过 ``{author}name`` 、 ``{category}foobar`` 、 ``{index}`` 和 \"\n\"``{tag}tagname`` 这样的语法链接到作者、分类、索引和标签。\"\n\n#: ../../content.rst:395 ec56f8d188bf4e41a961f00535b16dfb\nmsgid \"Deprecated internal link syntax\"\nmsgstr \"已弃用的内部链接语法\"\n\n#: ../../content.rst:397 01e39bc18c964baaaf43779b37fbaa01\nmsgid \"\"\n\"To remain compatible with earlier versions, Pelican still supports \"\n\"vertical bars (``||``) in addition to curly braces (``{}``) for internal \"\n\"links. For example: ``|filename|an_article.rst``, ``|tag|tagname``, \"\n\"``|category|foobar``. The syntax was changed from ``||`` to ``{}`` to \"\n\"avoid collision with Markdown extensions or reST directives. Similarly, \"\n\"Pelican also still supports linking to static content with \"\n\"``{filename}``. The syntax was changed to ``{static}`` to allow linking \"\n\"to both generated articles and pages and their static sources.\"\nmsgstr \"\"\n\"为了保持和早期版本的兼容，在内部链接中除了使用花括号（ ``{}`` ）外，还支持在内部链接中使用竖线（ ``||`` ）。例如， \"\n\"``|filename|an_article.rst`` 、  ``|tag|tagname`` 、 ``|category|foobar`` \"\n\"。将语法中的 ``||`` 改到 ``{}`` 是为了避免和Markdown或reST的语法和指令相冲突。类似地， ``{filename}`` \"\n\"虽然仍能使用，但是其语法已经改为了 ``{static}`` 。 ``{static}`` 既可以链接到文章或页面，也可以链接到静态资源。\"\n\n#: ../../content.rst:405 375eca8f0c324943a3d5ba60f46e8aa7\nmsgid \"Support for the old syntax may eventually be removed.\"\nmsgstr \"对旧语法地支持最终会被移除。\"\n\n#: ../../content.rst:408 d1e5719616d5454a810ed1562d0610fa\nmsgid \"Including other files\"\nmsgstr \"引入其他文件\"\n\n#: ../../content.rst:409 b429cad5b7904db5b16053bd9dbc7bb6\nmsgid \"Both Markdown and reStructuredText syntaxes provide mechanisms for this.\"\nmsgstr \"Markdown和reStructuredText的语法中都提供了这种机制\"\n\n#: ../../content.rst:411 fa6e783b42c84147a18f2a23136a8212\nmsgid \"\"\n\"Following below are some examples for **reStructuredText** using `the \"\n\"include directive`_:\"\nmsgstr \"下面是 **reStructuredText** 使用 `include指令`_ 的一些例子：\"\n\n#: ../../content.rst:417 ecbaa72c1df64857b2e720ab7055e258\nmsgid \"\"\n\"Include a fragment of a file delimited by two identifiers, highlighted as\"\n\" C++ (slicing based on line numbers is also possible):\"\nmsgstr \"下面的例子，引入了一段用一对标识符分隔的文件片段，并指定以C++语法进行高亮显示。（同样支持通过行号指定片段）\"\n\n#: ../../content.rst:426 04bf027b52124b669b3b56ea50ac240d\nmsgid \"\"\n\"Include a raw HTML file (or an inline SVG) and put it directly into the \"\n\"output without any processing:\"\nmsgstr \"将一HTML文件（或者一个行内SVG）直接引入，并且不进行任何处理直接将其作为输出：\"\n\n#: ../../content.rst:433 612365f02c5a471295f2f3601f0d95e9\nmsgid \"\"\n\"For **Markdown**, one must rely on an extension. For example, using the \"\n\"`mdx_include plugin`_:\"\nmsgstr \"对于 **Markdown** ，若要进行文件引入，就必须使用扩展插件。例如可以使用 `mdx_include plugin`_ ：\"\n\n#: ../../content.rst:443 30c87f2b5e594c24ac8ab719614c71fd\nmsgid \"Importing an existing site\"\nmsgstr \"导入已有站点\"\n\n#: ../../content.rst:445 f0f0ccd87dcc4afebe9b7d954481eeb2\nmsgid \"\"\n\"It is possible to import your site from several other blogging sites \"\n\"(like WordPress, Tumblr, ..) using a simple script. See :ref:`import`.\"\nmsgstr \"您可以使用一个简单的脚本导入已有的站点（例如WordPress、Tumblr）。详见 :ref:`导入已有站点<import>` 。\"\n\n#: ../../content.rst:449 48de7111f6ec49ec8637c06e7d774f26\nmsgid \"Translations\"\nmsgstr \"翻译\"\n\n#: ../../content.rst:451 0d1f7e6d14b746e2bb40f200c23f89a5\nmsgid \"\"\n\"It is possible to translate articles. To do so, you need to add a \"\n\"``lang`` meta attribute to your articles/pages and set a ``DEFAULT_LANG``\"\n\" setting (which is English [en] by default). With those settings in \"\n\"place, only articles with the default language will be listed, and each \"\n\"article will be accompanied by a list of available translations for that \"\n\"article.\"\nmsgstr \"\"\n\"一篇文章可以有多个翻译版本。对于这类文章，您需要加上元数据属性 ``lang`` ，并且配置 ``DEFAULT_LANG`` \"\n\"（默认为[en]）。完成上述配置后，文章列表中列出的是默认语言版本的文章，文章内容页中会列出所有可用的翻译版本供读者选择。\"\n\n#: ../../content.rst:459 61df3a34ac194a2eb037c1b4e868265c\nmsgid \"\"\n\"This core Pelican functionality does not create sub-sites (e.g. \"\n\"``example.com/de``) with translated templates for each language. For such\"\n\" advanced functionality the `i18n_subsites plugin`_ can be used.\"\nmsgstr \"\"\n\"Pelican的这个核心功能并不会给同一文章的不同语言版本创建子站点（例如 ``example.com/de`` \"\n\"）。但是如果需要创建子站点的话，可以使用扩展插件 `i18n_subsites plugin`_ 。\"\n\n#: ../../content.rst:464 c05ed4b06cec45248f976be0580b257c\nmsgid \"\"\n\"By default, Pelican uses the article's URL \\\"slug\\\" to determine if two \"\n\"or more articles are translations of one another. (This can be changed \"\n\"with the ``ARTICLE_TRANSLATION_ID`` setting.) The slug can be set \"\n\"manually in the file's metadata; if not set explicitly, Pelican will \"\n\"auto-generate the slug from the title of the article.\"\nmsgstr \"\"\n\"默认情况下，Pelican会使用文章的URL “slug” 来判断当前文档是否是同一篇文章的不同翻译版本。（这一点可以通过配置 \"\n\"``ARTICLE_TRANSLATION_ID`` \"\n\"来改变）slug可以通过元数据手动指定，若没有，Pelican会根据文章的标题（title）来自动生成slug。\"\n\n#: ../../content.rst:470 e448fdfd15c046fb8c641fcead12b26d\nmsgid \"\"\n\"Here is an example of two articles, one in English and the other in \"\n\"French.\"\nmsgstr \"以下的例子是一篇文章有英语和法语两个翻译版本的情况。\"\n\n#: ../../content.rst:472 62a186c5d6194a37b884343a858f2200\nmsgid \"The English article::\"\nmsgstr \"英语文章如下：\"\n\n#: ../../content.rst:482 b32c5433696e4a09adb804cef323b3f1\nmsgid \"And the French version::\"\nmsgstr \"法语版本为：\"\n\n#: ../../content.rst:492 b4d1d69ebe22462d985ebe2cfc8cd1e8\nmsgid \"\"\n\"Post content quality notwithstanding, you can see that only item in \"\n\"common between the two articles is the slug, which is functioning here as\"\n\" an identifier. If you'd rather not explicitly define the slug this way, \"\n\"you must then instead ensure that the translated article titles are \"\n\"identical, since the slug will be auto-generated from the article title.\"\nmsgstr \"值得注意的是，以上两篇文章的slug是相同的，即slug作为唯一标识符存在。若您没有手动指定slug，那么请保证同一篇文章的不同翻译版本的标题是相同的。如此，由于slug会根据文章标题自动生成，它们隐含的slug会是相同的。\"\n\n#: ../../content.rst:498 2e50d70746634009a070dc41068fbc89\nmsgid \"\"\n\"If you do not want the original version of one specific article to be \"\n\"detected by the ``DEFAULT_LANG`` setting, use the ``translation`` \"\n\"metadata to specify which posts are translations::\"\nmsgstr \"\"\n\"如果您不希望某篇文章的原始版本以 ``DEFAULT_LANG`` 翻译版本出现，可以使用 ``translation`` \"\n\"元数据来指出本推文是一个非默认语言的翻译版本。（译者注：例如，设置的默认语言为zh_CN，如果某篇推文的原始版本是英文而不是中文，那么对于中文翻译版本的就可以指定其translations元数据为true，即对于该推文来说，中文版本是翻译后的版本）\"\n\n#: ../../content.rst:515 01ecf34fd1e440ea908fd181001b38b6\nmsgid \"Syntax highlighting\"\nmsgstr \"语法高亮\"\n\n#: ../../content.rst:517 4d7eebd1886347b383ea3b1c517b821d\nmsgid \"\"\n\"Pelican can provide colorized syntax highlighting for your code blocks. \"\n\"To do so, you must use the following conventions inside your content \"\n\"files.\"\nmsgstr \"您可以按照下面的约定在文件内容中添加代码块，Pelican可以完成五彩缤纷的语法高亮。\"\n\n#: ../../content.rst:520 5896f772fcd04f309e2188040f0bea60\nmsgid \"\"\n\"For reStructuredText, use the ``code-block`` directive to specify the \"\n\"type of code to be highlighted (in these examples, we'll use \"\n\"``python``)::\"\nmsgstr \"对于reStructuredText，使用 ``code-block`` 指令指定代码所使用的语言（此处以``python``为例）：\"\n\n#: ../../content.rst:527 ec6ec4c325c6406ba3b00437116b84b8\nmsgid \"\"\n\"For Markdown, which utilizes the `CodeHilite extension`_ to provide \"\n\"syntax highlighting, include the language identifier just above the code \"\n\"block, indenting both the identifier and the code::\"\nmsgstr \"Markdown则使用 `CodeHilite extension`_ 扩展插件来完成语法高亮。在代码上方标记所用语言，同时将其与代码都进行缩进：\"\n\n#: ../../content.rst:541 58220db84e4d4ab7950dad7ad36ea1b5\nmsgid \"\"\n\"The specified identifier (e.g. ``python``, ``ruby``) should be one that \"\n\"appears on the `list of available lexers \"\n\"<https://pygments.org/docs/lexers/>`_.\"\nmsgstr \"\"\n\"指定语言的标识符（例如 ``python``、``ruby``）必须是在 `可用列表 \"\n\"<https://pygments.org/docs/lexers/>`_ 中列出的。\"\n\n#: ../../content.rst:544 cb10d4bc6f4c44008ce8324df993c2ed\nmsgid \"\"\n\"When using reStructuredText the following options are available in the \"\n\"`code-block` directive:\"\nmsgstr \"对于reStructuredText，下面列出的选项可以在 `code-block` 命令中使用：\"\n\n#: ../../content.rst:548 3598816f6ab54705aa545de3eb95a22c\nmsgid \"Option\"\nmsgstr \"选项\"\n\n#: ../../content.rst:548 2861fb4a308a443c971110b5757e9d13\nmsgid \"Valid values\"\nmsgstr \"有效值\"\n\n#: ../../content.rst:550 638a4299a7d346659254d7aa6e2485e7\nmsgid \"anchorlinenos\"\nmsgstr \"anchorlinenos\"\n\n#: ../../content.rst:550 ../../content.rst:574 ../../content.rst:576\n#: 0e32384143484934af18e224e414a45b 217edf5016f74e23a906623d077191ff\n#: c6b0e9c5aa4340329b2fe203222055df\nmsgid \"N/A\"\nmsgstr \"N/A\"\n\n#: ../../content.rst:550 e219ff4135fb45e8b27fdd71a874ffee\nmsgid \"If present, wrap line numbers in ``<a>`` tags.\"\nmsgstr \"指定行号是否显示在 <a> 标签中\"\n\n#: ../../content.rst:551 8e95919e90e14208a8150c2c52cb20b9\nmsgid \"classprefix\"\nmsgstr \"classprefix\"\n\n#: ../../content.rst:551 ../../content.rst:559 ../../content.rst:561\n#: ../../content.rst:570 ../../content.rst:572 ../../content.rst:577\n#: ../../content.rst:578 96789c1cd92545b1a9153e9be1c5726d\n#: 9e591c65044b4ca4aa876e0dd5ba94bc a1920b40389d4b25a66cb0e755389960\n#: bee284b2086a40a4aa28bc87c916d9df cb11442c371b48349bba579e7dfce72b\n#: e330b50a8cea43a5b55771f04fc4e688 f28e8d5bd9544ccbbcb99037c02f08cf\nmsgid \"string\"\nmsgstr \"string\"\n\n#: ../../content.rst:551 f6d85a8a8ec74c46a313bcfb72f5283a\nmsgid \"String to prepend to token class names\"\nmsgstr \"要添加到用于语法高亮的css类名前面的字符串\"\n\n#: ../../content.rst:552 4fd6cd04ea444c389c6f77030eb0a123\nmsgid \"hl_lines\"\nmsgstr \"hl_lines\"\n\n#: ../../content.rst:552 aa5112c2c73e40d9940b5a21eaa1d650\nmsgid \"numbers\"\nmsgstr \"numbers\"\n\n#: ../../content.rst:552 1b03b3add35c44eeaef4d3c31dd51fb4\nmsgid \"\"\n\"List of lines to be highlighted, where line numbers to highlight are \"\n\"separated by a space. This is similar to ``emphasize-lines`` in Sphinx, \"\n\"but it does not support a range of line numbers separated by a hyphen, or\"\n\" comma-separated line numbers.\"\nmsgstr \"需要高亮的行号列表，行号之间以空格隔开。这与Sphinx中的 ``emphasize-lines`` 类似，但是不支持使用连字符和逗号指定行号范围。\"\n\n#: ../../content.rst:559 abe7266edc704a0b857856e92fd2022b\nmsgid \"lineanchors\"\nmsgstr \"lineanchors\"\n\n#: ../../content.rst:559 baa7634eb7e646e39698c24bc3ee82af\nmsgid \"Wrap each line in an anchor using this string and -linenumber.\"\nmsgstr \"用此处指定的字符串和 “-行号”给每一行都加上锚点。\"\n\n#: ../../content.rst:561 21ccf81937cf4fe38f556f2852524269\nmsgid \"linenos\"\nmsgstr \"linenos\"\n\n#: ../../content.rst:561 2b1b4a9f23e448d4baaf5d36b896a5ba\nmsgid \"\"\n\"If present or set to \\\"table\\\", output line numbers in a table; if set to\"\n\" \\\"inline\\\", output them inline. \\\"none\\\" means do not output the line \"\n\"numbers for this table.\"\nmsgstr \"开启此选项或将此选项设为“table”时，输出表格时会带上行号；如果设为“inline”，则内联输出行号；如果设为“none”，则不输出行号。\"\n\n#: ../../content.rst:566 d9813ccee6d24eae8c539fd9cc0ddd54\nmsgid \"linenospecial\"\nmsgstr \"linenospecial\"\n\n#: ../../content.rst:566 ../../content.rst:568 ../../content.rst:569\n#: 1eeb1f08e07e4f95a03cbeca48b422a6 bac61cf96bc3466985c9f4d5b934055b\n#: eadc4e3c92094e589c3b931d20cd97ab\nmsgid \"number\"\nmsgstr \"number\"\n\n#: ../../content.rst:566 ff3b3aa5e45e4a3a837400e8333f7c5a\nmsgid \"If set, every nth line will be given the 'special' CSS class.\"\nmsgstr \"是否每隔几行就设置一行特殊的css样式类。\"\n\n#: ../../content.rst:568 e32730e901bb460e975410fe26a9432f\nmsgid \"linenostart\"\nmsgstr \"linenostart\"\n\n#: ../../content.rst:568 48d2621a74174b82a71d52a921e2f60f\nmsgid \"Line number for the first line.\"\nmsgstr \"起始行的行号。\"\n\n#: ../../content.rst:569 fcb4c1088bb04cd9ba6e4273e3013369\nmsgid \"linenostep\"\nmsgstr \"linenostep\"\n\n#: ../../content.rst:569 1ce5e05481f84c7f84964bb1d2e3e9ae\nmsgid \"Print every nth line number.\"\nmsgstr \"每隔几行输出一次\"\n\n#: ../../content.rst:570 110dc8da76774b3ca517ad93c53fbd3f\nmsgid \"lineseparator\"\nmsgstr \"lineseparator\"\n\n#: ../../content.rst:570 b9ba8609393c4ec8b964481ae2c66614\nmsgid \"String to print between lines of code, '\\\\n' by default.\"\nmsgstr \"每行输出代码之间的输出字符串，默认为 '\\\\n'。\"\n\n#: ../../content.rst:572 8b336c4c8e65427ebb1a89e94232199a\nmsgid \"linespans\"\nmsgstr \"linespans\"\n\n#: ../../content.rst:572 07c2d6ca97084859b47b09237633a4ab\nmsgid \"Wrap each line in a span using this and -linenumber.\"\nmsgstr \"使用指定的字符串和“-行号”将每一行包装在一个span中。\"\n\n#: ../../content.rst:574 bd0c5e4ba73d458aa14fce20c1347910\nmsgid \"nobackground\"\nmsgstr \"nobackground\"\n\n#: ../../content.rst:574 07672d498e2f4b6e8d4da4b5382a34f0\nmsgid \"If set, do not output background color for the wrapping element\"\nmsgstr \"若设置，则不为元素输出背景颜色\"\n\n#: ../../content.rst:576 a054798a57814cfd9b363d7048dd9e1e\nmsgid \"nowrap\"\nmsgstr \"nowrap\"\n\n#: ../../content.rst:576 de085518cf324de4b6d917c616e2b7dd\nmsgid \"If set, do not wrap the tokens at all.\"\nmsgstr \"若设置，则不对token进行换行处理。\"\n\n#: ../../content.rst:577 5989452c45bd4cc187e1cd1cfb88b440\nmsgid \"tagsfile\"\nmsgstr \"tagsfile\"\n\n#: ../../content.rst:577 74b9388dcbe048ff824108bafc0bf72b\nmsgid \"ctags file to use for name definitions.\"\nmsgstr \"用于命名定义的ctags文件\"\n\n#: ../../content.rst:578 0b355baf272c4e87a18b1594b311258f\nmsgid \"tagurlformat\"\nmsgstr \"tagurlformat\"\n\n#: ../../content.rst:578 dde5f2fd922b4b45b5eca083527dd93a\nmsgid \"format for the ctag links.\"\nmsgstr \"用于ctag链接的格式\"\n\n#: ../../content.rst:581 e034ff3a3ee44ef185f8c3aed60fc692\nmsgid \"\"\n\"Note that, depending on the version, your Pygments module might not have \"\n\"all of these options available. Refer to the *HtmlFormatter* section of \"\n\"the `Pygments documentation <https://pygments.org/docs/formatters/>`_ for\"\n\" more details on each of the options.\"\nmsgstr \"\"\n\"请注意，由于版本的不同，Pygments模块可能不完全支持上述选项。请参考 `Pygments文档 \"\n\"<https://pygments.org/docs/formatters/>`_ 中 *HtmlFormatter* \"\n\"一节获取每个选项的详细信息。\"\n\n#: ../../content.rst:586 e7df88ffb2d4475ca19259b222d1ab3e\nmsgid \"\"\n\"For example, the following code block enables line numbers, starting at \"\n\"153, and prefixes the Pygments CSS classes with *pgcss* to make the names\"\n\" more unique and avoid possible CSS conflicts::\"\nmsgstr \"\"\n\"举个例子，下面的代码块开启了行号显示，从153行开始输出，并且指定Pygments的CSS类以 *pgcss* \"\n\"为前缀，使得类名更为独特并避免可能的CSS冲突：\"\n\n#: ../../content.rst:597 fc9b8b1fa7364ce1a274281a8e2e7237\nmsgid \"\"\n\"It is also possible to specify the ``PYGMENTS_RST_OPTIONS`` variable in \"\n\"your Pelican settings file to include options that will be automatically \"\n\"applied to every code block.\"\nmsgstr \"\"\n\"您也可以在Pelican的配置文件中指定 ``PYGMENTS_RST_OPTIONS`` \"\n\"，如此就可以让Pelican自动在每个代码块上使用指定的选项。\"\n\n#: ../../content.rst:601 b51dfbadd3bc42a483611d7013a87241\nmsgid \"\"\n\"For example, if you want to have line numbers displayed for every code \"\n\"block and a CSS prefix, you would set this variable to::\"\nmsgstr \"\"\n\"举个例子，若您希望每个代码块都显示行号，并且在CSS类名前都加上前缀pgcss，就可以像这样设置 ``PYGMENTS_RST_OPTIONS``\"\n\" ：\"\n\n#: ../../content.rst:606 82a9f33cc7c9493e8d8772f6c6fb63da\nmsgid \"\"\n\"If specified, settings for individual code blocks will override the \"\n\"defaults in your settings file.\"\nmsgstr \"\"\n\"若指定了 ``PYGMENTS_RST_OPTIONS`` ，同时也为代码块单独指定了一些选项，单独指定的会将 \"\n\"``PYGMENTS_RST_OPTIONS`` 覆盖。\"\n\n#: ../../content.rst:610 d2baf0b12ba148f0af9ccab86542e35f\nmsgid \"Publishing drafts\"\nmsgstr \"发布草稿\"\n\n#: ../../content.rst:612 2ba53426b76742e6980e6700c94d3d96\nmsgid \"\"\n\"If you want to publish an article or a page as a draft (for friends to \"\n\"review before publishing, for example), you can add a ``Status: draft`` \"\n\"attribute to its metadata. That article will then be output to the \"\n\"``drafts`` folder and not listed on the index page nor on any category or\"\n\" tag page.\"\nmsgstr \"\"\n\"如果您想要以草稿的形式发布文章或页面（例如在正式发布前给朋友预览），可以添加元数据属性 ``Status: draft`` 。如此，文章就会输出到\"\n\" ``drafts`` 文件夹中，并且不会被列在首页、分类或是标签页面中。\"\n\n#: ../../content.rst:617 e3a756e1580d48378a16946caeb79c8a\nmsgid \"\"\n\"If your articles should be automatically published as a draft (to not \"\n\"accidentally publish an article before it is finished), include the \"\n\"status in the ``DEFAULT_METADATA``::\"\nmsgstr \"\"\n\"若您希望文章默认以草稿形式发布（可以防止在完成文章前不小心将其正式发布），可以将此status属性加在 ``DEFAULT_METADATA`` \"\n\"中：\"\n\n#: ../../content.rst:625 c4b74b80b8714eb2a69d81f42f6e3e27\nmsgid \"\"\n\"To publish a post when the default status is ``draft``, update the post's\"\n\" metadata to include ``Status: published``.\"\nmsgstr \"要发布当前处于 ``draft`` 状态的推文，更新推文的元数据，使其中包括 ``Status: published``。\"\n\n#: ../../content.rst:629 f8baadb48b12467aaa1025f018ab6621\nmsgid \"Hidden Posts\"\nmsgstr \"隐藏推文\"\n\n#: ../../content.rst:631 eb5efca86b2d4432a49703306334591a\nmsgid \"\"\n\"Like pages, posts can also be marked as ``hidden`` with the ``Status: \"\n\"hidden`` attribute. Hidden posts will be output to ``ARTICLE_SAVE_AS`` as\"\n\" expected, but are not included by default in tag, category, and author \"\n\"indexes, nor in the main article feed. This has the effect of creating an\"\n\" \\\"unlisted\\\" post.\"\nmsgstr \"\"\n\"和页面一样，推文也能通过 ``Status: hidden`` 标记为隐藏状态。隐藏的推文会输出到 ``ARTICLE_SAVE_AS`` \"\n\"指定的目录中，这些推文“不会被列出”，即不会在标签、分类、作者主页、feed中出现。\"\n\n#: ../../content.rst:637 2d67772b24bb40748d56dc3938195ce6\nmsgid \"Skip Posts\"\nmsgstr \"忽略推文\"\n\n#: ../../content.rst:639 0c97c429a7a74ba4830851491829d63e\nmsgid \"\"\n\"Posts marked with ``skip`` status are ignored entirely. They are not \"\n\"processed nor output to the ``ARTICLE_SAVE_AS`` path. Such posts will \"\n\"similarly not be included in indexes or feeds.\"\nmsgstr \"\"\n\"状态设为了 ``skip`` 的推文将会被完全忽略。也就是说，他们不会被处理，也不会输出到 ``ARTICLE_SAVE_AS`` \"\n\"指定的目录中。同样，被忽略的推文不会出现在索引或者订阅源中。\"\n"
  },
  {
    "path": "docs/locale/zh_CN/LC_MESSAGES/contribute.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) 2010–2024\n# This file is distributed under the same license as the PELICAN package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, 2024.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PELICAN 4\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2025-07-13 11:46+0800\\n\"\n\"PO-Revision-Date: 2024-06-27 19:00+0800\\n\"\n\"Last-Translator: GeorgeHu <dhxxhch@163.com>\\n\"\n\"Language: zh_CN\\n\"\n\"Language-Team: \\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=utf-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Generated-By: Babel 2.17.0\\n\"\n\n#: ../../contribute.rst:2 848b6c0ec944440791d56b25e314a8ab\nmsgid \"Contributing and feedback guidelines\"\nmsgstr \"项目贡献与意见反馈\"\n\n#: ../../contribute.rst:4 e8b8762778fd461db0934f07e4fc1fc5\nmsgid \"\"\n\"There are many ways to contribute to Pelican. You can improve the \"\n\"documentation, add missing features, and fix bugs (or just report them). \"\n\"You can also help out by reviewing and commenting on `existing issues \"\n\"<https://github.com/getpelican/pelican/issues>`_.\"\nmsgstr \"\"\n\"有很多渠道可以参与到贡献项目中来，例如帮助改进文档、添加缺失的特性、修复与报告bug。可以从查看 `已有 issues \"\n\"<https://github.com/getpelican/pelican/issues>`_ 开始。\"\n\n#: ../../contribute.rst:9 103b2f2862c4469695e4c6aff2321a8d\nmsgid \"\"\n\"Don't hesitate to fork Pelican and submit an issue or pull request on \"\n\"GitHub. When doing so, please consider the following guidelines.\"\nmsgstr \"随时随地都可以fork Pelican或是在GitHub上提交issue或PR。\"\n\n#: ../../../CONTRIBUTING.rst:2 5ad44a6fdf0b45eaaa800023139694f8\nmsgid \"Filing issues\"\nmsgstr \"提出issue\"\n\n#: ../../../CONTRIBUTING.rst:4 c7e2bb966f49419aba7ed7027a977043\nmsgid \"Before you submit a new issue, try `asking for help`_ first.\"\nmsgstr \"在你提交一个新的issue之前，可以先尝试 `请求他人帮助`_ 。\"\n\n#: ../../../CONTRIBUTING.rst:5 a287bb06699b4db79d6dd7491bbe031b\nmsgid \"\"\n\"If determined to create a new issue, first search `Pelican Discussions`_ \"\n\"and `existing issues`_ (open and closed) to see if your question has \"\n\"already been answered previously.\"\nmsgstr \"\"\n\"当你决定要提出新的issue时，先在 `Pelican的讨论版`_ 和 `已有issues`_ \"\n\"中搜索一下，（开放关闭的issue都搜一下），来看看你的问题是不是有人之前已经提出过。\"\n\n#: ../../../CONTRIBUTING.rst:14 d4a600f2338b458e822aba90e54d4cfd\nmsgid \"How to get help\"\nmsgstr \"如何获取帮助\"\n\n#: ../../../CONTRIBUTING.rst:16 db3264afde384c2891d9be7205578556\nmsgid \"Before you ask for help, please make sure you do the following:\"\nmsgstr \"在寻求帮助之前，请先尝试如下步骤：\"\n\n#: ../../../CONTRIBUTING.rst:18 3581147764244a548cd2898faaa7799a\nmsgid \"\"\n\"Read the documentation_ thoroughly. If in a hurry, at least use the \"\n\"search field that is provided at top-left on the documentation_ pages. \"\n\"Make sure you read the docs for the Pelican version you are using.\"\nmsgstr \"\"\n\"完整阅读 documentation_ 。如果你很急，至少先在 documentation_ \"\n\"左上角的搜索栏中尝试搜索。确保你阅读的文档和使用的Pelican版本相匹配。\"\n\n#: ../../../CONTRIBUTING.rst:21 d8e467909ec64ba7900da93b3765bfa6\nmsgid \"\"\n\"Use a search engine (e.g., DuckDuckGo, Google) to search for a solution \"\n\"to your problem. Someone may have already found a solution, perhaps in \"\n\"the form of a ':pelican-doc:`plugins` or a specific combination of \"\n\"settings.\"\nmsgstr \"\"\n\"使用搜索引擎（例如 DuckDuckGo、Google）搜索遇到问题的解决方案。互联网上可能已经有人遇到过相同的问题，解决方法可能包括使用某些 \"\n\":pelican-doc:`plugins` 或配置一系列的设置选项。\"\n\n#: ../../../CONTRIBUTING.rst:25 2011839b36504c41b307cc9f817c4a46\nmsgid \"Try reproducing the issue in a clean environment, ensuring you are using:\"\nmsgstr \"尝试在一个尽可能简单的环境中重现问题，并确保以下几点：\"\n\n#: ../../../CONTRIBUTING.rst:27 2d64217ea3e54dc58a371fc11a6ece8e\nmsgid \"\"\n\"latest Pelican release (or an up-to-date Git clone of Pelican ``main`` \"\n\"branch)\"\nmsgstr \"使用最新版本的Pelican（或是用Git克隆Pelican的main分支）\"\n\n#: ../../../CONTRIBUTING.rst:28 721ca09c5a9a495b9fbb6aa86df8be28\nmsgid \"latest releases of libraries used by Pelican\"\nmsgstr \"将Pelican使用的库升级到最新版本\"\n\n#: ../../../CONTRIBUTING.rst:29 bbe722bd2be748219d38c134f29569dd\nmsgid \"no plugins or only those related to the issue\"\nmsgstr \"此环境中没有使用插件或是只使用和问题相关的插件\"\n\n#: ../../../CONTRIBUTING.rst:31 e9f337f01ca546be93bd1d18884a1685\nmsgid \"\"\n\"**NOTE:** The most common sources of problems are anomalies in (1) \"\n\"themes, (2) plugins, (3) settings files, and (4) ``make``/``invoke`` \"\n\"automation wrappers. If you can't reproduce your problem when using the \"\n\"following steps to generate your site, then the problem is almost \"\n\"certainly with one of the above-listed elements (and not Pelican \"\n\"itself)::\"\nmsgstr \"\"\n\"**注意：** 最常见的问题基本上都产生于主题、插件、设置文件和自动化工具 ``make``/``invoke`` \"\n\"中。如果按照下述步骤生成站点后无法复现之前的问题，那么几乎可以肯定问题出在这四个地方，而不在Pelican本身：\"\n\n#: ../../../CONTRIBUTING.rst:41 1420bb3dd096480289b3da1534d7bf64\nmsgid \"\"\n\"If you can generate your site without problems using the steps above, \"\n\"then your problem is unlikely to be caused by Pelican itself, and \"\n\"therefore please consider reaching out to the maintainers of the \"\n\"plugins/theme you are using instead of raising the topic with the Pelican\"\n\" core community.\"\nmsgstr \"如果按照上述步骤能够正常生成站点，那么你的问题不太可能是由Pelican本身导致的，请考虑联系对应插件/主题的维护者，而不是在Pelican内核的社区中提出问题。\"\n\n#: ../../../CONTRIBUTING.rst:46 bdb7575fa4c74c0891fd686794cc84fd\nmsgid \"\"\n\"If despite the above efforts you still cannot resolve your problem, be \"\n\"sure to include in your inquiry the following information, preferably in \"\n\"the form of links to content uploaded to a `paste service`_, GitHub \"\n\"repository, or other publicly-accessible location:\"\nmsgstr \"\"\n\"经过上面这些努力，若您仍无法解决问题，确保你的提问中包括如下信息，可以以 `paste service`_ \"\n\"链接、GitHub仓库，或者其他可公开获取的形式提供：\"\n\n#: ../../../CONTRIBUTING.rst:51 b559dc6ca72649baa754cb14d1ac77ca\nmsgid \"\"\n\"Describe what version of Pelican you are running (output of ``pelican \"\n\"--version`` or the HEAD commit hash if you cloned the repo) and how \"\n\"exactly you installed it (the full command you used, e.g. ``python -m pip\"\n\" install pelican``).\"\nmsgstr \"\"\n\"描述正在运行的Pelican版本信息（可以通过 ``pelican --version`` 命令得到，如果clone的源仓库则可以查看HEAD \"\n\"commit的哈希值），以及你是如何安装Pelican的（要包括使用到的命令，例如 ``python -m pip install \"\n\"pelican``）\"\n\n#: ../../../CONTRIBUTING.rst:54 d09a0393a4c1462b878c1adf31a7537d\nmsgid \"\"\n\"If you are looking for a way to get some end result, prepare a detailed \"\n\"description of what the end result should look like (preferably in the \"\n\"form of an image or a mock-up page) and explain in detail what you have \"\n\"done so far to achieve it.\"\nmsgstr \"如果你希望产生某种特定的最终结果，请详细描述此最终结果是什么样的（最好以图片或者伪页面的形式），，并且细致讲述你做了哪些尝试。\"\n\n#: ../../../CONTRIBUTING.rst:58 720ee9dbccc74dccbabb994a2d36638d\nmsgid \"\"\n\"If you are trying to solve some issue, prepare a detailed description of \"\n\"how to reproduce the problem. If the issue cannot be easily reproduced, \"\n\"it cannot be debugged by developers or volunteers. Describe only the \"\n\"**minimum steps** necessary to reproduce it (no extra plugins, etc.).\"\nmsgstr \"\"\n\"如果你在尝试解决某些问题，请详细描述如何复现此问题。如果问题很难被复现，其他开发者和志愿者就很难进行调试。尽量只写出复现该问题的 **最少步骤**\"\n\" （无额外插件）。\"\n\n#: ../../../CONTRIBUTING.rst:62 34bdc49c617643d8ae7adb6a433a88fe\nmsgid \"\"\n\"Upload your settings file or any other custom code that would enable \"\n\"people to reproduce the problem or to see what you have already tried to \"\n\"achieve the desired end result.\"\nmsgstr \"上传你的配置文件以及所有自定义过的代码，这可以使得大家能够重现问题或者看到你已经做出的尝试。\"\n\n#: ../../../CONTRIBUTING.rst:65 03c88e23c7b54117aa69e003c8bbef6e\nmsgid \"\"\n\"Upload detailed and **complete** output logs and backtraces (remember to \"\n\"add the ``--debug`` flag: ``pelican --debug content [...]``)\"\nmsgstr \"\"\n\"上传详细 **完整** 的输出日志以及backtraces信息（记得在执行pelican命令时加上 ``--debug`` 标记： \"\n\"``pelican --debug content [...]`` ）\"\n\n#: ../../../CONTRIBUTING.rst:71 953240a12cd64be7b9375a4571193314\nmsgid \"\"\n\"Once the above preparation is ready, you can post your query as a new \"\n\"thread in `Pelican Discussions`_. Remember to include all the information\"\n\" you prepared.\"\nmsgstr \"一旦做好了上述准备，就可以在 `Pelican Discussions`_ 中发起你的问题了。记得在请求中附上收集好的信息。\"\n\n#: ../../../CONTRIBUTING.rst:75 e9f48bdfc6c744f282c70da3ac581052\nmsgid \"Contributing code\"\nmsgstr \"贡献代码\"\n\n#: ../../../CONTRIBUTING.rst:77 888be6bde2de42a49705f29443a519c1\nmsgid \"\"\n\"Before you submit a contribution, please ask whether it is desired so \"\n\"that you don't spend a lot of time working on something that would be \"\n\"rejected for a known reason. Consider also whether your new feature might\"\n\" be better suited as a ':pelican-doc:`plugins` — you can `ask for help`_\"\n\"  to make that determination.\"\nmsgstr \"\"\n\"在提交代码修改前，请先询问是否需要此修改，以免你做的工作因为已知原因而被拒绝。想想要添加的新特性是否更适合以 :pelican-doc:`插件` \"\n\"形式完成。可以通过 `如何获取帮助`_ 来帮助你作出决定。\"\n\n#: ../../../CONTRIBUTING.rst:82 6e1329bbd8354c30b8ffa07f18894d3f\nmsgid \"\"\n\"Also, if you intend to submit a pull request to address something for \"\n\"which there is no existing issue, there is no need to create a new issue \"\n\"and then immediately submit a pull request that closes it. You can submit\"\n\" the pull request by itself.\"\nmsgstr \"另外，如果你的PR是为了解决一个目前没有在issue中出现过的问题，那么就没有必要先创建一个新的issue，而是可以直接提起PR。\"\n\n#: ../../../CONTRIBUTING.rst:87 bca476812a33487c98d6aa840820671b\nmsgid \"Using Git and GitHub\"\nmsgstr \"使用Git与GitHub\"\n\n#: ../../../CONTRIBUTING.rst:89 51f8df6063a544baabf35ef3bae28e83\nmsgid \"\"\n\"`Create a new branch`_ specific to your change (as opposed to making your\"\n\" commits in the ``main`` branch).\"\nmsgstr \"`创建一个新的分支`_ 来标记你做的修改（而不是直接在主分支中提交）。\"\n\n#: ../../../CONTRIBUTING.rst:91 6c419972402444d5976574902311e2d7\nmsgid \"\"\n\"**Don't put multiple unrelated fixes/features in the same branch / pull \"\n\"request.** For example, if you're working on a new feature and find a \"\n\"bugfix that doesn't *require* your new feature, **make a new distinct \"\n\"branch and pull request** for the bugfix. Similarly, any proposed changes\"\n\" to code style formatting should be in a completely separate pull \"\n\"request.\"\nmsgstr \"\"\n\"**不要把多个无关联的修复/特性修改放在同一个分支/拉去请求中。** 如果当你在做新特性的时候发现了一个bug可以修复，但修复这个bug \"\n\"*不需要用到* 这个新特性， **那么请另外创建一个分支并拉取请求。** 类似的，任何对代码风格的格式化都应该在单独的请求中拉取。\"\n\n#: ../../../CONTRIBUTING.rst:96 ced35621749d426a8e39fdeb9b0f7c90\nmsgid \"\"\n\"Add a ``RELEASE.md`` file in the root of the project that contains the \"\n\"release type (major, minor, patch) and a summary of the changes that will\"\n\" be used as the release changelog entry. For example::\"\nmsgstr \"\"\n\"在项目根目录下添加 ``RELEASE.md`` \"\n\"文件，在其中包含release的类型（主要、次要、补丁），以及对项目改变的概述，这些内容会作为该release发布日志的一部分。下面是一个例子：\"\n\n#: ../../../CONTRIBUTING.rst:104 ca6b2bf54f5248cbb7d90edb678478fc\nmsgid \"\"\n\"Check for unnecessary whitespace via ``git diff --check`` before \"\n\"committing.\"\nmsgstr \"在提交前使用 ``git diff --check`` 来检查是否有无意义的空白字符。\"\n\n#: ../../../CONTRIBUTING.rst:105 48776b48e4924398b7632b8f05141e78\nmsgid \"\"\n\"First line of your commit message should start with present-tense verb, \"\n\"be 50 characters or less, and include the relevant issue number(s) if \"\n\"applicable. *Example:* ``Ensure proper PLUGIN_PATH behavior. Refs #428.``\"\n\" If the commit *completely fixes* an existing bug report, please use \"\n\"``Fixes #585`` or ``Fix #585`` syntax (so the relevant issue is \"\n\"automatically closed upon PR merge).\"\nmsgstr \"\"\n\"commit信息的第一行应该以现在时动词开头，并且第一行尽量保持在50字以下，并且包含相关联issue的编号（如果有的话）。 例如： \"\n\"``Ensure proper PLUGIN_PATH behavior. Refs #428.`` 如果此项提交 *完全修复* \"\n\"了某项已报告的bug，请使用例如 ``Fixes #585`` 或 ``Fix #585`` \"\n\"的语法（这样的话相关的issue会在PR合并后自动关闭）。\"\n\n#: ../../../CONTRIBUTING.rst:110 75acb68d9eaa4230ae230f016bf77b6c\nmsgid \"\"\n\"After the first line of the commit message, add a blank line and then a \"\n\"more detailed explanation (when relevant).\"\nmsgstr \"在第一行commit信息后添加一行空白行，再进行更多相关的细节描述。\"\n\n#: ../../../CONTRIBUTING.rst:112 51e3a16f76364d91a9abf219c731ff80\nmsgid \"\"\n\"`Squash your commits`_ to eliminate merge commits and ensure a clean and \"\n\"readable commit history.\"\nmsgstr \"`压缩commit`_ 来消除合并commits，确保你的commit历史记录是干净可读的。\"\n\n#: ../../../CONTRIBUTING.rst:114 01ddd9df01024d38a8de79122a91cc07\nmsgid \"\"\n\"After you have issued a pull request, the continuous integration (CI) \"\n\"system will run the test suite on all supported Python versions and check\"\n\" for code style compliance. If any of these checks fail, you should fix \"\n\"them. (If tests fail on the CI system but seem to pass locally, ensure \"\n\"that local test runs aren't skipping any tests.)\"\nmsgstr \"在你发出PR后，持续集成（CI）系统会在所有支持的Python版本上运行测试套件，并且检查代码风格的合规性。如果出现了错误，你应该将其修复。（如果没有通过CI系统上的测试但是本地测试通过了，请再检查一下，确保在本地进行了所有CI系统中的检查）\"\n\n#: ../../../CONTRIBUTING.rst:121 bc27587df397410a9bb272f0851756a3\nmsgid \"Contribution quality standards\"\nmsgstr \"贡献的质量标准\"\n\n#: ../../../CONTRIBUTING.rst:123 2cf100b3e98b43e5b841493887a1d8be\nmsgid \"\"\n\"Adhere to the project's code style standards. See: `Development \"\n\"Environment`_\"\nmsgstr \"遵循项目的代码风格标准。详见 `开发环境`_\"\n\n#: ../../../CONTRIBUTING.rst:124 fffad000d6ca490291bd09cb18fcc75a\nmsgid \"\"\n\"Ensure your code is compatible with the `officially-supported Python \"\n\"releases`_.\"\nmsgstr \"确保你的代码可以兼容 `python的官方发布版本`_\"\n\n#: ../../../CONTRIBUTING.rst:125 907e4426cbc643fb9075e32be169ba42\nmsgid \"\"\n\"Add docs and tests for your changes. Undocumented and untested features \"\n\"will not be accepted.\"\nmsgstr \"请为你修改的内容添加文档与测试。未注有文档或没有对应测试的特性会被拒绝。\"\n\n#: ../../../CONTRIBUTING.rst:127 d2bcbeeb9c0541c2a5ac5ec589a16ca4\nmsgid \"\"\n\":pelican-doc:`Run all the tests <contribute>` **on all versions of Python\"\n\" supported by Pelican** to ensure nothing was accidentally broken.\"\nmsgstr \"\"\n\"**在Pelican支持的所有Python版本上** :pelican-doc:`执行所有测试 <contribute>` \"\n\"，以确保没有意料之外的问题。\"\n\n#: ../../../CONTRIBUTING.rst:130 26daa76aea674039be278882a95422f5\nmsgid \"\"\n\"Check out our `Git Tips`_ page or `ask for help`_ if you need assistance \"\n\"or have any questions about these guidelines.\"\nmsgstr \"若需要帮助或对以上指南有任何疑惑，还可以查看我们的 `Git提示`_ 页面和 `请求帮助`_ 部分。\"\n\n#: ../../contribute.rst:15 b4a94275e9c14d8795fa54473ee2f05b\nmsgid \"Setting up the development environment\"\nmsgstr \"配置开发环境\"\n\n#: ../../contribute.rst:17 a0eb6948883742d2a00665a576ef6aba\nmsgid \"\"\n\"While there are many ways to set up one's development environment, the \"\n\"following instructions will utilize Pip_ and PDM_. These tools facilitate\"\n\" managing virtual environments for separate Python projects that are \"\n\"isolated from one another, so you can use different packages (and package\"\n\" versions) for each.\"\nmsgstr \"\"\n\"在配置开发环境时往往有很多种方式，但下面的指南会使用 Pip_ 和 PDM_ \"\n\"完成配置。这两个工具都可以用于管理虚拟环境，使得不同的Python项目相互隔离，这样就可以很方便的在不同的项目中使用不同的库（以及不同的库版本）。\"\n\n#: ../../contribute.rst:22 4c5c4d91e6964d709d01102e32310642\nmsgid \"Please note that Python |min_python| is required for Pelican development.\"\nmsgstr \"请注意，要进行Pelican的开发，至少需要Python |min_python|\"\n\n#: ../../contribute.rst:24 5419157e28984a618fc1f0df81deb620\nmsgid \"\"\n\"*(Optional)* If you prefer to `install PDM \"\n\"<https://pdm.fming.dev/latest/#installation>`_ once for use with multiple\"\n\" projects, you can install it via::\"\nmsgstr \"\"\n\"*（可选）* 若您想要 `安装PDM <https://pdm.fming.dev/latest/#installation>`_ \"\n\"，可以使用下面这条命令：\"\n\n#: ../../contribute.rst:29 a9d08dc294cb4857a58d2c63eae98a15\nmsgid \"\"\n\"Point your web browser to the `Pelican repository`_ and tap the **Fork** \"\n\"button at top-right. Then clone the source for your fork and add the \"\n\"upstream project as a Git remote::\"\nmsgstr \"\"\n\"在Web浏览器中进入 `Pelican的代码仓库`_ ，点击右上角的 **Fork** \"\n\"按钮。然后克隆你自己的这份fork，最后添加项目的原仓库为远程仓库upstream：\"\n\n#: ../../contribute.rst:38 4c8ebbf9839441ca9364eeb1d25b180f\nmsgid \"\"\n\"While PDM can dynamically create and manage virtual environments, we're \"\n\"going to manually create and activate a virtual environment::\"\nmsgstr \"通过下面的命令可以手动创建并激活一个虚拟环境：\"\n\n#: ../../contribute.rst:45 ../../contribute.rst:186\n#: 2afe046c20814fe5b3de9a65606505f1 6ec60e6a37b642edb68af7ed1bc82c0b\nmsgid \"Install the needed dependencies and set up the project::\"\nmsgstr \"安装必需的依赖并配置项目：\"\n\n#: ../../contribute.rst:50 59d5dabaab1d409c8873187e5664fe67\nmsgid \"Your local environment should now be ready to go!\"\nmsgstr \"现在，你的本地开发环境就配置完成了！\"\n\n#: ../../contribute.rst:57 6fdce76f8ec64275b24366ff03cc6340\nmsgid \"Development\"\nmsgstr \"开发\"\n\n#: ../../contribute.rst:59 1d1a814a5dba40bcb84ce824d6312805\nmsgid \"\"\n\"Once Pelican has been set up for local development, create a topic branch\"\n\" for your bug fix or feature::\"\nmsgstr \"在配置好Pelican的本地开发环境后，请先为你的bug修复或特性增加创建一个分支：\"\n\n#: ../../contribute.rst:64 773cdd3a48894e11a62cb24b25ef4829\nmsgid \"\"\n\"Now you can make changes to Pelican, its documentation, and/or other \"\n\"aspects of the project.\"\nmsgstr \"在切换到新建的分支后，就可以开始对Pelican的文档或其他内容做更改了。\"\n\n#: ../../contribute.rst:68 bb120553218b4d0699998fbaf00d32c0\nmsgid \"Setting up ``git blame`` (optional)\"\nmsgstr \"配置 ``git blame`` （可选）\"\n\n#: ../../contribute.rst:70 644fae63e5ea4e66a24e35a7ada3524c\nmsgid \"\"\n\"``git blame`` annotates lines in a file with information about the pull \"\n\"request that last modified it. Sweeping shallow changes (like formatting)\"\n\" can make that information less useful, so we keep a list of such changes\"\n\" to be ignored. Run the following command to set this up in your \"\n\"repository, adding ``--global`` if you want this setting to apply to all \"\n\"repositories::\"\nmsgstr \"\"\n\"``git blame`` \"\n\"会在文件中的行上标注有关最后一次修改该行的PR信息。对浅层变化（如格式化）进行批量更改可能会使这些信息变得不那么有用，因此我们维护一个包含此类更改的列表，以便忽略它们。运行以下命令在您的存储库中设置此配置，如果希望此设置适用于所有存储库，请添加\"\n\" ``--global`` ：\"\n\n#: ../../contribute.rst:78 68b7031047e94e03b0e1b0ea39d0355e\nmsgid \"\"\n\"As noted in a `useful article`_ about ``git blame``, there are other \"\n\"related settings you may find to be beneficial::\"\nmsgstr \"就像在 `这篇文章`_ 中提到的，还可以进行一些可能有用的额外设置：\"\n\n#: ../../contribute.rst:89 c33fd6178fb044dda7073f1fc2cce979\nmsgid \"Running the test suite\"\nmsgstr \"运行测试套件\"\n\n#: ../../contribute.rst:91 5b51e49bc1ca42c6916c4dceed476057\nmsgid \"\"\n\"Each time you make changes to Pelican, there are two things to do \"\n\"regarding tests: check that the existing tests pass, and add tests for \"\n\"any new features or bug fixes. The tests are located in \"\n\"``pelican/tests``, and you can run them via::\"\nmsgstr \"\"\n\"每次对Pelican做出修改后，在测试方面需要做两个工作：检查是否能通过已有的测试、为新增特性或bug修复创建测试。请将自动化测试文件放在 \"\n\"``pelican/tests`` 中，接着执行以下命令：\"\n\n#: ../../contribute.rst:98 0e03b29d89cc408e9374cb51f7147611\nmsgid \"\"\n\"(For more on Invoke, see ``invoke -l`` to list tasks, or \"\n\"https://pyinvoke.org for documentation.)\"\nmsgstr \"（执行 ``invoke -l`` 会列出可以调用的测试任务，关于此的更多文档请参阅 https://pyinvoke.org ）\"\n\n#: ../../contribute.rst:101 70aad8c721c64d2b8d32488dd9da851e\nmsgid \"\"\n\"In addition to running the test suite, it is important to also ensure \"\n\"that any lines you changed conform to code style guidelines. You can \"\n\"check that via::\"\nmsgstr \"除了运行测试套件外，还要确保修改了的部分遵循代码风格指南。可以通过下面的命令检查代码风格：\"\n\n#: ../../contribute.rst:106 ../../contribute.rst:200\n#: b0ff008dde5e4e0b892e0fc2fa959b6a\nmsgid \"\"\n\"If style violations are found, many of them can be addressed \"\n\"automatically via::\"\nmsgstr \"若存在不合规范风格的代码，大多数情况下可以通过下述命令自动纠正：\"\n\n#: ../../contribute.rst:111 ebad1e2cb63a45d999d2d3e510711972\nmsgid \"\"\n\"If code style violations are found in lines you changed, correct those \"\n\"lines and re-run the ``invoke lint`` command until they have all been \"\n\"fixed. You do not need to address style violations, if any, for code \"\n\"lines you did not touch.\"\nmsgstr \"如果在修改过的代码中有地方违反了代码风格规范，请纠正并再次运行上述命令，直到全部纠正。但是若是发现违反代码风格的地方并不是你修改的，请忽略之，不要进行纠正。\"\n\n#: ../../contribute.rst:115 e208ada16ab8425e9fbbcd5f135f6574\nmsgid \"\"\n\"After making your changes and running the tests, you may see a test \"\n\"failure mentioning that \\\"some generated files differ from the expected \"\n\"functional tests output.\\\" If you have made changes that affect the HTML \"\n\"output generated by Pelican, and the changes to that output are expected \"\n\"and deemed correct given the nature of your changes, then you should \"\n\"update the output used by the functional tests. To do so, **make sure you\"\n\" have both** ``en_EN.utf8`` **and** ``fr_FR.utf8`` **locales installed**,\"\n\" and then run the following command::\"\nmsgstr \"\"\n\"在修改完代码，运行测试的过程中，你可能会看到测试失败中有提到“some generated files differ from the \"\n\"expected functional tests output” \"\n\"。这可能是由于你对代码的修改影响到了Pelican的HTML输出，若输出的结果确实是你想要的，请更新功能测试所用的输出用例。请确保你安装了 \"\n\"``en_EN.utf8`` 和 ``fr_FR.utf8`` ，然后执行下述命令：\"\n\n#: ../../contribute.rst:125 a4a3e16c3e0345c99cb2d8b674627afa\nmsgid \"\"\n\"You may also find that some tests are skipped because some dependency \"\n\"(e.g., Pandoc) is not installed. This does not automatically mean that \"\n\"these tests have passed; you should at least verify that any skipped \"\n\"tests are not affected by your changes.\"\nmsgstr \"你还可能会发现有一些测试由于缺少依赖（例如 Pandoc）而被跳过。这并不意味着通过了这些测试，请至少确保对代码的修改不会影响到这些被跳过的测试。\"\n\n#: ../../contribute.rst:130 dd6db784c2534b0ea0842cb736dca7c3\nmsgid \"\"\n\"You should run the test suite under each of the supported versions of \"\n\"Python. This is best done by creating a separate Python environment for \"\n\"each version. Tox_ is a useful tool to automate running tests inside \"\n\"``virtualenv`` environments.\"\nmsgstr \"\"\n\"你应该在Pelican支持的所有Python版本下运行测试套件。一般会通过为每一个Python版本创建一个虚拟环境来实现这一点。Tox_ \"\n\"是一个用于在 ``virtualenv`` 环境中自动运行测试的工具。\"\n\n#: ../../contribute.rst:138 58fd644b4b7248ebb9c8ff899a2f90b1\nmsgid \"Running a code coverage report\"\nmsgstr \"运行代码测试覆盖报告\"\n\n#: ../../contribute.rst:140 abe50ab68fef48dea42aa269743fc172\nmsgid \"\"\n\"Code is more likely to stay robust if it is tested. Coverage_ is a \"\n\"library that measures how much of the code is tested. To run it::\"\nmsgstr \"经过测试的代码往往具有更好的健壮性。 Coverage_ 是一个用于衡量代码测试覆盖率的库执行下面的命令以调取之：\"\n\n#: ../../contribute.rst:145 9d5ba28c240f464c92db9869c01e3917\nmsgid \"\"\n\"This will show overall coverage, coverage per file, and even line-by-line\"\n\" coverage. There is also an HTML report available::\"\nmsgstr \"该命令会展示总体覆盖率以及在每个文件上的覆盖率，甚至还会展示每一行的覆盖情况。同样也会有一份HTML格式的报告供您查看：\"\n\n#: ../../contribute.rst:153 45e095f0c0fd4a5b9f75027d12dd891f\nmsgid \"Building the docs\"\nmsgstr \"构建文档\"\n\n#: ../../contribute.rst:155 e1e8bb56a9c8449a8da8e10fcf45da2a\nmsgid \"\"\n\"If you make changes to the documentation, you should build and inspect \"\n\"your changes before committing them::\"\nmsgstr \"若你对文档进行过修改，请在commit前完成构建和检查：\"\n\n#: ../../contribute.rst:160 9482dc5bee484f0c9f05af197b49ed70\nmsgid \"\"\n\"Open http://localhost:8000 in your browser to review the documentation. \"\n\"While the above task is running, any changes you make and save to the \"\n\"documentation should automatically appear in the browser, as it live-\"\n\"reloads when it detects changes to the documentation source files.\"\nmsgstr \"\"\n\"执行上述命令后，请在Web浏览器中打开 http://localhost:8000 \"\n\"来查看文档。在上述命令执行时，对文档做的任何修改应该会自动反映在浏览器中。\"\n\n#: ../../contribute.rst:166 82343c9684bb440eb260110d98bb0e59\nmsgid \"Plugin development\"\nmsgstr \"插件开发\"\n\n#: ../../contribute.rst:168 8697f547344e4973ad34f9c619ddf22e\nmsgid \"\"\n\"To create a *new* Pelican plugin, please refer to the `plugin template`_ \"\n\"repository for detailed instructions.\"\nmsgstr \"要创建一个 *新的* Pelican插件，请参阅 `插件模板`_ 仓库以获得更为详细的指导。\"\n\n#: ../../contribute.rst:171 3c505e3035c143c89efd3e648fe00e8e\nmsgid \"\"\n\"If you want to contribute to an *existing* Pelican plugin, follow the \"\n\"steps above to set up Pelican for local development, and then create a \"\n\"directory to store cloned plugin repositories::\"\nmsgstr \"若你想在 *已有* Pelican插件中做贡献，请先按前文所述步骤配置Pelican的本地开发环境，然后创建一个文件夹来存放克隆下来的插件仓库：\"\n\n#: ../../contribute.rst:177 5523421ea2664b1ab0859216a1c8a463\nmsgid \"\"\n\"Assuming you wanted to contribute to the Simple Footnotes plugin, you \"\n\"would first browse to the `Simple Footnotes`_ repository on GitHub and \"\n\"tap the **Fork** button at top-right. Then clone the source for your fork\"\n\" and add the upstream project as a Git remote::\"\nmsgstr \"\"\n\"假设想要为Simple Footnotes插件做贡献，你应该先查看并fork `Simple Footnotes`_ \"\n\"的Github仓库，然后克隆你自己fork的那一份，再添加原仓库作为Git远程仓库upstream：\"\n\n#: ../../contribute.rst:190 e5178eb4654a44919c743d37f00ff4c3\nmsgid \"Create a topic branch for your plugin bug fix or feature::\"\nmsgstr \"同样地，为你想要进行的bug修复或特性添加创建一个分支：\"\n\n#: ../../contribute.rst:194 af04dad9f528473caa4c4c0f4c33042a\nmsgid \"\"\n\"After writing new tests for your plugin changes, run the plugin test \"\n\"suite and check for code style compliance via::\"\nmsgstr \"完成修改并添加测试后，运行测试套件，并检查代码风格：\"\n\n#: ../../contribute.rst:205 06d00f61d5c344d587baa85116b3c1e0\nmsgid \"\"\n\"If style violations are found even after running the above auto-\"\n\"formatters, you will need to make additional manual changes until \"\n\"``invoke lint`` no longer reports any code style violations.\"\nmsgstr \"如果在自动格式化后仍存在代码风格上的问题，请手动修正这些问题，直到执行 ``invoke lint`` 时不再报告问题。\"\n\n#: ../../contribute.rst:213 9a0831b06abd494fad469b7df71c489f\nmsgid \"Submitting your changes\"\nmsgstr \"提交更改\"\n\n#: ../../contribute.rst:215 23b5d147059b4cea99a213f50d63097a\nmsgid \"\"\n\"Assuming linting validation and tests pass, add a ``RELEASE.md`` file in \"\n\"the root of the project that contains the release type (major, minor, \"\n\"patch) and a summary of the changes that will be used as the release \"\n\"changelog entry. For example::\"\nmsgstr \"\"\n\"通过了风格检查和所有测试后，请在项目的根目录下添加一个 ``RELEASE.md`` \"\n\"文件，其中应包含发布的类型（major、minor、patch）以及代码变更的摘要，这份摘要会被用作更新日志的条目。下面是一个例子：\"\n\n#: ../../contribute.rst:224 6794c41ebe2c4937ba4f3f8e16e7a9d9\nmsgid \"Commit your changes and push your topic branch::\"\nmsgstr \"commit你的更改，并push对应分支：\"\n\n#: ../../contribute.rst:230 daa69b097fc14739be924714f8070cf6\nmsgid \"\"\n\"Finally, browse to your repository fork on GitHub and submit a pull \"\n\"request.\"\nmsgstr \"最后，前往Github，从你fork的仓库向原仓库提出PR。\"\n\n#: ../../contribute.rst:234 b71524be74c84517a12fcdecb51bc55e\nmsgid \"Logging tips\"\nmsgstr \"日志技巧\"\n\n#: ../../contribute.rst:236 a0b70f864ce144eabe0f89d78844c395\nmsgid \"Try to use logging with appropriate levels.\"\nmsgstr \"请仔细斟酌合适的日志等级。\"\n\n#: ../../contribute.rst:238 3b44fa3ec9b3493e97c310207e5dce91\nmsgid \"For logging messages that are not repeated, use the usual Python way::\"\nmsgstr \"对于不重复的日志消息，使用一般的方式即可：\"\n\n#: ../../contribute.rst:247 49d4e407310348838660e8c74c6e3fb6\n#, python-format\nmsgid \"\"\n\"Do not format log messages yourself. Use ``%s`` formatting in messages \"\n\"and pass arguments to logger. This is important, because the Pelican \"\n\"logger will preprocess some arguments, such as exceptions.\"\nmsgstr \"\"\n\"请不要自己格式化日志消息，而是使用在日志消息中使用 ``%s`` \"\n\"并向logger传入参数。请务必遵循这一规则，因为Pelican的logger会自动预处理一些特殊的参数，例如exception。\"\n\n#: ../../contribute.rst:252 4ac501dff8bc4554998d3f03486cce0e\nmsgid \"Limiting extraneous log messages\"\nmsgstr \"限制低关联日志消息\"\n\n#: ../../contribute.rst:254 c4dfb487945341cda6c0858954a2ed40\nmsgid \"\"\n\"If the log message can occur several times, you may want to limit the log\"\n\" to prevent flooding. In order to do that, use the ``extra`` keyword \"\n\"argument for the logging message in the following format::\"\nmsgstr \"如果同一日志消息会重复多次，你会希望限制这些多余的内容。使用 ``extra`` 命名参数来实现这一点：\"\n\n#: ../../contribute.rst:261 4090a3bc71e3441e8a7efd639d36ec1e\nmsgid \"\"\n\"Optionally, you can also set ``'limit_args'`` as a tuple of arguments in \"\n\"``extra`` dict if your generic message needs formatting.\"\nmsgstr \"可选的，如果通用日志消息需要格式化，可以添加 ``'limit_args'`` 参数并将其对应值设为一个元组。\"\n\n#: ../../contribute.rst:264 dd6530ceb29d4a91902046a3d4e63af6\nmsgid \"\"\n\"Limit is set to ``5``, i.e, first four logs with the same ``'limit_msg'``\"\n\" are outputted normally but the fifth one will be logged using \"\n\"``'limit_msg'`` (and ``'limit_args'`` if present). After the fifth, \"\n\"corresponding log messages will be ignored.\"\nmsgstr \"\"\n\"限制数默认设为了 ``5`` ，即前四个有相同 ``'limit_msg'`` 参数的日志消息会正常输出，但第五条这样的日志消息会呈现为 \"\n\"``'limit_msg'`` 参数值本身（ ``'limit_args'`` 同理）。第六条及之后的日志消息会被直接忽略。\"\n\n#: ../../contribute.rst:269 50bdb3405a964740aeb91a7d559ba9b5\nmsgid \"\"\n\"For example, if you want to log missing resources, use the following \"\n\"code::\"\nmsgstr \"例如，如果你想要用日志记录资源缺失的信息，可以使用下面的代码：\"\n\n#: ../../contribute.rst:277 0303387eccd842f9aa57eb3192252dba\nmsgid \"The log messages will be displayed as follows::\"\nmsgstr \"最终的日志消息看起来会像这样：\"\n\n#: ../../contribute.rst:287 281637c4520d4755993e8bfa46b0326b\nmsgid \"Outputting traceback in the logs\"\nmsgstr \"在日志中输出traceback信息\"\n\n#: ../../contribute.rst:289 8bd9319a7a6c4f77bd651057d1cc7c75\nmsgid \"\"\n\"If you're logging inside an ``except`` block, you may want to provide the\"\n\" traceback information as well. You can do that by setting ``exc_info`` \"\n\"keyword argument to ``True`` during logging. However, doing so by default\"\n\" can be undesired because tracebacks are long and can be confusing to \"\n\"regular users. Try to limit them to ``--debug`` mode like the following::\"\nmsgstr \"\"\n\"当在 ``except`` 块中进行日志记录时，你可能会希望同时输出traceback信息。可以简单地将 ``exc_info`` 参数设为 \"\n\"``True`` 来实现这一功能。但是通过此方法输出的traceback信息会非常长，不便于理解。可以像下述代码一样将这些信息限制在 \"\n\"``--debug`` 模式中：\"\n\n#~ msgid \"latest Pelican release (or an up-to-date Git clone of Pelican master)\"\n#~ msgstr \"\"\n\n#~ msgid \"\"\n#~ \"`Create a new branch`_ specific to \"\n#~ \"your change (as opposed to making \"\n#~ \"your commits in the master branch).\"\n#~ msgstr \"\"\n"
  },
  {
    "path": "docs/locale/zh_CN/LC_MESSAGES/faq.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) 2010–2024\n# This file is distributed under the same license as the PELICAN package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, 2024.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PELICAN 4\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-02-02 10:32+0800\\n\"\n\"PO-Revision-Date: 2026-02-02 10:32+0800\\n\"\n\"Last-Translator: GeorgeHu <dhxxhch@163.com>\\n\"\n\"Language: zh_CN\\n\"\n\"Language-Team: \\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=utf-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Generated-By: Babel 2.17.0\\n\"\n\n#: ../../faq.rst:2 84467b3ab4b8411589855b3130e14406\nmsgid \"Frequently Asked Questions (FAQ)\"\nmsgstr \"常见问题解答\"\n\n#: ../../faq.rst:4 54c28b1640fd4939b5f196fa377292eb\nmsgid \"Here are some frequently asked questions about Pelican.\"\nmsgstr \"以下是一些Pelican的常见问题解答。\"\n\n#: ../../faq.rst:7 a95f8f3dcb6741949ba9d4761199dd0a\nmsgid \"What's the best way to communicate a problem, question, or suggestion?\"\nmsgstr \"交流问题、疑问或提建议的最佳方式是什么？\"\n\n#: ../../faq.rst:9 d93f8424407d42b2b3ce37b39baecd8a\nmsgid \"Please read our :doc:`feedback guidelines <contribute>`.\"\nmsgstr \"请参阅文档 :doc:`项目贡献与意见反馈 <contribute>` 。\"\n\n#: ../../faq.rst:12 9fea72b4670c4fe6a3d67e1ddb158f47\nmsgid \"How can I help?\"\nmsgstr \"我可以帮上什么忙？\"\n\n#: ../../faq.rst:14 3f4b88cf5b814e678a552c821ae4b450\nmsgid \"\"\n\"There are several ways to help out. First, you can communicate any \"\n\"Pelican suggestions or problems you might have via `Pelican Discussions \"\n\"<https://github.com/getpelican/pelican/discussions>`_. Please first check\"\n\" the existing list of discussions and issues (both open and closed) in \"\n\"order to avoid submitting topics that have already been covered before.\"\nmsgstr \"\"\n\"有好多种方法可以提供帮助。首先，可以在 `Pelican讨论板块 \"\n\"<https://github.com/getpelican/pelican/discussions>`_ \"\n\"中提出任何关于Pelican的建议或是问题。在提问或建议之前，请先查看已关闭或开放的issues中是否已有相关内容，以避免内容上的重复。\"\n\n#: ../../faq.rst:20 ca9e66682caf43a481ca91ecace43ed0\nmsgid \"\"\n\"If you want to contribute, please fork `the Git repository \"\n\"<https://github.com/getpelican/pelican/>`_, create a new feature branch, \"\n\"make your changes, and issue a pull request. Someone will review your \"\n\"changes as soon as possible. Please refer to the :doc:`How to Contribute \"\n\"<contribute>` section for more details.\"\nmsgstr \"\"\n\"如果你想要对项目进行贡献，请fork `Git仓库 <https://github.com/getpelican/pelican/>`_ \"\n\"，创建一个新的功能分支，并在其中进行修改，在修改完成后提出一个PR。项目组会尽快审核你的PR。关于此的更多内容，请参见 \"\n\":doc:`项目贡献与意见反馈 <contribute>` 一节。\"\n\n#: ../../faq.rst:26 f05e9b722b084a439cd6d99b3155910d\nmsgid \"\"\n\"You can also contribute by creating themes and improving the \"\n\"documentation.\"\nmsgstr \"你可以发起的贡献当然也包括创建主题和改进文档。\"\n\n#: ../../faq.rst:29 d40c58aeafe54bdaa389c3c05a0fd721\nmsgid \"Is the Pelican settings file mandatory?\"\nmsgstr \"Pelican配置文件是必要的吗？\"\n\n#: ../../faq.rst:31 96ef0c57471d4a669bd7f2a7f493c23b\nmsgid \"\"\n\"Configuration files are optional and are just an easy way to configure \"\n\"Pelican. For basic operations, it's possible to specify options while \"\n\"invoking Pelican via the command line. See ``pelican --help`` for more \"\n\"information.\"\nmsgstr \"\"\n\"配置文件是可选的，其本质是使您可以更方便地配置Pelican。对于一些基本的配置操作，完全可以在命令行中指定，调用 ``pelican \"\n\"--help`` 可以查看pelican命令的更多信息。\"\n\n#: ../../faq.rst:36 e3752aec18514ce292ee4ebd0d95db37\nmsgid \"Changes to the settings file take no effect\"\nmsgstr \"修改后的配置文件没有生效\"\n\n#: ../../faq.rst:38 3f5c632fd20446cf8dd70a5eb88dbbcf\nmsgid \"\"\n\"When experimenting with different settings (especially the metadata ones)\"\n\" caching may interfere and the changes may not be visible. In such cases,\"\n\" ensure that caching is disabled via ``LOAD_CONTENT_CACHE = False`` or \"\n\"use the ``--ignore-cache`` command-line switch.\"\nmsgstr \"\"\n\"在尝试不同的配置时（尤其是尝试不同元数据时），缓存很可能会产生干扰，使得修改不可见。此时，确保配置了 ``LOAD_CONTENT_CACHE =\"\n\" False`` 或在命令行中加上 ``--ignore-cache`` 以禁用缓存。\"\n\n#: ../../faq.rst:44 067892211d0d4f4bae85d65a0132eb1d\nmsgid \"I'm creating my own theme. How do I use Pygments for syntax highlighting?\"\nmsgstr \"在自己创建主题时，如何使用Pygments来调整语法高亮？\"\n\n#: ../../faq.rst:46 b1e6ed1bea2e4b3cb3798131f30a828c\nmsgid \"\"\n\"Pygments adds some classes to the generated content. These classes are \"\n\"used by themes to style code syntax highlighting via CSS. Specifically, \"\n\"you can customize the appearance of your syntax highlighting via the \"\n\"``.highlight pre`` class in your theme's CSS file. To see how various \"\n\"styles can be used to render Django code, for example, use the style \"\n\"selector drop-down at top-right on the `Pygments project demo site \"\n\"<https://pygments.org/demo/>`_.\"\nmsgstr \"\"\n\"Pygments会为生成的内容添加一些CSS类。这些类会为主题所用，主题会通过CSS来为代码添加语法高亮。具体来说，你可以通过主题CSS文件中的 \"\n\"``.highlight pre`` 类来自定义语法高亮的外观。在 `Pygments 项目的demo网站 \"\n\"<https://pygments.org/demo/>`_ 上可以预览能够渲染的代码类型。\"\n\n#: ../../faq.rst:53 5dccc8ae367545b08bdce61e008e0a20\nmsgid \"\"\n\"You can use the following example commands to generate a starting CSS \"\n\"file from a Pygments built-in style (in this case, \\\"monokai\\\") and then \"\n\"copy the generated CSS file to your new theme::\"\nmsgstr \"你可以使用下面的命令来让Pygments使用内置风格（此处为“monokai”）生成一个初始CSS文件，然后将此文件拷贝到新主题中：\"\n\n#: ../../faq.rst:60 027edae1ebdf4d52b59171a26915c1ac\nmsgid \"Don't forget to import your ``pygment.css`` file from your main CSS file.\"\nmsgstr \"不要忘了在你的CSS主文件中引入  ``pygment.css`` 文件。\"\n\n#: ../../faq.rst:63 164af3be4dce45879963c5d3ee0cd264\nmsgid \"How do I create my own theme?\"\nmsgstr \"如何创建我自己的主题？\"\n\n#: ../../faq.rst:65 7b1db6528b0a4735894868a229a5969d\nmsgid \"Please refer to :ref:`theming-pelican`.\"\nmsgstr \"请参阅 :ref:`theming-pelican` 。\"\n\n#: ../../faq.rst:68 b8e21f837e0744c49cfe8f0cb3a1d5ee\nmsgid \"Can I override individual templates without forking the whole theme?\"\nmsgstr \"我只需要覆盖主题中单独的几个模板文件，可不可以不fork整个主题？\"\n\n#: ../../faq.rst:70 70fd7b5c55c246a6a25b20304bfdb616\nmsgid \"\"\n\"Yes, you can override existing templates of the theme that you are using,\"\n\" or add new templates, via the ``THEME_TEMPLATES_OVERRIDES`` variable. \"\n\"For example, to override the page template, you can define the location \"\n\"for your templates like this::\"\nmsgstr \"\"\n\"当然可以，覆盖部分模板文件或是添加一些模板文件都是可以的，使用 ``THEME_TEMPLATES_OVERRIDES`` \"\n\"变量即可。例如，若需要覆盖page的模板，可以向这样定义你自己的模板文件位置：\"\n\n#: ../../faq.rst:77 a96870f0cad74996bec2469ea0c2e9e1\nmsgid \"\"\n\"You can then define a custom template in ``templates/page.html``. See \"\n\":ref:`settings/themes` for details.\"\nmsgstr \"自定义的模板可以为 ``templates/page.html`` 。详情请参看 :ref:`settings/themes` 。\"\n\n#: ../../faq.rst:81 b832cd952cf44a0097f383825f0f295f\nmsgid \"I want to use Markdown, but I got an error.\"\nmsgstr \"我想要使用Markdown，但是出错了。\"\n\n#: ../../faq.rst:83 32d9dbde7029412d852ab8e710112573\nmsgid \"\"\n\"If you try to generate Markdown content without first installing the \"\n\"Markdown library, you may see a message that says ``No valid files found \"\n\"in content``. Markdown is not a hard dependency for Pelican, so if you \"\n\"have content in Markdown format, you will need to explicitly install the \"\n\"Markdown library. You can do so by typing the following command, \"\n\"prepending ``sudo`` if permissions require it::\"\nmsgstr \"\"\n\"如果没有事先安装Markdown库，在生成Markdown内容时会看到一条提示 ``No valid files found in \"\n\"content`` \"\n\"。虽然Markdown并不是必需依赖，但如果你写的内容中含有Markdown格式，就需要安装Markdown库了。输入下面的命令以安装Markdown库，如果需要权限，请在前面添加\"\n\" ``sudo`` ：\"\n\n#: ../../faq.rst:93 46728a367ffe47d9afeb7608e9c0db5f\nmsgid \"Can I use arbitrary metadata in my templates?\"\nmsgstr \"在模板中可以使用任意元数据吗？\"\n\n#: ../../faq.rst:95 9b7fbafc6d29429a88a079bfb74e3af5\nmsgid \"\"\n\"Yes. For example, to include a modified date in a Markdown post, one \"\n\"could include the following at the top of the article::\"\nmsgstr \"当然可以。例如，可以在Markdown帖子中包含一个“修改日期”，加在文章开头即可：\"\n\n#: ../../faq.rst:100 ce62442a4c9d4347bd6ae8a59476fcee\nmsgid \"\"\n\"For reStructuredText, this metadata should of course be prefixed with a \"\n\"colon::\"\nmsgstr \"对于reStructuredText，此元数据也应当以冒号为前缀：\"\n\n#: ../../faq.rst:104 bf869a6da43e448a9cc512843aa4a183\nmsgid \"\"\n\"This metadata can then be accessed in templates such as ``article.html`` \"\n\"via::\"\nmsgstr \"此元数据可以在模板中获取到，例如在 ``article.html`` 中，可以像这样获取：\"\n\n#: ../../faq.rst:110 b9c9a648b30942b996b124af9fd5a84c\nmsgid \"\"\n\"If you want to include metadata in templates outside the article context \"\n\"(e.g., ``base.html``), the ``if`` statement should instead be::\"\nmsgstr \"如果您想在其他模板（例如 ``base.html`` ）中获取此元数据，则 ``if`` 语句应改为：\"\n\n#: ../../faq.rst:117 22fb499d05e041c4bea55515c5428685\nmsgid \"\"\n\"Because the colon symbol (``:``) is used as a separator, be aware that \"\n\"metadata field names *containing* a colon will probably not work.\"\nmsgstr \"因为冒号 (``:``) 已经用作分隔符，字段名称包含冒号的元数据可能不会起作用。\"\n\n#: ../../faq.rst:121 b78a678a165d40f4823fac2b19bcafc1\nmsgid \"\"\n\"How do I make my output folder structure identical to my content \"\n\"hierarchy?\"\nmsgstr \"如何使得输出目录的结构和content目录的结构保持一致？\"\n\n#: ../../faq.rst:123 851d1019c070482991667cc024063d29\nmsgid \"Try these settings::\"\nmsgstr \"可以尝试如下配置：\"\n\n#: ../../faq.rst:130 5195876e3f364a838d72b16c568263bc\nmsgid \"How do I assign custom templates on a per-page basis?\"\nmsgstr \"如何为某个页面指定某个模板？\"\n\n#: ../../faq.rst:132 2ddd3cf1fbf048b1819bcfc9b3691a12\nmsgid \"\"\n\"It's as simple as adding an extra line of metadata to any page or article\"\n\" that you want to have its own template. For example, this is how it \"\n\"would be handled for content in reST format::\"\nmsgstr \"这非常简单，在任何页面或者文章中，都可以通过多添加一行元数据来指定特定模板。例如，在reST中，使用：\"\n\n#: ../../faq.rst:138 6f5eb40b4a5e4f83ab9d1cb48fefad57\nmsgid \"For content in Markdown format::\"\nmsgstr \"对于Markdown，则使用：\"\n\n#: ../../faq.rst:142 2e28d1bf074c437eb5017bf6f345bf71\nmsgid \"\"\n\"Then just make sure your theme contains the relevant template file (e.g. \"\n\"``template_name.html``). If you just want to add a new custom template to\"\n\" an existing theme, you can also provide it in a directory specified by \"\n\"``THEME_TEMPLATES_OVERRIDES`` (see :ref:`settings/themes`).\"\nmsgstr \"\"\n\"接着只要确保主题中有相对应的模板文件 (e.g. ``template_name.html``)。如果只是需要把一个自定义\"\n\"模板加到已有主题中，可以将其放在 ``THEME_TEMPLATES_OVERRIDES`` 指定的目录中 （详见 :ref:`settings/themes`）。\"\n\n#: ../../faq.rst:147 675e77f99f3c42bb8715c84a97c7a064\nmsgid \"How can I override the generated URL of a specific page or article?\"\nmsgstr \"如何重写某一个页面或文章生成的URL？\"\n\n#: ../../faq.rst:149 7e518b99b29d4787addc732d57e94ed1\nmsgid \"\"\n\"Include ``url`` and ``save_as`` metadata in any pages or articles that \"\n\"you want to override the generated URL. Here is an example page in reST \"\n\"format::\"\nmsgstr \"在任意页面或文章中都可以添加 ``url`` 和 ``save_as`` 元数据，这样就可以重写URL了。下面以reST格式为例：\"\n\n#: ../../faq.rst:158 903306ecaed3483591b4ed2dcba3d183\nmsgid \"\"\n\"With this metadata, the page will be written to \"\n\"``override/url/index.html`` and Pelican will use the URL \"\n\"``override/url/`` to link to this page.\"\nmsgstr \"\"\n\"有了这样的元数据，此页面会保存为 ``override/url/index.html`` ，Pelican会将 ``override/url/``\"\n\" 作为链接到此页面的URL。\"\n\n#: ../../faq.rst:162 d80d84fcb6844e25a8452e29c4113181\nmsgid \"How can I use a static page as my home page?\"\nmsgstr \"如何使用一个静态页面作为主页？\"\n\n#: ../../faq.rst:164 e17a2e2dd9014109888bab9286ee607c\nmsgid \"\"\n\"The override feature mentioned above can be used to specify a static page\"\n\" as your home page. The following Markdown example could be stored in \"\n\"``content/pages/home.md``::\"\nmsgstr \"上一个问题中提到的特性可以用于实现此需求。下面例子中的Markdown文件保存为 ``content/pages/home.md`` ：\"\n\n#: ../../faq.rst:174 b99ba0ca8656416cbdc38f3fa263b7eb\nmsgid \"\"\n\"If the original blog index is still wanted, it can then be saved in a \"\n\"different location by setting ``INDEX_SAVE_AS = 'blog_index.html'`` for \"\n\"the ``'index'`` direct template.\"\nmsgstr \"\"\n\"如果仍需要原来的博客主页（即 ``'index'`` 直接模板），可以通过设置 ``INDEX_SAVE_AS = \"\n\"'blog_index.html'`` 将其存储在其他位置。\"\n\n#: ../../faq.rst:179 fca4725a57dd451fb3b0fb9df78f69b5\nmsgid \"What if I want to disable feed generation?\"\nmsgstr \"可以禁用订阅源生成吗？\"\n\n#: ../../faq.rst:181 e9c08140e2ed44f189a7a156db027a3e\nmsgid \"\"\n\"To disable feed generation, all feed settings should be set to ``None``. \"\n\"All but three feed settings already default to ``None``, so if you want \"\n\"to disable all feed generation, you only need to specify the following \"\n\"settings::\"\nmsgstr \"\"\n\"要禁用订阅源，所有订阅源相关的配置都应被设为 ``None`` 。其中有三项设置默认为 ``None`` \"\n\"，因此如果要彻底不生成订阅源，你只需要指定下面这些设置：\"\n\n#: ../../faq.rst:191 7820a481af4c4f44a40fb3ae80768a1d\nmsgid \"\"\n\"The word ``None`` should not be surrounded by quotes. Please note that \"\n\"``None`` and ``''`` are not the same thing.\"\nmsgstr \"``None`` 两侧不需要加引号。请注意 ``None`` 和 ``''`` 不是同一个东西。\"\n\n#: ../../faq.rst:195 4fa2ffbf1c274ec396a0d756762c260d\nmsgid \"\"\n\"I'm getting a warning about feeds generated without SITEURL being set \"\n\"properly\"\nmsgstr \"Pelican警告说由于SITEURL设置不正确，无法正常生成订阅源\"\n\n#: ../../faq.rst:197 8d52f14f6b03476897dfb15c188a961a\nmsgid \"\"\n\"`RSS and Atom feeds require all URL links to be absolute \"\n\"<https://validator.w3.org/feed/docs/rss2.html#comments>`_. In order to \"\n\"properly generate links in Pelican you will need to set ``SITEURL`` to \"\n\"the full path of your site.\"\nmsgstr \"\"\n\"`RSS和Atom订阅源要求所有URL都要链接到绝对地址 \"\n\"<https://validator.w3.org/feed/docs/rss2.html#comments>`_ \"\n\"。为了使得Pelican能正确生成链接，你需要将站点的 ``SITEURL`` 设置为完整路径。\"\n\n#: ../../faq.rst:202 1412ceb735d44a30b58db3241248e7ec\nmsgid \"\"\n\"Feeds are still generated when this warning is displayed, but links \"\n\"within may be malformed and thus the feed may not validate.\"\nmsgstr \"虽然Pelican提出了警告，但是仍会生成订阅源，但其中的链接可能是无效的，这会导致订阅源不可用。\"\n\n#: ../../faq.rst:206 20cadccc527e4ebda08eac9ed34f5055\nmsgid \"Can I force Atom feeds to show only summaries instead of article content?\"\nmsgstr \"可以让Atom订阅源只显示摘要，不显示文章内容吗？\"\n\n#: ../../faq.rst:208 9c45ba2ec5c6402e86e89661b943d1ad\nmsgid \"\"\n\"Instead of having to open a separate browser window to read articles, the\"\n\" overwhelming majority of folks who use feed readers prefer to read \"\n\"content within the feed reader itself. Mainly for that reason, Pelican \"\n\"does not support restricting Atom feeds to only contain summaries. Unlike\"\n\" Atom feeds, the RSS feed specification does not include a separate \"\n\"``content`` field, so by default Pelican publishes RSS feeds that only \"\n\"contain summaries (but can optionally be set to instead publish full \"\n\"content RSS feeds). So the default feed generation behavior provides \"\n\"users with a choice: subscribe to Atom feeds for full content or to RSS \"\n\"feeds for just the summaries.\"\nmsgstr \"\"\n\"绝大多数使用订阅源阅读器的人都更喜欢直接在阅读器中阅读文章内容，而不是另外再打开窗口来阅读。因此，Pelican不支持使Atom只包含摘要。但是由于RSS不包含单独的\"\n\" ``content`` \"\n\"字段，因此Pelican在发布RSS时默认只包含摘要（当然也可以设置为包含文章内容）。Pelican在订阅源生成上的如此行为就可以让用户自行选择订阅类型：包含了完整内容的Atom或是只包含摘要的RSS。\"\n\n#: ../../faq.rst:219 bf0d4ca837f74d9ab6618db6306c6a70\nmsgid \"Is Pelican only suitable for blogs?\"\nmsgstr \"Pelican只适合用于博客吗？\"\n\n#: ../../faq.rst:221 49697f375cfc49b08f5d0c2297d15028\nmsgid \"\"\n\"No. Pelican can be easily configured to create and maintain any type of \"\n\"static site. This may require a little customization of your theme and \"\n\"Pelican configuration. For example, if you are building a launch site for\"\n\" your product and do not need tags on your site, you could remove the \"\n\"relevant HTML code from your theme. You can also disable generation of \"\n\"tag-related pages via::\"\nmsgstr \"不是的。Pelican可以方便地用于创建维护任何静态站点，为此你需要对主题和配置做一些定制。例如，如果要为你的产品构建一个宣传网站，即不需要使用标签特性，从主题中移除与标签相关的HTML代码即可。另外，还可以通过下面的设置来禁用标签相关页面的生成：\"\n\n#: ../../faq.rst:231 0a59dd7209554237912579b362d07788\nmsgid \"\"\n\"Why does Pelican always write all HTML files even with content caching \"\n\"enabled?\"\nmsgstr \"启用内容缓存后，为什么Pelican仍会每次都写入所有HTML文件？\"\n\n#: ../../faq.rst:233 6291b82d02fc4450a79d1200b5d04f62\nmsgid \"\"\n\"In order to reliably determine whether the HTML output is different \"\n\"before writing it, a large part of the generation environment including \"\n\"the template contexts, imported plugins, etc. would have to be saved and \"\n\"compared, at least in the form of a hash (which would require special \"\n\"handling of unhashable types), because of all the possible combinations \"\n\"of plugins, pagination, etc. which may change in many different ways. \"\n\"This would require a lot more processing time and memory and storage \"\n\"space. Simply writing the files each time is a lot faster and a lot more \"\n\"reliable.\"\nmsgstr \"为了确定HTML输出确实和之前的不同，模板上下文、插件等很多生成环境都需要保存并比较某种哈希值（对于不可哈希的内容类型还需要进行一些额外处理）。另外，由于插件、分页等内容的存在，输出的HTML很可能会与之前不同。因此，考虑到处理时间和存储空间，每次都重新写入全部HTML会更快更可靠。\"\n\n#: ../../faq.rst:242 5cc5e1361f914c92b0670030f0c83f5d\nmsgid \"\"\n\"However, this means that the modification time of the files changes every\"\n\" time, so a ``rsync`` based upload will transfer them even if their \"\n\"content hasn't changed. A simple solution is to make ``rsync`` use the \"\n\"``--checksum`` option, which will make it compare the file checksums in a\"\n\" much faster way than Pelican would.\"\nmsgstr \"\"\n\"然而，这样的机制会使得在每次生成站点后，文件的修改时间都会变化，因此基于 ``rsync`` \"\n\"上传时会把没有变化的内容也进行上传。一个简便的解决方法就是给 ``rsync`` 加上 ``--checksum`` \"\n\"选项，这会比Pelican在生成时进行校验更快。\"\n\n#: ../../faq.rst:249 b24c40be89b94f3b980cbbda38d46115\nmsgid \"How to process only a subset of all articles?\"\nmsgstr \"如何只处理一部分文章？\"\n\n#: ../../faq.rst:251 fa34a90481f44ace83ee16401543ce09\nmsgid \"\"\n\"It is often useful to process only e.g. 10 articles for debugging \"\n\"purposes. This can be achieved by explicitly specifying only the \"\n\"filenames of those articles in ``ARTICLE_PATHS``. A list of such \"\n\"filenames could be found using a command similar to ``cd content; find \"\n\"-name '*.md' | head -n 10``.\"\nmsgstr \"\"\n\"简便起见，在调试时可能只需要处理几篇文章。可以直接在配置项 ``ARTICLE_PATHS`` 中添加需要处理文章的文件名。可以通过像 ``cd \"\n\"content; find -name '*.md' | head -n 10`` 这样的命令获取文章文件名的列表。\"\n\n#: ../../faq.rst:257 0fa566e3aa084cb9b04e0cee32684222\nmsgid \"My tag cloud is missing/broken since I upgraded Pelican\"\nmsgstr \"在升级Pelican后，标签云消失或不可用了\"\n\n#: ../../faq.rst:259 0bd1304a12c24f048b227c68391b148c\nmsgid \"\"\n\"In an ongoing effort to streamline Pelican, tag cloud generation has been\"\n\" moved out of Pelican core and into a separate `plugin \"\n\"<https://github.com/pelican-plugins/tag-cloud>`_. See the :ref:`plugins` \"\n\"documentation for further information about the Pelican plugin system.\"\nmsgstr \"\"\n\"我们一直致力于精简Pelican，标签云生成的功能已经从Pelican核心中移除，转而放到了一个单独的 `tag-cloud插件 \"\n\"<https://github.com/pelican-plugins/tag-cloud>`_ 中。查看 :ref:`plugins` \"\n\"文档获取更多关于Pelican插件系统的信息。\"\n\n#: ../../faq.rst:265 1833dfba94c74f4bb9e9f0a112ed3e0f\nmsgid \"Since I upgraded Pelican my pages are no longer rendered\"\nmsgstr \"升级Pelican后，一些页面没有被渲染\"\n\n#: ../../faq.rst:267 576e5c2338ba4c43a51bb562301ad0c2\nmsgid \"\"\n\"Pages were available to themes as lowercase ``pages`` and uppercase \"\n\"``PAGES``. To bring this inline with the :ref:`templates-variables` \"\n\"section, ``PAGES`` has been removed. This is quickly resolved by updating\"\n\" your theme to iterate over ``pages`` instead of ``PAGES``. Just \"\n\"replace::\"\nmsgstr \"\"\n\"在以前的版本中，主题通过小写的 ``pages`` 和大写的 ``PAGES`` 都能获取到页面。为了使之与 :ref:`templates-\"\n\"variables` 一节中的内容保持一致，大写的 ``PAGES`` 被删除了。只要将主题中的 ``PAGES`` 替换为 ``pages`` \"\n\"，问题即可解决。例如将原先的：\"\n\n#: ../../faq.rst:274 355512b9f6b34ece9b6baed128b2ca4d\nmsgid \"with something like::\"\nmsgstr \"替换为：\"\n\n#: ../../faq.rst:279 99ef769943fe41c4a37ca951e905b2ba\nmsgid \"How can I stop Pelican from trying to parse my static files as content?\"\nmsgstr \"如何避免让Pelican将我的静态文件解析为内容文件？（译者注：例如要将一个HTML文件作为静态文件）\"\n\n#: ../../faq.rst:281 4efb20c5b82d41afb07151599fa189dd\nmsgid \"\"\n\"Pelican's article and page generators run before it's static generator. \"\n\"That means if you use a setup similar to the default configuration, where\"\n\" a static source directory is defined inside a ``*_PATHS`` setting, all \"\n\"files that have a valid content file ending (``.html``, ``.rst``, \"\n\"``.md``, ...) will be treated as articles or pages before they get \"\n\"treated as static files.\"\nmsgstr \"\"\n\"Pelican的文章与页面生成器会先于静态文件生成器运行。这意味着若使用默认配置，即静态资源文件夹定义在某个 ``*_PATHS`` \"\n\"配置项中，所有以有效内容文件后缀结尾的文件（ ``.html`` 、 ``.rst`` 、 ``.md`` \"\n\"等）都会被视为文章或者页面，而不是静态文件。\"\n\n#: ../../faq.rst:287 d959eb6a67fe440caa70105e1692bf93\nmsgid \"\"\n\"To circumvent this issue either use the appropriate ``*_EXCLUDES`` \"\n\"setting or disable the offending reader via ``READERS`` if you don't need\"\n\" it.\"\nmsgstr \"\"\n\"为了避免这个问题，使用合适的 ``*_EXCLUDES`` 配置，在必要时还可以通过 ``READERS`` \"\n\"配置项来直接禁用产生问题的reader。\"\n\n#: ../../faq.rst:291 5e64dc4b6fad4e7ea07278f5a2529e89\nmsgid \"Why is [arbitrary Markdown syntax] not supported?\"\nmsgstr \"为什么不是所有的Markdown语法都支持？\"\n\n#: ../../faq.rst:293 6872a70ec1434c41a78d465271761c69\nmsgid \"\"\n\"Pelican does not directly handle Markdown processing and instead \"\n\"delegates that task to the Python-Markdown_ project, the core of which \"\n\"purposefully follows the original Markdown syntax rules and not the \"\n\"myriad Markdown \\\"flavors\\\" that have subsequently propagated. That said,\"\n\" Python-Markdown_ is quite modular, and the syntax you are looking for \"\n\"may be provided by one of the many available `Markdown Extensions`_. \"\n\"Alternatively, some folks have created Pelican plugins that support \"\n\"Markdown variants, so that may be your best choice if there is a \"\n\"particular variant you want to use when writing your content.\"\nmsgstr \"\"\n\"Pelican并不直接对Markdown进行处理，而是将此任务交给 Python-Markdown_ \"\n\"项目，此项目的核心有意只遵循原始的Markdown语法规则，而不服从之后传播开的大量Markdown风格。另外， Python-Markdown_\"\n\" 是相当模块化的，你想要使用的语法可能已经有现成的 `Markdown扩展`_ \"\n\"进行了实现。或者，也有人创建了支持Markdown变体的Pelican插件，如果你想要用某种Markdown变体，可以在这些地方寻找支持。\"\n\n#~ msgid \"\"\n#~ \"Then just make sure your theme \"\n#~ \"contains the relevant template file \"\n#~ \"(e.g. ``template_name.html``).\"\n#~ msgstr \"确保对应的模板文件在主题中存在即可（例如 ``template_name.html`` ）。\"\n"
  },
  {
    "path": "docs/locale/zh_CN/LC_MESSAGES/importer.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) 2010–2024\n# This file is distributed under the same license as the PELICAN package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, 2024.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PELICAN 4\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2024-06-24 19:06+0800\\n\"\n\"PO-Revision-Date: 2024-06-27 19:00+0800\\n\"\n\"Last-Translator: GeorgeHu <dhxxhch@163.com>\\n\"\n\"Language: zh_CN\\n\"\n\"Language-Team: \\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=utf-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Generated-By: Babel 2.15.0\\n\"\n\n#: ../../importer.rst:4 2e58a5582f664ba0af49aac4480bc799\nmsgid \"Importing an existing site\"\nmsgstr \"导入已有站点\"\n\n#: ../../importer.rst:7 5182de0b717543c7a4813491755b720a\nmsgid \"Description\"\nmsgstr \"简介\"\n\n#: ../../importer.rst:9 29a8bae0ba78486894ed4c286cd2f3b4\nmsgid \"\"\n\"``pelican-import`` is a command-line tool for converting articles from \"\n\"other software to reStructuredText or Markdown. The supported import \"\n\"formats are:\"\nmsgstr \"\"\n\"命令行工具 ``pelican-import`` 用于将其他软件生成的文章转换成reStructuredText\"\n\"或Markdown格式。支持导入下面这些格式：\"\n\n#: ../../importer.rst:12 c670f6055ad24d818132d74951c9928c\nmsgid \"Blogger XML export\"\nmsgstr \"Blogger XML export\"\n\n#: ../../importer.rst:13 d31ddaa8c7d54a268b379f706164de39\nmsgid \"Dotclear export\"\nmsgstr \"Dotclear export\"\n\n#: ../../importer.rst:14 5102eb70c58240b2ad4d508a196b176e\nmsgid \"Medium export\"\nmsgstr \"Medium export\"\n\n#: ../../importer.rst:15 2cfcdf575387417bae3a9938aa55b0e6\nmsgid \"Tumblr API\"\nmsgstr \"Tumblr API\"\n\n#: ../../importer.rst:16 42233d68a4bc46339b284681bdbdd19c\nmsgid \"WordPress XML export\"\nmsgstr \"WordPress XML export\"\n\n#: ../../importer.rst:17 0170dad08a80435b99a39ccaf887c5bb\nmsgid \"RSS/Atom feed\"\nmsgstr \"RSS/Atom feed\"\n\n#: ../../importer.rst:19 077a8220f4a84dd297ec5aa7cff15a24\nmsgid \"\"\n\"The conversion from HTML to reStructuredText or Markdown relies on \"\n\"`Pandoc`_. For Dotclear, if the source posts are written with Markdown \"\n\"syntax, they will not be converted (as Pelican also supports Markdown).\"\nmsgstr \"\"\n\"从HTML转换到reStructuredText或Markdown是依赖 `Pandoc`_ \"\n\"完成的。对于Dotclear，若原帖子是由Markdown语法写的，则无需转换\"\n\"（因为Pelican本就支持Markdown）。\"\n\n#: ../../importer.rst:25 e9b94b6029204b82b009d3ef23c19814\nmsgid \"\"\n\"Unlike Pelican, Wordpress supports multiple categories per article. These\"\n\" are imported as a comma-separated string. You have to resolve these \"\n\"manually, or use a plugin such as `More Categories`_ that enables \"\n\"multiple categories per article.\"\nmsgstr \"\"\n\"和Pelican不同，在Wordpress中可以将一篇文章同时放在多个分类中。在导入时，各个分类\"\n\"会以逗号分隔，你必须自己手动进行处理。或者也可以使用例如 `More Categories`_ \"\n\"这样的插件，使得文章可以同时存在于多个分类中。\"\n\n#: ../../importer.rst:32 f7add19b68754b6e8a617a1d50dee759\nmsgid \"\"\n\"Imported pages may contain links to images that still point to the \"\n\"original site. So you might want to download those images into your local\"\n\" content and manually re-link them from the relevant pages of your site.\"\nmsgstr \"\"\n\"要导入的内容中可能会包含指向原站点的图片链接，你可能希望将他们全部下载下来，然后再\"\n\"重新手动调整这些链接。\"\n\n#: ../../importer.rst:37 22cc1a514c4f42efbcf9afc3d987c42e\nmsgid \"Dependencies\"\nmsgstr \"依赖\"\n\n#: ../../importer.rst:39 6139199770a24fc7af7ca7e556d18d5f\nmsgid \"\"\n\"``pelican-import`` has some dependencies not required by the rest of \"\n\"Pelican:\"\nmsgstr \"\"\n\"``pelican-import`` 需要用到一些其他依赖，这些依赖只会被 ``pelican-import`` 用到：\"\n\n#: ../../importer.rst:41 0e8eb04bb07f4752880b873e73e7f7e5\nmsgid \"\"\n\"*BeautifulSoup4* and *lxml*, for WordPress and Dotclear import. Can be \"\n\"installed like any other Python package (``pip install BeautifulSoup4 \"\n\"lxml``).\"\nmsgstr \"\"\n\"为了能够导入WordPress和Dotclear的内容，需要 *BeautifulSoup4* 与 *lxml* 。\"\n\"安装方法与其他Python包相同（ ``pip install BeautifulSoup4 lxml`` ）\"\n\n#: ../../importer.rst:44 7d31c1ad4ecb4014a3ef240436b9b3e1\nmsgid \"*Feedparser*, for feed import (``pip install feedparser``).\"\nmsgstr \"为了能够导入订阅源，需要 *Feedparser* （ ``pip install feedparser`` ）\"\n\n#: ../../importer.rst:45 db7a18b1a4534a17956c9d030dddff56\nmsgid \"\"\n\"*Pandoc*, see the `Pandoc site`_ for installation instructions on your \"\n\"operating system.\"\nmsgstr \"\"\n\"还需要 *Pandoc* ，参照 `Pandoc官方网站`_ 进行安装。\"\n\n#: ../../importer.rst:53 9952881aed104ef0ac82af5339e6b149\nmsgid \"Usage\"\nmsgstr \"用法\"\n\n#: ../../importer.rst:63 83dbe43e4d2e4d8eaf3e37724ac119e3\nmsgid \"Positional arguments\"\nmsgstr \"位置参数\"\n\n#: ../../importer.rst:65 4a12692744024752be75d82ed74d369d\nmsgid \"``input``\"\nmsgstr \"``input``\"\n\n#: ../../importer.rst:65 52f62f22221f4c3d964df5aced3d2a2b\nmsgid \"The input file to read\"\nmsgstr \"需要读取的输入文件\"\n\n#: ../../importer.rst:66 acc46432d5c14ea8a5e27e6ec2b84d18\nmsgid \"``api_key``\"\nmsgstr \"``api_key``\"\n\n#: ../../importer.rst:66 29dd358bf2fe49d8a218c56ca376f6a6\nmsgid \"\"\n\"(Tumblr only) api_key can be obtained from \"\n\"https://www.tumblr.com/oauth/apps\"\nmsgstr \"\"\n\"（只会在Tumblr中用到）从 https://www.tumblr.com/oauth/apps 中获取到的api_key\"\n\n#: ../../importer.rst:70 a81b90d51a9f4c28adc09038715cf5c2\nmsgid \"Optional arguments\"\nmsgstr \"可选参数\"\n\n#: ../../importer.rst:72 d4d5211b75aa4103b06ad7685368af06\nmsgid \"Show this help message and exit\"\nmsgstr \"显示此帮助信息并退出 ``pelican-import`` \"\n\n#: ../../importer.rst:73 a7bae87fe16644f4b5da7d32fdc05f95\nmsgid \"Blogger XML export (default: False)\"\nmsgstr \"输入是否为Blogger XML格式（默认：False）\"\n\n#: ../../importer.rst:74 e8c133125ed04120bcc3737fa2a0ba60\nmsgid \"Dotclear export (default: False)\"\nmsgstr \"输入是否为Dotclear格式（默认：False）\"\n\n#: ../../importer.rst:75 caffd159f92a4f36aadedec398823ac3\nmsgid \"Medium export (default: False)\"\nmsgstr \"输入是否为Medium格式（默认：False）\"\n\n#: ../../importer.rst:76 f1bcaccf8e2f43f6894f2f0540c9d7ba\nmsgid \"Tumblr API (default: False)\"\nmsgstr \"输入是否为Tumblr API格式（默认：False）\"\n\n#: ../../importer.rst:77 6131f8fa00294515a028f4bb1a3a3053\nmsgid \"WordPress XML export (default: False)\"\nmsgstr \"输入是否为WordPress XML格式（默认：False）\"\n\n#: ../../importer.rst:78 dad00ee0aebb4550acae995ecdbb622f\nmsgid \"Feed to parse (default: False)\"\nmsgstr \"输入是否为订阅源格式（默认：False）\"\n\n#: ../../importer.rst:80 0ca3cbbc57c64b5b88444ccde94f94ce\nmsgid \"Output path (default: content)\"\nmsgstr \"输出路径（默认：content）\"\n\n#: ../../importer.rst:82 baa2762a4ee745028e29865720ca299d\nmsgid \"\"\n\"Output markup format: ``rst``, ``markdown``, or ``asciidoc`` (default: \"\n\"``rst``)\"\nmsgstr \"\"\n\"输出格式，可选值为： ``rst`` 、 ``markdown`` 、 ``asciidoc`` （默认： ``rst`` ）\"\n\n#: ../../importer.rst:84 53232a317a58422d8f070c245d3b7409\nmsgid \"Put files in directories with categories name (default: False)\"\nmsgstr \"是否要将输出文件按分类名放到各文件夹中（默认：False）\"\n\n#: ../../importer.rst:86 f72e1895d9fc4facb90ddffb53b31a0a\nmsgid \"\"\n\"Put files recognised as pages in \\\"pages/\\\" sub- directory (blogger and \"\n\"wordpress import only) (default: False)\"\nmsgstr \"\"\n\"将识别为页面的文件放入“pages/” 子文件夹中（仅在blogger和wordpress中有用）（默认：False）\"\n\n#: ../../importer.rst:89 3f9315af4f1e4ced8ece96fca71cb1e7\nmsgid \"Import only post from the specified author\"\nmsgstr \"仅导入某个作者的帖子\"\n\n#: ../../importer.rst:90 0b34125f0bb744b089fe77b86b3e50f7\nmsgid \"\"\n\"Strip raw HTML code that can't be converted to markup such as flash \"\n\"embeds or iframes (default: False)\"\nmsgstr \"\"\n\"删除无法转换的HTML代码，例如嵌入的flash或iframe（默认：False）\"\n\n#: ../../importer.rst:92 f899a119b708450bbd38913f813255c2\nmsgid \"\"\n\"Put wordpress custom post types in directories. If used with --dir-cat \"\n\"option directories will be created as \\\"/post_type/category/\\\" (wordpress\"\n\" import only)\"\nmsgstr \"\"\n\"将wordpress中的自定义类型博文放到对应文件夹中。如果同时还使用了 --dir-cat 选项，\"\n\"输出转换后文件时会创建诸如“/post_type/category/” 的文件夹（只在wordpress中有效）\"\n\n#: ../../importer.rst:95 627c041fab81460eafd4f5fe361bcd1a\nmsgid \"\"\n\"Download files uploaded to wordpress as attachments. Files will be added \"\n\"to posts as a list in the post header and links to the files within the \"\n\"post will be updated. All files will be downloaded, even if they aren't \"\n\"associated with a post. Files will be downloaded with their original path\"\n\" inside the output directory, e.g. \\\"output/wp-\"\n\"uploads/date/postname/file.jpg\\\". (wordpress import only) (requires an \"\n\"internet connection)\"\nmsgstr \"\"\n\"下载作为附件上传到WordPress的文件。文件会以列表形式添加到帖子的开头，并且到这些\"\n\"文件的链接都会进行更新。另外，即使某些文件没有在任何帖子中用到，也同样会被下载。\"\n\"文件会被下载到输出文件夹下，并保持原始路径，例如\"\n\"“output/wp-uploads/date/postname/file.jpg” 。（仅在wordpress中有效，\"\n\"且需要互联网连接）\"\n\n#: ../../importer.rst:104 11162d8c497b4108a38c2a60af4a4215\nmsgid \"\"\n\"Disable storing slugs from imported posts within output. With this \"\n\"disabled, your Pelican URLs may not be consistent with your original \"\n\"posts. (default: False)\"\nmsgstr \"\"\n\"不保存导入推文的slug，会导致Pelican的URL和原推文不一致。（默认：False）\"\n\n#: ../../importer.rst:109 f4f4b6e918d3498e927b59c5d0bae05a\nmsgid \"Blog name used in Tumblr API\"\nmsgstr \"Tumblr API中使用的博客名\"\n\n#: ../../importer.rst:113 16e0f9bd1c6e4b338673f1800e6a4995\nmsgid \"Examples\"\nmsgstr \"例子\"\n\n#: ../../importer.rst:115 0cf17b9fd72940c391a1bb8bf7de534b\nmsgid \"For Blogger::\"\nmsgstr \"导入Blogger：\"\n\n#: ../../importer.rst:119 3fc79daf9e9e4f5ba1a121faaabd0c9e\nmsgid \"For Dotclear::\"\nmsgstr \"导入Dotclear：\"\n\n#: ../../importer.rst:123 328ff8145b464fa2ab59505a8bc3236a\nmsgid \"For Medium::\"\nmsgstr \"导入Medium：\"\n\n#: ../../importer.rst:127 8ca5f721833142249b6d798efcb77458\nmsgid \"\"\n\"The Medium export is a zip file.  Unzip it, and point this tool to the \"\n\"\\\"posts\\\" subdirectory.  For more information on how to export, see \"\n\"https://help.medium.com/hc/en-us/articles/115004745787-Export-your-\"\n\"account-data.\"\nmsgstr \"\"\n\"Medium中导出的是一个zip文件。请先解压之，然后再将其中的“posts”子目录传给此工具。 \"\n\"https://help.medium.com/hc/en-us/articles/115004745787-Export-your-account-data \"\n\"中有更详细的导出指导。\"\n\n#: ../../importer.rst:131 516a83a4d8cf4570a9a6fff416e5cf5a\nmsgid \"For Tumblr::\"\nmsgstr \"导入Tumblr：\"\n\n#: ../../importer.rst:135 8fcab620c0d44bb29a120d8d781f4daa\nmsgid \"For WordPress::\"\nmsgstr \"导入WordPress：\"\n\n#: ../../importer.rst:139 a929213eb21f4118b9adbb6199bd78ea\nmsgid \"For Medium (an example of using an RSS feed):\"\nmsgstr \"导入Medium（例子中使用了RSS订阅源）：\"\n\n#: ../../importer.rst:141 5e23c5d167ef4db1994f4323ac3d120e\nmsgid \"\"\n\"$ python -m pip install feedparser $ pelican-import --feed \"\n\"https://medium.com/feed/@username\"\nmsgstr \"\"\n\"$ python -m pip install feedparser $ pelican-import --feed \"\n\"https://medium.com/feed/@username\"\n\n#: ../../importer.rst:146 b44dfe0f807049899c0560c6bf62c386\nmsgid \"The RSS feed may only return the most recent posts — not all of them.\"\nmsgstr \"RSS订阅源可能只会返回最新的帖子，而不是所有帖子。\"\n\n#: ../../importer.rst:149 575426ff787d4647b3aa2469b8b52412\nmsgid \"Tests\"\nmsgstr \"测试\"\n\n#: ../../importer.rst:151 036d2119412b41f3a3cb69cec74ecc81\nmsgid \"To test the module, one can use sample files:\"\nmsgstr \"可以使用下面的文件作为样例进行测试：\"\n\n#: ../../importer.rst:153 482b30f9aab54717bb14218ae5fa8ea6\nmsgid \"\"\n\"for WordPress: https://www.wpbeginner.com/wp-themes/how-to-add-dummy-\"\n\"content-for-theme-development-in-wordpress/\"\nmsgstr \"\"\n\"WordPress： https://www.wpbeginner.com/wp-themes/how-to-add-dummy-content-\"\n\"for-theme-development-in-wordpress/\"\n\n#: ../../importer.rst:154 6cb1bd10d37e4993aabece8aaed20171\nmsgid \"for Dotclear: http://media.dotaddict.org/tda/downloads/lorem-backup.txt\"\nmsgstr \"Dotclear： http://media.dotaddict.org/tda/downloads/lorem-backup.txt\"\n"
  },
  {
    "path": "docs/locale/zh_CN/LC_MESSAGES/index.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) 2010–2024\n# This file is distributed under the same license as the PELICAN package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, 2024.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PELICAN 4\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2024-06-24 19:06+0800\\n\"\n\"PO-Revision-Date: 2024-06-27 19:00+0800\\n\"\n\"Last-Translator: GeorgeHu <dhxxhch@163.com>\\n\"\n\"Language: zh_CN\\n\"\n\"Language-Team: \\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=utf-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Generated-By: Babel 2.15.0\\n\"\n\n#: ../../index.rst:2 160b5c32c524404ba295da4e89124739\nmsgid \"Pelican |release|\"\nmsgstr \"Pelican |release|\"\n\n#: ../../index.rst:4 19170a80b4274f71b77062c7a6b90726\nmsgid \"\"\n\"Pelican is a static site generator, written in Python_. Highlights \"\n\"include:\"\nmsgstr \"\"\n\"Pelican是一个用 Python_ 写的静态站点生成器，它有诸多亮点：\"\n\n#: ../../index.rst:6 6ab42a346f2c46d789cd46655195f2d3\nmsgid \"\"\n\"Write your content directly with your editor of choice in \"\n\"reStructuredText_ or Markdown_ formats\"\nmsgstr \"\"\n\"你可以直接在自己的编辑器中用 reStructuredText_ 或 Markdown_ 完成内容创作\"\n\n#: ../../index.rst:8 dbd17888530e43ce8bdfc1594947032c\nmsgid \"Includes a simple CLI tool to (re)generate your site\"\nmsgstr \"自带了一个简单的命令行工具，你可以用它来生成你的站点\"\n\n#: ../../index.rst:9 2bbe72bda8db457a88f3d3a94d16cc0c\nmsgid \"Easy to interface with distributed version control systems and web hooks\"\nmsgstr \"易于与分布式版本控制系统和webhook交互\"\n\n#: ../../index.rst:10 24af69b083024f2a9c4f162d54fa57c6\nmsgid \"Completely static output is easy to host anywhere\"\nmsgstr \"生成的站点是完全静态的，可以在任何主机上轻松地部署\"\n\n#: ../../index.rst:12 1e2090f3f19d49a19a6c50524e4cd0b7\nmsgid \"Ready to get started? Check out the :doc:`Quickstart<quickstart>` guide.\"\nmsgstr \"准备好开始体验了吗？请查看 :doc:`快速入门<quickstart>` 指南。\"\n\n#: ../../index.rst:15 481a352565e84c848e018de507fbe9af\nmsgid \"Features\"\nmsgstr \"特性\"\n\n#: ../../index.rst:17 6c7b5d9b43ca42f1b1df139e7f884d26\nmsgid \"Pelican’s feature highlights include:\"\nmsgstr \"Pelican在特性上也有很多亮点：\"\n\n#: ../../index.rst:19 464e5e8ea8324fab9c5496b317a6db97\nmsgid \"\"\n\"Articles (e.g., blog posts) and pages (e.g., \\\"About\\\", \\\"Projects\\\", \"\n\"\\\"Contact\\\")\"\nmsgstr \"\"\n\"可以生成文章（例如博客推文）和页面（例如“关于”、“联系我们”、“项目”）\"\n\n#: ../../index.rst:20 c7cc4fe6ea8145feb0ace7d0965e2634\nmsgid \"Integration with external services\"\nmsgstr \"可以和外部服务集成\"\n\n#: ../../index.rst:21 ceb2c8a629024157946eba53638d7eb1\nmsgid \"Site themes (created using Jinja2_ templates)\"\nmsgstr \"可以使用主题（主题使用 Jinja2_ 模板引擎创建）\"\n\n#: ../../index.rst:22 51c3defcba6c4d31a77c3aade6826f1a\nmsgid \"Publication of articles in multiple languages\"\nmsgstr \"可以为同一篇文章发布多种语言版本\"\n\n#: ../../index.rst:23 6f7cbfae94c54318a904e9725ce73677\nmsgid \"Generation of Atom and RSS feeds\"\nmsgstr \"可以生成Atom和Rss订阅源\"\n\n#: ../../index.rst:24 3d667d2ed98a489788f6c38a4e4a6752\nmsgid \"Code syntax highlighting\"\nmsgstr \"可以渲染代码高亮\"\n\n#: ../../index.rst:25 bf1a1f91b821464182471a3760a59d4f\nmsgid \"Import existing content from WordPress, Dotclear, or RSS feeds\"\nmsgstr \"可以从WordPress、Dotclear或Rss订阅源导入已有的内容\"\n\n#: ../../index.rst:26 bd82641c549645cb8b4cd3187800397c\nmsgid \"Fast rebuild times thanks to content caching and selective output writing\"\nmsgstr \"得益于内容缓存和选择性生成设计，可以快速重新生成站点\"\n\n#: ../../index.rst:27 8dec47d1ab13410c9b99db0709c860a3\nmsgid \"Extensible via a rich plugin ecosystem: `Pelican Plugins`_\"\nmsgstr \"可扩展性强，有丰富的插件生态： `Pelican Plugins`_\"\n\n#: ../../index.rst:30 c7e090d7d2e04ff1ac1844e56209d75b\nmsgid \"Why the name \\\"Pelican\\\"?\"\nmsgstr \"为什么叫做“Pelican”？\"\n\n#: ../../index.rst:32 8c31222af5e24ba69acb5dd07a5b5d56\nmsgid \"\"\n\"\\\"Pelican\\\" is an anagram for *calepin*, which means \\\"notebook\\\" in \"\n\"French. ;)\"\nmsgstr \"\"\n\"“Pelican”是法语词笔记本 *calepin* 读音的回文。;)\"\n\n#: ../../index.rst:35 188f72b2bb644f978180eba22009ebc6\nmsgid \"Source code\"\nmsgstr \"源码\"\n\n#: ../../index.rst:37 2c8804f173fb4aa8973fb4d2413c263b\nmsgid \"You can access the source code at: https://github.com/getpelican/pelican\"\nmsgstr \"在这里可以获取Pelican的源码： https://github.com/getpelican/pelican\"\n\n#: ../../index.rst:40 06ab21b7cde94cee92193199ddc69775\nmsgid \"How to get help, contribute, or provide feedback\"\nmsgstr \"如何获取帮助、贡献内容或是提供反馈\"\n\n#: ../../index.rst:42 7fdcc2bcaac04317a6f4114f1d9c327f\nmsgid \"\"\n\"See our :doc:`feedback and contribution submission guidelines \"\n\"<contribute>`.\"\nmsgstr \"\"\n\"请查看文档 :doc:`反馈意见和贡献的提交指南 <contribute>`。\"\n\n#: ../../index.rst:45 3d15499d76e1489d8e8782c65f73bb29\nmsgid \"Documentation\"\nmsgstr \"文档\"\n"
  },
  {
    "path": "docs/locale/zh_CN/LC_MESSAGES/install.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) 2010–2024\n# This file is distributed under the same license as the PELICAN package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, 2024.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PELICAN 4\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2025-07-13 11:46+0800\\n\"\n\"PO-Revision-Date: 2024-06-25 19:00+0800\\n\"\n\"Last-Translator: GeorgeHu <dhxxhch@163.com>\\n\"\n\"Language: zh_CN\\n\"\n\"Language-Team: \\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=utf-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Generated-By: Babel 2.17.0\\n\"\n\n#: ../../install.rst:2 e735e1393d63466092c9fc0a5ee4117d\nmsgid \"Installing Pelican\"\nmsgstr \"安装Pelican\"\n\n#: ../../install.rst:4 e34bdf7c1bbb4c75a47f8bd16e626c67\nmsgid \"\"\n\"Pelican currently runs best on |min_python|; earlier versions of Python \"\n\"are not supported.\"\nmsgstr \"Pelican需要 |min_python| 以上版本的Python，不支持更低版本。\"\n\n#: ../../install.rst:6 ff98ade47da6403e84dd1b2209896d9c\nmsgid \"\"\n\"You can install Pelican via several different methods. The simplest is \"\n\"via Pip_::\"\nmsgstr \"有多种方法可以安装Pelican，最简单的就是通过 Pip_：\"\n\n#: ../../install.rst:10 ae2fcb82534e4a3f81980f69ed94c9ad\nmsgid \"Or, if you plan on using Markdown::\"\nmsgstr \"如果您需要使用Markdown，请使用下面的命令安装：\"\n\n#: ../../install.rst:14 ed597b1eb47949efba0f1781ef7bbd1f\nmsgid \"\"\n\"(Keep in mind that some operating systems will require you to prefix the \"\n\"above command with ``sudo`` in order to install Pelican system-wide.)\"\nmsgstr \"（在某些操作系统中，需要在命令前加 ``sudo`` 才能在整个系统上安装Pelican）\"\n\n#: ../../install.rst:17 04d6784f06dd40e7bff76bf6476aaba1\nmsgid \"\"\n\"While the above is the simplest method, the recommended approach is to \"\n\"create a virtual environment for Pelican via virtualenv_ before \"\n\"installing Pelican. Assuming you have virtualenv_ installed, you can then\"\n\" open a new terminal session and create a new virtual environment for \"\n\"Pelican::\"\nmsgstr \"\"\n\"尽管上面是最简单的安装方法，但我们推荐使用虚拟环境 virtualenv_ 完成Pelican的安装。当您安装好 virtualenv_ \"\n\"后，打开一个新的命令行并为Pelican创建一个虚拟环境：\"\n\n#: ../../install.rst:26 08aae819315e48a194a065a3fc3dddad\nmsgid \"\"\n\"Once the virtual environment has been created and activated, Pelican can \"\n\"be installed via ``python -m pip install pelican`` as noted above. \"\n\"Alternatively, if you have the project source, you can install Pelican \"\n\"using the setuptools method::\"\nmsgstr \"\"\n\"当创建并激活虚拟环境后，使用之前提到过的命令 ``python -m pip install pelican`` \"\n\"就可以安装Pelican了。或者，如果您想要从源码安装，可以使用setuptools：\"\n\n#: ../../install.rst:33 368febf14ca740e19fa470b0f832dea1\nmsgid \"\"\n\"If you have Git installed and prefer to install the latest bleeding-edge \"\n\"version of Pelican rather than a stable release, use the following \"\n\"command::\"\nmsgstr \"如果安装过Git，并且您希望安装Pelican的最最新版本（而不是稳定版），请使用下面的命令：\"\n\n#: ../../install.rst:38 2498d09099194317a62e67b907bdd5d3\nmsgid \"\"\n\"Once Pelican is installed, you can run ``pelican --help`` to see basic \"\n\"usage options. For more detail, refer to the :doc:`Publish<publish>` \"\n\"section.\"\nmsgstr \"\"\n\"当您安装好Pelican，可以执行 ``pelican --help`` 命令来查看一些基本用法。在 :doc:`发布站点<publish>` \"\n\"章节中可以了解更多信息。\"\n\n#: ../../install.rst:42 4ef93669753e4bb89252a8c9852e7a71\nmsgid \"Optional packages\"\nmsgstr \"可选包\"\n\n#: ../../install.rst:44 190eabcd8f3a437cbf895ecee25aff4d\nmsgid \"\"\n\"If you plan on using `Markdown <https://pypi.org/project/Markdown/>`_ as \"\n\"a markup format, you can install Pelican with Markdown support::\"\nmsgstr \"\"\n\"如您希望使用 `Markdown <https://pypi.org/project/Markdown/>`_ \"\n\"来写作，执行下面的命令来安装Markdown支持：\"\n\n#: ../../install.rst:49 fa8fc8ff397a412f839bc2805696aa45\nmsgid \"\"\n\"Typographical enhancements can be enabled in your settings file, but \"\n\"first the requisite `Typogrify <https://pypi.org/project/typogrify/>`_ \"\n\"library must be installed::\"\nmsgstr \"\"\n\"Pelican还支持排版增强，若您需要使用，请先安装 `Typogrify \"\n\"<https://pypi.org/project/typogrify/>`_ 库，稍后您可以在设置文件中启用它。\"\n\n#: ../../install.rst:56 74911273a6934154bad4fadbc0d1f28b\nmsgid \"Dependencies\"\nmsgstr \"依赖\"\n\n#: ../../install.rst:58 77d44b11ae7e4945b119fd473bb53e67\nmsgid \"\"\n\"When Pelican is installed, the following dependent Python packages should\"\n\" be automatically installed without any action on your part:\"\nmsgstr \"当Pelican安装完成后，下面的所有Python依赖应该都会自动安装，无需另外做任何操作：\"\n\n#: ../../install.rst:61 22bdf13ed0a3482fb66f10486518261c\nmsgid \"\"\n\"`feedgenerator <https://pypi.org/project/feedgenerator/>`_, to generate \"\n\"the Atom feeds\"\nmsgstr \"`feedgenerator <https://pypi.org/project/feedgenerator/>`_，用于生成Atom feeds\"\n\n#: ../../install.rst:63 21ddc5ce3bed4f9cab2a454e8319a8c4\nmsgid \"`jinja2 <https://pypi.org/project/Jinja2/>`_, for templating support\"\nmsgstr \"`jinja2 <https://pypi.org/project/Jinja2/>`_，用于模板系统\"\n\n#: ../../install.rst:64 9302b2919a4f4de0927060911f69f5ed\nmsgid \"`pygments <https://pypi.org/project/Pygments/>`_, for syntax highlighting\"\nmsgstr \"`pygments <https://pypi.org/project/Pygments/>`_，用于语法高亮\"\n\n#: ../../install.rst:65 c6e45ac0f3ea4f91953fb2dfc66d29d9\nmsgid \"\"\n\"`docutils <https://pypi.org/project/docutils/>`_, for supporting \"\n\"reStructuredText as an input format\"\nmsgstr \"`docutils <https://pypi.org/project/docutils/>`_，用于reStructuredText格式\"\n\n#: ../../install.rst:67 aea17a424f3c4e8eab50172b6653fe16\nmsgid \"\"\n\"`blinker <https://pypi.org/project/blinker/>`_, an object-to-object and \"\n\"broadcast signaling system\"\nmsgstr \"`blinker <https://pypi.org/project/blinker/>`_，对象-对象的信号广播系统\"\n\n#: ../../install.rst:69 5da4c8d1fdf349c2afe23ffc9d832816\nmsgid \"\"\n\"`unidecode <https://pypi.org/project/Unidecode/>`_, for ASCII \"\n\"transliterations of Unicode text utilities\"\nmsgstr \"\"\n\"`unidecode \"\n\"<https://pypi.org/project/Unidecode/>`_，用于将Unicode文本转为ASCII字符的音译\"\n\n#: ../../install.rst:72 ff81051def5544e1b5d66532453aed25\nmsgid \"\"\n\"`MarkupSafe <https://pypi.org/project/MarkupSafe/>`_, for a markup-safe \"\n\"string implementation\"\nmsgstr \"`MarkupSafe <https://pypi.org/project/MarkupSafe/>`_，用于转义字符的安全处理\"\n\n#: ../../install.rst:74 0222b4cdfdcb48839f5f6b092071db99\nmsgid \"\"\n\"`python-dateutil <https://pypi.org/project/python-dateutil/>`_, to read \"\n\"the date metadata\"\nmsgstr \"\"\n\"`python-dateutil <https://pypi.org/project/python-\"\n\"dateutil/>`_，用于读取日期相关的元数据\"\n\n#: ../../install.rst:78 49117127302b49b39bd5b86abae18709\nmsgid \"Upgrading\"\nmsgstr \"更新升级\"\n\n#: ../../install.rst:80 93962c7d303f4c9fa5ad9d43f86ea50a\nmsgid \"\"\n\"If you installed a stable Pelican release via Pip_ and wish to upgrade to\"\n\" the latest stable release, you can do so by adding ``--upgrade``::\"\nmsgstr \"若是通过 Pip_ 安装了稳定版本的Pelican，可以通过在安装命令中添加 ``--upgrade`` 来升级到最新版：\"\n\n#: ../../install.rst:85 1ac1fa009f9e4245ae7f975bda7d5a22\nmsgid \"\"\n\"If you installed Pelican via distutils or the bleeding-edge method, \"\n\"simply perform the same step to install the most recent version.\"\nmsgstr \"若是通过distutils安装或是通过Git安装了测试版的Pelican重新进行一遍和安装时同样的步骤即可。\"\n\n#: ../../install.rst:89 7845fa285f0b4dcd8e881c9edd61f80c\nmsgid \"Kickstart your site\"\nmsgstr \"启动网站\"\n\n#: ../../install.rst:91 488ad84175cb45f6a6bb26cec24c1f10\nmsgid \"\"\n\"Once Pelican has been installed, you can create a skeleton project via \"\n\"the ``pelican-quickstart`` command, which begins by asking some questions\"\n\" about your site::\"\nmsgstr \"\"\n\"Pelican安装完成后，通过 ``pelican-quickstart`` \"\n\"命令创建项目的整体框架，在运行这个命令时，您需要输入一些与站点相关的信息：\"\n\n#: ../../install.rst:97 63a773d35b91455b944206337e527a3a\nmsgid \"\"\n\"If run inside an activated virtual environment, ``pelican-quickstart`` \"\n\"will look for an associated project path inside \"\n\"``$VIRTUAL_ENV/.project``. If that file exists and contains a valid \"\n\"directory path, the new Pelican project will be saved at that location. \"\n\"Otherwise, the default is the current working directory. To set the new \"\n\"project path on initial invocation, use: ``pelican-quickstart --path \"\n\"/your/desired/directory``\"\nmsgstr \"\"\n\"如果是在虚拟环境中执行 ``pelican-quickstart`` ，系统会自动在 ``$VIRTUAL_ENV/.project`` \"\n\"目录中查找这个命令。若这个这个命令存在并且路径是正确的，一个新的Pelican项目就会在目标位置创建。否则，会默认在当前的工作目录下创建这个项目。若要在初始化时指定项目路径，请使用\"\n\" ``pelican-quickstart --path /your/desired/directory``。\"\n\n#: ../../install.rst:104 b7cdf15328074880bb4fc69dcb7bd26f\nmsgid \"\"\n\"Once you finish answering all the questions, your project will consist of\"\n\" the following hierarchy (except for *pages* — shown in parentheses below\"\n\" — which you can optionally add yourself if you plan to create non-\"\n\"chronological content)::\"\nmsgstr \"\"\n\"当您回答完所有问题后，项目就会成功创建。项目中会包含下述的一些层级结构（除了用括号括起来的 \"\n\"*pages*）。如果有一些内容不需要按时间排序，您可以将它们放在（pages）所在的位置：\"\n\n#: ../../install.rst:118 05e4fe3b0d0a4c998fba451692a68725\nmsgid \"\"\n\"The next step is to begin to adding content to the *content* folder that \"\n\"has been created for you.\"\nmsgstr \"接下来就可以开始往 *content* 目录中添加自己创作的内容了。\"\n"
  },
  {
    "path": "docs/locale/zh_CN/LC_MESSAGES/internals.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) 2010–2024\n# This file is distributed under the same license as the PELICAN package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, 2024.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PELICAN 4\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2024-06-24 19:06+0800\\n\"\n\"PO-Revision-Date: 2024-06-27 19:00+0800\\n\"\n\"Last-Translator: GeorgeHu <dhxxhch@163.com>\\n\"\n\"Language: zh_CN\\n\"\n\"Language-Team: n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=utf-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Generated-By: Babel 2.15.0\\n\"\n\n#: ../../internals.rst:2 5d90a7c7f9dd42b5ba1fdfc05c5e9c3c\nmsgid \"Pelican internals\"\nmsgstr \"Pelican内部机制\"\n\n#: ../../internals.rst:4 fa53597118244e8585b3b0a9fb4336c0\nmsgid \"\"\n\"This section describe how Pelican works internally. As you'll see, it's \"\n\"quite simple, but a bit of documentation doesn't hurt.  :)\"\nmsgstr \"\"\n\"这一节描述了Pelican的内部运行机制。你会发现，Pelican的内部其实并不复杂。 :)\"\n\n#: ../../internals.rst:7 c9a34db098f34796b80ee62896702be2\nmsgid \"\"\n\"You can also find in the :doc:`report` section an excerpt of a report the\"\n\" original author wrote with some software design information.\"\nmsgstr \"你可以在 :doc:`report` 一节中找到原作者用软件设计相关内容报告的节选。\"\n\n#: ../../internals.rst:13 ac2af84842574bef9a791b416e21834e\nmsgid \"Overall structure\"\nmsgstr \"总体结构\"\n\n#: ../../internals.rst:15 fb7aea45b8f74c9c877bf2640d47aaac\nmsgid \"\"\n\"What Pelican does is take a list of files and process them into some sort\"\n\" of output. Usually, the input files are reStructuredText and Markdown \"\n\"files, and the output is a blog, but both input and output can be \"\n\"anything you want.\"\nmsgstr \"\"\n\"Pelican做的事情其实很简单：获取一个文件列表，并将它们处理为某种输出。通常，输入文件是\"\n\"reStructuredText和Markdown文件，输出是一个博客，但事实上输入和输出都可以是你想要的\"\n\"任何内容。\"\n\n#: ../../internals.rst:19 599649d1e9da4355ab02b50ea4fbdb19\nmsgid \"The logic is separated into different classes and concepts:\"\nmsgstr \"系统的整体逻辑可以分为几个不同的类和概念：\"\n\n#: ../../internals.rst:21 8ec0821a726e4ade8046921cc09b3ea3\nmsgid \"\"\n\"**Writers** are responsible for writing files: .html files, RSS feeds, \"\n\"and so on. Since those operations are commonly used, the object is \"\n\"created once and then passed to the generators.\"\nmsgstr \"\"\n\"**Writers** 负责完成 html、RSS订阅源等等内容的文件写入。因为这些操作都是比较常用的，\"\n\"这个类只会被创建一次，然后再传给Generators。\"\n\n#: ../../internals.rst:25 63c9a61869884147a8752e9be188e0e9\nmsgid \"\"\n\"**Readers** are used to read from various formats (HTML, Markdown and \"\n\"reStructuredText for now, but the system is extensible). Given a file, \"\n\"they return metadata (author, tags, category, etc.) and content (HTML-\"\n\"formatted).\"\nmsgstr \"\"\n\"**Readers** 用于读取不同格式的文件（目前支持HTML、Markdown、reStructuredText，\"\n\"但可以继续扩展）。向**Readers**输入一个文件，它会返回文档的元数据（作者、标签、\"\n\"分类等等）与HTML格式的文档正文内容。\"\n\n#: ../../internals.rst:29 d9bc146ae213415b804cd93ebf43e340\nmsgid \"\"\n\"**Generators** generate the different outputs. For instance, Pelican \"\n\"comes with ``ArticlesGenerator`` and ``PageGenerator``. Given a \"\n\"configuration, they can do whatever they want. Most of the time, it's \"\n\"generating files from inputs.\"\nmsgstr \"\"\n\"**Generators** 用以生成不同的输出，Pelican自带了 ``ArticlesGenerator`` 和 \"\n\"``PageGenerator`` 。给定一套配置信息， **Generators** 可以做几乎任何事。\"\n\"但大多数情况下，它的工作就是从输入生成文件。\"\n\n#: ../../internals.rst:34 49ef39e8677a4529a3ee226faae1526b\nmsgid \"\"\n\"Pelican also uses templates, so it's easy to write your own theme. The \"\n\"syntax is `Jinja2 <https://palletsprojects.com/p/jinja/>`_ and is very \"\n\"easy to learn, so don't hesitate to jump in and build your own theme.\"\nmsgstr \"\"\n\"Pelican使用了模板引擎，因此可以较为简单地编写自定义主题。模板语法使用的是易于学习的 \"\n\"`Jinja2 <https://palletsprojects.com/p/jinja/>`_ ，因此快去构建你自己的主题吧。\"\n\n#: ../../internals.rst:39 1aef766f93d549afa332fad4278c4063\nmsgid \"How to implement a new reader?\"\nmsgstr \"如何实现一个新的reader？\"\n\n#: ../../internals.rst:41 abbbfc19ccea4e3ea3716179981e3c1d\nmsgid \"\"\n\"Is there an awesome markup language you want to add to Pelican? Well, the\"\n\" only thing you have to do is to create a class with a ``read`` method \"\n\"that returns HTML content and some metadata.\"\nmsgstr \"\"\n\"若是希望为Pelican添加一个标记语言，只需要创建一个类，实现 ``read`` 方法，并在其中\"\n\"返回元数据和以HTML表示的正文内容。\"\n\n#: ../../internals.rst:45 1e9fc1bcc9444db4b751f1c621280a32\nmsgid \"Take a look at the Markdown reader::\"\nmsgstr \"可以看一看Markdown的reader：\"\n\n#: ../../internals.rst:71 cbc4f49384964be3a0a68b1083100839\nmsgid \"Simple, isn't it?\"\nmsgstr \"是不是很简单呢？\"\n\n#: ../../internals.rst:73 02643c7e485d49e39344570ba5639a60\nmsgid \"\"\n\"If your new reader requires additional Python dependencies, then you \"\n\"should wrap their ``import`` statements in a ``try...except`` block.  \"\n\"Then inside the reader's class, set the ``enabled`` class attribute to \"\n\"mark import success or failure. This makes it possible for users to \"\n\"continue using their favourite markup method without needing to install \"\n\"modules for formats they don't use.\"\nmsgstr \"\"\n\"如果新创建的reader需要额外的Python依赖，应该把 ``import`` 放在 ``try...except`` \"\n\"块中。在reader类中，设置类属性 ``enabled`` 来标记import是否成功。这使得用户能\"\n\"继续使用他们喜欢的标记语言而无需安装用不到的模块。\"\n\n#: ../../internals.rst:80 02deeeac368b4dbc8c7b1025275d5bd5\nmsgid \"How to implement a new generator?\"\nmsgstr \"如何实现一个新的generator？\"\n\n#: ../../internals.rst:82 f7e5c28efbdb40c0bac7b985e8264310\nmsgid \"\"\n\"Generators have two important methods. You're not forced to create both; \"\n\"only the existing ones will be called.\"\nmsgstr \"\"\n\"generator有两个重要方法。不一定两个都要创建，若只创建了一个，就会自动调用存在的方法。\"\n\n#: ../../internals.rst:85 01f2801461e043e7882167907e337d2c\nmsgid \"\"\n\"``generate_context``, that is called first, for all the generators. Do \"\n\"whatever you have to do, and update the global context if needed. This \"\n\"context is shared between all generators, and will be passed to the \"\n\"templates. For instance, the ``PageGenerator`` ``generate_context`` \"\n\"method finds all the pages, transforms them into objects, and populates \"\n\"the context with them. Be careful *not* to output anything using this \"\n\"context at this stage, as it is likely to change by the effect of other \"\n\"generators.\"\nmsgstr \"\"\n\"``generate_context`` 会优先被调用，其中可以完成任何你想要做的事，如果需要的话，还要\"\n\"更新全局上下文。全局上下文会在所有generator间共享，并在之后传给模板。例如 \"\n\"``PageGenerator`` 的 ``generate_context`` 方法会找寻所有页面，并将他们转换为对象，\"\n\"再将上下文传入其中。注意，请 *不要* 在此阶段使用该上下文输出任何内容，因为其他\"\n\"generator还会继续影响上下文。\"\n\n#: ../../internals.rst:93 3241d04af8944c48bf162963a774000c\nmsgid \"\"\n\"``generate_output`` is then called. And guess what is it made for? Oh, \"\n\"generating the output.  :) It's here that you may want to look at the \"\n\"context and call the methods of the ``writer`` object that is passed as \"\n\"the first argument of this function. In the ``PageGenerator`` example, \"\n\"this method will look at all the pages recorded in the global context and\"\n\" output a file on the disk (using the writer method ``write_file``) for \"\n\"each page encountered.\"\nmsgstr \"\"\n\"``generate_output`` 会在 ``generate_context`` 之后被调用，用于生成要输出的内容。\"\n\"此时就需要使用上下文并调用 ``writer`` 对象的方法，此 ``writer`` 就是传入 \"\n\"``generate_output`` 方法的第一个参数。``PageGenerator`` 的 ``generate_output`` \"\n\"方法中，会使用writer的 ``write_file`` 方法为全局上下文中的每一个页面输出一个文件。\"\n"
  },
  {
    "path": "docs/locale/zh_CN/LC_MESSAGES/pelican-themes.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) 2010–2024\n# This file is distributed under the same license as the PELICAN package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, 2024.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PELICAN 4\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2024-06-24 19:06+0800\\n\"\n\"PO-Revision-Date: 2024-06-27 19:00+0800\\n\"\n\"Last-Translator: GeorgeHu <dhxxhch@163.com>\\n\"\n\"Language: zh_CN\\n\"\n\"Language-Team: \\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=utf-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Generated-By: Babel 2.15.0\\n\"\n\n#: ../../pelican-themes.rst:2 1fce54d5389b41f4a588e9b23b646aee\nmsgid \"pelican-themes\"\nmsgstr \"pelican-themes\"\n\n#: ../../pelican-themes.rst:7 6158b329ed7b469286405115e2ed7fa0\nmsgid \"Description\"\nmsgstr \"简介\"\n\n#: ../../pelican-themes.rst:9 3df74d6d079945f7a4e0062ed5ea3eed\nmsgid \"\"\n\"``pelican-themes`` is a command line tool for managing themes for \"\n\"Pelican. See :ref:`settings/themes` for settings related to themes.\"\nmsgstr \"\"\n\"``pelican-themes`` 是一个命令行工具，用于管理Pelican主题。有关主题的配置，\"\n\"请参考 :ref:`设置章节中的主题 <settings/themes>` 。\"\n\n#: ../../pelican-themes.rst:14 03eb76faf4544c8dbf478752096c7d7c\nmsgid \"Usage\"\nmsgstr \"用法\"\n\n#: ../../pelican-themes.rst:16 d5dcdc6c26094f5695061f9c53633589\nmsgid \"pelican-themes [-h] [-l] [-i theme path [theme path ...]]\"\nmsgstr \"pelican-themes [-h] [-l] [-i theme path [theme path ...]]\"\n\n#: ../../pelican-themes.rst:17 99b7a21ca612425da217b72b8c0c9b64\nmsgid \"[-r theme name [theme name ...]]\"\nmsgstr \"[-r theme name [theme name ...]]\"\n\n#: ../../pelican-themes.rst:18 1f64db909173426dabee822aea3b269b\nmsgid \"[-s theme path [theme path ...]] [-v] [--version]\"\nmsgstr \"[-s theme path [theme path ...]] [-v] [--version]\"\n\n#: ../../pelican-themes.rst:21 63ef4d44a1db4176b4c3866671a93603\nmsgid \"Optional arguments:\"\nmsgstr \"可选参数：\"\n\n#: ../../pelican-themes.rst:24 348360945a0943ffa8122aad16bf0ec1\nmsgid \"Show the help and exit\"\nmsgstr \"显示帮助信息并退出\"\n\n#: ../../pelican-themes.rst:26 aaec8d28264b45b7aac617b7140b5b13\nmsgid \"Show the themes already installed\"\nmsgstr \"显示已安装的主题\"\n\n#: ../../pelican-themes.rst:28 c8d44b6ac6754f4e8e10a39848f042d0\nmsgid \"One or more themes to install\"\nmsgstr \"安装一个或多个主题\"\n\n#: ../../pelican-themes.rst:30 18077fbf428e476aa218464fb0f18d8d\nmsgid \"One or more themes to remove\"\nmsgstr \"移除一个或多个主题\"\n\n#: ../../pelican-themes.rst:32 e328d59886be45a6ae9530a0f2bea3ca\nmsgid \"\"\n\"Same as ``--install``, but create a symbolic link instead of copying the \"\n\"theme. Useful for theme development\"\nmsgstr \"\"\n\"和 ``--install`` 相同，区别在于此选项仅会创建一个符号链接到给定的目录，\"\n\"而不会将主题完整拷贝。一般用于主题的开发\"\n\n#: ../../pelican-themes.rst:35 481c7a32a5e6400d83c9e2e56e6b94a4\nmsgid \"Verbose output\"\nmsgstr \"开启详细输出\"\n\n#: ../../pelican-themes.rst:37 d7889dd20ac643ecad73e464ec4cfa55\nmsgid \"Print the version of this script\"\nmsgstr \"显示此工具的版本信息\"\n\n#: ../../pelican-themes.rst:42 5c3d3aabd5304e8f9a6f0593824f1da6\nmsgid \"Examples\"\nmsgstr \"例子\"\n\n#: ../../pelican-themes.rst:46 4d6ff63aae06482dbf22f41d4111b001\nmsgid \"Listing the installed themes\"\nmsgstr \"列出已安装主题\"\n\n#: ../../pelican-themes.rst:48 91a9e942ea36479999586426afead753\nmsgid \"\"\n\"With ``pelican-themes``, you can see the available themes by using the \"\n\"``-l`` or ``--list`` option:\"\nmsgstr \"\"\n\"在 ``pelican-themes`` 中使用 ``-l`` 或 ``--list`` 选项，查看可用主题：\"\n\n#: ../../pelican-themes.rst:62 7a2f7dc98fcc45cabc4639576d503c28\nmsgid \"\"\n\"In this example, we can see there are three themes available: \"\n\"``notmyidea``, ``simple``, and ``two-column``.\"\nmsgstr \"\"\n\"在上面的例子中，可以看到有三个主题可供使用： ``notmyidea`` 、 \"\n\"``simple`` 、和 ``two-column`` 。\"\n\n#: ../../pelican-themes.rst:65 8c03dfa908114d92b8a9aeb6673555ce\nmsgid \"\"\n\"``two-column`` is followed by an ``@`` because this theme is not copied \"\n\"to the Pelican theme path, but is instead just linked to it (see \"\n\"`Creating symbolic links`_ for details about creating symbolic links).\"\nmsgstr \"\"\n\"主题 ``two-column`` 后有一个 ``@`` ，这是因为该主题没有被拷贝到Pelican的主题\"\n\"路径下，而只是为其创建了一个符号链接 （详见 `创建符号链接`_ ）。\"\n\n#: ../../pelican-themes.rst:69 bc91e8c3ff4a44dd9234d0ab186d8515\nmsgid \"\"\n\"Note that you can combine the ``--list`` option with the ``-v`` or \"\n\"``--verbose`` option to get more verbose output, like this:\"\nmsgstr \"\"\n\"当然，你可以将 ``--list`` 选项和 ``-v`` 或 ``--verbose`` 结合起来，从而\"\n\"得到更详细的输出：\"\n\n#: ../../pelican-themes.rst:81 0b407ed71e6a4b428f5a582b58a47f3c\nmsgid \"Installing themes\"\nmsgstr \"安装主题\"\n\n#: ../../pelican-themes.rst:83 e95f78a5c3b844b9a6fd2924f455748f\nmsgid \"\"\n\"You can install one or more themes using the ``-i`` or ``--install`` \"\n\"option. This option takes as argument the path(s) of the theme(s) you \"\n\"want to install, and can be combined with the ``--verbose`` option:\"\nmsgstr \"\"\n\"使用 ``-i`` 或 ``--install`` 选项可以安装一个或多个主题。此选项将一个\"\n\"或多个到达主题的路径作为参数，同样可以结合 ``--verbose`` 选项：\"\n\n#: ../../pelican-themes.rst:103 5b20e90396564e08860b2b3a569e7166\nmsgid \"Removing themes\"\nmsgstr \"移除主题\"\n\n#: ../../pelican-themes.rst:105 2415bf89e3804c9dbdc34814b0132b8c\nmsgid \"\"\n\"The ``pelican-themes`` command can also remove themes from the Pelican \"\n\"themes path. The ``-r`` or ``--remove`` option takes as argument the \"\n\"name(s) of the theme(s) you want to remove, and can be combined with the \"\n\"``--verbose`` option.\"\nmsgstr \"\"\n\"``pelican-themes`` 命令同样可用于移除Pelican主题文件夹下的主题。 ``-r`` 或 \"\n\"``--remove`` 选项以一个或多个主题的名称为参数，同样也可以结合 ``--verbose`` \"\n\"选项使用。\"\n\n#: ../../pelican-themes.rst:122 9ea5149543a648049444220a4041da69\nmsgid \"Creating symbolic links\"\nmsgstr \"创建符号链接\"\n\n#: ../../pelican-themes.rst:124 17cdf3146683485ea72db5fbd9c1f60a\nmsgid \"\"\n\"``pelican-themes`` can also install themes by creating symbolic links \"\n\"instead of copying entire themes into the Pelican themes path.\"\nmsgstr \"\"\n\"``pelican-themes`` 也可以通过创建符号链接来安装主题，如此便无需完整拷贝主题。\"\n\n#: ../../pelican-themes.rst:127 1d2c60b41c374936a9986a852d50e898\nmsgid \"\"\n\"To symbolically link a theme, you can use the ``-s`` or ``--symlink``, \"\n\"which works exactly as the ``--install`` option:\"\nmsgstr \"\"\n\"使用 ``-s`` 或 ``--symlink`` 选项来为主题创建符号链接，用法和 ``--install`` 选项相同：\"\n\n#: ../../pelican-themes.rst:134 66707a8607f549199dca6f93586d2d87\nmsgid \"\"\n\"In this example, the ``two-column`` theme is now symbolically linked to \"\n\"the Pelican themes path, so we can use it, but we can also modify it \"\n\"without having to reinstall it after each modification.\"\nmsgstr \"\"\n\"在上面的例子中， ``two-column`` 主题就已经在Pelican主题目录下创建了符号链接，\"\n\"也可以正常使用。如此，当我们修改主题后就无需重新进行安装。\"\n\n#: ../../pelican-themes.rst:138 93ec27a473b04bca9d2930a7cb6b609c\nmsgid \"This is useful for theme development:\"\nmsgstr \"这对主题的开发是很有用的：\"\n\n#: ../../pelican-themes.rst:155 66d808308aa64fc9afcef8bdf03bca8b\nmsgid \"Doing several things at once\"\nmsgstr \"同时执行多个操作\"\n\n#: ../../pelican-themes.rst:157 ace10a2c2f4d4adab9ade60631e82c38\nmsgid \"\"\n\"The ``--install``, ``--remove`` and ``--symlink`` options are not \"\n\"mutually exclusive, so you can combine them in the same command line to \"\n\"do more than one operation at time, like this:\"\nmsgstr \"\"\n\"``--install`` 、 ``--remove`` 和 ``--symlink`` 可以同时使用，不会冲突，\"\n\"因此可以在同一行命令中同时做多个操作：\"\n\n#: ../../pelican-themes.rst:169 e7adbac04b6a40fd986c02e834cc1756\nmsgid \"\"\n\"In this example, the theme ``notmyidea-cms`` is replaced by the theme \"\n\"``notmyidea-cms-fr``\"\nmsgstr \"\"\n\"在上面的例子中，用 ``notmyidea-cms-fr`` 替换了 ``notmyidea-cms`` 主题。\"\n"
  },
  {
    "path": "docs/locale/zh_CN/LC_MESSAGES/plugins.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) 2010–2024\n# This file is distributed under the same license as the PELICAN package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, 2024.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PELICAN 4\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2025-07-13 11:46+0800\\n\"\n\"PO-Revision-Date: 2024-06-26 19:00+0800\\n\"\n\"Last-Translator: GeorgeHu <dhxxhch@163.com>\\n\"\n\"Language: zh_CN\\n\"\n\"Language-Team: \\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=utf-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Generated-By: Babel 2.17.0\\n\"\n\n#: ../../plugins.rst:4 3df58bcad1a64350a8e763d87d7470e3\nmsgid \"Plugins\"\nmsgstr \"插件\"\n\n#: ../../plugins.rst:6 5e0f2aa517254778a71d1e742b051645\nmsgid \"\"\n\"Beginning with version 3.0, Pelican supports plugins. Plugins are a way \"\n\"to add features to Pelican without having to directly modify the Pelican \"\n\"core.\"\nmsgstr \"Pelican从3.0版本开始支持插件。通过插件，不必直接修改Pelican的核心代码就可以给Pelican添加新功能。\"\n\n#: ../../plugins.rst:10 40ad4aad1dc54b929f6059031edae0d9\nmsgid \"How to use plugins\"\nmsgstr \"如何使用插件\"\n\n#: ../../plugins.rst:12 8fc9f8cba76b4bb9930d80b5b985885a\nmsgid \"\"\n\"Starting with version 4.5, Pelican moved to a new plugin structure \"\n\"utilizing namespace packages that can be easily installed via Pip_. \"\n\"Plugins supporting this structure will install under the namespace \"\n\"package ``pelican.plugins`` and can be automatically discovered by \"\n\"Pelican. To see a list of Pip-installed namespace plugins that are active\"\n\" in your environment, run::\"\nmsgstr \"\"\n\"Pelican从4.5版本开始使用了一种全新的插件结构，利用了命名空间包，并且可以轻松地通过 Pip_ \"\n\"进行安装。支持此结构地插件都会被安装在命名空间包 ``pelican.plugins`` \"\n\"下，因此Pelican可以自动发现他们。下面的命令可以用于查看环境中用Pip安装的所有插件：\"\n\n#: ../../plugins.rst:20 de052285e7f645a9ab551433f3c07d46\nmsgid \"\"\n\"If you leave the ``PLUGINS`` setting as default (``None``), Pelican will \"\n\"automatically discover namespace plugins and register them. If, on the \"\n\"other hand, you specify a ``PLUGINS`` setting as a list of plugins, this \"\n\"auto-discovery will be disabled. At that point, only the plugins you \"\n\"specify will be registered, and you must explicitly list any namespace \"\n\"plugins as well.\"\nmsgstr \"\"\n\"若将 ``PLUGINS`` 配置项设为默认的 ``None`` ，Pelican会自动发现命名空间中的插件并且将他们全部加载；若你在 \"\n\"``PLUGINS`` 设置项中指定了一系列的插件，Pelican就不会去自动发现插件，也就是说，你需要显式地指定所有要使用的插件。\"\n\n#: ../../plugins.rst:26 a9675be841b84df584e67087cd23ab34\nmsgid \"\"\n\"If you are using the ``PLUGINS`` setting, you can specify plugins in two \"\n\"ways. The first method specifies plugins as a list of strings. Namespace \"\n\"plugins can be specified either by their full names \"\n\"(``pelican.plugins.myplugin``) or by their short names (``myplugin``)::\"\nmsgstr \"\"\n\"在配置 ``PLUGINS`` 时，有两种方式。一是用字符串列表指定插件的名称，可以是包含命名空间的完整名称（例如 \"\n\"``pelican.plugins.myplugin`` ），也可以是简短名称（ ``myplugin``）：\"\n\n#: ../../plugins.rst:35 188bf617180b4a7b9bc09f3fb1c201ae\nmsgid \"\"\n\"Alternatively, you can import them in your settings file and pass the \"\n\"modules::\"\nmsgstr \"二是在设置文件中先import进来，再将import进的模块放在 ``PLUGINS`` 设置项中：\"\n\n#: ../../plugins.rst:43 2d5db874810245a98b59ab080a0df1a5\nmsgid \"\"\n\"When experimenting with different plugins (especially the ones that deal \"\n\"with metadata and content) caching may interfere and the changes may not \"\n\"be visible. In such cases disable caching with ``LOAD_CONTENT_CACHE = \"\n\"False`` or use the ``--ignore-cache`` command-line switch.\"\nmsgstr \"\"\n\"在尝试不同的插件时（尤其是那些处理元数据和内容的插件），缓存可能会相互干扰，一些更改不会生效。发生这种情况时，就需要通过设置 \"\n\"``LOAD_CONTENT_CACHE = False`` 或使用 ``--ignore-cache`` 命令行选项禁用缓存。\"\n\n#: ../../plugins.rst:48 7421f93c1d714c9c853fc9311681515a\nmsgid \"\"\n\"If your plugins are not in an importable path, you can specify a list of \"\n\"paths via the ``PLUGIN_PATHS`` setting. As shown in the following \"\n\"example, paths in the ``PLUGIN_PATHS`` list can be absolute or relative \"\n\"to the settings file::\"\nmsgstr \"\"\n\"如果插件处于无法直接进行import的路径，可以在 ``PLUGIN_PATHS`` 配置项中指定这些路径。如下例所示， \"\n\"``PLUGIN_PATHS`` 中的路径可以是绝对的，也可以是相对于设置文件的：\"\n\n#: ../../plugins.rst:56 b8406038d0284d3fbef9d3de1fa7fd9f\nmsgid \"Where to find plugins\"\nmsgstr \"在哪儿下载插件\"\n\n#: ../../plugins.rst:57 b07653ce77194a998630a55ae9511de5\nmsgid \"\"\n\"Namespace plugins can be found in the `pelican-plugins organization`_ as \"\n\"individual repositories. Legacy plugins are located in the `pelican-\"\n\"plugins repository`_ and will be gradually phased out in favor of the \"\n\"namespace versions.\"\nmsgstr \"\"\n\"新的命名空间插件可以在GitHub的 `pelican-plugins 组织`_ \"\n\"中找到，每个插件都是一个独立的仓库。而老的插件则可以在GitHub的 `pelican-plugins 仓库`_ \"\n\"中找到。这些老的插件会逐步淘汰并转移到新的命名空间版本。\"\n\n#: ../../plugins.rst:65 5c55fa6f3d664be2a49b8256dc2f6a2e\nmsgid \"\"\n\"Please note that while we do our best to review and maintain these \"\n\"plugins, they are submitted by the Pelican community and thus may have \"\n\"varying levels of support and interoperability.\"\nmsgstr \"请注意，尽管我们尽全力审查和维护这些插件，但这些插件是Pelican社区提交的，因此支持性和互操作性程度各不相同。\"\n\n#: ../../plugins.rst:70 25339a713a97492c88b0e60024ac34b8\nmsgid \"How to create plugins\"\nmsgstr \"如何创建插件\"\n\n#: ../../plugins.rst:72 62b6b4a1a5f0486e8b3a39d6a7050f0a\nmsgid \"\"\n\"Plugins are based on the concept of signals. Pelican sends signals, and \"\n\"plugins subscribe to those signals. The list of available signals is \"\n\"documented in a subsequent section.\"\nmsgstr \"插件是基于信号这一概念的。Pelican会发送信号，插件则订阅这些信号。可用的信号在下一节会贴出来。\"\n\n#: ../../plugins.rst:76 f8f74b0257be46a1878e72e126166bd0\nmsgid \"\"\n\"The only rule to follow for plugins is to define a ``register`` callable,\"\n\" in which you map the signals to your plugin logic. Let's take a simple \"\n\"example::\"\nmsgstr \"\"\n\"对于插件来说，唯一需要遵循的规则就是一定要定义一个可调用的 ``register`` ，在 ``register`` \"\n\"中需要将信号映射到插件逻辑上。下面是一个简单的例子：\"\n\n#: ../../plugins.rst:93 163eebc74421416da2ad497830c42771\nmsgid \"\"\n\"Signal receivers are weakly-referenced and thus must not be defined \"\n\"within your ``register`` callable or they will be garbage-collected \"\n\"before the signal is emitted.\"\nmsgstr \"信号接收器在Pelican中是弱引用的，因此不能将它定义在可调用的 ``register`` 中，否则接收器在信号发送之前就会被回收。\"\n\n#: ../../plugins.rst:97 bb63bd2d24e341a1a4f7dfa118648d9a\nmsgid \"\"\n\"If multiple plugins connect to the same signal, plugins will be invoked \"\n\"in the order they are registered. When the ``PLUGINS`` setting is \"\n\"defined, plugin invocation order will be the order in which the plugins \"\n\"are listed in the ``PLUGINS`` setting. If you rely on auto-discovered \"\n\"namespace plugins and have no ``PLUGINS`` setting defined, plugins will \"\n\"be invoked in the same order that they are discovered (the same order as \"\n\"listed in the output of the ``pelican-plugins`` command). If you want to \"\n\"specify the order explicitly, disable auto-discovery by defining \"\n\"``PLUGINS`` in the desired order.\"\nmsgstr \"\"\n\"对于关联到同一个信号的多个插件，将按照它们注册的前后顺序执行。但若设置了 ``PLUGINS`` \"\n\"配置项，则会以此配置项中的顺序为准。如果您使用了无需PLUGINS设置的新版命名空间插件，它们将按照被探测到的顺序进行连接（与 pelican-\"\n\"plugins 输出的顺序相同）。若您此时仍想要显式指定顺序，设置 ``PLUGINS`` 配置项即可。\"\n\n#: ../../plugins.rst:107 062aa3a3402141cfbd376d4fee1b5b34\nmsgid \"Namespace plugin structure\"\nmsgstr \"命名空间插件的结构\"\n\n#: ../../plugins.rst:109 e6968290620d4de3b71ff62d5abba91f\nmsgid \"\"\n\"Namespace plugins must adhere to a certain structure in order to function\"\n\" properly. They need to be installable (i.e. contain ``setup.py`` or \"\n\"equivalent) and have a folder structure as follows::\"\nmsgstr \"命名空间插件必须遵循特定的结构才能正常工作。这些插件需要是可安装的（即包含 ``setup.py`` 或其他等效文件），并且遵循下述文件夹结构：\"\n\n#: ../../plugins.rst:122 b9782f71fae14bce9854b8b5056407d8\nmsgid \"\"\n\"It is crucial that ``pelican`` or ``pelican/plugins`` folder **not** \"\n\"contain an ``__init__.py`` file. In fact, it is best to have those \"\n\"folders empty besides the listed folders in the above structure and keep \"\n\"your plugin related files contained solely in the \"\n\"``pelican/plugins/myplugin`` folder to avoid any issues.\"\nmsgstr \"\"\n\"非常关键的一点就是， ``pelican`` 和 ``pelican/plugins`` 文件夹下都 **不能** 包含 \"\n\"``__init__.py`` 文件。事实上，这两个文件夹下最好是只有上面列出的文件夹，并且保证与插件相关的文件都仅包含在 \"\n\"``pelican/plugins/myplugin`` 文件夹中，以避免奇奇怪怪的问题。\"\n\n#: ../../plugins.rst:128 8440bc91329c498c90fadab556391a84\nmsgid \"\"\n\"To easily set up the proper structure, a `cookiecutter template for \"\n\"plugins`_ is provided. Refer to that project's README for instructions on\"\n\" how to use it.\"\nmsgstr \"为了让大家更容易就能建立正确的结构，我们为插件提供了一个 `cookiecutter模板`_ ，使用方法参考此项目README文件中的指示即可。\"\n\n#: ../../plugins.rst:134 bb029c6c9ea14a2dac684d516fb9a1eb\nmsgid \"List of signals\"\nmsgstr \"信号列表\"\n\n#: ../../plugins.rst:136 968d92d9b3bb4491ad9c0e4a015e73f9\nmsgid \"Here is the list of currently implemented signals:\"\nmsgstr \"下面是目前已经实现了的信号：\"\n\n#: ../../plugins.rst:139 f2db011f146d40bf9f07ec6b09c7c6d0\nmsgid \"Signal\"\nmsgstr \"信号\"\n\n#: ../../plugins.rst:139 32f683cb25c74315ac803c62868bd7b2\nmsgid \"Arguments\"\nmsgstr \"参数\"\n\n#: ../../plugins.rst:139 d02ae4c30dec40ae8bd894fda051562d\nmsgid \"Description\"\nmsgstr \"描述\"\n\n#: ../../plugins.rst:141 d526b9cb6c3c409f9b2d243082dfbdc3\nmsgid \"initialized\"\nmsgstr \"initialized\"\n\n#: ../../plugins.rst:141 ../../plugins.rst:142 ../../plugins.rst:160\n#: ../../plugins.rst:163 0ab3e30cf009477980c4c619e0a7dc5e\n#: 8cf4a2d70a234250a4d9f63e4e8cb49f a600f769faef42d99333442745c7b498\n#: a69e7ba2df7a47658b2f0e4ade60d455\nmsgid \"pelican object\"\nmsgstr \"pelican object\"\n\n#: ../../plugins.rst:142 3aff44965eec41269a45fd0b84b8b5d7\nmsgid \"finalized\"\nmsgstr \"finalized\"\n\n#: ../../plugins.rst:142 6a3bd6c773b245af9151ff5669ef7f84\nmsgid \"\"\n\"invoked after all the generators are executed and just before pelican \"\n\"exits useful for custom post processing actions, such as: - minifying \"\n\"js/css assets. - notify/ping search engines with an updated sitemap.\"\nmsgstr \"所有generator执行完成后调用，即pelican退出之前。这对于自定义后处理操作是非常有用的，例如可以简化js/css资源、向搜索引擎告知更新后的sitemap。\"\n\n#: ../../plugins.rst:146 eecb5a5dc1b84f94a830db617122f365\nmsgid \"generator_init\"\nmsgstr \"generator_init\"\n\n#: ../../plugins.rst:146 b01311f8da704b55b38e23149c60bc22\nmsgid \"generator\"\nmsgstr \"generator\"\n\n#: ../../plugins.rst:146 a3c477e7a8d04e94af4ee7a82c873ef2\nmsgid \"invoked in the Generator.__init__\"\nmsgstr \"在Generator.__init__中调用\"\n\n#: ../../plugins.rst:147 246a49eb99d34589ac409e5613f27069\nmsgid \"all_generators_finalized\"\nmsgstr \"all_generators_finalized\"\n\n#: ../../plugins.rst:147 0dafe1a8f7224b1bbe1af3ebeeac0b31\nmsgid \"generators\"\nmsgstr \"generators\"\n\n#: ../../plugins.rst:147 9d5130f91ac748e58d96cfba7711e8f6\nmsgid \"invoked after all the generators are executed and before writing output\"\nmsgstr \"在所有generator执行完后，写入输出内容前调用，\"\n\n#: ../../plugins.rst:148 3a7f543549164bb684f47daa5b1b9bd1\nmsgid \"readers_init\"\nmsgstr \"readers_init\"\n\n#: ../../plugins.rst:148 0946829014734c53a0b1e389df853daf\nmsgid \"readers\"\nmsgstr \"readers\"\n\n#: ../../plugins.rst:148 380ba486fff24555b3c312bee4645d23\nmsgid \"invoked in the Readers.__init__\"\nmsgstr \"在Readers.__init__中调用\"\n\n#: ../../plugins.rst:149 ../../plugins.rst:203 04aa2b44a0b84da9b62b952b627a2b5c\n#: e725d629327b48e3a7dffad1d07d81d2\nmsgid \"article_generator_context\"\nmsgstr \"article_generator_context\"\n\n#: ../../plugins.rst:149 f0c440ead7fc46e2a90685c3fdffb5d4\nmsgid \"article_generator, metadata\"\nmsgstr \"article_generator, metadata\"\n\n#: ../../plugins.rst:150 ../../plugins.rst:205 2ed41de1aaed481195aeacbc841459be\n#: e9e159b6d49d4cd29ebbe6eb6e0bb3b1\nmsgid \"article_generator_preread\"\nmsgstr \"article_generator_preread\"\n\n#: ../../plugins.rst:150 ../../plugins.rst:152 ../../plugins.rst:153\n#: ../../plugins.rst:156 37277bd83e254f47b6df91ba6790f79e\n#: 9d3b745b96114ff7931cbcc372901c3e b89f87d254984ec59e25045227c708bf\n#: d38f0e2931b84b82adcc5aca5a4c2233\nmsgid \"article_generator\"\nmsgstr \"article_generator\"\n\n#: ../../plugins.rst:150 7a45243569e84c1e9d5d49b5c1a7b86a\nmsgid \"\"\n\"invoked before a article is read in ArticlesGenerator.generate_context; \"\n\"use if code needs to do something before every article is parsed\"\nmsgstr \"在ArticlesGenerator.generate_context读取文章之前调用；若代码需要在解析每篇文章前执行某些操作，就可以使用此信号。\"\n\n#: ../../plugins.rst:152 87c8e4ad4a104cb889172025f1b0229b\nmsgid \"article_generator_init\"\nmsgstr \"article_generator_init\"\n\n#: ../../plugins.rst:152 46c1e5fbb90a4668afda3d66e4520689\nmsgid \"invoked in the ArticlesGenerator.__init__\"\nmsgstr \"在ArticlesGenerator.__init__中调用\"\n\n#: ../../plugins.rst:153 de4b631d41e946c485ebb813e3dd6b62\nmsgid \"article_generator_pretaxonomy\"\nmsgstr \"article_generator_pretaxonomy\"\n\n#: ../../plugins.rst:153 697a45a251fe4188b1f32cec631427b9\nmsgid \"\"\n\"invoked before categories and tags lists are created useful when e.g. \"\n\"modifying the list of articles to be generated so that removed articles \"\n\"are not leaked in categories or tags\"\nmsgstr \"在创建类别和标签列表之前调用。例如，当需要变更要生成的文章列表时可以使用，如此可以避免一些已移除文章在分类或标签列表中泄露。\"\n\n#: ../../plugins.rst:156 ../../plugins.rst:204 051dcac75cbf4f5ea3a665e6da642324\n#: 2360e283fdd142ab8d65792581522e72\nmsgid \"article_generator_finalized\"\nmsgstr \"article_generator_finalized\"\n\n#: ../../plugins.rst:156 0c3c808d5b7044018f8566ccc6dd3010\nmsgid \"invoked at the end of ArticlesGenerator.generate_context\"\nmsgstr \"在ArticlesGenerator.generate_context的最后调用\"\n\n#: ../../plugins.rst:157 60d78048da4843a7a0307218c078d151\nmsgid \"article_generator_write_article\"\nmsgstr \"article_generator_write_article\"\n\n#: ../../plugins.rst:157 2ac0d0e7306a4d5086bb2e8b7b17ffb1\nmsgid \"article_generator, content\"\nmsgstr \"article_generator, content\"\n\n#: ../../plugins.rst:157 565551e010964925b10a3b5734913119\nmsgid \"invoked before writing each article, the article is passed as content\"\nmsgstr \"在写入每篇文章前调用，文章以内容的形式作为参数传入。\"\n\n#: ../../plugins.rst:158 fd7918c3200f4714b028c8d0a200df98\nmsgid \"article_writer_finalized\"\nmsgstr \"article_writer_finalized\"\n\n#: ../../plugins.rst:158 e54633543dbf4e5fb2dd4c1bfc09b1c1\nmsgid \"article_generator, writer\"\nmsgstr \"article_generator, writer\"\n\n#: ../../plugins.rst:158 965e61a0fd6347faa2d7224a50a98b76\nmsgid \"\"\n\"invoked after all articles and related pages have been written, but \"\n\"before the article generator is closed.\"\nmsgstr \"在所有文章及相关联页面写入完成后，在文章generator关闭前调用。\"\n\n#: ../../plugins.rst:160 30df01c5c11a4ed58b006d78b007c68d\nmsgid \"get_generators\"\nmsgstr \"get_generators\"\n\n#: ../../plugins.rst:160 758447f5e55a4738a14486b0e962034d\nmsgid \"\"\n\"invoked in Pelican.get_generator_classes, can return a Generator, or \"\n\"several generators in a tuple or in a list.\"\nmsgstr \"在Pelican.get_generator_classes中调用，可以返回一个Generator，也可以以一个元组或列表的形式返回多个generator。\"\n\n#: ../../plugins.rst:163 730e948388a24435be216830e0af5be6\nmsgid \"get_writer\"\nmsgstr \"get_writer\"\n\n#: ../../plugins.rst:163 df9f9fef24984c4bad07b8834e79352f\nmsgid \"invoked in Pelican.get_writer, can return a custom Writer.\"\nmsgstr \"在Pelican.get_writer前调用，可以返回一个自定义Writer。\"\n\n#: ../../plugins.rst:165 ../../plugins.rst:206 1c172b26e92543d2be488a88cceaf576\n#: 252231854c504621b28243dfba9d88ab\nmsgid \"page_generator_context\"\nmsgstr \"page_generator_context\"\n\n#: ../../plugins.rst:165 a830e240c6564552ba4952bc657120a9\nmsgid \"page_generator, metadata\"\nmsgstr \"page_generator, metadata\"\n\n#: ../../plugins.rst:166 ../../plugins.rst:207 09add2ea39344ad8936296a07cfd8e82\n#: 0fc3cf365d9d418b8225e8f1f5da76d0\nmsgid \"page_generator_preread\"\nmsgstr \"page_generator_preread\"\n\n#: ../../plugins.rst:166 ../../plugins.rst:168 ../../plugins.rst:169\n#: 3c31cfe2f4744cd987f1638a4b82e5de a80ec8c388cb477abbcfc4f558d34df7\n#: d485c4f9c2c443748234827727cc887e\nmsgid \"page_generator\"\nmsgstr \"page_generator\"\n\n#: ../../plugins.rst:166 4d8b96aa6ebf47d885cd978c336679ff\nmsgid \"\"\n\"invoked before a page is read in PageGenerator.generate_context; use if \"\n\"code needs to do something before every page is parsed.\"\nmsgstr \"在PageGenerator.generate_context读取页面前调用，若代码需要在解析每个页面前执行某些操作，就可以使用此信号。\"\n\n#: ../../plugins.rst:168 ../../plugins.rst:209 06adf06d2b204100b9f80850b84bdff0\n#: c0988434a401410e8cf6b4528e6d2870\nmsgid \"page_generator_init\"\nmsgstr \"page_generator_init\"\n\n#: ../../plugins.rst:168 d359da10912949fa999dc3ad5215be66\nmsgid \"invoked in the PagesGenerator.__init__\"\nmsgstr \"在PagesGenerator.__init__中调用\"\n\n#: ../../plugins.rst:169 ../../plugins.rst:208 0994b38b87704caea04ef0671a7b1c67\n#: a97cf5f236a64959aa09838dbe03dfdc\nmsgid \"page_generator_finalized\"\nmsgstr \"page_generator_finalized\"\n\n#: ../../plugins.rst:169 4cfdfe952daf4e3ea5ea1c8b2cf7a664\nmsgid \"invoked at the end of PagesGenerator.generate_context\"\nmsgstr \"在PagesGenerator.generate_context的最后调用\"\n\n#: ../../plugins.rst:170 7e2504584a1b4fa4ae88c5002bcbb26f\nmsgid \"page_generator_write_page\"\nmsgstr \"page_generator_write_page\"\n\n#: ../../plugins.rst:170 ea204a5fe703472ea5afea283135b94d\nmsgid \"page_generator, content\"\nmsgstr \"page_generator, content\"\n\n#: ../../plugins.rst:170 22dd198fe6dc498f944e2c0e2c595c6c\nmsgid \"invoked before writing each page, the page is passed as content\"\nmsgstr \"在写入每个页面前调用，页面以内容形式作为参数传入\"\n\n#: ../../plugins.rst:171 84d5def2c4fc4a2489d2b4fc1fa445df\nmsgid \"page_writer_finalized\"\nmsgstr \"page_writer_finalized\"\n\n#: ../../plugins.rst:171 c55d65276a4e49c58c34d12cc062c90d\nmsgid \"page_generator, writer\"\nmsgstr \"page_generator, writer\"\n\n#: ../../plugins.rst:171 b2a3d1c7c2864a08829833bc16b3223e\nmsgid \"\"\n\"invoked after all pages have been written, but before the page generator \"\n\"is closed.\"\nmsgstr \"调用于所有页面写入完成后，在页面generator关闭前。\"\n\n#: ../../plugins.rst:173 ../../plugins.rst:210 097c5b3dc1d34a5eb7c1b4ae67179b3e\n#: a420152f887e4977bdd26a5fa7230915\nmsgid \"static_generator_context\"\nmsgstr \"static_generator_context\"\n\n#: ../../plugins.rst:173 1bbacfe960644e4a902b9c866e3fffce\nmsgid \"static_generator, metadata\"\nmsgstr \"static_generator, metadata\"\n\n#: ../../plugins.rst:174 ../../plugins.rst:211 c1242bcf76fc40568f67a2ce4e70c0bb\n#: f407aa94870645c891bb349edc3ae9a4\nmsgid \"static_generator_preread\"\nmsgstr \"static_generator_preread\"\n\n#: ../../plugins.rst:174 ../../plugins.rst:177 ../../plugins.rst:178\n#: 36f5be5c982b42d097c0465f542e490f cf0ebefd743246dd9db1b37a8c6a43a8\n#: d5cd54887d904bcca02b0df4f22580e9\nmsgid \"static_generator\"\nmsgstr \"static_generator\"\n\n#: ../../plugins.rst:174 1b2fbadf156644429e66ad2e64d26658\nmsgid \"\"\n\"invoked before a static file is read in StaticGenerator.generate_context;\"\n\" use if code needs to do something before every static file is added to \"\n\"the staticfiles list.\"\nmsgstr \"在StaticGenerator.generate_context读取静态文件前调用，若代码需要在每个静态文件加入静态文件列表前进行一些修改，就可以使用此信号。\"\n\n#: ../../plugins.rst:177 654377fe53434f77b3ba294b5689d1d4\nmsgid \"static_generator_init\"\nmsgstr \"static_generator_init\"\n\n#: ../../plugins.rst:177 e9b3cbbde7a6443a81d025d1a4fe6145\nmsgid \"invoked in the StaticGenerator.__init__\"\nmsgstr \"在StaticGenerator.__init__中调用\"\n\n#: ../../plugins.rst:178 202be739e43444f48f122d3e5f657a45\nmsgid \"static_generator_finalized\"\nmsgstr \"static_generator_finalized\"\n\n#: ../../plugins.rst:178 06080672fd614d39a79aa6d3a783087f\nmsgid \"invoked at the end of StaticGenerator.generate_context\"\nmsgstr \"在StaticGenerator.generate_context的最后调用\"\n\n#: ../../plugins.rst:179 ce174fb4533143518c13b16ab6dbe4c8\nmsgid \"content_object_init\"\nmsgstr \"content_object_init\"\n\n#: ../../plugins.rst:179 5089a38bad1447cab62f350df8e76f31\nmsgid \"content_object\"\nmsgstr \"content_object\"\n\n#: ../../plugins.rst:179 d105f652be424f5cad8bfaf7be69ec4b\nmsgid \"invoked at the end of Content.__init__\"\nmsgstr \"在Content.__init__的最后调用\"\n\n#: ../../plugins.rst:180 dbda8a11bca744a4ba5fc51d044f1d6e\nmsgid \"content_written\"\nmsgstr \"content_written\"\n\n#: ../../plugins.rst:180 c8ba95ebcc2e4c79ae79717a730fe504\nmsgid \"path, context\"\nmsgstr \"path, context\"\n\n#: ../../plugins.rst:180 6d9caed8fa24400a86f8ede1c3ecb260\nmsgid \"invoked each time a content file is written.\"\nmsgstr \"每一次内容文件写入后调用。\"\n\n#: ../../plugins.rst:181 73a4265b050c4b32be186bb2cec59f30\nmsgid \"feed_generated\"\nmsgstr \"feed_generated\"\n\n#: ../../plugins.rst:181 78fa3603986f417286f2e7440f5aff57\nmsgid \"context, feed\"\nmsgstr \"context, feed\"\n\n#: ../../plugins.rst:181 13dcd9e5fb2f408db72b87b88877596b\nmsgid \"\"\n\"invoked each time a feed gets generated. Can be used to modify a feed \"\n\"object before it gets written.\"\nmsgstr \"每个feed生成前调用。可以用于在feed写入前修改之。\"\n\n#: ../../plugins.rst:183 3a959768d5704e459940cbfcf8e1459c\nmsgid \"feed_written\"\nmsgstr \"feed_written\"\n\n#: ../../plugins.rst:183 86844bee049a445e87db283bdf325338\nmsgid \"path, context, feed\"\nmsgstr \"path, context, feed\"\n\n#: ../../plugins.rst:183 e79185da7cb54bf5aa59a46846222391\nmsgid \"invoked each time a feed file is written.\"\nmsgstr \"每一个feed文件写入后调用。\"\n\n#: ../../plugins.rst:188 0fe0539bad1c4fcbbebbdaa98d328ee9\nmsgid \"\"\n\"Avoid ``content_object_init`` signal if you intend to read ``summary`` or\"\n\" ``content`` properties of the content object. That combination can \"\n\"result in unresolved links when :ref:`ref-linking-to-internal-content` \"\n\"(see `pelican-plugins bug #314`_). Use ``_summary`` and ``_content`` \"\n\"properties instead, or, alternatively, run your plugin at a later stage \"\n\"(e.g. ``all_generators_finalized``).\"\nmsgstr \"\"\n\"请避免使用 ``content_object_init`` 信号读取content对象的 ``summary`` 或 ``content`` \"\n\"属性，这可能导致在 :ref:`ref-linking-to-internal-content` 时无法解析链接（请参阅 `pelican-\"\n\"plugins bug #314`_ ）。请改用 ``_summary`` 和 ``_content`` 属性，或者就在后续阶段再运行插件（例如 \"\n\"``all_generators_finalized`` 时）。\"\n\n#: ../../plugins.rst:197 77ca681d0d7a4a9ea42f7eebf683f024\nmsgid \"\"\n\"After Pelican 3.2, signal names were standardized.  Older plugins may \"\n\"need to be updated to use the new names:\"\nmsgstr \"Pelican3.2之后，信号名都进行了标准化，较老的插件可能需要进行更新：\"\n\n#: ../../plugins.rst:201 c83f9215c5964ba49cb5ed849c777495\nmsgid \"Old name\"\nmsgstr \"旧名称\"\n\n#: ../../plugins.rst:201 167435de345b443fa51c27b355121e14\nmsgid \"New name\"\nmsgstr \"新名称\"\n\n#: ../../plugins.rst:203 bcdf136cbb2c4dedbd90f6e56f584c6b\nmsgid \"article_generate_context\"\nmsgstr \"article_generate_context\"\n\n#: ../../plugins.rst:204 60fe5b91f4a54f0997f93d927b0d81c4\nmsgid \"article_generate_finalized\"\nmsgstr \"article_generate_finalized\"\n\n#: ../../plugins.rst:205 31252537627f4042b7f7b4e0a4a33aeb\nmsgid \"article_generate_preread\"\nmsgstr \"article_generate_preread\"\n\n#: ../../plugins.rst:206 719da4844a0a4b6fbb2cf2d9b7e51deb\nmsgid \"pages_generate_context\"\nmsgstr \"pages_generate_context\"\n\n#: ../../plugins.rst:207 f7c865fd6824473aad024fc606235b48\nmsgid \"pages_generate_preread\"\nmsgstr \"pages_generate_preread\"\n\n#: ../../plugins.rst:208 74c47460bacf4fd68f2536580efb1480\nmsgid \"pages_generator_finalized\"\nmsgstr \"pages_generator_finalized\"\n\n#: ../../plugins.rst:209 b403e7f978c24d989d99587579f31d3c\nmsgid \"pages_generator_init\"\nmsgstr \"pages_generator_init\"\n\n#: ../../plugins.rst:210 94e5184530c94cc48d00fd819fffd649\nmsgid \"static_generate_context\"\nmsgstr \"static_generate_context\"\n\n#: ../../plugins.rst:211 00ca2c730ad840f584d3f9dd30daf0cd\nmsgid \"static_generate_preread\"\nmsgstr \"static_generate_preread\"\n\n#: ../../plugins.rst:215 f8044e028ccd4d64954e24375a739cd2\nmsgid \"Recipes\"\nmsgstr \"具体使用方法举例\"\n\n#: ../../plugins.rst:217 0c441d12047240199025f2d3ac954167\nmsgid \"\"\n\"We eventually realised some of the recipes to create plugins would be \"\n\"best shared in the documentation somewhere, so here they are!\"\nmsgstr \"下面分享了一些创建插件的具体方法，请享用！\"\n\n#: ../../plugins.rst:221 bb96f2da7b3340cb9ed56ee1ad59796b\nmsgid \"How to create a new reader\"\nmsgstr \"如何创建一个新的reader\"\n\n#: ../../plugins.rst:223 49dbbbd2c5ca4798a1b9d67b48630d36\nmsgid \"\"\n\"One thing you might want is to add support for your very own input \"\n\"format. While it might make sense to add this feature in Pelican core, we\"\n\" wisely chose to avoid this situation and instead have the different \"\n\"readers defined via plugins.\"\nmsgstr \"你可能需要添加对输入文件格式的特殊支持。这似乎可以作为Pelican核心的一个功能，但我们选择避免将此功能放在核心中，而是通过插件实现不同的reader。\"\n\n#: ../../plugins.rst:228 af8936c711204a0aa7c85835124065c5\nmsgid \"\"\n\"The rationale behind this choice is mainly that plugins are really easy \"\n\"to write and don't slow down Pelican itself when they're not active.\"\nmsgstr \"做出这个决定主要是因为实现这样的格式支持插件非常容易，而且这样在不需要此功能时也不会影响Pelican自身的速度。\"\n\n#: ../../plugins.rst:231 11dac8bd71994c18a289086ec95a0273\nmsgid \"No more talking — here is an example::\"\nmsgstr \"多说无益，下面是一个具体例子：\"\n\n#: ../../plugins.rst:267 f6bf903ae8de4ac183ecea699de568dc\nmsgid \"Adding a new generator\"\nmsgstr \"添加新的generator\"\n\n#: ../../plugins.rst:269 50d39b45550446a493a6d5d6eb971103\nmsgid \"\"\n\"Adding a new generator is also really easy. You might want to have a look\"\n\" at :doc:`internals` for more information on how to create your own \"\n\"generator.\"\nmsgstr \"添加一个generator也非常简单，你可能会想要看一看 :doc:`internals` ，其中有关于如何创建generator的内容。\"\n\n#: ../../plugins.rst:283 1b4bc8c2b02645dd81b06ffdbd759c36\nmsgid \"Adding a new writer\"\nmsgstr \"添加新的writer\"\n\n#: ../../plugins.rst:285 ac526121b895429d8412605bca594684\nmsgid \"\"\n\"Adding a writer will allow you to output additional file formats to disk,\"\n\" or change how the existing formats are written to disk. Note that only \"\n\"one writer will be active at a time, so be sure to either subclass the \"\n\"built-in Writer, or completely re-implement it.\"\nmsgstr \"添加writer可以让你将其他文件格式输出到磁盘，或者可以改变现有格式写入磁盘的方式。请注意，一次只能启用一个writer，因此请确保继承了内置的Writer，并且完全重新实现之。\"\n\n#: ../../plugins.rst:290 4335016710cd417ca9b8068cb7a45d51\nmsgid \"Here is a basic example of how to set up your own writer::\"\nmsgstr \"下面是启用你的自定义writer的一个基本例子：\"\n\n#: ../../plugins.rst:310 c65b371d4bf740c49dfe190407c9af69\nmsgid \"Using Plugins to Inject Content\"\nmsgstr \"使用插件添加内容\"\n\n#: ../../plugins.rst:312 9f180f86d09f43d7aff4607bb7deb6f1\nmsgid \"\"\n\"You can programmatically inject articles or pages using plugins. This can\"\n\" be useful if you plan to fetch articles from an API, for example.\"\nmsgstr \"可以通过插件以可编程的方式添加文章或页面。如果你打算从某些API获取文章，这就会很有用。\"\n\n#: ../../plugins.rst:315 a65dd6bb4d0e48438dcf6d545bfaa053\nmsgid \"\"\n\"Following is a simple example of how one can build a plugin that injects \"\n\"a custom article, using the ``article_generator_pretaxonomy`` signal::\"\nmsgstr \"下面是一个简单的示例，说明了如何使用 ``article_generator_pretaxonomy`` 信号构建一个添加自定义文章的插件：\"\n"
  },
  {
    "path": "docs/locale/zh_CN/LC_MESSAGES/publish.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) 2010–2024\n# This file is distributed under the same license as the PELICAN package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, 2024.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PELICAN 4\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2024-06-24 19:06+0800\\n\"\n\"PO-Revision-Date: 2024-06-25 19:00+0800\\n\"\n\"Last-Translator: GeorgeHu <dhxxhch@163.com>\\n\"\n\"Language: zh_CN\\n\"\n\"Language-Team: \\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=utf-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Generated-By: Babel 2.15.0\\n\"\n\n#: ../../publish.rst:2 65617cfb871b492589d55186b708a1ce\nmsgid \"Publish your site\"\nmsgstr \"发布站点\"\n\n#: ../../publish.rst:7 dc4c9b1c1afd477d906b892dc592bdcd\nmsgid \"Site generation\"\nmsgstr \"站点生成\"\n\n#: ../../publish.rst:9 610c37360e2b49ec8ea630ddc224d2b7\nmsgid \"\"\n\"Once Pelican is installed and you have some content (e.g., in Markdown or\"\n\" reST format), you can convert your content into HTML via the ``pelican``\"\n\" command, specifying the path to your content and (optionally) the path \"\n\"to your :doc:`settings<settings>` file::\"\nmsgstr \"\"\n\"您应该已经安装好Pelican并且已经创作了一些内容了吧（以Markdown或是reST格式），\"\n\"现在就可以将这些内容通过 ``pelican`` 命令转换为HTML了，在转换时需要指定\"\n\"创作内容存放的路径；如果有需要， :doc:`配置<settings>` 文件的路径也可单独指定：\"\n\n#: ../../publish.rst:16 6f353c84f5204d2b84c49d1557010b19\nmsgid \"\"\n\"The above command will generate your site and save it in the ``output/`` \"\n\"folder, using the default theme to produce a simple site. The default \"\n\"theme consists of very simple HTML without styling and is provided so \"\n\"folks may use it as a basis for creating their own themes.\"\nmsgstr \"\"\n\"上面的指令会在 ``output/`` 目录下生成站点，使用的是默认的主题。默认主题只使用\"\n\"一些简单的HTML并且不包含样式，大家往往以这个简单主题为基础来创作自己的主题。\"\n\n#: ../../publish.rst:21 bb5064d57ed144e6b85d7d3d0938f91c\nmsgid \"\"\n\"You can also tell Pelican to watch for your modifications, instead of \"\n\"manually re-running it every time you want to see your changes. To enable\"\n\" this, run the ``pelican`` command with the ``-r`` or ``--autoreload`` \"\n\"option. On non-Windows environments, this option can also be combined \"\n\"with the ``-l`` or ``--listen`` option to simultaneously both auto-\"\n\"regenerate *and* serve the output at http://localhost:8000::\"\nmsgstr \"\"\n\"你也可以让Pelican来监听对源内容文件的修改，而不是在每次修改内容后重新手动执行命令\"\n\"来生成站点。在执行 ``pelican`` 命令时，加上 ``-r`` 或者 ``--autoreload`` 选项\"\n\"就可以做到这一点。在非Windows环境下，这个选项还可以和 ``-l`` 或 ``--listen`` \"\n\"搭配使用，这样就可以在自动重生成站点的基础上，同时提供在 http://localhost:8000 \"\n\"上的访问：\"\n\n#: ../../publish.rst:30 40089a6762204e27bd16afaa038a8277\nmsgid \"\"\n\"Pelican has other command-line switches available. Have a look at the \"\n\"help to see all the options you can use::\"\nmsgstr \"\"\n\"Pelican还有一些其他的命令行选项。可以在帮助中看到所有可用选项：\"\n\n#: ../../publish.rst:36 4484bb6f6e2b4bd49027c98be4fa2cd8\nmsgid \"Viewing the generated files\"\nmsgstr \"浏览生成的文件\"\n\n#: ../../publish.rst:38 4dc83b844c964bcab17af21fabd5e6b2\nmsgid \"\"\n\"The files generated by Pelican are static files, so you don't actually \"\n\"need anything special to view them. You can use your browser to open the \"\n\"generated HTML files directly::\"\nmsgstr \"\"\n\"Pelican生成的文件都是静态的，也就是说不需要使用什么特殊的手段就可以浏览。\"\n\"您可以直接使用浏览器打开生成的HTML文件：\"\n\n#: ../../publish.rst:44 c5774634f7da4f64bb7c7d0adbcdb65b\nmsgid \"\"\n\"Because the above method may have trouble locating your CSS and other \"\n\"linked assets, running Pelican's simple built-in web server will often \"\n\"provide a more reliable previewing experience::\"\nmsgstr \"\"\n\"事实上，上面所说的直接打开的方式可能会使CSS或其他链接上出现问题，\"\n\"可以运行Pelican自带的简易web服务器，如此便可以获得可靠的预览体验：\"\n\n#: ../../publish.rst:50 b2eab6914b854b40bd769433fbad21b7\nmsgid \"\"\n\"Once the web server has been started, you can preview your site at: \"\n\"http://localhost:8000/\"\nmsgstr \"\"\n\"当web服务器启动后，可以访问 http://localhost:8000/ 来预览您的站点。\"\n\n#: ../../publish.rst:54 3b7344cad46a4dfaa01c067dd1f4009b\nmsgid \"Deployment\"\nmsgstr \"部署\"\n\n#: ../../publish.rst:56 de2815c211b84291a985a1d808ffbfe7\nmsgid \"\"\n\"After you have generated your site, previewed it in your local \"\n\"development environment, and are ready to deploy it to production, you \"\n\"might first re-generate your site with any production-specific settings \"\n\"(e.g., analytics, feeds, etc.) that you may have defined::\"\nmsgstr \"\"\n\"当您生成好站点后，可以在本地先进行预览，确认无误后，在部署前可能还需使用\"\n\"生产环境特定的配置文件重新生成站点：\"\n\n#: ../../publish.rst:63 56e568114b72443ebcf1f741f07504dc\nmsgid \"\"\n\"To base your publish configuration on top of your ``pelicanconf.py``, you\"\n\" can import your ``pelicanconf`` settings by including the following line\"\n\" in your ``publishconf.py``::\"\nmsgstr \"\"\n\"您可以基于 ``pelicanconf.py`` 进行设置文件的配置， 在 ``publishconf.py`` \"\n\"中import ``pelicanconf`` 就可实现（译者注：配置文件其实本质上就是一些\"\n\"Python变量，因此import后就可以全部引入）：\"\n\n#: ../../publish.rst:69 b9e1243ed9ba409890d86ef8ff85499d\nmsgid \"\"\n\"If you have generated a ``publishconf.py`` using ``pelican-quickstart``, \"\n\"this line is included by default.\"\nmsgstr \"\"\n\"如果 ``publishconf.py`` 是通过 ``pelican-quickstart`` 生成的，上面这行默认就有。\"\n\n#: ../../publish.rst:72 39671d42b0bb4c828fc51c63c351402c\nmsgid \"\"\n\"The steps for deploying your site will depend on where it will be hosted.\"\n\" If you have SSH access to a server running Nginx or Apache, you might \"\n\"use the ``rsync`` tool to transmit your site files::\"\nmsgstr \"\"\n\"部署站点的方法步骤取决于网站托管的位置。对于使用SSH访问的运行着Nginx或\"\n\"Apache的服务器，您可能需要使用 ``rsync`` 工具来传输站点文件：\"\n\n#: ../../publish.rst:78 523ed256e0164a968d8580310e4a9304\nmsgid \"\"\n\"There are many other deployment options, some of which can be configured \"\n\"when first setting up your site via the ``pelican-quickstart`` command. \"\n\"See the :doc:`Tips<tips>` page for detail on publishing via GitHub Pages.\"\nmsgstr \"\"\n\"还有很多其他的部署方式供您选择，有一些在第一次通过 ``pelican-quickstart`` \"\n\"命令建立站点时就已经配置。在 :doc:`小技巧<tips>` 中可以查看如何通过\"\n\"Github Pages部署站点。\"\n\n#: ../../publish.rst:83 c44ecc79922d419b8627706a6694dd8c\nmsgid \"Automation\"\nmsgstr \"自动化\"\n\n#: ../../publish.rst:85 b892dcba14a84306aa6b39295b5f81e3\nmsgid \"\"\n\"While the ``pelican`` command is the canonical way to generate your site,\"\n\" automation tools can be used to streamline the generation and \"\n\"publication flow. One of the questions asked during the ``pelican-\"\n\"quickstart`` process pertains to whether you want to automate site \"\n\"generation and publication. If you answered \\\"yes\\\" to that question, a \"\n\"``tasks.py`` and ``Makefile`` will be generated in the root of your \"\n\"project. These files, pre-populated with certain information gleaned from\"\n\" other answers provided during the ``pelican-quickstart`` process, are \"\n\"meant as a starting point and should be customized to fit your particular\"\n\" needs and usage patterns. If you find one or both of these automation \"\n\"tools to be of limited utility, these files can be deleted at any time \"\n\"and will not affect usage of the canonical ``pelican`` command.\"\nmsgstr \"\"\n\"``pelican`` 命令是生成站点的标准方法，但同时也有自动化工具可以用来简化生成与\"\n\"发布流程。在 ``pelican-quickstart`` 的过程中，其中一个问题就是是否启用自动站点\"\n\"生成与发布。若您选择了 “yes”，在项目的根目录中就会生成 ``tasks.py`` \"\n\"和 ``Makefile`` 。这些文件中预填充了一些从 ``pelican-quickstart`` 过程中\"\n\"收集的信息，您应该从这个生成好的文件出发，再根据实际需要进一步修改。\"\n\"另外，如果您认为这些自动化脚本文件没什么用，完全可以将他们删除，这不会对标准命令 \"\n\"``pelican`` 产生任何影响。\"\n\n#: ../../publish.rst:98 4c49ca3a24e3462a984dda738875ed4e\nmsgid \"\"\n\"Following are automation tools that \\\"wrap\\\" the ``pelican`` command and \"\n\"can simplify the process of generating, previewing, and uploading your \"\n\"site.\"\nmsgstr \"\"\n\"下面是一些自动化工具，其中包装了 ``pelican`` 命令，可以用于简化生成、预览和\"\n\"上传站点的过程。\"\n\n#: ../../publish.rst:102 103fb7405038442aae62b62ea0fcdbe5\nmsgid \"Invoke\"\nmsgstr \"Invoke\"\n\n#: ../../publish.rst:104 d3e46bf8da96489e923f6497e8932538\nmsgid \"\"\n\"The advantage of Invoke_ is that it is written in Python and thus can be \"\n\"used in a wide range of environments. The downside is that it must be \"\n\"installed separately. Use the following command to install Invoke, \"\n\"prefixing with ``sudo`` if your environment requires it::\"\nmsgstr \"\"\n\"Invoke_ 工具使用Python作为编程语言，并且能够用在很多不同的环境中。它需要使用\"\n\"下面的命令单独安装，在某些操作系统中可能需要在前面加上 ``sudo`` ：\"\n\n#: ../../publish.rst:111 786359d08e8f45598df7b1c45e32ca0a\nmsgid \"\"\n\"Take a moment to open the ``tasks.py`` file that was generated in your \"\n\"project root. You will see a number of commands, any one of which can be \"\n\"renamed, removed, and/or customized to your liking. Using the out-of-the-\"\n\"box configuration, you can generate your site via::\"\nmsgstr \"\"\n\"可以打开 ``tasks.py`` 文件看看其中的代码，可以尝试更改和删除其中的命令，\"\n\"也可以按照您的喜好自行进行其他修改。生成好的文件是开箱即用的，您可以通过\"\n\"下面的命令生成站点：\"\n\n#: ../../publish.rst:118 ../../publish.rst:166 04c6045b58c24bc1a1fd594cdcf4ef5c\n#: 1e9cf29276ec4446b1b0f4a55a1ef4b8\nmsgid \"\"\n\"If you'd prefer to have Pelican automatically regenerate your site every \"\n\"time a change is detected (which is handy when testing locally), use the \"\n\"following command instead::\"\nmsgstr \"\"\n\"若您希望Pelican在检测到变化时自动重新生成站点（在本地测试的时候很实用），\"\n\"可以使用下面的命令：\"\n\n#: ../../publish.rst:124 ../../publish.rst:172 fabe0ce08eca4c5ebd9ca65898dab138\n#: ff42351e29b944a59e8df22b1cbb20f5\nmsgid \"\"\n\"To serve the generated site so it can be previewed in your browser at \"\n\"http://localhost:8000/::\"\nmsgstr \"\"\n\"下面的命令则可以让您在生成后通过浏览器访问 http://localhost:8000/ 来预览站点\"\n\n#: ../../publish.rst:129 e1b12a6c64b246f89aea105b8d7febbc\nmsgid \"\"\n\"To serve the generated site with automatic browser reloading every time a\"\n\" change is detected, first ``python -m pip install livereload``, then use\"\n\" the following command::\"\nmsgstr \"\"\n\"在每次检测到修改重生成站点后，可以让浏览器自动进行重载。先运行 \"\n\"``python -m pip install livereload`` 安装，再运行下面的这条命令就可以实现：\"\n\n#: ../../publish.rst:135 bf0d6c7770fe4a399b81b9ebdd48fa4e\nmsgid \"\"\n\"If during the ``pelican-quickstart`` process you answered \\\"yes\\\" when \"\n\"asked whether you want to upload your site via SSH, you can use the \"\n\"following command to publish your site via rsync over SSH::\"\nmsgstr \"\"\n\"如果在 ``pelican-quickstart`` 过程中，对是否要通过SSH上传站点问题回答了“yes”，\"\n\"您就可以使用下面的命令借助rsync在SSH上发布站点：\"\n\n#: ../../publish.rst:141 9bea9f82ce164ee5ba07349a4c4d58ea\nmsgid \"\"\n\"These are just a few of the commands available by default, so feel free \"\n\"to explore ``tasks.py`` and see what other commands are available. More \"\n\"importantly, don't hesitate to customize ``tasks.py`` to suit your \"\n\"specific needs and preferences.\"\nmsgstr \"\"\n\"默认就可以使用的命令远不止这些，在 ``tasks.py`` 中可以找到更多可用的命令。\"\n\"更重要的是，当您有特定需求和偏好时，直接修改 ``tasks.py`` 即可。\"\n\n#: ../../publish.rst:147 06a6e7232c6243d79ab9f43ddc28590d\nmsgid \"Make\"\nmsgstr \"Make\"\n\n#: ../../publish.rst:149 a2a5b589cf804fcd83ee2d0fbf98c12d\nmsgid \"\"\n\"A ``Makefile`` is also automatically created for you when you say \\\"yes\\\"\"\n\" to the relevant question during the ``pelican-quickstart`` process. The \"\n\"advantage of this method is that the ``make`` command is built into most \"\n\"POSIX systems and thus doesn't require installing anything else in order \"\n\"to use it. The downside is that non-POSIX systems (e.g., Windows) do not \"\n\"include ``make``, and installing it on those systems can be a non-trivial\"\n\" task.\"\nmsgstr \"\"\n\"``Makefile`` 也是自动生成的。在大多数POSIX系统中都内置了 ``make`` 命令，\"\n\"无需安装即可使用。但在非POSIX系统（例如Windows）中并没有 ``make`` ，在这些\"\n\"系统中安装 ``make`` 则往往比较麻烦。\"\n\n#: ../../publish.rst:156 68c38c3eb34e4e6ca9cd4a2d3646d5cb\nmsgid \"\"\n\"If you want to use ``make`` to generate your site using the settings in \"\n\"``pelicanconf.py``, run::\"\nmsgstr \"\"\n\"使用 ``make`` 命令是以 ``pelicanconf.py`` 作为配置文件来生成站点的：\"\n\n#: ../../publish.rst:161 133e6e1ebf92412a85eedbe56e0b91af\nmsgid \"\"\n\"To generate the site for production, using the settings in \"\n\"``publishconf.py``, run::\"\nmsgstr \"\"\n\"使用 ``publishconf.py`` 作为配置文件来为生产环境生成站点：\"\n\n#: ../../publish.rst:177 f4e250949c2145ceb03b65c875767abc\nmsgid \"\"\n\"Normally you would need to run ``make regenerate`` and ``make serve`` in \"\n\"two separate terminal sessions, but you can run both at once via::\"\nmsgstr \"\"\n\"一般来说， ``make regenerate`` 和 ``make serve`` 需要在分别在单独的终端会话中\"\n\"运行，下面的命令相当于同时运行上述两个命令：\"\n\n#: ../../publish.rst:182 1f83bbcf60134eef959370bb5ca402d9\nmsgid \"\"\n\"The above command will simultaneously run Pelican in regeneration mode as\"\n\" well as serve the output at http://localhost:8000.\"\nmsgstr \"\"\n\"上面的命令会让Pelican在重生成模式下持续运行，同样地，您可以通过 \"\n\"http://localhost:8000 访问生成的站点。\"\n\n#: ../../publish.rst:185 9274a68b1e3b4639bf638a044eda613d\nmsgid \"\"\n\"When you're ready to publish your site, you can upload it via the \"\n\"method(s) you chose during the ``pelican-quickstart`` questionnaire. For \"\n\"this example, we'll use rsync over ssh::\"\nmsgstr \"\"\n\"当准备好发布站点时，可以使用在 ``pelican-quickstart`` 过程中选择的方法进行上传。\"\n\"下面的例子使用rsync在ssh上完成这一工作：\"\n\n#: ../../publish.rst:191 9d7e7927c183491f981aacebe14e5bf1\nmsgid \"That's it! Your site should now be live.\"\nmsgstr \"OK！您的站点现在已经可以访问了。\"\n\n#: ../../publish.rst:193 8f570acd5f494f5b9645fdbca6db6fbb\nmsgid \"\"\n\"(The default ``Makefile`` and ``devserver.sh`` scripts use the ``python``\"\n\" and ``pelican`` executables to complete its tasks. If you want to use \"\n\"different executables, such as ``python3``, you can set the ``PY`` and \"\n\"``PELICAN`` environment variables, respectively, to override the default \"\n\"executable names.)\"\nmsgstr \"\"\n\"（默认的 ``Makefile`` 和 ``devserver.sh`` 脚本执行 ``python`` 和 ``pelican`` \"\n\"来完成任务。若您希望使用其他的可执行文件，例如 ``python3`` ，设置环境变量 ``PY`` \"\n\"和 ``PELICAN`` 来覆盖默认的可执行文件名）\"\n"
  },
  {
    "path": "docs/locale/zh_CN/LC_MESSAGES/quickstart.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) 2010–2024\n# This file is distributed under the same license as the PELICAN package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, 2024.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PELICAN 4\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2024-06-24 19:06+0800\\n\"\n\"PO-Revision-Date: 2024-06-25 19:00+0800\\n\"\n\"Last-Translator: GeorgeHu <dhxxhch@163.com>\\n\"\n\"Language: zh_CN\\n\"\n\"Language-Team: \\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=utf-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Generated-By: Babel 2.15.0\\n\"\n\n#: ../../quickstart.rst:2 e5f32d61440744aab3f878488ef9e1e3\nmsgid \"Quickstart\"\nmsgstr \"快速开始\"\n\n#: ../../quickstart.rst:4 d3762ec7c3934f85b25b04cf4024a90c\nmsgid \"\"\n\"Reading through all the documentation is highly recommended, but for the \"\n\"truly impatient, following are some quick steps to get started.\"\nmsgstr \"\"\n\"强烈建议将所有文档完整地看一遍，但如果您目前没空，下面的步骤可以帮助您快速开始\"\n\"使用Pelican。\"\n\n#: ../../quickstart.rst:8 c5982d5ecf7c445590254370b84995be\nmsgid \"Installation\"\nmsgstr \"安装\"\n\n#: ../../quickstart.rst:10 fda7d08c05f14e2fa0c07a4a1d216db5\nmsgid \"\"\n\"Install Pelican (and optionally Markdown if you intend to use it) on \"\n\"Python |min_python| by running the following command in your preferred \"\n\"terminal, prefixing with ``sudo`` if permissions warrant::\"\nmsgstr \"\"\n\"在命令行中执行下面的命令以安装Pelican（如果您需要Markdown支持的话，也可以同时安装之）。\"\n\"Pelican需要使用 |min_python| 以上版本的Python。在必要情况下，请在命令前加上 ``sudo`` 。\"\n\n#: ../../quickstart.rst:17 9db650d9dc9d4ac48df4dd9fc0a246ac\nmsgid \"Create a project\"\nmsgstr \"创建项目\"\n\n#: ../../quickstart.rst:19 2e9a72a878754604abdb27d9ec37937e\nmsgid \"\"\n\"First, choose a name for your project, create an appropriately-named \"\n\"directory for your site, and switch to that directory::\"\nmsgstr \"\"\n\"首先，给您的项目想个名字，并以合适的名字创建一个文件夹来存放您的站点。\"\n\"接着，进入这个新创建的文件夹：\"\n\n#: ../../quickstart.rst:25 da759420dd8440b485936a5a054f142a\nmsgid \"\"\n\"Create a skeleton project via the ``pelican-quickstart`` command, which \"\n\"begins by asking some questions about your site::\"\nmsgstr \"\"\n\"通过 ``pelican-quickstart`` 命令创建一个项目的框架，执行这个命令后，\"\n\"您需要输入一些站点相关的信息：\"\n\n#: ../../quickstart.rst:30 eb2d702c9f5a4981a93f805e98674cfe\nmsgid \"\"\n\"For questions that have default values denoted in brackets, feel free to \"\n\"use the Return key to accept those default values [#tzlocal_fn]_. When \"\n\"asked for your URL prefix, enter your domain name as indicated (e.g., \"\n\"``https://example.com``).\"\nmsgstr \"\"\n\"对于那些在括号中写了默认值的问题，完全可以直接回车以使用预设值 [#tzlocal_fn]_。\"\n\"在输入站点URL的前缀（prefix）时，请根据提示的格式输入站点的域名（例如 \"\n\"``https://example.com``）。\"\n\n#: ../../quickstart.rst:36 66d29d63cce0488a8ec9e43ce97035f9\nmsgid \"Create an article\"\nmsgstr \"创作文章\"\n\n#: ../../quickstart.rst:38 03af35552ef84e4491b46d8bf8c0f51e\nmsgid \"\"\n\"You cannot run Pelican until you have created some content. Use your \"\n\"preferred text editor to create your first article with the following \"\n\"content::\"\nmsgstr \"\"\n\"您可以使用喜欢的文本编辑器来创建第一篇文章。下面是一个样例，可以将它作为您的第一篇文章：\"\n\n#: ../../quickstart.rst:47 165d46a3f9da4f949375c70115fdeb3b\nmsgid \"\"\n\"Given that this example article is in Markdown format, save it as \"\n\"``~/projects/yoursite/content/keyboard-review.md``.\"\nmsgstr \"\"\n\"上面这篇文章是以Markdown的格式完成的，一定要将其保存在站点目录的content文件夹下，例如 \"\n\"``~/projects/yoursite/content/keyboard-review.md``。\"\n\n#: ../../quickstart.rst:51 5cc306848439434f81708eddee812f0e\nmsgid \"Generate your site\"\nmsgstr \"生成站点\"\n\n#: ../../quickstart.rst:53 03037d0c3b0b4a64b957f8284f008c9d\nmsgid \"\"\n\"From your project root directory, run the ``pelican`` command to generate\"\n\" your site::\"\nmsgstr \"\"\n\"在项目的根目录下，直接运行命令 ``pelican`` 就可以生成您自己的站点了：\"\n\n#: ../../quickstart.rst:57 abadae17b6f94e36b8603bad69f6e24f\nmsgid \"\"\n\"Your site has now been generated inside the ``output/`` directory. (You \"\n\"may see a warning related to feeds, but that is normal when developing \"\n\"locally and can be ignored for now.)\"\nmsgstr \"\"\n\"站点会生成在 ``output/`` 目录下。（此时可能会显示和feeds有关的警告，这和当前的\"\n\"本地开发环境有关，目前可以忽略之）\"\n\n#: ../../quickstart.rst:62 7cf36e609f544f02a0c800f8412cf79c\nmsgid \"Preview your site\"\nmsgstr \"预览站点\"\n\n#: ../../quickstart.rst:64 1a64015c5cc9401bac0a6ac953164fb3\nmsgid \"\"\n\"Open a new terminal session, navigate to your project root directory, and\"\n\" run the following command to launch Pelican's web server::\"\nmsgstr \"\"\n\"打开一个新的命令行，进入刚才项目的根目录，执行下面的命令以运行一个Pelican web服务器：\"\n\n#: ../../quickstart.rst:69 eb286b4785304d22a46e90884d26de07\nmsgid \"Preview your site by navigating to http://localhost:8000/ in your browser.\"\nmsgstr \"打开浏览器，进入 http://localhost:8000/ 就可以看到刚刚生成的站点了。\"\n\n#: ../../quickstart.rst:71 1dc30b5cb267402c9da251303ff59dbf\nmsgid \"\"\n\"Continue reading the other documentation sections for more detail, and \"\n\"check out the Pelican wiki's Tutorials_ page for links to community-\"\n\"published tutorials.\"\nmsgstr \"\"\n\"请继续阅读文档中的其他部分来了解Pelican的更多用法，也可以前往Pelican的\"\n\"wiki 教程_ 页面获取社区发布的教程。\"\n\n#: ../../quickstart.rst:78 6c135ea1cbb44400b446c0f9074e0fc5\nmsgid \"Footnotes\"\nmsgstr \"脚注\"\n\n#: ../../quickstart.rst:80 911df4217fd94e6184502153ed0e53dc\nmsgid \"\"\n\"You can help localize default fields by installing the optional `tzlocal \"\n\"<https://pypi.org/project/tzlocal/>`_ module.\"\nmsgstr \"\"\n\"您可以安装可选模块 `tzlocal <https://pypi.org/project/tzlocal/>`_ 来\"\n\"本地化默认字段。\"\n"
  },
  {
    "path": "docs/locale/zh_CN/LC_MESSAGES/report.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) 2010–2024\n# This file is distributed under the same license as the PELICAN package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, 2024.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PELICAN 4\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2024-06-24 19:06+0800\\n\"\n\"PO-Revision-Date: 2024-06-27 19:00+0800\\n\"\n\"Last-Translator: GeorgeHu <dhxxhch@163.com>\\n\"\n\"Language: zh_CN\\n\"\n\"Language-Team: \\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=utf-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Generated-By: Babel 2.15.0\\n\"\n\n#: ../../report.rst:2 bc25575efa494c7b9455e02eb5c514ab\nmsgid \"Some history about Pelican\"\nmsgstr \"Pelican的一些历史\"\n\n#: ../../report.rst:6 959bbe068d2e4fd19e48be22706070d2\nmsgid \"\"\n\"This page comes from a report the original author (Alexis Métaireau) \"\n\"wrote right after writing Pelican, in December 2010. The information may \"\n\"not be up-to-date.\"\nmsgstr \"\"\n\"此页面来自原作者 Alexis Métaireau 在2010年12月完成Pelican后作的一篇报告，因此\"\n\"其中涉及的具体内容可能和最新的Pelican有些出入。\"\n\n#: ../../report.rst:10 598beb4776eb4a7bb1c928979752b1f1\nmsgid \"\"\n\"Pelican is a simple static blog generator. It parses markup files \"\n\"(Markdown or reStructuredText for now) and generates an HTML folder with \"\n\"all the files in it. I've chosen to use Python to implement Pelican \"\n\"because it seemed to be simple and to fit to my needs. I did not wanted \"\n\"to define a class for each thing, but still wanted to keep my things \"\n\"loosely coupled. It turns out that it was exactly what I wanted. From \"\n\"time to time, thanks to the feedback of some users, it took me a very few\"\n\" time to provide fixes on it. So far, I've re-factored the Pelican code \"\n\"by two times; each time took less than 30 minutes.\"\nmsgstr \"\"\n\"Pelican是一个简单的静态博客生成器。它解析标记文件（目前主要是Markdown和\"\n\"reStructuredText），并生成一个文件夹，其中包含了对应于标记文件的HTML。由于Python\"\n\"很简单并且符合需求，我选择使用Python来实现Pelican。我不想为每个东西定义一个类，\"\n\"但同时又想要各部件之间低耦合。事实证明，这正是我想要的。在发展过程中，多亏了用户\"\n\"给的反馈，我花了些时间修复了一些问题。到目前为止，我已经将Pelican的代码重构了两次，\"\n\"每次重构都不会超过30分钟。\"\n\n#: ../../report.rst:21 1709ab99c3144cb692afd1d1bc388921\nmsgid \"Use case\"\nmsgstr \"使用场景\"\n\n#: ../../report.rst:23 119f315a8e6c409d98783a636ac2147c\nmsgid \"\"\n\"I was previously using WordPress, a solution you can host on a web server\"\n\" to manage your blog. Most of the time, I prefer using markup languages \"\n\"such as Markdown or reStructuredText to type my articles. To do so, I use\"\n\" vim. I think it is important to let the people choose the tool they want\"\n\" to write the articles. In my opinion, a blog manager should just allow \"\n\"you to take any kind of input and transform it to a weblog. That's what \"\n\"Pelican does. You can write your articles using the tool you want, and \"\n\"the markup language you want, and then generate a static HTML weblog.\"\nmsgstr \"\"\n\"我之前使用的是WordPress，你可以将它部署在Web服务器上来管理博客。大多数时候，\"\n\"我更喜欢使用Markdown或reStructuredText等标记语言来撰写文章。为此，我一般用vim\"\n\"来写这些文章。我认为让大家自行选择用于写文章的工具是很重要的。在我看来，博客管理器\"\n\"应该能够接受任何类型的输入并将其转换为博客站。Pelican就采取这一思想。您可以选择自己\"\n\"喜欢的工具以及标记语言来撰写文章，然后生成静态的HTML博客站。\"\n\n#: ../../report.rst:34 1a087a07690c4c35873a7f4ce18ba52b\nmsgid \"\"\n\"To be flexible enough, Pelican has template support, so you can easily \"\n\"write your own themes if you want to.\"\nmsgstr \"\"\n\"为了足够的灵活性，Pelican中支持使用模板，这样你就可以编写自己的主题了。\"\n\n#: ../../report.rst:38 fca5a0962a0d4c27aa163f2aec94b1cf\nmsgid \"Design process\"\nmsgstr \"设计过程\"\n\n#: ../../report.rst:40 073dd0b024fa4701acc0078b84c45648\nmsgid \"\"\n\"Pelican came from a need I have. I started by creating a single file \"\n\"application, and I have make it grow to support what it does by now. To \"\n\"start, I wrote a piece of documentation about what I wanted to do. Then, \"\n\"I created the content I wanted to parse (the reStructuredText files) and \"\n\"started experimenting with the code. Pelican was 200 lines long and \"\n\"contained almost ten functions and one class when it was first usable.\"\nmsgstr \"\"\n\"Pelican来源于我的需求。从单文件应用程序出发，不断成长为现在功能丰富的应用。首先，我\"\n\"写了一份需求文档；然后创建了我想要解析的内容（reStructuredText文件），并开始\"\n\"实验性的编写代码。Pelican的第一个能够使用的版本包含了200行代码、10个函数以及1个类。\"\n\n#: ../../report.rst:47 f407fc9ad9434f1082014eeca8c4cc89\nmsgid \"\"\n\"I have been facing different problems all over the time and wanted to add\"\n\" features to Pelican while using it. The first change I have done was to \"\n\"add the support of a settings file. It is possible to pass the options to\"\n\" the command line, but can be tedious if there is a lot of them. In the \"\n\"same way, I have added the support of different things over time: Atom \"\n\"feeds, multiple themes, multiple markup support, etc. At some point, it \"\n\"appears that the \\\"only one file\\\" mantra was not good enough for \"\n\"Pelican, so I decided to rework a bit all that, and split this in \"\n\"multiple different files.\"\nmsgstr \"\"\n\"我不断遇到各种问题，在使用过程中还想要往Pelican中添加功能。在对代码的第一次修改中，\"\n\"添加了对配置文件的支持。虽然可以在命令行中往里传入选项，但当配置项多起来后，就会变得\"\n\"异常冗长。同样地，Pelican支持了越来越多的功能：Atom订阅源、多主体支持、多标记语言\"\n\"支持等等。在某一时刻，单文件应用已经不适合Pelican了，因此我决定多做些工作，将应用分离\"\n\"到多个文件中。\"\n\n#: ../../report.rst:56 57b3d1ba492646e28e20396b78df8ea0\nmsgid \"I’ve separated the logic in different classes and concepts:\"\nmsgstr \"我将系统整体逻辑分为如下几个类和概念：\"\n\n#: ../../report.rst:58 2d4090dba6674569a7e1088919185aa5\nmsgid \"\"\n\"*writers* are responsible of all the writing process of the files. They \"\n\"are responsible of writing .html files, RSS feeds and so on. Since those \"\n\"operations are commonly used, the object is created once, and then passed\"\n\" to the generators.\"\nmsgstr \"\"\n\"**Writers** 负责文件的写入工作，即负责完成 html、RSS订阅源等文件的写入。因为这些\"\n\"操作都是比较常用的，这个类只会被创建一次，然后再传给Generators。\"\n\n#: ../../report.rst:63 a4cff6dceb8f430791edaeb3b2280924\nmsgid \"\"\n\"*readers* are used to read from various formats (Markdown and \"\n\"reStructuredText for now, but the system is extensible). Given a file, \"\n\"they return metadata (author, tags, category, etc) and content (HTML \"\n\"formatted).\"\nmsgstr \"\"\n\"**Readers** 用于读取不同格式的文件（目前支持Markdown、reStructuredText，\"\n\"但可以继续扩展）。向 **Readers** 输入一个文件，它会返回文档的元数据（作者、标签、\"\n\"分类等等）与HTML格式的文档正文内容。\"\n\n#: ../../report.rst:67 6ed9719c06c2477ea05ea30e4806ad14\nmsgid \"\"\n\"*generators* generate the different outputs. For instance, Pelican comes \"\n\"with an ArticlesGenerator and PagesGenerator, into others. Given a \"\n\"configuration, they can do whatever you want them to do. Most of the time\"\n\" it's generating files from inputs (user inputs and files).\"\nmsgstr \"\"\n\"**Generators** 用以生成不同的输出，Pelican自带了 ``ArticlesGenerator`` 和 \"\n\"``PageGenerator`` 。给定一套配置信息， **Generators** 可以做几乎任何事。\"\n\"但大多数情况下，它的工作就是从输入生成文件。\"\n\n#: ../../report.rst:72 cb5129c105b04d788a908f580a83e7e1\nmsgid \"\"\n\"I also deal with contents objects. They can be ``Articles``, ``Pages``, \"\n\"``Quotes``, or whatever you want. They are defined in the ``contents.py``\"\n\" module and represent some content to be used by the program.\"\nmsgstr \"\"\n\"同样，还要处理正文对象。正文对象可以是 ``Articles`` 、 ``Pages`` 、 ``Quotes`` \"\n\"或者其他你想要的类型。这些对象在 ``contents.py`` 模块中完成定义，同时代表了应用中\"\n\"使用到的内容。\"\n\n#: ../../report.rst:77 4123da2b628448359aa9ed20b2ca87d2\nmsgid \"In more detail\"\nmsgstr \"更细节的内容\"\n\n#: ../../report.rst:79 8482492940524edf8244fc220553cd3c\nmsgid \"Here is an overview of the classes involved in Pelican.\"\nmsgstr \"以下是Pelican中涉及的类的概述。\"\n\n#: ../../report.rst:83 a8a39a1ccc154604b8bb000dff44982d\nmsgid \"\"\n\"The interface does not really exist, and I have added it only to clarify \"\n\"the whole picture. I do use duck typing and not interfaces.\"\nmsgstr \"\"\n\"上图中的接口事实上并不存在，我是为了整张图的完整性才加上去的。在实际实现中，使用了\"\n\"鸭子类型而不是接口。\"\n\n#: ../../report.rst:86 889dfae0dc4242f0b21ce831c7172001\nmsgid \"Internally, the following process is followed:\"\nmsgstr \"应用内部按以下流程进行处理：\"\n\n#: ../../report.rst:88 fc5cbf8ca65c456c90c56c00cf5ab93f\nmsgid \"\"\n\"First of all, the command line is parsed, and some content from the user \"\n\"is used to initialize the different generator objects.\"\nmsgstr \"\"\n\"首先，解析命令行，并根据用户给入的一些内容来初始化不同的generator对象。\"\n\n#: ../../report.rst:91 5d0c1dc643364248820fad76c204f663\nmsgid \"\"\n\"A ``context`` is created. It contains the settings from the command line \"\n\"and a settings file if provided.\"\nmsgstr \"\"\n\"创建一个 ``context`` ，其中包含了来自命令行和文件的配置信息。\"\n\n#: ../../report.rst:93 36725875f2c14e0bb8fc60b16afa1367\nmsgid \"\"\n\"The ``generate_context`` method of each generator is called, updating the\"\n\" context.\"\nmsgstr \"\"\n\"调用各generator对象的 ``generate_context`` 方法来更新 ``context`` 。\"\n\n#: ../../report.rst:95 d50a4b2e38884eb38f1b66fdf7fb1eda\nmsgid \"\"\n\"The writer is created and given to the ``generate_output`` method of each\"\n\" generator.\"\nmsgstr \"\"\n\"创建 **Writers** 并将其给入generator的 ``generate_output`` 方法。\"\n\n#: ../../report.rst:98 da8d9096940044f2849112fb5efcb4cb\nmsgid \"\"\n\"I make two calls because it is important that when the output is \"\n\"generated by the generators, the context will not change. In other words,\"\n\" the first method ``generate_context`` should modify the context, whereas\"\n\" the second ``generate_output`` method should not.\"\nmsgstr \"\"\n\"由于当generator生成输出时并不会改变上下文，我进行了两次调用。换句话说，第一个方法 \"\n\"``generate_context`` 会修改上下文，而第二个方法 ``generate_output`` 不会。\"\n\n#: ../../report.rst:103 a6350edba931463fb92ae51dd9bc253a\nmsgid \"\"\n\"Then, it is up to the generators to do what the want, in the \"\n\"``generate_context`` and ``generate_content`` method. Taking the \"\n\"``ArticlesGenerator`` class will help to understand some others concepts.\"\n\" Here is what happens when calling the ``generate_context`` method:\"\nmsgstr \"\"\n\"然后，事情就取决于各generator在 ``generate_context`` 和 ``generate_content`` \"\n\"中做的操作了。拿 ``ArticlesGenerator`` 举例可以帮助理解其他的一些概念。下面是调用 \"\n\"``generate_context`` 方法后会发生的事情：\"\n\n#: ../../report.rst:108 4b99ddf2cf344d0b8fbd080c15adfb64\nmsgid \"\"\n\"Read the folder “path”, looking for restructured text files, load each of\"\n\" them, and construct a content object (``Article``) with it. To do so, \"\n\"use ``Reader`` objects.\"\nmsgstr \"\"\n\"读取文件夹路径，查找并加载每个restructured文件，并为每个文件构建一个正文内容对象（ \"\n\"``Article`` ）。此工作是由 ``Reader`` 对象完成的。\"\n\n#: ../../report.rst:111 176a7a5896904f2e9929623ef652660b\nmsgid \"Update the ``context`` with all those articles.\"\nmsgstr \"根据所有的文章更新 ``context`` 。\"\n\n#: ../../report.rst:113 bb88942c85004c4c9e0b55a72076b18f\nmsgid \"\"\n\"Then, the ``generate_content`` method uses the ``context`` and the \"\n\"``writer`` to generate the wanted output.\"\nmsgstr \"\"\n\"然后， ``generate_content`` 方法使用 ``context`` 和 ``writer`` 来生成想要的输出。\"\n"
  },
  {
    "path": "docs/locale/zh_CN/LC_MESSAGES/settings.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) 2010–2024\n# This file is distributed under the same license as the PELICAN package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, 2024.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PELICAN 4\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-02-02 10:32+0800\\n\"\n\"PO-Revision-Date: 2026-02-02 10:32+0800\\n\"\n\"Last-Translator: GeorgeHu <dhxxhch@163.com>\\n\"\n\"Language: zh_CN\\n\"\n\"Language-Team: \\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=utf-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Generated-By: Babel 2.17.0\\n\"\n\n#: ../../settings.rst:2 33f20b9899bd4f78a4f3eb7d250dfcc9\nmsgid \"Settings\"\nmsgstr \"设置\"\n\n#: ../../settings.rst:4 3c3d83a6b67b42e5bb4e2519e403949d\nmsgid \"\"\n\"Pelican is configurable thanks to a settings file you can pass to the \"\n\"command line::\"\nmsgstr \"可以通过命令行给Pelican传入配置文件：\"\n\n#: ../../settings.rst:9 4137dd63d4b241cfbf37d291e974734a\nmsgid \"\"\n\"If you used the ``pelican-quickstart`` command, your primary settings \"\n\"file will be named ``pelicanconf.py`` by default.\"\nmsgstr \"如果使用的是 ``pelican-quickstart`` 命令，默认的主配置文件时 ``pelicanconf.py`` 。\"\n\n#: ../../settings.rst:12 509edfb7c1484707a192b4537faaf3b3\nmsgid \"\"\n\"You can also specify settings via ``-e`` / ``--extra-settings`` option \"\n\"flags. It will override default settings as well as any defined within \"\n\"the setting file. Note that values must follow JSON notation::\"\nmsgstr \"\"\n\"通过 ``-e`` / ``--extra-settings`` \"\n\"选项，可以直接指定一些配置来覆盖配置文件中的设置。需要注意的是，选项值必须时JSON格式的：\"\n\n#: ../../settings.rst:18 2b7e043877334b32996b426ea7f8e1f0\nmsgid \"\"\n\"Environment variables can also be used here but must be escaped \"\n\"appropriately::\"\nmsgstr \"可以在命令中使用环境变量，但是需要正确地进行转义：\"\n\n#: ../../settings.rst:24 e9ac322feb4a4dbd9e07b73a1c49af72\nmsgid \"\"\n\"When experimenting with different settings (especially the metadata ones)\"\n\" caching may interfere and the changes may not be visible. In such cases \"\n\"disable caching with ``LOAD_CONTENT_CACHE = False`` or use the \"\n\"``--ignore-cache`` command-line switch.\"\nmsgstr \"\"\n\"在尝试不同的设置（特别是尝试元数据）时，受缓存的干扰，对设置的更改可能不会生效。在这种情况下，指定 ``LOAD_CONTENT_CACHE = \"\n\"False`` 设置或 ``--ignore-cache`` 命令行选项即可。\"\n\n#: ../../settings.rst:29 f8b7aff6141b48b3a03f726f769c9603\nmsgid \"\"\n\"Settings are configured in the form of a Python module (a file). There is\"\n\" an `example settings file \"\n\"<https://raw.githubusercontent.com/getpelican/pelican/main/samples/pelican.conf.py>`_\"\n\" available for reference.\"\nmsgstr \"\"\n\"设置以Python模块（一个文件）的形式。 `示例配置文件 \"\n\"<https://raw.githubusercontent.com/getpelican/pelican/main/samples/pelican.conf.py>`_\"\n\" 可供您参考。\"\n\n#: ../../settings.rst:34 3ed2687613ef480bb61b8232c47d4af8\nmsgid \"\"\n\"To see a list of current settings in your environment, including both \"\n\"default and any customized values, run the following command (append one \"\n\"or more specific setting names as arguments to see values for those \"\n\"settings only)::\"\nmsgstr \"要查看当前环境下的配置，同时查看默认的或是自定义的配置值，执行下面的命令（在后面以参数的形式添加一个或多个指定的配置名称，可以单独查看指定的配置项）:\"\n\n#: ../../settings.rst:40 5d6b03822d2e4f35890b7a651a88987c\nmsgid \"\"\n\"All the setting identifiers must be set in all-caps, otherwise they will \"\n\"not be processed. Setting values that are numbers (5, 20, etc.), booleans\"\n\" (True, False, None, etc.), dictionaries, or tuples should *not* be \"\n\"enclosed in quotation marks. All other values (i.e., strings) *must* be \"\n\"enclosed in quotation marks.\"\nmsgstr \"\"\n\"所有设置的键（设置中的变量名）都必须是大写的，否则会被无视。配置值可能是数值（5、20等）、布尔值（True、False、None等）、字典或者元组。这些值应该以Python值的形式存在，\"\n\" *不* 需要用引号引起来。除此之外的其他配置值（例如字符串） *必须* 用引号引起来。\"\n\n#: ../../settings.rst:46 258fb84ebdee4dfe9373c7b7c2aab94d\nmsgid \"\"\n\"Unless otherwise specified, settings that refer to paths can be either \"\n\"absolute or relative to the configuration file. The settings you define \"\n\"in the configuration file will be passed to the templates, which allows \"\n\"you to use your settings to add site-wide content.\"\nmsgstr \"除非另有指定，设置中指定的路径可以是绝对路径，也可以是相对于配置文件的相对路径。设置中配置的东西会传递到网站模板中，这使得可以在配置文件中添加在整个站点中都能使用的内容。\"\n\n#: ../../settings.rst:51 938a61723b6b4361b440b165bca533b7\nmsgid \"Here is a list of settings for Pelican:\"\nmsgstr \"下面是Pelican设置项的列表：\"\n\n#: ../../settings.rst:55 8ea36bbc1f084d1d8e29dc0bd2f8c922\nmsgid \"Basic settings\"\nmsgstr \"基础设置\"\n\n#: ../../settings.rst:59 5de910e868b14ee791a313a2d31c16b2\nmsgid \"\"\n\"When you don't specify a category in your post metadata, set this setting\"\n\" to ``True``, and organize your articles in subfolders, the subfolder \"\n\"will become the category of your post. If set to ``False``, \"\n\"``DEFAULT_CATEGORY`` will be used as a fallback. The default is ``True``.\"\nmsgstr \"\"\n\"当您没有在推文中指定元数据categroy时，若本项设置设为了 ``True`` \"\n\"，并且文章也是通过子文件夹进行分类管理的，那么这些子文件夹的名称就会作为发布内容的分类。若本项设为了 ``False`` ，会使用配置项 \"\n\"``DEFAULT_CATEGORY`` 作为默认分类。本项设置默认为 ``True`` 。\"\n\n#: ../../settings.rst:66 3675c7a1107744f0818c0473c4f0643b\nmsgid \"The default category to fall back on. The default is ``'misc'``.\"\nmsgstr \"默认的分类。本项设置默认为 ``'misc'`` 。\"\n\n#: ../../settings.rst:70 f4ee51775b44419586a76dbf79d887e5\nmsgid \"\"\n\"Whether to display pages on the menu of the template. Templates may or \"\n\"may not honor this setting. The default is ``True``.\"\nmsgstr \"指定是否将“页面”显示在模板的菜单中。模板可能不会遵循此项。本项设置默认为 ``True`` 。\"\n\n#: ../../settings.rst:75 b4f761d35ffb49e9bf520bc1206f7868\nmsgid \"\"\n\"Whether to display categories on the menu of the template. Templates may \"\n\"or not honor this setting. The default is ``True``.\"\nmsgstr \"指定是否将“分类”显示在模板的菜单中。模板可能不会遵循此项。本项设置默认为 ``True`` 。\"\n\n#: ../../settings.rst:80 f3b1f471909b4af29de908310a75eaf5\n#, python-brace-format\nmsgid \"\"\n\"Extra configuration settings for the docutils publisher (applicable only \"\n\"to reStructuredText). See `Docutils Configuration`_ settings for more \"\n\"details. The default is ``{}`` with no extra configuration settings.\"\nmsgstr \"\"\n\"docutils的额外配置项（只针对reStructuredText有效）。在 `Docutils 配置`_ 设置中查看更多信息。默认为 \"\n\"``{}`` ，即不做任何额外配置。\"\n\n#: ../../settings.rst:86 841018ef5c0c410c92bc7780acf25291\nmsgid \"\"\n\"Delete the output directory, and **all** of its contents, before \"\n\"generating new files. This can be useful in preventing older, unnecessary\"\n\" files from persisting in your output. However, **this is a destructive \"\n\"setting and should be handled with extreme care.** The default is \"\n\"``False``.\"\nmsgstr \"\"\n\"在生成新文件前删除输出目录及其中的 **所有** 内容。这可以避免一些老的无用的文件一直存在于输出目录中。但是， \"\n\"**此项配置是具有破坏性的，请谨慎使用** 。本项设置默认为 ``False`` 。\"\n\n#: ../../settings.rst:93 b9b726bedf79446e8f1721edee1b2eb8\nmsgid \"\"\n\"A list of filenames that should be retained and not deleted from the \"\n\"output directory. One use case would be the preservation of version \"\n\"control data.\"\nmsgstr \"一个文件名的列表，包含了应该保留，不从输出目录中删除的文件。可以用于版本控制数据的保留。\"\n\n#: ../../settings.rst:96 ../../settings.rst:114 ../../settings.rst:142\n#: 39c5fe892d10473ea765dfd16aa70b29 bcb1712b6ed142d6b8db0d06f30dc902\nmsgid \"Example::\"\nmsgstr \"例子：\"\n\n#: ../../settings.rst:100 ../../settings.rst:146\n#: f0fd9392aa0544248ae3ecfa505cbd50\nmsgid \"The default is ``[]``.\"\nmsgstr \"默认为 ``[]`` 。\"\n\n#: ../../settings.rst:104 47a64611cf2f4e6b85543040b8221d3a\n#, python-brace-format\nmsgid \"\"\n\"A dictionary of custom Jinja2 environment variables you want to use. This\"\n\" also includes a list of extensions you may want to include. See `Jinja \"\n\"Environment documentation`_. The default is ``{'extensions': [], \"\n\"'trim_blocks': True, 'lstrip_blocks': True}``.\"\nmsgstr \"\"\n\"一个字典，用于配置自定义Jinja2环境变量。这其中也包含了要使用的扩展列表。详见 `Jinja环境文档`_ 。本项设置默认为 \"\n\"``{'extensions': [], 'trim_blocks': True, 'lstrip_blocks': True}`` 。\"\n\n#: ../../settings.rst:111 b0e2be83c4684482a75198372a093d96\nmsgid \"\"\n\"A dictionary of custom Jinja2 filters you want to use.  The dictionary \"\n\"should map the filtername to the filter function.\"\nmsgstr \"一个字典，存放自定义的Jinja2过滤器。此字典中应该是过滤器名称到过滤器函数的映射。\"\n\n#: ../../settings.rst:122 7e0e43b081f94e5dbe72072f2dc251e2\n#, python-brace-format\nmsgid \"See: `Jinja custom filters documentation`_. The default is ``{}``.\"\nmsgstr \"详见： `Jinja自定义过滤器文档`_ 。本项设置默认为 ``{}`` 。\"\n\n#: ../../settings.rst:126 b0ec3d780aaf4daf95b134faba512564\n#, python-brace-format\nmsgid \"\"\n\"A dictionary of custom objects to map into the Jinja2 global environment \"\n\"namespace. The dictionary should map the global name to the global \"\n\"variable/function. See: `Jinja global namespace documentation`_. The \"\n\"default is ``{}``.\"\nmsgstr \"\"\n\"一个字典，可以将自定义对象映射到Jinja2的全局环境命名空间中。字典中应该是全局名称到全局变量/函数的映射。详见： \"\n\"`Jinja全局命名空间文档`_ 。本项设置默认为 ``{}`` 。\"\n\n#: ../../settings.rst:133 8ef1787d5b3f4a9fa1111027f183fd4f\n#, python-brace-format\nmsgid \"\"\n\"A dictionary of custom Jinja2 tests you want to use. The dictionary \"\n\"should map test names to test functions. See: `Jinja custom tests \"\n\"documentation`_. The default is ``{}``.\"\nmsgstr \"\"\n\"一个字典，自定义了要使用的Jinja测试。字典中应该是测试名到测试函数的映射。详见： `Jinja自定义测试文档`_ 。本项设置默认为 \"\n\"``{}`` 。\"\n\n#: ../../settings.rst:139 06c6769420a744ea9fc27fc3e930bfcb\nmsgid \"\"\n\"A list of tuples containing the logging level (up to ``warning``) and the\"\n\" message to be ignored.\"\nmsgstr \"一个以元组为元素的列表，元组中包含日志等级（最高到 ``warning``）和要忽略的消息。\"\n\n#: ../../settings.rst:150 4234d5d045444f60a42af4d6a76f2de9\nmsgid \"\"\n\"A dictionary of file extensions / Reader classes for Pelican to process \"\n\"or ignore.\"\nmsgstr \"一个字典，记录了文件扩展名到Reader类的映射。可以据此让Pelican按照指定规则处理或忽略某些文件。\"\n\n#: ../../settings.rst:153 bda15a1a6e724557ae9ba779a4d941fd\nmsgid \"For example, to avoid processing .html files, set::\"\nmsgstr \"例如，下面的配置可以让Pelican忽略 .html的文件不处理：\"\n\n#: ../../settings.rst:157 07c385958bf648868271075a146da55d\nmsgid \"To add a custom reader for the ``foo`` extension, set::\"\nmsgstr \"为扩展名为 ``foo`` 的文件添加自定义的reader：\"\n\n#: ../../settings.rst:161 ../../settings.rst:810 ../../settings.rst:861\n#: ../../settings.rst:955 f0fd9392aa0544248ae3ecfa505cbd50\n#, python-brace-format\nmsgid \"The default is ``{}``.\"\nmsgstr \"默认为 ``{}`` 。\"\n\n#: ../../settings.rst:165 ebc561b14759445386bb22e0318ae6de\nmsgid \"\"\n\"A list of Unix glob patterns. Files and directories matching any of these\"\n\" patterns or any of the commonly hidden files and directories set by \"\n\"``watchfiles.DefaultFilter`` will be ignored by the processor. For \"\n\"example, the default ``['**/.*']`` will ignore \\\"hidden\\\" files and \"\n\"directories, and ``['__pycache__']`` would ignore Python 3's bytecode \"\n\"caches.\"\nmsgstr \"\"\n\"通配符模式的列表。匹配到其中任一个模式，或是 ``watchfiles.DefaultFilter`` \"\n\"中设置了隐藏的文件和目录都会被忽略。例如，默认的 ``['**/.*']`` 可以用于忽略任何隐藏文件与目录， \"\n\"``['__pycache__']`` 则可以忽略Python3的字节码缓存文件。\"\n\n#: ../../settings.rst:171 6d3691b43e9741bd97f11cf56ddd89ff\nmsgid \"\"\n\"For a full list of the commonly hidden files set by \"\n\"``watchfiles.DefaultFilter``, please refer to the `watchfiles \"\n\"documentation`_.\"\nmsgstr \"请参阅 `watchfiles文档`_ 以获取 ``watchfiles.DefaultFilter`` 中设置常见隐藏文件的完整列表\"\n\n#: ../../settings.rst:174 f0fd9392aa0544248ae3ecfa505cbd50\nmsgid \"The default is ``['**/.*']``.\"\nmsgstr \"默认为 ``['**/.*']`` 。\"\n\n#: ../../settings.rst:178 43597f10c7444144a4bffed8b2a29b41\nmsgid \"\"\n\"Extra configuration settings for the Markdown processor. Refer to the \"\n\"Python Markdown documentation's `Options section <https://python-\"\n\"markdown.github.io/reference/#markdown>`_ for a complete list of \"\n\"supported options. The ``extensions`` option will be automatically \"\n\"computed from the ``extension_configs`` option.\"\nmsgstr \"\"\n\"对Markdown处理器的额外配置。可以参考Python Markdown文档的 `选项章节 <https://python-\"\n\"markdown.github.io/reference/#markdown>`_ ，查看可用选项的完整列表。其中的 \"\n\"``extensions_configs`` 选项会用于自动计算 ``extensions`` 选项。\"\n\n#: ../../settings.rst:184 f0fd9392aa0544248ae3ecfa505cbd50\nmsgid \"The default is::\"\nmsgstr \"默认值为：\"\n\n#: ../../settings.rst:196 38d0b586c896439aa13c04c9555d9a4b\nmsgid \"\"\n\"The dictionary defined in your settings file will replace this default \"\n\"one.\"\nmsgstr \"配置文件中的字典会覆盖默认设置。\"\n\n#: ../../settings.rst:201 d6295ff5c7a345b2b9eb5f365fc5db8c\nmsgid \"\"\n\"Where to output the generated files. This should correspond to your web \"\n\"server's virtual host root directory.\"\nmsgstr \"输出生成文件的位置。此项配置应该和web服务器虚拟主机的根目录有关。\"\n\n#: ../../settings.rst:204 f0fd9392aa0544248ae3ecfa505cbd50\nmsgid \"The default is ``'output'``.\"\nmsgstr \"默认为 ``'output'`` 。\"\n\n#: ../../settings.rst:208 1da4adc27e65428b8178929389a8ca72\nmsgid \"\"\n\"Path to content directory to be processed by Pelican. If undefined, and \"\n\"content path is not specified via an argument to the ``pelican`` command,\"\n\" Pelican will default to ``'.'``, the current working directory.\"\nmsgstr \"待Pelican处理的文件目录的路径。如果没有定义，也没有在 ``pelican`` 命令中通过参数指定，Pelican会默认使用当前工作目录。\"\n\n#: ../../settings.rst:214 2b21399d328a41ba9982c23771f4c281\nmsgid \"\"\n\"A list of directories and files to look at for pages, relative to \"\n\"``PATH``. The default is ``['pages']``.\"\nmsgstr \"此列表中的目录和文件会被视为页面，路径是相对于 ``PATH`` 的。本项配置默认为 ``['pages']`` 。\"\n\n#: ../../settings.rst:219 c456260766774bcab50850fa7e4f9cf8\nmsgid \"\"\n\"A list of directories to exclude when looking for pages in addition to \"\n\"``ARTICLE_PATHS``. The default is ``[]``.\"\nmsgstr \"除了 ``ARTICLE_PATHS`` 中的文件不会被视为页面外，此选项中也可指定不被视为页面的文件目录。本项配置默认为 ``[]`` 。\"\n\n#: ../../settings.rst:224 7d1515dd32ea4eb3bc0b621ef7cd0c2b\nmsgid \"\"\n\"A list of directories and files to look at for articles, relative to \"\n\"``PATH``. The default is ``['']``.\"\nmsgstr \"此列表中的目录和文件会被视为文章，路径是相对于 ``PATH`` 的。本项配置默认为 ``['']`` 。\"\n\n#: ../../settings.rst:229 562736e3c91442bbb062e85e63d6f1f9\nmsgid \"\"\n\"A list of directories to exclude when looking for articles in addition to\"\n\" ``PAGE_PATHS``. The default is ``[]``.\"\nmsgstr \"除了 ``PAGE_PATHS`` 中的文件不会被视为文章外，此选项中也可指定不被视为文章的文件目录。本项配置默认为 ``[]`` 。\"\n\n#: ../../settings.rst:234 ea5874e71eb941a2b37262eb9cb398bf\nmsgid \"\"\n\"Set to True if you want to copy the articles and pages in their original \"\n\"format (e.g. Markdown or reStructuredText) to the specified \"\n\"``OUTPUT_PATH``. The default is ``False``.\"\nmsgstr \"\"\n\"如果你想要将文章和页面以源格式（例如Markdown或reStructuredText）复制一份到 ``OUTPUT_PATH`` \"\n\"目录中，就将此项设为True。本项配置默认为 ``False`` 。\"\n\n#: ../../settings.rst:240 30108efdc87c48368c035774372eb8f1\nmsgid \"\"\n\"Controls the extension that will be used by the SourcesGenerator.  \"\n\"Defaults to ``.text``. If not a valid string the default value will be \"\n\"used. The default is ``'.text'``.\"\nmsgstr \"\"\n\"控制SourcesGenerator使用的扩展名。默认为 ``.text`` 。如果设置的值是无效的，会使用默认值。本项配置默认为 \"\n\"``'.text'`` 。\"\n\n#: ../../settings.rst:246 5763cdeffac14fb4a4403b534251e8e2\nmsgid \"The list of plugins to load. See :ref:`plugins`. The default is ``None``.\"\nmsgstr \"要加载的插件列表。详见 :ref:`插件<plugins>` 。本项配置默认为 ``None`` 。\"\n\n#: ../../settings.rst:250 8f081da9abd648a0b029262e50bb5834\nmsgid \"\"\n\"A list of directories where to look for plugins. See :ref:`plugins`. The \"\n\"default is ``[]``.\"\nmsgstr \"查找插件的目录列表。详见 :ref:`插件<plugins>` 。本项配置默认为 ``[]`` 。\"\n\n#: ../../settings.rst:255 4a0df17e21714b569b3beef92153bc9c\nmsgid \"Your site's name. The default is ``'A Pelican Blog'``.\"\nmsgstr \"站点名称。默认为 ``'A Pelican Blog'`` 。\"\n\n#: ../../settings.rst:259 a2a835e1c3804bdaa57c834e117f5b2e\nmsgid \"\"\n\"Base URL of your web site. Not defined by default, so it is best to \"\n\"specify your SITEURL; if you do not, feeds will not be generated with \"\n\"properly-formed URLs. If your site is available via HTTPS, this setting \"\n\"should begin with ``https://`` — otherwise use ``http://``. Then append \"\n\"your domain, with no trailing slash at the end. Example: ``SITEURL = \"\n\"'https://example.com'``\"\nmsgstr \"\"\n\"网站的基URL。此选项没有默认值，因此最好是指定一下SITEURL；如果不指定，feeds就无法正确生成URL。如果站点使用了HTTPS，那么此项设定最好以\"\n\" ``https://`` 开头；否则使用 ``http://`` 即可。在协议后面接着就是域名，不要以斜杠结尾。一个例子： ``SITEURL \"\n\"= 'https://example.com'`` \"\n\n#: ../../settings.rst:266 72e916aee6f143cd82a15c0c84b2bd73\nmsgid \"The default is ``''``, the blank string.\"\nmsgstr \"默认为 ``''`` ，即空字符串。\"\n\n#: ../../settings.rst:270 af6a95fa0a79465287831e83c66b6eb0\nmsgid \"\"\n\"A list of directories (relative to ``PATH``) in which to look for static \"\n\"files. Such files will be copied to the output directory without \"\n\"modification. Articles, pages, and other content source files will \"\n\"normally be skipped, so it is safe for a directory to appear both here \"\n\"and in ``PAGE_PATHS`` or ``ARTICLE_PATHS``.  Pelican's default settings \"\n\"include the \\\"images\\\" directory here. The default is ``['images']``.\"\nmsgstr \"\"\n\"用于查找静态文件的目录列表（相对于 ``PATH`` \"\n\"目录）。静态文件会原封不动地拷贝到输出目录中。文章、页面以及其他的内容源文件都会被跳过，因此一个目录可以安全地同时出现在此选项以及 \"\n\"``PAGE_PATHS`` 或 ``ARTICLE_PATHS`` 中。Pelican默认会将 \\\"images\\\" \"\n\"目录包含在此选项中。本项配置默认为 ``['images']`` 。\"\n\n#: ../../settings.rst:279 562736e3c91442bbb062e85e63d6f1f9\nmsgid \"\"\n\"A list of directories to exclude when looking for static files. The \"\n\"default is ``[]``.\"\nmsgstr \"此选项列表中的目录都会在搜索静态文件时排除在外。本项配置默认为 ``[]`` 。\"\n\n#: ../../settings.rst:284 92849777e12b448898dba49e9799484b\nmsgid \"\"\n\"If set to False, content source files will not be skipped when copying \"\n\"files found in ``STATIC_PATHS``. This setting is for backward \"\n\"compatibility with Pelican releases before version 3.5.  It has no effect\"\n\" unless ``STATIC_PATHS`` contains a directory that is also in \"\n\"``ARTICLE_PATHS`` or ``PAGE_PATHS``. If you are trying to publish your \"\n\"site's source files, consider using the ``OUTPUT_SOURCES`` setting \"\n\"instead. The default is ``True``.\"\nmsgstr \"\"\n\"如果此选项设为False， ``STATIC_PATHS`` \"\n\"中的内容源文件将不会被忽略，也会像静态文件一样被原封不动地拷贝。此项设置是为了给3.5版本前的Pelican进行向后兼容的。若某个目录同时出现在了\"\n\" ``STATIC_PATHS`` 和 ``ARTICLE_PATHS`` 中，或 ``STATIC_PATHS`` 和 \"\n\"``PAGE_PATHS`` 中时才会生效。如果你是想将站点的源文件发布出去的话，请考虑使用 ``OUTPUT_SOURCES`` \"\n\"。本项配置默认为 ``True`` 。\"\n\n#: ../../settings.rst:294 a4a2ef0dfd6442fb889bf9bfe33688ee\nmsgid \"\"\n\"Create links instead of copying files. If the content and output \"\n\"directories are on the same device, then create hard links.  Falls back \"\n\"to symbolic links if the output directory is on a different filesystem. \"\n\"If symlinks are created, don't forget to add the ``-L`` or ``--copy-\"\n\"links`` option to rsync when uploading your site. The default is \"\n\"``False``.\"\nmsgstr \"\"\n\"为静态文件创建链接而不是复制文件本身。如果内容和输出目录位于同一设备上，则创建硬链接；如果输出目录位于不同的文件系统上，则回退至符号链接。若创建了符号链接，使用rsync上传网站时需要添加-L或\"\n\"--copy-links选项。本项配置默认为 ``False`` 。\"\n\n#: ../../settings.rst:302 8c6ff3cd170444dc9e9411e43bbcffdd\nmsgid \"\"\n\"If set to ``True``, and ``STATIC_CREATE_LINKS`` is ``False``, compare \"\n\"mtimes of content and output files, and only copy content files that are \"\n\"newer than existing output files. The default is ``False``.\"\nmsgstr \"\"\n\"当此项设为 ``True`` 且 ``STATIC_CREATE_LINKS`` 设为 ``False`` \"\n\"时才会生效，此时会比较mtime，只有在当前文件更新时才会执行拷贝。本项配置默认为 ``False`` 。\"\n\n#: ../../settings.rst:308 b26c548f490f45f9bbe95ee6b12fd306\nmsgid \"\"\n\"If set to ``True``, several typographical improvements will be \"\n\"incorporated into the generated HTML via the `Typogrify \"\n\"<https://pypi.org/project/typogrify/>`_ library, which can be installed \"\n\"via: ``python -m pip install typogrify``. The default is ``False``.\"\nmsgstr \"\"\n\"若此项设置为True，一些显示上的改进将通过 `Typogrify <https://pypi.org/project/typogrify/>`_\"\n\" 库合并到生成的HTML中。可以通过 ``python -m pip install typogrify`` 进行安装。本项配置默认为 \"\n\"``False`` 。\"\n\n#: ../../settings.rst:315 f4a976dc583346eebd71cedbbd43839c\nmsgid \"\"\n\"A list of tags for Typogrify to ignore. By default Typogrify will ignore \"\n\"``pre`` and ``code`` tags. This requires that Typogrify version 2.0.4 or \"\n\"later is installed. The default is ``[]``.\"\nmsgstr \"\"\n\"指定Typogrify要忽略的标签列表。默认情况下，Typogrify将忽略 ``pre`` 和 ``code`` \"\n\"标签此项特性需要安装高于2.0.4版本的Typogrify。。本项配置默认为 ``[]`` 。\"\n\n#: ../../settings.rst:321 b40b1e64ddc344bfa9451e3e51e397df\nmsgid \"\"\n\"A list of Typogrify filters to skip. Allowed values are: ``'amp'``, \"\n\"``'smartypants'``, ``'caps'``, ``'initial_quotes'``, ``'widont'``. By \"\n\"default, no filter is omitted (in other words, all filters get applied). \"\n\"This setting requires that Typogrify version 2.1.0 or later is installed.\"\n\" The default is ``[]``.\"\nmsgstr \"\"\n\"要忽略的Typogrify过滤器列表。可用值包括： ``'amp'`` 、 ``'smartypants'`` 、 ``'caps'`` 、 \"\n\"``'initial_quotes'`` 、 ``'widont'`` \"\n\"。默认不忽略任何过滤器。本项配置需要2.1.0或以上版本的Typogrify。本项配置默认为 ``[]`` 。\"\n\n#: ../../settings.rst:329 8b9d3479e18c407090a4aac6a1dcafdf\nmsgid \"\"\n\"This setting controls how Typogrify sets up the Smartypants filter to \"\n\"interpret multiple dash/hyphen/minus characters. A single ASCII dash \"\n\"character (``-``) is always rendered as a hyphen. The ``default`` setting\"\n\" does not handle en-dashes and converts double-hyphens into em-dashes. \"\n\"The ``oldschool`` setting renders both en-dashes and em-dashes when it \"\n\"sees two (``--``) and three (``---``) hyphen characters, respectively. \"\n\"The ``oldschool_inverted`` setting turns two hyphens into an em-dash and \"\n\"three hyphens into an en-dash. The default is ``'default'``.\"\nmsgstr \"\"\n\"此设置用于设置Typogrify的Smartypants过滤器，控制过滤器如何解析多个破折号/连字符/减号。单个ASCII破折号字符 \"\n\"(``-``) 始终被视为连字符。设为 ``default`` 时不处理短破折号，并会将双连字符转换为长破折号；设为 ``oldschool`` \"\n\"时会将两个 ( ``--`` ) 和三个 ( ``--`` ) 连字符分别呈现为短破折号和长破折号；设为 \"\n\"``oldschool_inverted`` 时则会将两个连字符转换为长破折号，而将三个连字符转换为短破折号。本项配置默认为 \"\n\"``'default'`` \"\n\n#: ../../settings.rst:340 44489695c0bb4c75ba04e6d23b17a6b7\nmsgid \"\"\n\"When creating a short summary of an article, this will be the default \"\n\"length (measured in words) of the text created.  This only applies if \"\n\"your content does not otherwise specify a summary. Setting to ``None`` \"\n\"will cause the summary to be a copy of the original content. The default \"\n\"is ``50``.\"\nmsgstr \"\"\n\"当未给文章或页面书写摘要时，会自动创建摘要，此设置指定了默认创建摘要的长度（以字/词为单位）。若将此项设为 ``None`` \"\n\"，摘要会和原始内容一模一样。本项配置默认为 ``50`` 。\"\n\n#: ../../settings.rst:347 aad4656b1b5441f588931776445fb4cf\nmsgid \"\"\n\"When creating a short summary of an article, this will be the number of \"\n\"paragraphs to use as the summary. This only applies if your content does \"\n\"not otherwise specify a summary. Setting to ``None`` will cause the \"\n\"summary to use the whole text (up to ``SUMMARY_MAX_LENGTH``) instead of \"\n\"just the first N paragraphs. The default is ``None``.\"\nmsgstr \"\"\n\"当未给文章或页面书写摘要时，会自动创建摘要。此设置指定了默认创建摘要的段落数，即将正文的前N段视为摘要。若将此项设为 ``None`` \"\n\"，摘要会和原始内容一模一样，但具体还会遵循 ``SUMMARY_MAX_LENGTH`` 。本项配置默认为 ``None`` 。\"\n\n#: ../../settings.rst:355 469780be0d8144f0bfe4fc7c475e11cb\nmsgid \"\"\n\"When creating a short summary of an article and the result was truncated \"\n\"to match the required word length, this will be used as the truncation \"\n\"suffix. The default is ``'…'``.\"\nmsgstr \"在创建摘要时，若内容因长度被截断，此项设置值将用作截断的结尾。本项配置默认为 ``'…'`` 。\"\n\n#: ../../settings.rst:361 11e86cf295024b67a50156da38d62043\nmsgid \"\"\n\"If disabled, content with dates in the future will get a default status \"\n\"of ``draft``. See :ref:`reading_only_modified_content` for caveats. The \"\n\"default is ``True``.\"\nmsgstr \"\"\n\"若此项设为False，带了未来日期的文章或页面的状态都会设为 ``draft`` 。相关注意事项详见 \"\n\":ref:`reading_only_modified_content` 。本项配置默认为 ``True`` 。\"\n\n#: ../../settings.rst:367 c29c4ca7127741d49a164b7dff038232\nmsgid \"\"\n\"Regular expression that is used to parse internal links. Default syntax \"\n\"when linking to internal files, tags, etc., is to enclose the identifier,\"\n\" say ``filename``, in ``{}`` or ``||``. Identifier between ``{`` and \"\n\"``}`` goes into the ``what`` capturing group.  For details see :ref:`ref-\"\n\"linking-to-internal-content`. The default is ``'[{|](?P<what>.*?)[|}]'``.\"\nmsgstr \"\"\n\"用于解析内部链接的正则表达式。链接到内部文件、标签等时的默认语法是将标识符（例如 ``filename`` ）括在 ``{}`` 或 ``||``\"\n\" 中。 ``{`` 和 ``}`` 之间的则进入 ``what`` 捕获组。更多详情请参见 :ref:`ref-linking-to-\"\n\"internal-content` 。本项配置默认为 ``'[{|](?P<what>.*?)[|}]'`` 。\"\n\n#: ../../settings.rst:376 a74ea9d0899541e78d3a997b8f481ad6\n#, python-brace-format\nmsgid \"\"\n\"A list of default Pygments settings for your reStructuredText code \"\n\"blocks. See :ref:`internal_pygments_options` for a list of supported \"\n\"options. The default is ``{}``.\"\nmsgstr \"\"\n\"reStructuredText代码块的默认Pygments设置列表。请参阅 :ref:`internal_pygments_options` \"\n\"查看支持选项列表。本项配置默认为 ``{}`` 。\"\n\n#: ../../settings.rst:382 aa2425b88dea4351bf184f127a5965de\nmsgid \"\"\n\"If ``True``, saves content in caches.  See \"\n\":ref:`reading_only_modified_content` for details about caching. The \"\n\"default is ``False``.\"\nmsgstr \"\"\n\"若设为 ``True`` ，会将内容保存在缓存中。有关缓存请参阅 :ref:`reading_only_modified_content` \"\n\"。本项配置默认为 ``False`` 。\"\n\n#: ../../settings.rst:388 fe1ca91d569e4c2584b0dd3907761f40\nmsgid \"\"\n\"If set to ``'reader'``, save only the raw content and metadata returned \"\n\"by readers. If set to ``'generator'``, save processed content objects. \"\n\"The default is ``'reader'``.\"\nmsgstr \"\"\n\"若设为 ``reader`` ，则只保存reader返回的原始内容和元数据。若设为 ``generator`` \"\n\"，则保存处理过的内容对象。本项配置默认为 ``'reader'`` 。\"\n\n#: ../../settings.rst:394 9fc3e0a091d0493cb1172bb1c3bde79d\nmsgid \"Directory in which to store cache files. The default is ``'cache'``.\"\nmsgstr \"指定存储缓存文件的目录。本项配置默认为 ``'cache'`` 。\"\n\n#: ../../settings.rst:398 e37599cff5684bcc92d1102ccb78ba03\nmsgid \"\"\n\"If ``True``, use gzip to (de)compress the cache files. The default is \"\n\"``True``.\"\nmsgstr \"若设为 ``True`` ，则使用gzip对缓存文件进行解压缩。本项配置默认为 ``True`` 。\"\n\n#: ../../settings.rst:403 c6735c207785406f93dbd6c85c1e7331\nmsgid \"Controls how files are checked for modifications.\"\nmsgstr \"调整判定文件是否修改的方式\"\n\n#: ../../settings.rst:405 ../../settings.rst:1445\n#: 18648953d9c040c8bd0b98d212509bbf\nmsgid \"If set to ``'mtime'``, the modification time of the file is checked.\"\nmsgstr \"若设为 ``mtime`` ，则检查文件的修改时间。\"\n\n#: ../../settings.rst:407 ../../settings.rst:1447\n#: e5596360b86d44ef81b01bb259b4b189\nmsgid \"\"\n\"If set to a name of a function provided by the ``hashlib`` module, e.g. \"\n\"``'md5'``, the file hash is checked.\"\nmsgstr \"若设为 ``hashlib`` 库中提供的方法名，例如 ``md5`` ，则会检查文件的哈希值。\"\n\n#: ../../settings.rst:410 f0fd9392aa0544248ae3ecfa505cbd50\nmsgid \"The default is ``'mtime'``.\"\nmsgstr \"默认为 ``'mtime'`` 。\"\n\n#: ../../settings.rst:414 f9de4ce8f2534da6b6318522dd749cef\nmsgid \"\"\n\"If ``True``, load unmodified content from caches. The default is \"\n\"``False``.\"\nmsgstr \"若设为 ``True`` ，则会从缓存中加载未修改的内容。本项配置默认为 ``False`` 。\"\n\n#: ../../settings.rst:418 48308a306f9c41f0b95ce62120a4c64b\nmsgid \"\"\n\"A list of metadata fields containing reST/Markdown content to be parsed \"\n\"and translated to HTML. The default is ``['summary']``.\"\nmsgstr \"元数据的列表，此列表中的元数据会被解析为HTML。本项配置默认为 ``['summary']`` 。\"\n\n#: ../../settings.rst:423 43cbc9a1d76d4d698f9c0e4013ec47d8\nmsgid \"\"\n\"The TCP port to serve content from the output folder via HTTP when \"\n\"pelican is run with ``--listen``. The default is ``8000``.\"\nmsgstr \"使用--listen运行pelican时，会在此选项指定的TCP端口上以HTTP提供内容。本项配置默认为 ``8000`` 。\"\n\n#: ../../settings.rst:428 ad5bd958c68f45f8b031fe61c19baa46\nmsgid \"The IP to which to bind the HTTP server. The default is ``'127.0.0.1'``.\"\nmsgstr \"需要和HTTP服务器绑定的IP地址。本项配置默认为 ``'127.0.0.1'`` 。\"\n\n#: ../../settings.rst:433 bb37f2124e17422e8d92159261df8891\nmsgid \"URL settings\"\nmsgstr \"URL设置\"\n\n#: ../../settings.rst:435 b8f09390ffb0493c87f475f214133b2d\nmsgid \"\"\n\"The first thing to understand is that there are currently two supported \"\n\"methods for URL formation: *relative* and *absolute*. Relative URLs are \"\n\"useful when testing locally, and absolute URLs are reliable and most \"\n\"useful when publishing. One method of supporting both is to have one \"\n\"Pelican configuration file for local development and another for \"\n\"publishing. To see an example of this type of setup, use the ``pelican-\"\n\"quickstart`` script as described in the :doc:`Installation <install>` \"\n\"section, which will produce two separate configuration files for local \"\n\"development and publishing, respectively.\"\nmsgstr \"\"\n\"首先要知道的是，URL格式有两种形式： *相对URL* 、 *绝对URL* \"\n\"。相对URL在本地测试时往往比较有用，而绝对URL在发布时往往是比较有效可靠的。要同时支持两种URL形式，可以在本地开发和发布环境中使用两份不同的配置文件。执行脚本\"\n\" ``pelican-quickstart`` 时，就会为本地开发和发布环境分别生成一份配置文件，此脚本在 :doc:`安装Pelican \"\n\"<install>` 一节中有详细描述。\"\n\n#: ../../settings.rst:444 5c90d0e477da4e37a4b3ae46684e3cb1\n#, python-brace-format\nmsgid \"\"\n\"You can customize the URLs and locations where files will be saved. The \"\n\"``*_URL`` and ``*_SAVE_AS`` variables use Python's format strings. These \"\n\"variables allow you to place your articles in a location such as \"\n\"``{slug}/index.html`` and link to them as ``{slug}`` for clean URLs (see \"\n\"example below). These settings give you the flexibility to place your \"\n\"articles and pages anywhere you want.\"\nmsgstr \"\"\n\"URL和文件存储位置都是可以自定义的， ``*_URL`` 和 ``*_SAVE_AS`` \"\n\"变量使用Python风格的格式化字符串。你可以利用一些变量将文章放在诸如 ``{slug}/index.html`` 的位置，并且可以以 \"\n\"``{slug}`` 的形式进行链接，如此可以让URL更加简洁（详见下面的例子）。这些设置可以让你灵活地将文章和页面放在任何你想要的地方。\"\n\n#: ../../settings.rst:452 0ca45357c5b74c758e00faefa8f4c0e8\n#, python-brace-format\nmsgid \"\"\n\"If a ``*_SAVE_AS`` setting contains a parent directory that doesn't match\"\n\" the parent directory inside the corresponding ``*_URL`` setting, this \"\n\"may cause Pelican to generate unexpected URLs in a few cases, such as \"\n\"when using the ``{attach}`` syntax.\"\nmsgstr \"\"\n\"如果 ``*_SAVE_AS`` 中包含了不在 ``*_URL`` 中的父目录，会导致Pelican在少数情况下（例如使用 \"\n\"``{attach}`` 语法时）产生不确定的URL。\"\n\n#: ../../settings.rst:457 b04cc2a7f85f4ba692a703555df3a194\nmsgid \"\"\n\"If you don't want that flexibility and instead prefer that your generated\"\n\" output paths mirror your source content's filesystem path hierarchy, try\"\n\" the following settings::\"\nmsgstr \"若不希望有这种灵活性，而是希望生成的输出路径保留源内容路径的层次结构，可以尝试以下设置：\"\n\n#: ../../settings.rst:464 ad7d1e214f2a4d85ae7b1d28e3a164cb\nmsgid \"\"\n\"Otherwise, you can use a variety of file metadata attributes within URL-\"\n\"related settings:\"\nmsgstr \"否则，可以在URL相关设置中可以使用下面的这些元数据属性：\"\n\n#: ../../settings.rst:467 c4b17402ea72433f9df15ac8b3a1ceb9\nmsgid \"slug\"\nmsgstr \"slug\"\n\n#: ../../settings.rst:468 fad16eab57e94f5f8f69ec1d19752a95\nmsgid \"date\"\nmsgstr \"date\"\n\n#: ../../settings.rst:469 031db5162fbe4ff2a63a482a1574ef3d\nmsgid \"lang\"\nmsgstr \"lang\"\n\n#: ../../settings.rst:470 a4da9aeb8acc4e6eaee3809b7b55cca8\nmsgid \"author\"\nmsgstr \"author\"\n\n#: ../../settings.rst:471 2eb8d928fd324ae2baa8d68c224d8804\nmsgid \"category\"\nmsgstr \"category\"\n\n#: ../../settings.rst:473 ../../settings.rst:616\n#: 9e1b640b50424480b171962702ffdc5f\nmsgid \"Example usage::\"\nmsgstr \"例如：\"\n\n#: ../../settings.rst:480 d6a8ebf0d638473eac3819a10923303d\nmsgid \"\"\n\"This would save your articles into something like ``/posts/2011/Aug/07\"\n\"/sample-post/index.html``, save your pages into \"\n\"``/pages/about/index.html``, and render them available at URLs of \"\n\"``/posts/2011/Aug/07/sample-post/`` and ``/pages/about/``, respectively.\"\nmsgstr \"\"\n\"上面的设置会将你的文章以类似于 ``/posts/2011/Aug/07/sample-post/index.html`` 的形式存储，页面则以 \"\n\"``/pages/about/index.html`` 的形式存储，对应的URL分别为 ``/posts/2011/Aug/07/sample-\"\n\"post/`` 与 ``/pages/about/`` 。\"\n\n#: ../../settings.rst:486 5f57f3feaa7f4e778a1d916ff18c1d63\nmsgid \"\"\n\"If you specify a ``datetime`` directive, it will be substituted using the\"\n\" input files' date metadata attribute. If the date is not specified for a\"\n\" particular file, Pelican will rely on the file's ``mtime`` timestamp. \"\n\"Check the `Python datetime documentation`_ for more information.\"\nmsgstr \"\"\n\"如果指定了 ``datetime`` 指令，会使用输入文件的日期元数据进行替换。若没有指定日期，Pelican会根据文件的 ``mtime`` \"\n\"时间戳替换之。更多信息可以参考 `Python datetime文档`_ 。\"\n\n#: ../../settings.rst:496 a82644d4452643c1912f03ab291d6f4b\nmsgid \"\"\n\"Defines whether Pelican should use document-relative URLs or not. Only \"\n\"set this to ``True`` when developing/testing and only if you fully \"\n\"understand the effect it can have on links/feeds. The default is \"\n\"``False``.\"\nmsgstr \"\"\n\"定义Pelican是否使用文档间的相对URL。请只在开发或测试时将此项设为 ``True`` \"\n\"，并且确保你已经明白此项设置对链接与feed的影响。（译者注：当此项为True时，网页之间的链接会使用相对路径表达，例如 ``../my-\"\n\"article.html`` ）。本项配置默认为 ``False`` 。\"\n\n#: ../../settings.rst:502 08d86196410f482e803c69d85078652a\n#, python-brace-format\nmsgid \"The URL to refer to an article. The default is ``'{slug}.html'``.\"\nmsgstr \"draft状态文章的URL格式。本项配置默认为 ``'{slug}.html'`` 。\"\n\n#: ../../settings.rst:506 13b5dcc285d849999acd612a07d00105\n#, python-brace-format\nmsgid \"The place where we will save an article. The default is ``'{slug}.html'``.\"\nmsgstr \"draft状态文章的存储位置。本项配置默认为 ``'{slug}.html'`` 。\"\n\n#: ../../settings.rst:510 08d86196410f482e803c69d85078652a\n#, python-brace-format\nmsgid \"\"\n\"The URL to refer to an article which doesn't use the default language. \"\n\"The default is ``'{slug}-{lang}.html``.\"\nmsgstr \"非默认语言文章的URL格式。本项配置默认为 ``'{slug}-{lang}.html`` 。\"\n\n#: ../../settings.rst:515 13b5dcc285d849999acd612a07d00105\n#, python-brace-format\nmsgid \"\"\n\"The place where we will save an article which doesn't use the default \"\n\"language. The default is ``'{slug}-{lang}.html'``.\"\nmsgstr \"非默认语言文章的存储位置。本项配置默认为 ``'{slug}-{lang}.html'`` 。\"\n\n#: ../../settings.rst:520 eb807715a5ce47398b0a9545f2d21c3f\n#, python-brace-format\nmsgid \"\"\n\"The URL to refer to an article draft. The default is \"\n\"``'drafts/{slug}.html'``.\"\nmsgstr \"draft状态非默认语言文章的URL格式。本项配置默认为 ``'drafts/{slug}.html'`` 。\"\n\n#: ../../settings.rst:525 b3e2acb8ad31482cacda5244df2b36e1\n#, python-brace-format\nmsgid \"\"\n\"The place where we will save an article draft. The default is \"\n\"``'drafts/{slug}.html'``.\"\nmsgstr \"draft状态非默认语言文章的存储位置。本项配置默认为 ``'drafts/{slug}.html'`` 。\"\n\n#: ../../settings.rst:529 eb807715a5ce47398b0a9545f2d21c3f\n#, python-brace-format\nmsgid \"\"\n\"The URL to refer to an article draft which doesn't use the default \"\n\"language. The default is ``'drafts/{slug}-{lang}.html'``.\"\nmsgstr \"draft状态非默认语言文章的URL格式。本项配置默认为 ``'drafts/{slug}-{lang}.html'`` 。\"\n\n#: ../../settings.rst:534 b3e2acb8ad31482cacda5244df2b36e1\n#, python-brace-format\nmsgid \"\"\n\"The place where we will save an article draft which doesn't use the \"\n\"default language. The default is ``'drafts/{slug}-{lang}.html'``.\"\nmsgstr \"draft状态非默认语言文章的存储位置。本项配置默认为 ``'drafts/{slug}-{lang}.html'`` 。\"\n\n#: ../../settings.rst:539 6596ed1c997349bf94a503bdaa8b9e68\n#, python-brace-format\nmsgid \"\"\n\"The URL we will use to link to a page. The default is \"\n\"``'pages/{slug}.html'``.\"\nmsgstr \"非默认语言页面的URL格式。本项配置默认为 ``'pages/{slug}.html'`` 。\"\n\n#: ../../settings.rst:544 e837fdc936e54e6a80398382c305606b\n#, python-brace-format\nmsgid \"\"\n\"The location we will save the page. This value has to be the same as \"\n\"PAGE_URL or you need to use a rewrite in your server config. The default \"\n\"is ``'pages/{slug}.html'``.\"\nmsgstr \"\"\n\"页面的保存位置。除非在服务器上设置了重写规则，否则此项设置必须和PAGE_URL一致。本项配置默认为 \"\n\"``'pages/{slug}.html'`` 。\"\n\n#: ../../settings.rst:550 6596ed1c997349bf94a503bdaa8b9e68\n#, python-brace-format\nmsgid \"\"\n\"The URL we will use to link to a page which doesn't use the default \"\n\"language. The default is ``'pages/{slug}-{lang}.html'``.\"\nmsgstr \"非默认语言页面的URL格式。本项配置默认为 ``'pages/{slug}-{lang}.html'`` 。\"\n\n#: ../../settings.rst:555 e837fdc936e54e6a80398382c305606b\n#, python-brace-format\nmsgid \"\"\n\"The location we will save the page which doesn't use the default \"\n\"language. The default is ``'pages/{slug}-{lang}.html'``.\"\nmsgstr \"非默认语言页面的存储位置。本项配置默认为 ``'pages/{slug}-{lang}.html'`` 。\"\n\n#: ../../settings.rst:560 f50ffd4223fe4f1ab65496ddd66531f7\n#, python-brace-format\nmsgid \"\"\n\"The URL used to link to a page draft. The default is \"\n\"``'drafts/pages/{slug}.html'``.\"\nmsgstr \"draft状态非默认语言页面的URL格式。本项配置默认为 ``'drafts/pages/{slug}.html'`` 。\"\n\n#: ../../settings.rst:565 3675c7a1107744f0818c0473c4f0643b\n#, python-brace-format\nmsgid \"\"\n\"The actual location a page draft is saved at. The default is \"\n\"``'drafts/pages/{slug}.html'``.\"\nmsgstr \"draft状态非默认语言页面的实际存储位置。本项配置默认为 ``'drafts/pages/{slug}.html'`` 。\"\n\n#: ../../settings.rst:570 ee417f88ca17494cb0c3c7ec38ba9588\n#, python-brace-format\nmsgid \"\"\n\"The URL used to link to a page draft which doesn't use the default \"\n\"language. The default is ``'drafts/pages/{slug}-{lang}.html'``.\"\nmsgstr \"draft状态非默认语言页面的URL格式。本项配置默认为 ``'drafts/pages/{slug}-{lang}.html'`` 。\"\n\n#: ../../settings.rst:575 3675c7a1107744f0818c0473c4f0643b\n#, python-brace-format\nmsgid \"\"\n\"The actual location a page draft which doesn't use the default language \"\n\"is saved at. The default is ``'drafts/pages/{slug}-{lang}.html'``.\"\nmsgstr \"draft状态非默认语言页面的实际存储位置。本项配置默认为 ``'drafts/pages/{slug}-{lang}.html'`` 。\"\n\n#: ../../settings.rst:580 08d86196410f482e803c69d85078652a\n#, python-brace-format\nmsgid \"The URL to use for an author. The default is ``'author/{slug}.html'``.\"\nmsgstr \"此URL用于作者页。本项配置默认为 ``'author/{slug}.html'`` 。\"\n\n#: ../../settings.rst:584 c4758a4ce8f94850ba4567250259741d\n#, python-brace-format\nmsgid \"The location to save an author. The default is ``'author/{slug}.html'``.\"\nmsgstr \"作者列表的存储位置。本项配置默认为 ``'author/{slug}.html'`` 。\"\n\n#: ../../settings.rst:588 531f7328d8114d868ae245686dd1b85c\n#, python-brace-format\nmsgid \"The URL to use for a category. The default is ``'category/{slug}.html'``.\"\nmsgstr \"此URL用于分类页。本项配置默认为 ``'category/{slug}.html'`` 。\"\n\n#: ../../settings.rst:592 c4758a4ce8f94850ba4567250259741d\n#, python-brace-format\nmsgid \"\"\n\"The location to save a category. The default is \"\n\"``'category/{slug}.html'``.\"\nmsgstr \"分类列表的存储位置。本项配置默认为 ``'category/{slug}.html'`` 。\"\n\n#: ../../settings.rst:596 08d86196410f482e803c69d85078652a\n#, python-brace-format\nmsgid \"The URL to use for a tag. The default is ``'tag/{slug}.html'``.\"\nmsgstr \"此URL用于标签页。本项配置默认为 ``'tag/{slug}.html'`` 。\"\n\n#: ../../settings.rst:600 7a7143a49149452d999c2084cc0266e6\n#, python-brace-format\nmsgid \"The location to save the tag page. The default is ``'tag/{slug}.html'``.\"\nmsgstr \"某一个标签页的存储位置。本项配置默认为 ``'tag/{slug}.html'``\"\n\n#: ../../settings.rst:604 a62168ceb2d2448fbcdac62882e42d11\nmsgid \"\"\n\"If you do not want one or more of the default pages to be created (e.g., \"\n\"you are the only author on your site and thus do not need an Authors \"\n\"page), set the corresponding ``*_SAVE_AS`` setting to ``''`` to prevent \"\n\"the relevant page from being generated.\"\nmsgstr \"如果您不希望创建默认页面（例如你是网站上的唯一作者，因此不需要作者页面），请将相应的 ``*_SAVE_AS`` 设置设置为 ``''`` 。\"\n\n#: ../../settings.rst:609 2478a8d793294eb29adacef7766119bc\nmsgid \"\"\n\"Pelican can optionally create per-year, per-month, and per-day archives \"\n\"of your posts. These secondary archives are disabled by default but are \"\n\"automatically enabled if you supply format strings for their respective \"\n\"``_SAVE_AS`` settings. Period archives fit intuitively with the \"\n\"hierarchical model of web URLs and can make it easier for readers to \"\n\"navigate through the posts you've written over time.\"\nmsgstr \"\"\n\"可选的，Pelican可以为帖子创建每年、每月或是每日的归档。除非你为各自的 ``*_SAVE_AS`` \"\n\"设置了格式化字符串，否则这些归档在默认情况下是关闭的。按时间进行归档更直观地符合web URL的层次模型，也可以让读者更容易按时间顺序浏览帖子。\"\n\n#: ../../settings.rst:623 31eb7d472c40499eaf3bb2680388fead\nmsgid \"\"\n\"With these settings, Pelican will create an archive of all your posts for\"\n\" the year at (for instance) ``posts/2011/index.html`` and an archive of \"\n\"all your posts for the month at ``posts/2011/Aug/index.html``. These can \"\n\"be accessed through the URLs ``posts/2011/`` and ``posts/2011/Aug/``, \"\n\"respectively.\"\nmsgstr \"\"\n\"例如若使用了上面的设置，Pelican会创建按年的归档（例如 ``posts/2011/index.html`` ），以及按月的归档（例如 \"\n\"``posts/2011/Aug/index.html`` ）。这两个页面分别通过 ``posts/2011/`` 和 \"\n\"``posts/2011/Aug/`` 进行访问。\"\n\n#: ../../settings.rst:629 192f00bf9b4d435788b81599c48e0f66\nmsgid \"\"\n\"Period archives work best when the final path segment is ``index.html``. \"\n\"This way a reader can remove a portion of your URL and automatically \"\n\"arrive at an appropriate archive of posts, without having to specify a \"\n\"page name.\"\nmsgstr \"\"\n\"当路径设置为以 ``index.html`` \"\n\"结尾时，归档的体验会非常好。读者可以删除URL中的一部分以到达合适时间段的归档，而不需要指定某一个页面的名称。\"\n\n#: ../../settings.rst:635 e49118aa81654f33bb3e83703e730ab0\nmsgid \"\"\n\"The location to save per-year archives of your posts. The default is \"\n\"``''``.\"\nmsgstr \"年归档的存储位置。本项配置默认为 ``''`` 。\"\n\n#: ../../settings.rst:639 531f7328d8114d868ae245686dd1b85c\nmsgid \"\"\n\"The URL to use for per-year archives of your posts. You should set this \"\n\"if you enable per-year archives. The default is ``''``.\"\nmsgstr \"年归档的URL格式，若想要启用年归档，请配置此项。本项配置默认为 ``''`` 。\"\n\n#: ../../settings.rst:644 d0c7703c21d9400aa5d6ac77b56fe19e\nmsgid \"\"\n\"The location to save per-month archives of your posts. The default is \"\n\"``''``.\"\nmsgstr \"月归档的存储位置。本项配置默认为 ``''`` 。\"\n\n#: ../../settings.rst:649 b078d36e2bba494ca1c87f5902b2bd15\nmsgid \"\"\n\"The URL to use for per-month archives of your posts. You should set this \"\n\"if you enable per-month archives. The default is ``''``.\"\nmsgstr \"月归档的URL格式，若想要启用月归档，请配置此项。本项配置默认为 ``''`` 。\"\n\n#: ../../settings.rst:654 f75ca583dd6249acad90cdd2417bc047\nmsgid \"\"\n\"The location to save per-day archives of your posts. The default is \"\n\"``''``.\"\nmsgstr \"日归档的存储位置。本项配置默认为 ``''`` 。\"\n\n#: ../../settings.rst:658 d4b75f03113f4e72872002cf10c3ae79\nmsgid \"\"\n\"The URL to use for per-day archives of your posts. You should set this if\"\n\" you enable per-day archives. The default is ``''``.\"\nmsgstr \"日归档的URL格式，若想要启用日归档，请配置此项。本项配置默认为 ``''`` 。\"\n\n#: ../../settings.rst:661 e73bb60a4c2c47ccba854a07265812dc\nmsgid \"\"\n\"``DIRECT_TEMPLATES`` work a bit differently than noted above. Only the \"\n\"``_SAVE_AS`` settings are available, but it is available for any direct \"\n\"template.\"\nmsgstr \"\"\n\"``DIRECT_TEMPLATES`` 的工作方式与上面提到的有点不同，在其中可以使用一些特别的直接模板，并且仅在 ``*_SAVE_AS`` \"\n\"设置中可用。\"\n\n#: ../../settings.rst:667 c4758a4ce8f94850ba4567250259741d\nmsgid \"\"\n\"The location to save the article archives page. The default is \"\n\"``'archives.html'``.\"\nmsgstr \"文章归档页面的存储位置。本项配置默认为 ``'archives.html'`` 。\"\n\n#: ../../settings.rst:671 7a7143a49149452d999c2084cc0266e6\nmsgid \"The location to save the author list. The default is ``'authors.html'``.\"\nmsgstr \"作者列表的存储位置。本项配置默认为 ``'authors.html'`` 。\"\n\n#: ../../settings.rst:675 c4758a4ce8f94850ba4567250259741d\nmsgid \"\"\n\"The location to save the category list. The default is \"\n\"``'categories.html'``.\"\nmsgstr \"分类列表的存储位置。本项配置默认为 ``'categories.html'`` 。\"\n\n#: ../../settings.rst:679 7a7143a49149452d999c2084cc0266e6\nmsgid \"The location to save the tag list. The default is ``'tags.html'``.\"\nmsgstr \"标签列表的存储位置。本项配置默认为 `'tags.html'`` 。\"\n\n#: ../../settings.rst:683 28942938054b490c8dd5ca8367d87ea9\nmsgid \"\"\n\"The location to save the list of all articles. The default is \"\n\"``'index.html'``.\"\nmsgstr \"所有文章列表的存储位置。本项配置默认为 ``'index.html'`` 。\"\n\n#: ../../settings.rst:685 556bfbe4d2ab4b51815544a7ed6fa0aa\nmsgid \"\"\n\"URLs for direct template pages are theme-dependent. Some themes use \"\n\"corresponding ``*_URL`` setting as string, while others hard-code them: \"\n\"``'archives.html'``, ``'authors.html'``, ``'categories.html'``, \"\n\"``'tags.html'``.\"\nmsgstr \"\"\n\"事实上，直接模板页面的URL是和使用的主题相关的。有些主题会使用 ``*_URL`` 作为变量字符串，而有些则是直接对这些直接模板页面进行硬编码：\"\n\" ``'archives.html'`` 、 ``'authors.html'`` 、 ``'categories.html'`` 。\"\n\n#: ../../settings.rst:692 4f67c4073e084cfdbf5f58188cce97d8\nmsgid \"\"\n\"Specifies from where you want the slug to be automatically generated. Can\"\n\" be set to ``title`` to use the \\\"Title:\\\" metadata tag or ``basename`` \"\n\"to use the article's file name when creating the slug. The default is \"\n\"``'title'``.\"\nmsgstr \"\"\n\"自动生成slug所依赖的内容。可以指定为元数据标签 ``title`` ，也可以使用文章源文件的文件名 ``basename`` 。本项配置默认为\"\n\" ``'title'`` 。\"\n\n#: ../../settings.rst:698 161c36590f2b40a3a4d9dab57848fba7\nmsgid \"\"\n\"Allow Unicode characters in slugs. Set ``True`` to keep Unicode \"\n\"characters in auto-generated slugs. Otherwise, Unicode characters will be\"\n\" replaced with ASCII equivalents. The default is ``False``.\"\nmsgstr \"\"\n\"指定是否允许在slug中使用Unicode字符。若设为 ``True`` \"\n\"，自动生成的slug中会保留Unicode字符；否则Unicode字符会使用含义相同的ASCII替换。本项配置默认为 ``False`` 。\"\n\n#: ../../settings.rst:704 771258d986ef4e46b80e1ee043e3a377\nmsgid \"\"\n\"Preserve uppercase characters in slugs. Set ``True`` to keep uppercase \"\n\"characters from ``SLUGIFY_SOURCE`` as-is. The default is ``False``.\"\nmsgstr \"\"\n\"指定是否保留slug中的大写字母。若设为 ``True`` ，则会原样保留 ``SLUGIFY_SOURCE`` 中的大写字母。本项配置默认为 \"\n\"``False`` 。\"\n\n#: ../../settings.rst:709 ea3e23a38ffe465e8fef398b69940b87\nmsgid \"\"\n\"Regex substitutions to make when generating slugs of articles and pages. \"\n\"Specified as a list of pairs of ``(from, to)`` which are applied in \"\n\"order, ignoring case. The default substitutions have the effect of \"\n\"removing non-alphanumeric characters and converting internal whitespace \"\n\"to dashes. Apart from these substitutions, slugs are always converted to \"\n\"lowercase ascii characters and leading and trailing whitespace is \"\n\"stripped. Useful for backward compatibility with existing URLs. The \"\n\"default is::\"\nmsgstr \"\"\n\"指定生成文章和页面slug时要进行的正则表达式替换。指定的是一对对 ``(from, to)`` \"\n\"（from为要替换的内容，to为替换进去的内容），列表中的各对替换规则是按序执行且忽略大小写的。默认的替换会删除非字母非数字的字符并将内部空格替换为连字符。除此之外，slug会将所有字符转换为小写ASCII字符，并删除所有前导和末尾空格。这有利于现有URL的向后兼容。本项配置默认如下：\"\n\n#: ../../settings.rst:726 4ed665fd61124d7199e5d3a336a6490e\nmsgid \"\"\n\"Regex substitutions for author slugs. The default is \"\n\"``SLUG_REGEX_SUBSTITUTIONS``.\"\nmsgstr \"针对作者slug的正则替换。默认等于 ``SLUG_REGEX_SUBSTITUTIONS`` 。\"\n\n#: ../../settings.rst:731 9ec67c2063eb4bc5a47a0cbcd68f4e7d\nmsgid \"\"\n\"Regex substitutions for category slugs. The default is \"\n\"``SLUG_REGEX_SUBSTITUTIONS``.\"\nmsgstr \"针对分类slug的正则替换。默认等于 ``SLUG_REGEX_SUBSTITUTIONS`` 。\"\n\n#: ../../settings.rst:736 04708135895649fd8e9fabc003c0219f\nmsgid \"\"\n\"Regex substitutions for tag slugs. The default is \"\n\"``SLUG_REGEX_SUBSTITUTIONS``.\"\nmsgstr \"针对标签slug的正则替换。默认等于 ``SLUG_REGEX_SUBSTITUTIONS`` 。\"\n\n#: ../../settings.rst:740 e38808bbec234497a9349626bf5b3e96\nmsgid \"Time and Date\"\nmsgstr \"日期与时间\"\n\n#: ../../settings.rst:744 26e96055ea16439caae61e79c2f1a7b6\nmsgid \"The timezone used in the date information, to generate Atom and RSS feeds.\"\nmsgstr \"日期信息中使用的时区，会用于生成Atom和RSS feeds。（无默认值，必须手动设置指定）\"\n\n#: ../../settings.rst:746 0d1bac8219e34ecea81f4733a13ee33a\nmsgid \"\"\n\"If no timezone is defined, UTC is assumed. This means that the generated \"\n\"Atom and RSS feeds will contain incorrect date information if your locale\"\n\" is not UTC.\"\nmsgstr \"若没有定义时区，会直接使用UTC时区。这意味着当你的时区不等于UTC时，生成的Atom和RSS feeds中会包含错误的日期信息。\"\n\n#: ../../settings.rst:750 e2439055d3b7422fab3a3ba41d07ce62\nmsgid \"\"\n\"Pelican issues a warning in case this setting is not defined, as it was \"\n\"not mandatory in previous versions.\"\nmsgstr \"在之前的版本中，这一项设置并不是强制的，因此Pelican会在未设置时区时提出警告。\"\n\n#: ../../settings.rst:753 6cf83583c26d42108c10f9f23a512db3\nmsgid \"\"\n\"Have a look at `the wikipedia page`_ to get a list of valid timezone \"\n\"values.\"\nmsgstr \"有效的时区设置值可以在 `维基百科页`_ 中查看。\"\n\n#: ../../settings.rst:759 5e31086101004bde84dc96efa1967666\nmsgid \"\"\n\"The default date you want to use.  If ``'fs'``, Pelican will use the file\"\n\" system timestamp information (mtime) if it can't get date information \"\n\"from the metadata.  If given any other string, it will be parsed by the \"\n\"same method as article metadata.  If set to a tuple object, the default \"\n\"datetime object will instead be generated by passing the tuple to the \"\n\"``datetime.datetime`` constructor. The default is ``None``.\"\nmsgstr \"\"\n\"要使用的默认日期。若设为 ``'fs'`` \"\n\"，Pelican在无法从元数据中获取日期时，会以系统时间戳信息（mtime）为准；若设为其他字符串，Pelican将用与解析文章元数据相同的方法进行解析；若设为元组，则会将该元组传递给\"\n\" ``datetime.datetime`` 的构造函数来生成日期。本项配置默认为 ``None`` 。\"\n\n#: ../../settings.rst:768 27cab75cf2344a8c8d1573700e1f35ca\n#, python-format\nmsgid \"The default date format you want to use. The default is ``'%a %d %B %Y'``.\"\nmsgstr \"指定要使用的默认日期格式。本项配置默认为 ``'%a %d %B %Y'`` 。\"\n\n#: ../../settings.rst:772 fcf723cc20f544e6a43339335ba86558\nmsgid \"If you manage multiple languages, you can set the date formatting here.\"\nmsgstr \"若需要管理多种语言，可以在这里针对不同语言设置不同的日期格式。\"\n\n#: ../../settings.rst:774 d11fdb2b3aaa47b7993a38e4d5603e12\nmsgid \"\"\n\"If no ``DATE_FORMATS`` are set, Pelican will fall back to \"\n\"``DEFAULT_DATE_FORMAT``. If you need to maintain multiple languages with \"\n\"different date formats, you can set the ``DATE_FORMATS`` dictionary using\"\n\" the language name (``lang`` metadata in your post content) as the key.\"\nmsgstr \"\"\n\"如果 ``DATE_FORMATS`` 没有设置过，Pelican会使用 ``DEFAULT_DATE_FORMAT`` \"\n\"。如果要为不同语言设置不同如期格式，可以在此设置项字典中指定，键为语言名称（对应于帖子内容元数据中的 ``lang`` ），值为日期格式字符串。\"\n\n#: ../../settings.rst:779 c63c2ef9276b496bac1067b956c93819\n#, python-format\nmsgid \"\"\n\"In addition to the standard C89 strftime format codes that are listed in \"\n\"`Python datetime documentation`_, you can use the ``-`` character between\"\n\" ``%`` and the format character to remove any leading zeros. For example,\"\n\" ``%d/%m/%Y`` will output ``01/01/2014`` whereas ``%-d/%-m/%Y`` will \"\n\"result in ``1/1/2014``.\"\nmsgstr \"\"\n\"除了 `Python datetime文档`_ 中列出的标准C89 strftime格式代码之外，可以通过在 ``%`` 和格式字符之间添加 \"\n\"``-`` 来删除日期中的前导零。例如  ``%d/%m/%Y`` 对应输出 ``01/01/2014`` ，而 ``%-d/%-m/%Y`` \"\n\"对应输出 ``1/1/2014`` 。\"\n\n#: ../../settings.rst:792 f1cb8ed02da747fdb9556138744cb6b4\nmsgid \"\"\n\"It is also possible to set different locale settings for each language by\"\n\" using a ``(locale, format)`` tuple as a dictionary value which will \"\n\"override the ``LOCALE`` setting:\"\nmsgstr \"你还能够通过将元组 ``(locale, format)`` 作为值，来为每种语言指定地区，此处设置的地区会覆盖 ``LOCALE`` 设置：\"\n\n#: ../../settings.rst:814 81db232f575b4d4194222e5afb0d141a\nmsgid \"\"\n\"Change the locale. A list of locales can be provided here or a single \"\n\"string representing one locale.  When providing a list, all the locales \"\n\"will be tried until one works.\"\nmsgstr \"设置地区。可以同时指定多个地区，也可以使用字符串指定单个地区。当设置了多个地区时，会一个个尝试直到某一个可以使用。\"\n\n#: ../../settings.rst:818 d3630c9f75e145a98dd5746f4ca54ae4\nmsgid \"You can set locale to further control date format:\"\nmsgstr \"通过设置地区进一步控制日期格式：\"\n\n#: ../../settings.rst:826 feb0efa8a8a648648634ef896509879b\nmsgid \"\"\n\"For a list of available locales refer to `locales on Windows`_  or on \"\n\"Unix/Linux, use the ``locale -a`` command; see manpage `locale(1)`_ for \"\n\"more information. The default is the system locale.\"\nmsgstr \"\"\n\"要查看可用的地区列表，可以参看 `Windows上的地区`_ ；若使用的时Unix/Linux系统， 使用 ``locale -a`` \"\n\"命令即可，有关该命令的更多信息可以参阅手册 `locale(1)`_ 。本项配置默认与系统locale保持一致。\"\n\n#: ../../settings.rst:843 15067988a9f64c23ac30113f261c932f\nmsgid \"Template pages\"\nmsgstr \"模板页面\"\n\n#: ../../settings.rst:847 1e8e76f577b44f389d546bebe897b0a4\nmsgid \"\"\n\"A mapping containing template pages that will be rendered with the blog \"\n\"entries.\"\nmsgstr \"一些映射关系，指出了会和博客一起渲染的模板页面。\"\n\n#: ../../settings.rst:850 97158dd7cf984420b72d4fe184f613f3\nmsgid \"\"\n\"If you want to generate custom pages besides your blog entries, you can \"\n\"point any Jinja2 template file with a path pointing to the file and the \"\n\"destination path for the generated file.\"\nmsgstr \"如果你想要生成除了博客之外的自定义页面，你可以指出任何Jinja2的模板文件，需要同时指出源文件路径和生成文件的路径。\"\n\n#: ../../settings.rst:854 3bab3b6570c044c3a507687ebd136988\nmsgid \"\"\n\"For instance, if you have a blog with three static pages — a list of \"\n\"books, your resume, and a contact page — you could have::\"\nmsgstr \"例如，如果你的博客有三个静态页面——书籍列表、你的简历、以及一个联系我们页面，你可这么配置：\"\n\n#: ../../settings.rst:865 c1a40d40e5b34bc49b138e87baf1dd09\nmsgid \"\"\n\"The extensions to use when looking up template files from template names.\"\n\" The default is ``['.html']``.\"\nmsgstr \"指定要查找并视为模板文件的文件扩展名。本项配置默认为 ``['.html']`` 。\"\n\n#: ../../settings.rst:870 ad976b56f784425380d5ca5095c83bad\nmsgid \"\"\n\"List of templates that are used directly to render content. Typically \"\n\"direct templates are used to generate index pages for collections of \"\n\"content (e.g., category and tag index pages). If the author, category and\"\n\" tag collections are not needed, set ``DIRECT_TEMPLATES = ['index', \"\n\"'archives']``\"\nmsgstr \"\"\n\"指定用于直接渲染内容的模板列表。一般来说直接模板会用于生成内容集合的主页（例如分类和标签的主页）。如果不需要作者、分类或者标签集合，可以设置 \"\n\"``DIRECT_TEMPLATES = ['index', archives']`` 。\"\n\n#: ../../settings.rst:875 f545160f96c34ac9b9218b8cb88c2bab\nmsgid \"\"\n\"``DIRECT_TEMPLATES`` are searched for over paths maintained in \"\n\"``THEME_TEMPLATES_OVERRIDES``.\"\nmsgstr \"``DIRECT_TEMPLATES`` 会在 ``THEME_TEMPLATES_OVERRIDES`` 的路径中搜索。\"\n\n#: ../../settings.rst:878 57441857f4a146568ebfdb358c6647e5\nmsgid \"The default is ``['index', 'tags', 'categories', 'authors', 'archives']``.\"\nmsgstr \"默认为 ``['index', 'tags', 'categories', 'authors', 'archives']`` 。\"\n\n#: ../../settings.rst:881 e5b9ac921eba40d7961d58d716d285ff\nmsgid \"Metadata\"\nmsgstr \"元数据\"\n\n#: ../../settings.rst:885 983b827b2d9e4162ac78b6659e73f99f\nmsgid \"\"\n\"Default author (usually your name). The default is ``None``, which \"\n\"removes the byline.\"\nmsgstr \"默认作者（通常是你自己）。本项配置默认为 ``None`` ，此时会删除作者名一行。\"\n\n#: ../../settings.rst:889 27cab75cf2344a8c8d1573700e1f35ca\n#, python-brace-format\nmsgid \"\"\n\"The default metadata you want to use for all articles and pages. The \"\n\"default is ``{}``.\"\nmsgstr \"应用于所有文章和页面的默认元数据。本项配置默认为 ``{}`` 。\"\n\n#: ../../settings.rst:894 f322adf782eb45b6b261a51befce0b7b\nmsgid \"\"\n\"The regexp that will be used to extract any metadata from the filename. \"\n\"All named groups that are matched will be set in the metadata object.  \"\n\"The default value will only extract the date from the filename.\"\nmsgstr \"指定用于从文件名中提取元数据的正则表达式。所有匹配上的命名匹配组都会用于设置元数据。默认值会从文件名中提取日期。\"\n\n#: ../../settings.rst:898 b14cef00e4d74cf1aafa83f8adc7ff22\nmsgid \"For example, to extract both the date and the slug::\"\nmsgstr \"例如，可以同时提取日期和slug：\"\n\n#: ../../settings.rst:902 6f0fe6e9f1634fa281d42a4db9c7df83\n#, python-brace-format\nmsgid \"\"\n\"See also ``SLUGIFY_SOURCE``. The default is \"\n\"``r'(?P<date>\\\\d{4}-\\\\d{2}-\\\\d{2}).*'``.\"\nmsgstr \"参考 ``SLUGIFY_SOURCE`` 。本项配置默认为 ``r'(?P<date>\\\\d{4}-\\\\d{2}-\\\\d{2}).*'`` 。\"\n\n#: ../../settings.rst:906 6868648226c841849965cfc4a8f8a0fb\nmsgid \"\"\n\"Like ``FILENAME_METADATA``, but parsed from a page's full path relative \"\n\"to the content source directory. The default is ``''``.\"\nmsgstr \"和 ``FILENAME_METADATA`` 类似，但解析时的路径是相对于内容源文件所在目录的。本项配置默认为 ``''`` 。\"\n\n#: ../../settings.rst:911 52089bec13c64713a256032ed4f894ef\nmsgid \"\"\n\"Extra metadata dictionaries keyed by relative path. Relative paths \"\n\"require correct OS-specific directory separators (i.e. / in UNIX and \\\\\\\\\"\n\" in Windows) unlike some other Pelican file settings. Paths to a \"\n\"directory apply to all files under it. The most-specific path wins \"\n\"conflicts.\"\nmsgstr \"指定要从相对路径提取的额外元数据字典。与Pelican的其他设置文件不同，此项设置需要正确使用和操作系统对应的目录分隔符（Unix中使用/，Windows中使用\\\\\\\\）。若对一个目录设置了规则，该规则会作用于该目录下所有文件。当有多个路径相互冲突时，Pelican会选用更为具体的路径。\"\n\n#: ../../settings.rst:916 375cc26258cd4030a2e1743220b331db\nmsgid \"\"\n\"Not all metadata needs to be :ref:`embedded in source file itself \"\n\"<internal_metadata>`. For example, blog posts are often named following a\"\n\" ``YYYY-MM-DD-SLUG.rst`` pattern, or nested into ``YYYY/MM/DD-SLUG`` \"\n\"directories. To extract metadata from the filename or path, set \"\n\"``FILENAME_METADATA`` or ``PATH_METADATA`` to regular expressions that \"\n\"use Python's `group name notation`_ ``(?P<name>…)``. If you want to \"\n\"attach additional metadata but don't want to encode it in the path, you \"\n\"can set ``EXTRA_PATH_METADATA``:\"\nmsgstr \"\"\n\"不是所有元数据都需要直接 :ref:`放在推文源文件中 <internal_metadata>` 。例如，博文可能是以 ``YYYY-MM-DD-\"\n\"SLUG.rst`` 的形式命名的，或者是直接放在 ``YYYY/MM/DD-SLUG`` 文件夹中。要从文件名或路径中提取元数据，设置 \"\n\"``FILENAME_METADATA`` 或 ``PATH_METADATA`` 即可，需使用Python风格的 `命名组表示法`_ \"\n\"``(?P<name>…)`` 。当你需要为帖子附加一些额外的元数据，但不想将其编码在文件路径中时，就可以在 \"\n\"``EXTRA_PATH_METADATA`` 中设置：\"\n\n#: ../../settings.rst:937 43d9707ff47e488dba64d7d1d23cbc4a\nmsgid \"\"\n\"This can be a convenient way to shift the installed location of a \"\n\"particular file:\"\nmsgstr \"通过这个设置项，很方便就可以转移特定文件的位置：\"\n\n#: ../../settings.rst:959 ef39cc18199a44b895748dfe9c46a07c\nmsgid \"Feed settings\"\nmsgstr \"订阅源设置\"\n\n#: ../../settings.rst:961 8c7bb16134c24af5b49a9e63b6ff36f8\nmsgid \"\"\n\"By default, Pelican uses Atom feeds. However, it is also possible to use \"\n\"RSS feeds if you prefer.\"\nmsgstr \"默认情况下，Pelican会使用Atom订阅源。但如果你愿意的话，也可以使用RSS。\"\n\n#: ../../settings.rst:964 a20b5eb7bea54cde84cfde3380cc9c86\nmsgid \"\"\n\"Pelican generates category feeds as well as feeds for all your articles. \"\n\"It does not generate feeds for tags by default, but it is possible to do \"\n\"so using the ``TAG_FEED_ATOM`` and ``TAG_FEED_RSS`` settings:\"\nmsgstr \"\"\n\"Pelican会生成分类的feed，也会为所有文章生成，但默认并不会为标签生成feed，要生成标签feed，可以使用  \"\n\"``TAG_FEED_ATOM`` 和 ``TAG_FEED_RSS`` 设置：\"\n\n#: ../../settings.rst:970 1ffaa4be4dae4481b80eff1b8191f366\nmsgid \"\"\n\"The domain prepended to feed URLs. Since feed URLs should always be \"\n\"absolute, it is highly recommended to define this (e.g., \"\n\"\\\"https://feeds.example.com\\\"). The default is ``SITEURL``.\"\nmsgstr \"\"\n\"指定要附加到订阅源URL前面的域名。因为订阅源URL应该是绝对的，所以强烈推荐定义此设置项（例如 \"\n\"https://feeds.example.com ）。本项配置默认为 ``SITEURL`` 。\"\n\n#: ../../settings.rst:976 7a7143a49149452d999c2084cc0266e6\nmsgid \"\"\n\"The location to save the Atom feed. The default is ``None``, for no Atom \"\n\"feed.\"\nmsgstr \"指定Atom订阅源的存储位置。本项配置默认为 ``None`` ，即不使用Atom订阅源。\"\n\n#: ../../settings.rst:981 2fd2426a582247f8a375940ecbd0f96a\nmsgid \"\"\n\"Relative URL of the Atom feed. If not set, ``FEED_ATOM`` is used both for\"\n\" save location and URL. The default is ``None``.\"\nmsgstr \"Atom订阅源的相对URL。如果未设置此项，会将 ``FEED_ATOM`` 同时用于存储位置和URL。本项配置默认为 ``None`` 。\"\n\n#: ../../settings.rst:986 c4758a4ce8f94850ba4567250259741d\nmsgid \"\"\n\"The location to save the RSS feed. The default is ``None``, for no RSS \"\n\"feed.\"\nmsgstr \"RSS订阅源的存储位置。本项配置默认为 ``None`` ，即不使用RSS订阅源。\"\n\n#: ../../settings.rst:990 737caf1d58854aa3b86820243fc80403\nmsgid \"\"\n\"Relative URL of the RSS feed. If not set, ``FEED_RSS`` is used both for \"\n\"save location and URL. The default is ``None``.\"\nmsgstr \"RSS订阅源的相对URL。如果未设置此项，会将 ``FEED_RSS`` 同时用于存储位置和URL。本项配置默认为 ``None`` 。\"\n\n#: ../../settings.rst:995 28942938054b490c8dd5ca8367d87ea9\nmsgid \"\"\n\"The location to save the all-posts Atom feed: this feed will contain all \"\n\"posts regardless of their language. The default is \"\n\"``'feeds/all.atom.xml'``.\"\nmsgstr \"存储all-posts Atom订阅源的文件位置：其中会包含所有语言的帖子。本项配置默认为 ``'feeds/all.atom.xml'`` 。\"\n\n#: ../../settings.rst:1000 f4e7fbd9297743ccaadafa11c7cfb1e1\nmsgid \"\"\n\"Relative URL of the all-posts Atom feed. If not set, ``FEED_ALL_ATOM`` is\"\n\" used both for save location and URL. The default is ``None``.\"\nmsgstr \"\"\n\"all-posts Atom订阅源的相对URL。如果未设置此项，会将 ``FEED_ALL_ATOM`` 同时用于存储位置和URL。本项配置默认为\"\n\" ``None`` 。\"\n\n#: ../../settings.rst:1005 eaacfd07bdb94dd2a9c6792a1f036807\nmsgid \"\"\n\"The location to save the the all-posts RSS feed: this feed will contain \"\n\"all posts regardless of their language. The default is ``None``, for no \"\n\"all-posts RSS feed.\"\nmsgstr \"\"\n\"存储all-posts RSS订阅源的文件位置：其中会包含所有语言的帖子。本项配置默认为 ``None`` ，即不使用all-posts \"\n\"RSS订阅源。\"\n\n#: ../../settings.rst:1011 fe17f05439064eea8fb3dad8255cd467\nmsgid \"\"\n\"Relative URL of the all-posts RSS feed. If not set, ``FEED_ALL_RSS`` is \"\n\"used both for save location and URL. The default is ``None``.\"\nmsgstr \"\"\n\"all-posts RSS订阅源的相对URL。如果未设置此项，会将 ``FEED_ALL_RSS`` 同时用于存储位置和URL。本项配置默认为 \"\n\"``None`` 。\"\n\n#: ../../settings.rst:1016 c4758a4ce8f94850ba4567250259741d\n#, python-brace-format\nmsgid \"\"\n\"The location to save the category Atom feeds. [2]_ The default is \"\n\"``'feeds/{slug}.atom.xml'``.\"\nmsgstr \"category Atom订阅源的存储位置。 [2]_ 本项配置默认为 ``'feeds/{slug}.atom.xml'`` 。\"\n\n#: ../../settings.rst:1021 d31bcd45f3ee47e4a316ac3f765c527d\n#, python-brace-format\nmsgid \"\"\n\"Relative URL of the category Atom feeds, including the ``{slug}`` \"\n\"placeholder. [2]_ If not set, ``CATEGORY_FEED_ATOM`` is used both for \"\n\"save location and URL. The default is ``None``.\"\nmsgstr \"\"\n\"category Atom订阅源的相对URL，其中包含 ``{slug}`` 。 [2]_ 如果未设置， 会将 \"\n\"``CATEGORY_FEED_ATOM`` 同时用于存储位置和URL。本项配置默认为 ``None`` 。\"\n\n#: ../../settings.rst:1027 fabfac75a52f48029a8147f62289c252\n#, python-brace-format\nmsgid \"\"\n\"The location to save the category RSS feeds, including the ``{slug}`` \"\n\"placeholder. [2]_ The default is ``None``, for no RSS feed.\"\nmsgstr \"category RSS订阅源的存储位置，其中包含 ``{slug}`` 。 [2]_ 本项配置默认为 ``None`` ，即不使用RSS订阅源。\"\n\n#: ../../settings.rst:1032 fabfac75a52f48029a8147f62289c252\n#, python-brace-format\nmsgid \"\"\n\"Relative URL of the category RSS feeds, including the ``{slug}`` \"\n\"placeholder. [2]_ If not set, ``CATEGORY_FEED_RSS`` is used both for save\"\n\" location and URL. The default is ``None``.\"\nmsgstr \"\"\n\"category RSS订阅源的相对URL，其中包含 ``{slug}`` 。 [2]_ 如果未设置， 会将 \"\n\"``CATEGORY_FEED_RSS`` 同时用于存储位置和URL。本项配置默认为 ``None`` 。\"\n\n#: ../../settings.rst:1038 28942938054b490c8dd5ca8367d87ea9\n#, python-brace-format\nmsgid \"\"\n\"The location to save the author Atom feeds. [2]_ The default is \"\n\"``'feeds/{slug}.atom.xml'``.\"\nmsgstr \"\"\n\"author Atom订阅源的存储位置，其中包含 ``{slug}`` 。 [2]_ 本项配置默认为 \"\n\"``'feeds/{slug}.atom.xml'`` 。\"\n\n#: ../../settings.rst:1043 fde52f62d95a4bad85a5a1b49eed6170\n#, python-brace-format\nmsgid \"\"\n\"Relative URL of the author Atom feeds, including the ``{slug}`` \"\n\"placeholder. [2]_ If not set, ``AUTHOR_FEED_ATOM`` is used both for save \"\n\"location and URL. The default is ``None`` (not set).\"\nmsgstr \"\"\n\"author Atom订阅源的相对URL，其中包含 ``{slug}`` 。 [2]_ 如果未设置， 会将 \"\n\"``AUTHOR_FEED_ATOM`` 同时用于存储位置和URL。本项配置默认为 ``None`` ，即不使用。\"\n\n#: ../../settings.rst:1049 c4758a4ce8f94850ba4567250259741d\n#, python-brace-format\nmsgid \"\"\n\"The location to save the author RSS feeds. [2]_ The default is \"\n\"``'feeds/{slug}.rss.xml'``.\"\nmsgstr \"author RSS订阅源的存储位置。 [2]_ 本项配置默认为 ``'feeds/{slug}.rss.xml'`` 。\"\n\n#: ../../settings.rst:1054 367ef87d541c45ffaf65e8d8b1469f1a\n#, python-brace-format\nmsgid \"\"\n\"Relative URL of the author RSS feeds, including the ``{slug}`` \"\n\"placeholder. [2]_ If not set, ``AUTHOR_FEED_RSS`` is used both for save \"\n\"location and URL. The default is ``None``.\"\nmsgstr \"\"\n\"author RSS订阅源的相对URL，其中包含 ``{slug}`` 。 [2]_ 如果未设置， 会将 ``AUTHOR_FEED_RSS`` \"\n\"同时用于存储位置和URL。本项配置默认为 ``None`` 。\"\n\n#: ../../settings.rst:1060 b1159e07c8184831b6dcfd308cd23439\n#, python-brace-format\nmsgid \"\"\n\"The location to save the tag Atom feed, including the ``{slug}`` \"\n\"placeholder. [2]_ The default is ``None``, for no tag feed.\"\nmsgstr \"tag Atom订阅源的存储位置，其中包含 ``{slug}`` 。 [2]_ 本项配置默认为 ``None`` ，即不使用tag feed。\"\n\n#: ../../settings.rst:1065 d744ca82b48d4e9298f2ca19252aedec\n#, python-brace-format\nmsgid \"\"\n\"Relative URL of the tag Atom feed, including the ``{slug}`` placeholder. \"\n\"[2]_ The default is ``None``.\"\nmsgstr \"tag Atom订阅源的相对URL，其中包含 ``{slug}`` 。 [2]_ 本项配置默认为 ``None`` 。\"\n\n#: ../../settings.rst:1070 b1159e07c8184831b6dcfd308cd23439\n#, python-brace-format\nmsgid \"\"\n\"Relative URL to output the tag RSS feed, including the ``{slug}`` \"\n\"placeholder. If not set, ``TAG_FEED_RSS`` is used both for save location \"\n\"and URL. The default is ``None``, for no tag feed.\"\nmsgstr \"\"\n\"tag RSS订阅源的相对URL，其中包含 ``{slug}`` 。如果未设置，会将 ``TAG_FEED_RSS`` \"\n\"同时用于存储位置和URL。本项配置默认为 ``None`` ，即不使用tag feed。\"\n\n#: ../../settings.rst:1076 c8f29653c4f3423b8dec9905fa1de6f2\nmsgid \"\"\n\"Maximum number of items allowed in a feed. Setting to ``None`` will cause\"\n\" the feed to contains every article. 100 if not specified. The default is\"\n\" ``100``.\"\nmsgstr \"单个订阅源中允许包含的最多元素数量。若设为 ``None`` 表示不做上限；若不指定，默认上限为100。\"\n\n#: ../../settings.rst:1081 27393055cbb846bba21699d9a59502c2\nmsgid \"\"\n\"Only include item summaries in the ``description`` tag of RSS feeds. If \"\n\"set to ``False``, the full content will be included instead. This setting\"\n\" doesn't affect Atom feeds, only RSS ones. The default is ``True``.\"\nmsgstr \"\"\n\"仅在RSS订阅源的 ``description`` 标签中包含项目摘要。若设为 ``False`` ，则将包含完整内容。此项设置不会影响Atom \"\n\"feed，只针对RSS feed。本项配置默认为 ``True`` 。\"\n\n#: ../../settings.rst:1087 2c53416e07e34cc9998718fc5e82cc12\nmsgid \"\"\n\"If set to ``True``, ``?ref=feed`` will be appended to links in generated \"\n\"feeds for the purpose of referrer tracking. The default is ``False``.\"\nmsgstr \"若设为 ``True`` ，会将 ``?ref=feed`` 附到生成的链接中，以便追踪引用。本项配置默认为 ``False`` 。\"\n\n#: ../../settings.rst:1090 7f647c4c65494b93bb6d1c3ef4b39af6\nmsgid \"\"\n\"If you don't want to generate some or any of these feeds, set the above \"\n\"variables to ``None``.\"\nmsgstr \"若你不想要生成某些订阅源，将对应变量设为 ``None`` 即可。\"\n\n#: ../../settings.rst:1093 372a88d4b1044ba491c1547e90014c73\n#, python-brace-format\nmsgid \"``{slug}`` is replaced by name of the category / author / tag.\"\nmsgstr \"``{slug}`` 会分别用分类名/作者名/标签名来替换。\"\n\n#: ../../settings.rst:1097 9913cc3370754eda888a2594a73ce4da\nmsgid \"Pagination\"\nmsgstr \"分页\"\n\n#: ../../settings.rst:1099 caf94bfd47344208a34f6b10225646a1\nmsgid \"\"\n\"The default behaviour of Pelican is to list all the article titles along \"\n\"with a short description on the index page. While this works well for \"\n\"small-to-medium sites, sites with a large quantity of articles will \"\n\"probably benefit from paginating this list.\"\nmsgstr \"默认情况下，Pelican会把所有文章以简短描述的形式展示在首页上。虽然这对中小型网站效果不错，但对于拥有大量文章的网站来说可能需要将此列表进行分页。\"\n\n#: ../../settings.rst:1104 2667020362fe4d23a84b1d25b24863c3\nmsgid \"You can use the following settings to configure the pagination.\"\nmsgstr \"你可以使用下面的设置来配置分页。\"\n\n#: ../../settings.rst:1108 656911c7bc2145b0bd1ff10d5373d7dc\nmsgid \"\"\n\"The minimum number of articles allowed on the last page. Use this when \"\n\"you don't want the last page to only contain a handful of articles. The \"\n\"default is ``0``.\"\nmsgstr \"\"\n\"最后一页允许的最小文章数。当不希望最后一页仅包含少数文章时，请使用此选项。（译者注：当最后一页达不到此最小文章数时，会被合并到前一页）本项配置默认为\"\n\" ``0`` 。\"\n\n#: ../../settings.rst:1114 030af02515a84a13925108ab06457c0b\nmsgid \"\"\n\"The maximum number of articles to include on a page, not including \"\n\"orphans. False to disable pagination. The default is ``False``.\"\nmsgstr \"\"\n\"一个页面上包含的最大文章数，不包括孤立文章（译者注：当发生上一条设置选项中提到的合并时，最后一页显然会超过此最大文章数）。设为False会禁用分页。本项配置默认为\"\n\" ``False`` 。\"\n\n#: ../../settings.rst:1119 478c5db91b16485b81ea4523ae70b6f1\n#, python-brace-format\nmsgid \"\"\n\"The templates to use pagination with, and the number of articles to \"\n\"include on a page. If this value is ``None``, it defaults to \"\n\"``DEFAULT_PAGINATION``. The default is ``{'index': None, 'tag': None, \"\n\"'category': None, 'author': None}``.\"\nmsgstr \"\"\n\"指定哪些模板需要启用分页，以及对应的单页面文章数量。若设为 ``None`` ，则默认值为 ``DEFAULT_PAGINATION`` \"\n\"。本项配置默认为 ``{'index': None, 'tag': None, 'category': None, 'author': \"\n\"None}`` 。\"\n\n#: ../../settings.rst:1125 631c92f55fca4dd4acff9348397bdead\nmsgid \"\"\n\"A set of patterns that are used to determine advanced pagination output. \"\n\"The default is::\"\nmsgstr \"一组匹配模式，用于高级分页输出。本项配置默认如下：\"\n\n#: ../../settings.rst:1135 319e228179c2404dace7b1374e30a558\nmsgid \"Using Pagination Patterns\"\nmsgstr \"使用分页模式\"\n\n#: ../../settings.rst:1137 7c7876166cba4db0bc8ca7c6ceb1f828\nmsgid \"\"\n\"By default, pages subsequent to ``.../foo.html`` are created as \"\n\"``.../foo2.html``, etc. The ``PAGINATION_PATTERNS`` setting can be used \"\n\"to change this. It takes a sequence of triples, where each triple \"\n\"consists of::\"\nmsgstr \"\"\n\"默认情况下，连续页面的URL会如此编码：第一页为 ``.../foo.html`` ，后一页为 ``.../foo2.html`` \"\n\"。``PAGINATION_PATTERNS`` 就是用于修改这个编页规则的，其中是一些三元组：\"\n\n#: ../../settings.rst:1143 b96115cbd30a454e98427c2f568c9d9f\n#, python-brace-format\nmsgid \"\"\n\"For ``page_url`` and ``page_save_as``, you may use a number of variables.\"\n\" ``{url}`` and ``{save_as}`` correspond respectively to the ``*_URL`` and\"\n\" ``*_SAVE_AS`` values of the corresponding page type (e.g. \"\n\"``ARTICLE_SAVE_AS``). If ``{save_as} == foo/bar.html``, then ``{name} == \"\n\"foo/bar`` and ``{extension} == .html``. ``{base_name}`` equals ``{name}``\"\n\" except that it strips trailing ``/index`` if present. ``{number}`` \"\n\"equals the page number.\"\nmsgstr \"\"\n\"在  ``page_url`` 和 ``page_save_as`` 中，你可以使用很多变量。对于不同的页面类型， ``{url}`` 和 \"\n\"``{save_as}`` 对应于其 ``*_URL`` 和 ``*_SAVE_AS`` 配置项的计算值（例如 \"\n\"``ARTICLE_SAVE_AS`` ）。假设 ``{save_as} == foo/bar.html`` ，那么此时 ``{name} == \"\n\"foo/bar`` 、``{extension} == .html`` 。另外， ``{base_name}`` 和 ``{name}`` \"\n\"相同，只不过会截去末尾的 ``/index`` （如果有的话）。 ``{number}`` 则等于页码。（译者注： \"\n\"``minimum_page`` 意味到达该页面数后开始使用此条规则）\"\n\n#: ../../settings.rst:1150 0513d4b59b6443a592d6c47abf6ffd13\nmsgid \"\"\n\"For example, if you want to leave the first page unchanged, but place \"\n\"subsequent pages at ``.../page/2/`` etc, you could set \"\n\"``PAGINATION_PATTERNS`` as follows::\"\nmsgstr \"\"\n\"举个例子，如果你想要保持第一面保持不变，但后续页面都以 ``.../page/2/`` 的形式出现，你可以如此设置 \"\n\"``PAGINATION_PATTERNS`` ：\"\n\n#: ../../settings.rst:1160 a7e53284e5344eb5bab04206293349e4\nmsgid \"\"\n\"If you want a pattern to apply to the last page in the list, use ``-1`` \"\n\"as the ``minimum_page`` value::\"\nmsgstr \"如果你想指定最后一面制定规则，将 ``minimum_page`` 的值设为 ``-1`` 即可：\"\n\n#: ../../settings.rst:1166 ee7ce86e8f1749e686233ec4a999dcc9\nmsgid \"Translations\"\nmsgstr \"翻译\"\n\n#: ../../settings.rst:1168 66ba1c80957b4e84a265bbf1cfac36e5\nmsgid \"\"\n\"Pelican offers a way to translate articles. See the :doc:`Content \"\n\"<content>` section for more information.\"\nmsgstr \"Pelican为文章翻译提供了展示方法。详见 :doc:`创作内容 <content>` 。\"\n\n#: ../../settings.rst:1173 27cab75cf2344a8c8d1573700e1f35ca\nmsgid \"The default language to use. The default is ``'en'``.\"\nmsgstr \"指定默认语言。本项配置默认为 ``'en'`` 。\"\n\n#: ../../settings.rst:1177 2db269f9350e48098e8e06643b77a107\nmsgid \"\"\n\"The metadata attribute(s) used to identify which articles are \"\n\"translations of one another. May be a string or a collection of strings. \"\n\"Set to ``None`` or ``False`` to disable the identification of \"\n\"translations. The default is ``'slug'``.\"\nmsgstr \"\"\n\"指定用于标识不同翻译是同一篇文章的元数据。可以是一个或多个字符串。要禁用对文章翻译的识别，将此项设为 ``None`` 或 ``False`` \"\n\"。本项配置默认为 ``'slug'`` 。\"\n\n#: ../../settings.rst:1184 bfa4d3e17c6f42ac9ddeb79fd2131943\nmsgid \"\"\n\"The metadata attribute(s) used to identify which pages are translations \"\n\"of one another. May be a string or a collection of strings. Set to \"\n\"``None`` or ``False`` to disable the identification of translations. The \"\n\"default is ``'slug'``.\"\nmsgstr \"\"\n\"指定用于标识不同翻译是同一个页面的元数据。可以是一个或多个字符串。要禁用对页面翻译的识别，将此项设为 ``None`` 或 ``False`` \"\n\"。本项配置默认为 ``'slug'`` 。\"\n\n#: ../../settings.rst:1191 2ae8d30c65cb460194294c5a5de14f02\n#, python-brace-format\nmsgid \"\"\n\"The location to save the Atom feed for translations. [3]_ The default is \"\n\"``'feeds/all-{lang}.atom.xml'``.\"\nmsgstr \"指定各翻译Atom订阅源的存储位置。 [3]_ 本项配置默认为 ``'feeds/all-{lang}.atom.xml'`` 。\"\n\n#: ../../settings.rst:1196 bc09f3717a8a497680abc66b70745d0f\n#, python-brace-format\nmsgid \"\"\n\"Relative URL of the Atom feed for translations, including the ``{lang}`` \"\n\"placeholder. [3]_ If not set, ``TRANSLATION_FEED_ATOM`` is used both for \"\n\"save location and URL. The default is ``None``.\"\nmsgstr \"\"\n\"指定各翻译Atom feed的含有 ``{lang}`` 的相对URL。 [3]_ \"\n\"若未设置此项，``TRANSLATION_FEED_ATOM`` 会同时用于存储位置和URL。本项配置默认为 ``None`` 。\"\n\n#: ../../settings.rst:1202 1049b8c5e754466684e120afb2f7d281\nmsgid \"\"\n\"Where to put the RSS feed for translations. The default is ``None``, \"\n\"meaning no RSS feed.\"\nmsgstr \"指定各翻译RSS订阅源的存储位置。本项配置默认为 ``None`` ，即无RSS feed。\"\n\n#: ../../settings.rst:1207 625b105c73764fce865b2504e811e055\n#, python-brace-format\nmsgid \"\"\n\"Relative URL of the RSS feed for translations, including the ``{lang}`` \"\n\"placeholder. [3]_ If not set, ``TRANSLATION_FEED_RSS`` is used both for \"\n\"save location and URL. The default is ``None``.\"\nmsgstr \"\"\n\"文章或页面不同翻译在RSS订阅源中的相对路径，其中含有 ``{lang}``。 [3]_ \"\n\"若未设置此项，``TRANSLATION_FEED_RSS`` 会同时用于存储位置和URL。本项配置默认为 ``None`` 。\"\n\n#: ../../settings.rst:1211 088e79d226f0487fafc14494179cabcf\n#, python-brace-format\nmsgid \"{lang} is the language code\"\nmsgstr \"{lang} 为语言代码\"\n\n#: ../../settings.rst:1214 4376232e5a294aca906df56af2f49303\nmsgid \"Ordering content\"\nmsgstr \"内容的排列顺序\"\n\n#: ../../settings.rst:1218 41cf2c63929d4eeeae7bfdee85e8d084\nmsgid \"\"\n\"Order archives by newest first by date. (False: orders by date with older\"\n\" articles first.) The default is ``True``.\"\nmsgstr \"若设为True，日期较新的会排在前面；若设为False，则日期较旧的会排在前面。本项配置默认为 ``True`` 。\"\n\n#: ../../settings.rst:1223 3f3709e077b3416f8c3640dfc4432e38\nmsgid \"\"\n\"Reverse the category order. (True: lists by reverse alphabetical order; \"\n\"default lists alphabetically.) The default is ``False``.\"\nmsgstr \"若设为True，分类会按字典序逆序排列；若设为False，则按字典序顺序排列。本项配置默认为 ``False`` 。\"\n\n#: ../../settings.rst:1228 ff8d745b1884450185d26b1f7d645a5f\nmsgid \"\"\n\"Defines how the articles (``articles_page.object_list`` in the template) \"\n\"are sorted. Valid options are: metadata as a string (use ``reversed-`` \"\n\"prefix to reverse the sort order), special option ``'basename'`` which \"\n\"will use the basename of the file (without path), or a custom function to\"\n\" extract the sorting key from articles. Using a value of ``'date'`` will \"\n\"sort articles in chronological order, while the default value, \"\n\"``'reversed-date'``, will sort articles by date in reverse order (i.e., \"\n\"newest article comes first). The default is ``'reversed-date'``.\"\nmsgstr \"\"\n\"定义文章（模板中的 ``articles_page.object_list`` ）的排序方式。有效选项包括：字符串形式的元数据（使用前缀 \"\n\"``reversed-`` 来指定逆序）、特殊选项 ``'basename'`` \"\n\"（不带路径的文件名）、或是一个可以从文章中提取排序键的自定义函数。例如，将选项值设为 ``'date'`` ，文章就会以时间顺序排列文章。默认值为\"\n\" ``'reversed-date'`` ，即以日期逆序排列，即新文章在前、旧文章在后。本项配置默认为 ``'reversed-date'`` 。\"\n\n#: ../../settings.rst:1239 c2de8ca998954143a3a21d52f57a4e17\nmsgid \"\"\n\"Defines how the pages (``pages`` variable in the template) are sorted. \"\n\"Options are same as ``ARTICLE_ORDER_BY``.  The default value, \"\n\"``'basename'`` will sort pages by their basename. The default is \"\n\"``'basename'``.\"\nmsgstr \"\"\n\"定义页面（模板中的 ``pages`` 变量）的排序顺序。有效选项和 ``ARTICLE_ORDER_BY`` 中的相同。本项配置默认为 \"\n\"``'basename'`` 。\"\n\n#: ../../settings.rst:1247 6a345fb283734251b7acad72b7c4cf51\nmsgid \"Themes\"\nmsgstr \"主题\"\n\n#: ../../settings.rst:1249 6498842c51bb40548a640a7d419909bf\nmsgid \"\"\n\"Creating Pelican themes is addressed in a dedicated section (see :ref\"\n\":`theming-pelican`). However, here are the settings that are related to \"\n\"themes.\"\nmsgstr \"创建Pelican主题在单独的一节中讲解（参见 :ref:`theming-pelican` ）。此处讲解和主题有关的配置项。\"\n\n#: ../../settings.rst:1255 bb35f8335e4142f5b69a61115ab790e5\nmsgid \"\"\n\"Theme to use to produce the output. Can be a relative or absolute path to\"\n\" a theme folder, or the name of a default theme or a theme installed via \"\n\":doc:`pelican-themes` (see below). The default theme is \\\"notmyidea\\\".\"\nmsgstr \"\"\n\"用于产生输出的主题。可以是到达要使用主题的文件夹的相对或绝对路径，或是主题的名称（默认主题或通过 :doc:`pelican-themes` \"\n\"安装的主题）。默认主题为 \\\"notmyidea\\\" 。\"\n\n#: ../../settings.rst:1261 3d47fbf73e7a4188a877619ef4cbed77\nmsgid \"\"\n\"Destination directory in the output path where Pelican will place the \"\n\"files collected from `THEME_STATIC_PATHS`. Default is `theme`. The \"\n\"default is ``'theme'``.\"\nmsgstr \"\"\n\"Pelican从 `THEME_STATIC_PATHS` 中发现主题要使用的静态文件，此设置项指定这些静态文件在输出路径中的目录。本项配置默认为\"\n\" ``'theme'`` 。\"\n\n#: ../../settings.rst:1267 c0b9021df19241fab6b6f90983248f9c\nmsgid \"\"\n\"Static theme paths you want to copy. Default value is `static`, but if \"\n\"your theme has other static paths, you can put them here. If files or \"\n\"directories with the same names are included in the paths defined in this\"\n\" settings, they will be progressively overwritten. The default is \"\n\"``['static']``.\"\nmsgstr \"\"\n\"要复制的静态主题路径。默认值为 `static` \"\n\"，但如果你的主题有其他静态路径，也可以将其放在此处。此项设置中若包含了相同名称的文件或目录，前面的会被后面的覆盖。本项配置默认为 \"\n\"``['static']`` 。\"\n\n#: ../../settings.rst:1274 117f2d4711394bf39c50303d6b24c06b\nmsgid \"\"\n\"A list of paths you want Jinja2 to search for templates before searching \"\n\"the theme's ``templates/`` directory.  Allows for overriding individual \"\n\"theme template files without having to fork an existing theme.  Jinja2 \"\n\"searches in the following order: files in ``THEME_TEMPLATES_OVERRIDES`` \"\n\"first, then the theme's ``templates/``. The default is ``[]``.\"\nmsgstr \"\"\n\"在搜索主题的 ``templates/`` \"\n\"目录前，Jinja2会先搜索此设置项中的路径。可以使用此设置项覆盖主题中的某些模板文件，以尽量避免修改现有主题。Jinja2会先搜索 \"\n\"``THEME_TEMPLATES_OVERRIDES`` 配置的文件，再搜索主题中的 ``templates/`` 目录。本项配置默认为 \"\n\"``[]`` 。\"\n\n#: ../../settings.rst:1280 3f686a923ffa4a468df172f04146e388\n#, python-brace-format, python-format\nmsgid \"\"\n\"You can also extend templates from the theme using the ``{% extends %}`` \"\n\"directive utilizing the ``!theme`` prefix as shown in the following \"\n\"example:\"\nmsgstr \"利用 ``{% extends %}`` 指令中的 ``!theme`` 前缀也可以用于从主题扩展模板，如下例所示：\"\n\n#: ../../settings.rst:1289 35121540d2254f698cbf9538d00cf5bd\nmsgid \"Specify the CSS file you want to load. The default is ``'main.css'``.\"\nmsgstr \"指定需要加载的CSS文件。本项配置默认为 ``'main.css'`` 。\"\n\n#: ../../settings.rst:1291 533f2b3f18864e7ca68bfcb5d6961fe1\nmsgid \"\"\n\"By default, two themes are available. You can specify them using the \"\n\"``THEME`` setting or by passing the ``-t`` option to the ``pelican`` \"\n\"command:\"\nmsgstr \"默认情况下，有两个主题可供选择。可以使用 ``THEME`` 选项指定，或是在 ``pelican`` 命令中使用 ``-t`` 选项的参数传入。\"\n\n#: ../../settings.rst:1294 f1ea5d4700ca4f1091d6ee798596cff7\nmsgid \"notmyidea\"\nmsgstr \"notmyidea（默认值）\"\n\n#: ../../settings.rst:1295 9b7be83a91ab4de7bd6d7a30dbcef939\nmsgid \"simple (a synonym for \\\"plain text\\\" :)\"\nmsgstr \"simple（即“plain text”）\"\n\n#: ../../settings.rst:1297 3ac1546ab1144586825809c12f4abc78\nmsgid \"\"\n\"There are a number of other themes available at \"\n\"https://github.com/getpelican/pelican-themes. Pelican comes with :doc\"\n\":`pelican-themes`, a small script for managing themes.\"\nmsgstr \"\"\n\"还有很多主题可以在 https://github.com/getpelican/pelican-themes 上下载。Pelican使用一个称为 \"\n\":doc:`pelican-themes` 的小脚本来管理主题。\"\n\n#: ../../settings.rst:1301 f1b29806557540ddaefe6bc035a48459\nmsgid \"\"\n\"You can define your own theme, either by starting from scratch or by \"\n\"duplicating and modifying a pre-existing theme. Here is :doc:`a guide on \"\n\"how to create your theme <themes>`.\"\nmsgstr \"你还可以创建自己的主题，可以从头开始，也可以在已有主题的基础上修改。请参看 :doc:`主题 <themes>` 文档。\"\n\n#: ../../settings.rst:1305 47a8dd97888b440aabbea22aee72630a\nmsgid \"Following are example ways to specify your preferred theme::\"\nmsgstr \"下面是几个指定某个主题的例子：\"\n\n#: ../../settings.rst:1316 3f51b49bed124af39ae67bf60c8384f8\nmsgid \"\"\n\"The built-in ``simple`` theme can be customized using the following \"\n\"settings.\"\nmsgstr \"内置的 ``simple`` 主题可以使用以下设置项进行自定义。\"\n\n#: ../../settings.rst:1320 08d86196410f482e803c69d85078652a\nmsgid \"The URL of the stylesheet to use. The default is ``None``.\"\nmsgstr \"要使用的样式表的URL。本项配置默认为 ``None`` 。\"\n\n#: ../../settings.rst:1322 369beaeb61fd4e4f843d8174b666c0a7\nmsgid \"\"\n\"The built-in ``notmyidea`` theme can make good use of the following \"\n\"settings. Feel free to use them in your themes as well.\"\nmsgstr \"下面的一下选项可以很好地作用于内置的 ``notmyidea`` 主题。当然在其他主题中你也可以尽情尝试这些选项。\"\n\n#: ../../settings.rst:1327 7f647c4c65494b93bb6d1c3ef4b39af6\nmsgid \"A subtitle to appear in the header. The default is ``None``.\"\nmsgstr \"页面顶部要显示的副标题。本项配置默认为 ``None`` 。\"\n\n#: ../../settings.rst:1331 49eda3f428d7490bb78e081bbc941e64\nmsgid \"\"\n\"Pelican can handle Disqus comments. Specify the Disqus sitename \"\n\"identifier here. The default is ``None``.\"\nmsgstr \"可以在Pelican中使用Disqus的评论系统，此设置项用于设置Disqus的站点标识符。本项配置默认为 ``None`` 。\"\n\n#: ../../settings.rst:1336 a52590c6150e459495608626cf47cbc8\nmsgid \"\"\n\"Your GitHub URL (if you have one). It will then use this information to \"\n\"create a GitHub ribbon. The default is ``None``.\"\nmsgstr \"指定你的GitHub URL（如果有的话），此信息将被用于创建GitHub标记。本项配置默认为 ``None`` 。\"\n\n#: ../../settings.rst:1341 7a1fab7bd7d248aca77d6cebb71415fb\nmsgid \"\"\n\"Put any desired analytics scripts in this setting in ``publishconf.py``. \"\n\"Example:\"\nmsgstr \"在 ``publishconf.py`` 中设置此项，用于指定想要使用的统计分析脚本。如下例：\"\n\n#: ../../settings.rst:1353 f0fd9392aa0544248ae3ecfa505cbd50\nmsgid \"The default is ``None``.\"\nmsgstr \"默认为 ``None``\"\n\n#: ../../settings.rst:1357 5f3cf76b56694fa88318f38e06dfb9d9\nmsgid \"\"\n\"A list of tuples (Title, URL) for additional menu items to appear at the \"\n\"beginning of the main menu. The default is ``None``.\"\nmsgstr \"指定 (标题, URL) 元组的列表，用于指定额外的菜单项，会添加在菜单栏的开头。本项配置默认为 ``None`` 。\"\n\n#: ../../settings.rst:1362 23402de55a8d4b9a99f81aa3cbfd334f\nmsgid \"\"\n\"A list of tuples (Title, URL) for links to appear on the header. The \"\n\"default is ``None``.\"\nmsgstr \"指定 (标题, URL) 元组的列表，用于指定要展示在顶部的链接。本项配置默认为 ``None`` 。\"\n\n#: ../../settings.rst:1367 55e5a965cc1f45eea43a064d8c93c758\nmsgid \"\"\n\"A list of tuples (Title, URL) to appear in the \\\"social\\\" section. The \"\n\"default is ``None``.\"\nmsgstr \"指定 (标题, URL) 元组的列表，用于指定要展示在“social”部分的内容。本项配置默认为 ``None`` 。\"\n\n#: ../../settings.rst:1372 2b60264917b1429b9252029724038ed9\nmsgid \"\"\n\"Allows for adding a button to articles to encourage others to tweet about\"\n\" them. Add your Twitter username if you want this button to appear. The \"\n\"default is ``None``.\"\nmsgstr \"允许在文章中添加按钮，以便其他人在tweet上引用。如果希望显示此按钮，在此项中设置你的Twitter用户名。本项配置默认为 ``None`` 。\"\n\n#: ../../settings.rst:1378 f625d19e9cfc481f90ba05c050829ef3\nmsgid \"\"\n\"Allows override of the name of the links widget.  If not specified, \"\n\"defaults to \\\"links\\\". The default is ``None``.\"\nmsgstr \"指定用于覆盖“links”部分的名称，若不指定，默认设为 “links”。本项配置默认为 ``None`` 。\"\n\n#: ../../settings.rst:1383 54cd361f2d6c44ec8b8838f2364f9c7f\nmsgid \"\"\n\"Allows override of the name of the \\\"social\\\" widget.  If not specified, \"\n\"defaults to \\\"social\\\". The default is ``None``.\"\nmsgstr \"指定用于覆盖“social”部分的名称。若不指定，默认设为 “social”。本项配置默认为 ``None`` 。\"\n\n#: ../../settings.rst:1386 16874b8a80b149578efba9c45a78a9c7\nmsgid \"\"\n\"In addition, you can use the \\\"wide\\\" version of the ``notmyidea`` theme \"\n\"by adding the following to your configuration::\"\nmsgstr \"另外，你可以使用 ``notmyidea`` 主题的“宽屏”版本，在配置文件中添加下面这行配置即可：\"\n\n#: ../../settings.rst:1393 9d24e75fc67d4b98a06bbe832f7cd947\nmsgid \"Logging\"\nmsgstr \"日志\"\n\n#: ../../settings.rst:1395 9ddaf0c25b314e609b7de6873b2cfbcf\nmsgid \"\"\n\"Sometimes, a long list of warnings may appear during site generation. \"\n\"Finding the **meaningful** error message in the middle of tons of \"\n\"annoying log output can be quite tricky. In order to filter out redundant\"\n\" log messages, Pelican comes with the ``LOG_FILTER`` setting.\"\nmsgstr \"\"\n\"在站点生成过程中有时可能会出现一堆警告信息。在这一大堆日志输出中寻找 **有意义** \"\n\"的错误消息是非常棘手的。为了过滤掉多余的日志消息，可以在Pelican中指定 ``LOG_FILTER`` 设置。\"\n\n#: ../../settings.rst:1400 4c3ea89d86e846f3b38f146060f19c53\nmsgid \"\"\n\"``LOG_FILTER`` should be a list of tuples ``(level, msg)``, each of them \"\n\"being composed of the logging level (up to ``warning``) and the message \"\n\"to be ignored. Simply populate the list with the log messages you want to\"\n\" hide, and they will be filtered out.\"\nmsgstr \"\"\n\"``LOG_FILTER`` 是元组 ``(level, msg)`` ，level指定日志记录等级（最高为 ``warning`` \"\n\"），msg指定要忽略的消息。将想要隐藏的日志消息添加到此列表中就可以将他们过滤掉。\"\n\n#: ../../settings.rst:1405 ../../settings.rst:1413\n#: b62320cd110548f08cdc2b9ff52953d5\nmsgid \"For example::\"\nmsgstr \"例如：\"\n\n#: ../../settings.rst:1410 8a81ee82a14e4571852d1b955568028a\nmsgid \"\"\n\"It is possible to filter out messages by a template. Check out source \"\n\"code to obtain a template.\"\nmsgstr \"用模板字符串指定要过滤的消息也是可以的。具体的消息种类请查看源码。\"\n\n#: ../../settings.rst:1420 880baed291ff4f63836986b7c9082825\nmsgid \"\"\n\"Silencing messages by templates is a dangerous feature. It is possible to\"\n\" unintentionally filter out multiple message types with the same template\"\n\" (including messages from future Pelican versions). Proceed with caution.\"\nmsgstr \"通过模板过滤忽略消息是一个危险的功能。 使用同一模板可能会无意中过滤掉多种消息类型（包括来自新版本Pelican的消息），请谨慎行事。\"\n\n#: ../../settings.rst:1426 988048d34b0340beb22f11922ce0959a\nmsgid \"This option does nothing if ``--debug`` is passed.\"\nmsgstr \"当使用了 ``--debug`` 参数，此项设置就不会起作用。\"\n\n#: ../../settings.rst:1432 e1b3e06d5d29428ba28f2842124a7dcc\nmsgid \"Reading only modified content\"\nmsgstr \"只读取修改过的内容\"\n\n#: ../../settings.rst:1434 ff9209b75d1645c8b5af8941525fead0\nmsgid \"\"\n\"To speed up the build process, Pelican can optionally read only articles \"\n\"and pages with modified content.\"\nmsgstr \"为了加速网站构建过程，Pelican能够只读取修改过内容的文章和页面。\"\n\n#: ../../settings.rst:1437 5aee5c450b2047bea84e436894c179ef\nmsgid \"When Pelican is about to read some content source file:\"\nmsgstr \"当Pelican准备读取内容源文件时，会执行下面的规则：\"\n\n#: ../../settings.rst:1439 0aca4765447b49308b5a52b22a74d16a\nmsgid \"\"\n\"The hash or modification time information for the file from a previous \"\n\"build are loaded from a cache file if ``LOAD_CONTENT_CACHE`` is ``True``.\"\n\" These files are stored in the ``CACHE_PATH`` directory.  If the file has\"\n\" no record in the cache file, it is read as usual.\"\nmsgstr \"\"\n\"若 ``LOAD_CONTENT_CACHE`` 为 ``True`` \"\n\"，则从缓存文件中加载上一次构建时文件的哈希值或修改时间。这些缓存的文件存储在 ``CACHE_PATH`` \"\n\"所指定的目录中。若文件是新的，在缓存文件中没有记录，则照常读取。\"\n\n#: ../../settings.rst:1443 b8bb9d616a2d41b484ec5440fa09e57a\nmsgid \"The file is checked according to ``CHECK_MODIFIED_METHOD``:\"\nmsgstr \"文件会以 ``CHECK_MODIFIED_METHOD`` 设置的方式检查：\"\n\n#: ../../settings.rst:1449 fb6105f54c80491c80f99b8b447c5a4b\nmsgid \"\"\n\"If set to anything else or the necessary information about the file \"\n\"cannot be found in the cache file, the content is read as usual.\"\nmsgstr \"如果设置为其他任何值或在缓存文件中无法找到有关该文件的必要信息，则将照常读取内容。\"\n\n#: ../../settings.rst:1452 c46fe5fc65a44157b02b9e26befcefc6\nmsgid \"\"\n\"If the file is considered unchanged, the content data saved in a previous\"\n\" build corresponding to the file is loaded from the cache, and the file \"\n\"is not read.\"\nmsgstr \"如果Pelican认为文件没有更改过，会直接从上一次构建的对应文件中加载内容，源文件就不会被读取。\"\n\n#: ../../settings.rst:1455 0d597148978d4d228fc55b546d77ba97\nmsgid \"\"\n\"If the file is considered changed, the file is read and the new \"\n\"modification information and the content data are saved to the cache if \"\n\"``CACHE_CONTENT`` is ``True``.\"\nmsgstr \"\"\n\"若Pelican认为文件更改过了，则会读取源文件；若 ``CACHE_CONTENT`` 设为了 ``True`` \"\n\"，Pelican还会将修改后的信息以及内容数据存入缓存。\"\n\n#: ../../settings.rst:1459 e1c91fa9ecf84419a4e34e3fa0951b56\nmsgid \"\"\n\"If ``CONTENT_CACHING_LAYER`` is set to ``'reader'`` (the default), the \"\n\"raw content and metadata returned by a reader are cached. If this setting\"\n\" is instead set to ``'generator'``, the processed content object is \"\n\"cached. Caching the processed content object may conflict with plugins \"\n\"(as some reading related signals may be skipped) and the \"\n\"``WITH_FUTURE_DATES`` functionality (as the ``draft`` status of the \"\n\"cached content objects would not change automatically over time).\"\nmsgstr \"\"\n\"若 ``CONTENT_CACHING_LAYER`` 设为了 ``'reader'`` （默认值），则缓存reader返回的原始内容和元数据；若\"\n\" ``CONTENT_CACHING_LAYER`` 设为了 ``'generator'`` \"\n\"，则缓存处理过后的内容对象。缓存已处理的内容对象可能会和插件（因为可能会跳过一些与读取相关的信号）与 ``WITH_FUTURE_DATES`` \"\n\"的功能（因为已处理内容对象的 ``draft`` 状态不会改变）冲突。\"\n\n#: ../../settings.rst:1467 d46b39637a86497eb38667c8ecf9bf66\nmsgid \"\"\n\"Checking modification times is faster than comparing file hashes, but it \"\n\"is not as reliable because ``mtime`` information can be lost, e.g., when \"\n\"copying content source files using the ``cp`` or ``rsync`` commands \"\n\"without the ``mtime`` preservation mode (which for ``rsync`` can be \"\n\"invoked by passing the ``--archive`` flag).\"\nmsgstr \"\"\n\"检查文件修改时间比计算文件哈希更快，但事实上却不太可靠，因为 ``mtime`` 信息有丢失的可能。例如，使用 ``cp`` 或 \"\n\"``rsync`` 命令时没有开启 ``mtime`` 保留模式。（rsync可以通过指定 ``--archive`` 标志启用 \"\n\"``mtime`` 保留模式）\"\n\n#: ../../settings.rst:1473 3ef54978b60c4fcb9f2b0dc625797b74\nmsgid \"\"\n\"The cache files are Python pickles, so they may not be readable by \"\n\"different versions of Python as the pickle format often changes. If such \"\n\"an error is encountered, it is caught and the cache file is rebuilt \"\n\"automatically in the new format. The cache files will also be rebuilt \"\n\"after the ``GZIP_CACHE`` setting has been changed.\"\nmsgstr \"\"\n\"缓存文件使用的是Python \"\n\"pickles，因此不同版本的Python由于pickle文件格式变化可能无法读取缓存。如果遇到此类错误，会自动以新格式重新构建缓存。另外，当 \"\n\"``GZIP_CACHE`` 设置发生变化后，缓存也会自动重建。\"\n\n#: ../../settings.rst:1479 40fb13c9fe444d109c9014ce4f294f92\nmsgid \"\"\n\"The ``--ignore-cache`` command-line option is useful when the whole cache\"\n\" needs to be regenerated, such as when making modifications to the \"\n\"settings file that will affect the cached content, or just for debugging \"\n\"purposes. When Pelican runs in autoreload mode, modification of the \"\n\"settings file will make it ignore the cache automatically if \"\n\"``AUTORELOAD_IGNORE_CACHE`` is ``True``.\"\nmsgstr \"\"\n\"当需要重新生成整个缓存时，可以使用 ``--ignore-cache`` \"\n\"命令行选项，例如当需要修改会影响缓存内容的设置项时，或是调试时，都可以使用 ``--ignore-cache`` 。若 \"\n\"``AUTORELOAD_IGNORE_CACHE`` 设为了 ``True`` ，修改设置文件时会自动忽略缓存。\"\n\n#: ../../settings.rst:1485 05ea098bd1b34660878cc598cf9c639c\nmsgid \"\"\n\"Note that even when using cached content, all output is always written, \"\n\"so the modification times of the generated ``*.html`` files will always \"\n\"change. Therefore, ``rsync``-based uploading may benefit from the \"\n\"``--checksum`` option.\"\nmsgstr \"\"\n\"需要注意的是，即使使用了缓存的内容，最终的输出文件也始终会进行重新写入，因此生成的 ``*.html`` 文件的修改时间始终会变化。所以，基于 \"\n\"``rsync`` 进行上传时，可以考虑使用 ``--checksum`` 选项。\"\n\n#: ../../settings.rst:1492 358bf9edd2594e2fa3db87aae3703994\nmsgid \"Example settings\"\nmsgstr \"配置示例\"\n\n#~ msgid \"Your site name\"\n#~ msgstr \"站点名称\"\n\n#~ msgid \"The URL to refer to an article.\"\n#~ msgstr \"文章的URL格式。\"\n\n#~ msgid \"The place where we will save an article.\"\n#~ msgstr \"文章的存储位置。\"\n\n#~ msgid \"The URL we will use to link to a page.\"\n#~ msgstr \"页面的URL格式。\"\n\n#~ msgid \"The URL used to link to a page draft.\"\n#~ msgstr \"draft状态页面的URL。\"\n\n#~ msgid \"The actual location a page draft is saved at.\"\n#~ msgstr \"draft状态页面的实际存储位置。\"\n\n#~ msgid \"The URL to use for an author.\"\n#~ msgstr \"某一个作者的URL格式。\"\n\n#~ msgid \"The location to save an author.\"\n#~ msgstr \"某一个作者的存储位置。\"\n\n#~ msgid \"The URL to use for a category.\"\n#~ msgstr \"某一个分类的URL格式。\"\n\n#~ msgid \"The location to save a category.\"\n#~ msgstr \"某一个分类的存储位置。\"\n\n#~ msgid \"The URL to use for a tag.\"\n#~ msgstr \"某一个标签的URL格式。\"\n\n#~ msgid \"Default is the system locale.\"\n#~ msgstr \"默认值与系统的地区设置保持一致。\"\n\n#~ msgid \"Default author (usually your name).\"\n#~ msgstr \"默认作者（通常是你自己的名字）。\"\n\n#~ msgid \"See also ``SLUGIFY_SOURCE``.\"\n#~ msgstr \"另请参看 ``SLUGIFY_SOURCE`` 。\"\n\n#~ msgid \"The location to save the Atom feed.\"\n#~ msgstr \"指定保存Atom订阅源的位置。\"\n\n#~ msgid \"The location to save the RSS feed.\"\n#~ msgstr \"指定保存RSS订阅源的位置。\"\n"
  },
  {
    "path": "docs/locale/zh_CN/LC_MESSAGES/sphinx.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) 2010–2024\n# This file is distributed under the same license as the PELICAN package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, 2024.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PELICAN 4\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-02-02 10:32+0800\\n\"\n\"PO-Revision-Date: 2026-02-02 10:32+0800\\n\"\n\"Last-Translator: GeorgeHu <dhxxhch@163.com>\\n\"\n\"Language: zh_CN\\n\"\n\"Language-Team: \\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=utf-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Generated-By: Babel 2.17.0\\n\"\n\n#: ../../_templates/page.html:13 d28434a1f790406f866556f17fe43bea\nmsgid \"Skip to content\"\nmsgstr \"\"\n\n#: ../../_templates/page.html:68 11a1e7e70c0542dcb853ce6d667b4b13\nmsgid \"Back to top\"\nmsgstr \"返回顶部\"\n\n#: ../../_templates/page.html:121 b65dfb48967147f688c1d2166a0d3e60\nmsgid \"Next\"\nmsgstr \"下一节\"\n\n#: ../../_templates/page.html:133 44ccbbca34f24a5fb1083bcda42d2399\nmsgid \"Previous\"\nmsgstr \"前一节\"\n\n#: ../../_templates/page.html:136 fd17897083a54a929cff164a233bd4d7\nmsgid \"Home\"\nmsgstr \"首页\"\n\n#: ../../_templates/page.html:149 17589e72a0364f6b8532d40aea593ad7\n#, python-format\nmsgid \"<a href=\\\"%(path)s\\\">Copyright</a> &#169; %(copyright)s\"\nmsgstr \"<a href=\\\"%(path)s\\\">Copyright</a> &#169; %(copyright)s\"\n\n#: ../../_templates/page.html:153 6603e5fc982d4b8b8ba3145dcf098be9\n#, python-format\nmsgid \"\"\n\"Copyright &#169; %(copyright)s, <a \"\n\"href=\\\"https://justinmayer.com\\\">Justin Mayer</a>, Alexis Metaireau, and \"\n\"contributors\"\nmsgstr \"\"\n\"Copyright &#169; %(copyright)s, <a \"\n\"href=\\\"https://justinmayer.com\\\">Justin Mayer</a>, Alexis Metaireau, and \"\n\"contributors\"\n\n#: ../../_templates/page.html:161 757352d714c74c48ad540604822a210e\n#, python-format\nmsgid \"Last updated on %(last_updated)s\"\nmsgstr \"最后更新于 %(last_updated)s\"\n\n#: ../../_templates/page.html:207 6b07f3b7330d47a3976e765b14da9ad1\nmsgid \"On this page\"\nmsgstr \"本页目录\"\n"
  },
  {
    "path": "docs/locale/zh_CN/LC_MESSAGES/themes.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) 2010–2024\n# This file is distributed under the same license as the PELICAN package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, 2024.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PELICAN 4\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2024-06-25 20:36+0800\\n\"\n\"PO-Revision-Date: 2024-06-26 19:00+0800\\n\"\n\"Last-Translator: GeorgeHu <dhxxhch@163.com>\\n\"\n\"Language: zh_CN\\n\"\n\"Language-Team: \\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=utf-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Generated-By: Babel 2.15.0\\n\"\n\n#: ../../themes.rst:4 89902fe106274689a45bfad9447f4485\nmsgid \"Themes\"\nmsgstr \"主题\"\n\n#: ../../themes.rst:6 877321a191544e6db8b1fe257b7bfc82\nmsgid \"\"\n\"There is a community-managed repository of `Pelican Themes`_ for people \"\n\"to share and use.\"\nmsgstr \"\"\n\"有一个由社区管理的主题仓库 `Pelican Themes`_ 供大家使用。\"\n\n#: ../../themes.rst:9 6f0fdcf7ea28413482621e993a00aba2\nmsgid \"\"\n\"Please note that while we do our best to review and merge theme \"\n\"contributions, they are submitted by the Pelican community and thus may \"\n\"have varying levels of support and interoperability.\"\nmsgstr \"\"\n\"请注意，虽然我们已经尽全力审查与合并主题，但是由于他们是由社区提交的，因此\"\n\"支持性和互操作性各有不同。\"\n\n#: ../../themes.rst:14 f4083056816746ad8779108e8605f782\nmsgid \"Creating Themes\"\nmsgstr \"创建主题\"\n\n#: ../../themes.rst:16 11544ff05900447c9d89b7e4b762b456\nmsgid \"\"\n\"To generate its HTML output, Pelican uses the `Jinja \"\n\"<https://palletsprojects.com/p/jinja/>`_ templating engine due to its \"\n\"flexibility and straightforward syntax. If you want to create your own \"\n\"theme, feel free to take inspiration from the `\\\"simple\\\" theme \"\n\"<https://github.com/getpelican/pelican/tree/main/pelican/themes/simple/templates>`_.\"\nmsgstr \"\"\n\"Pelican使用 `Jinja <https://palletsprojects.com/p/jinja/>`_ 来生成HTML。\"\n\"如果你想要创建你自己的主题，请从 `\\\"simple\\\" 主题 \"\n\"<https://github.com/getpelican/pelican/tree/master/pelican/themes/simple/templates>`_ \"\n\"中找寻灵感。\"\n\n#: ../../themes.rst:22 646df766f1a64f6e89ba22466a9a57ee\nmsgid \"\"\n\"To generate your site using a theme you have created (or downloaded \"\n\"manually and then modified), you can specify that theme via the ``-t`` \"\n\"flag::\"\nmsgstr \"\"\n\"要使用你自己创建的主题生成站点，你可以通过命令行中的 ``-t`` 参数指定主题：\"\n\n#: ../../themes.rst:27 f3b0f229f56444d0b09f27dcc5076398\nmsgid \"\"\n\"If you'd rather not specify the theme on every invocation, you can define\"\n\" ``THEME`` in your settings to point to the location of your preferred \"\n\"theme.\"\nmsgstr \"\"\n\"如果你不希望每次都通过命令行手动指定主题，你可以在配置文件中定义 ``THEME`` \"\n\"来指定你希望使用的主题的位置。\"\n\n#: ../../themes.rst:32 b8028cb48f844e16b49bd30e6f7c7ec5\nmsgid \"Structure\"\nmsgstr \"结构\"\n\n#: ../../themes.rst:34 a3fcbbe24e4c4448b09db74e7140dd52\nmsgid \"To make your own theme, you must follow the following structure::\"\nmsgstr \"你需要遵循下面的结构来制作你自己的主题：\"\n\n#: ../../themes.rst:52 153830a0dc1c47358f1fd67c11174676\nmsgid \"\"\n\"`static` contains all the static assets, which will be copied to the \"\n\"output `theme` folder. The above filesystem layout includes CSS and image\"\n\" folders, but those are just examples. Put what you need here.\"\nmsgstr \"\"\n\"`static` 文件夹包含了所有静态资源，会被复制输出到 `theme` 文件夹中。上面的文件夹\"\n\"布局结构包括了CSS和image文件夹，但是这只是举个例子。你可以根据需求安排文件。\"\n\n#: ../../themes.rst:56 e923579cd7b74cdc94f43d4da4e47b2e\nmsgid \"\"\n\"`templates` contains all the templates that will be used to generate the \"\n\"content. The template files listed above are mandatory; you can add your \"\n\"own templates if it helps you keep things organized while creating your \"\n\"theme.\"\nmsgstr \"\"\n\"`templates` 文件夹包含了需要用到的所有模板文件，这些模板文件会用于生成网站内容。\"\n\"上面列出的模板文件都是必须有的。当然，你可以添加一些其他的模板来帮助组织主题文件。\"\n\n#: ../../themes.rst:64 354197c97b424a53b682d31d2432bbd7\nmsgid \"Templates and Variables\"\nmsgstr \"模板和变量\"\n\n#: ../../themes.rst:66 263ff11382b1433082f35b605ed76f4b\nmsgid \"\"\n\"The idea is to use a simple syntax that you can embed into your HTML \"\n\"pages. This document describes which templates should exist in a theme, \"\n\"and which variables will be passed to each template at generation time.\"\nmsgstr \"\"\n\"你可以将一些简单的语法嵌入到HTML文件中。以下文档描述了哪些模板需要存在于主题中，\"\n\"以及有哪些变量可以在模板中使用。\"\n\n#: ../../themes.rst:70 b511ed5df3fc4f75a8e9ca6e874b6cf7\nmsgid \"\"\n\"All templates will receive the variables defined in your settings file, \"\n\"as long as they are in all-caps. You can access them directly.\"\nmsgstr \"\"\n\"所有模板都能接收到配置文件中定义的变量，变量名都是全大写的，可以直接使用。\"\n\n#: ../../themes.rst:77 903d9890350a4b08a3c5e11bdc202d10\nmsgid \"Common Variables\"\nmsgstr \"通用变量\"\n\n#: ../../themes.rst:79 fa18fc2c334d4b51ae7545d24a8b5df5\nmsgid \"All of these settings will be available to all templates.\"\nmsgstr \"下列变量在所有模板中均可使用。\"\n\n#: ../../themes.rst:82 ../../themes.rst:170 ../../themes.rst:199\n#: ../../themes.rst:233 ../../themes.rst:266 ../../themes.rst:306\n#: ../../themes.rst:322 ../../themes.rst:355 1a4a93014c47420d8957a7f2209d6525\n#: 2d1889e9a23a4cb298d38366289f381d 63553de1af084662a41fded0a700913d\n#: 87ec83ae24564eaf831ada4f4aab01a3 8907d23ec9f94b5b83a9bdd717fc95bd\n#: 951f8b457243424da836ecf85c5db0e1 a3866a27423c4782a6d47b28d41e1144\n#: eee781bef37d4e94a9796ff50dd63447\nmsgid \"Variable\"\nmsgstr \"变量名\"\n\n#: ../../themes.rst:82 ../../themes.rst:170 ../../themes.rst:199\n#: ../../themes.rst:233 ../../themes.rst:266 ../../themes.rst:306\n#: ../../themes.rst:322 ../../themes.rst:355 ../../themes.rst:446\n#: ../../themes.rst:490 ../../themes.rst:509 17384d55be144a6ab765864d5833f96f\n#: 2e69f59326a04747b7655b61a713bcf5 46ecfcac4e0b48879a665f5ded2abc4c\n#: 4b4d47cfd511455db6eb2793e60907b6 6b9bab6f2603419da0032456f90e326a\n#: 9cadd069ae2b471eaaeeac1281b7f88d af7a426781734d61a2f1c95aff008adc\n#: c1274b2e4b5442d7b9774ffacdd22c1a f53c09af9fd642f7a26552ada70160d8\n#: f9ffc9bb411340199e68bb28e1c38e97 ff0cc823d5f44c71be4d9dfb09198ae5\nmsgid \"Description\"\nmsgstr \"描述\"\n\n#: ../../themes.rst:84 92684afe53b74e5eacca15acf5567c1c\nmsgid \"output_file\"\nmsgstr \"output_file\"\n\n#: ../../themes.rst:84 9534d42aed3a4f5bbcefb8f9aebefc9e\nmsgid \"\"\n\"The name of the file currently being generated. For instance, when \"\n\"Pelican is rendering the home page, output_file will be \\\"index.html\\\".\"\nmsgstr \"\"\n\"当前正在生成的文件名。例如在Pelican渲染主页时，此变量的值就是“index.html”。\"\n\n#: ../../themes.rst:87 ../../themes.rst:202 ../../themes.rst:236\n#: ../../themes.rst:325 ../../themes.rst:406 5e810b19b7934988905a23189aa25584\n#: 7ce75b9ff72a41368aa4d85147b3ee01 b304eca8c6ab4a97b9f9816e48e785a3\n#: b4b801b67a5f4a038664df8273752437 f6d5de62ec124133abd3e71d052076c9\nmsgid \"articles\"\nmsgstr \"articles\"\n\n#: ../../themes.rst:87 a37338288479498dabc0d35a3499ae2a\nmsgid \"\"\n\"The list of articles, ordered descending by date. All the elements are \"\n\"`Article` objects, so you can access their attributes (e.g. title, \"\n\"summary, author etc.). Sometimes this is shadowed (for instance, in the \"\n\"tags page). You will then find info about it in the `all_articles` \"\n\"variable.\"\nmsgstr \"\"\n\"文章列表，以日期降序排列。所有元素都是 `Article` 对象，因此你可以访问 `Article` \"\n\"对象的属性（例如title、summary、author等）。有时候此变量是隐藏的（例如在标签页面中）。\"\n\"但仍可以在 `all_articles` 变量中找到相关信息。\"\n\n#: ../../themes.rst:93 ../../themes.rst:203 ../../themes.rst:237\n#: ../../themes.rst:326 ../../themes.rst:408 100c5d8c8602411da08bfcde279249f2\n#: 24ff711ecb9e4308b52d404b822244f3 389e8343632d48048b4ced0128d20011\n#: 3d9a59ea4c7a428998e0bb4df84c6576 b0fe593f0e774b7a9b33ff8e44c8284a\nmsgid \"dates\"\nmsgstr \"dates\"\n\n#: ../../themes.rst:93 957d856345744280bb8cde05d15b934c\nmsgid \"The same list of articles, but ordered by date, ascending.\"\nmsgstr \"和articles相同的文章列表，但是以日期升序排列\"\n\n#: ../../themes.rst:95 850f75175d0f44c9987b95b244e0e085\nmsgid \"hidden_articles\"\nmsgstr \"hidden_articles\"\n\n#: ../../themes.rst:95 2853b0eb27e241c78c5ad83d8d502905\nmsgid \"The list of hidden articles\"\nmsgstr \"处于隐藏状态的文章的列表\"\n\n#: ../../themes.rst:96 68baf2e00aeb4fbbb9b18c562f5215de\nmsgid \"drafts\"\nmsgstr \"drafts\"\n\n#: ../../themes.rst:96 3eefce5813424f4b8a5edb283ec34699\nmsgid \"The list of draft articles\"\nmsgstr \"处于草稿状态的文章的列表\"\n\n#: ../../themes.rst:97 2bde499d530048a8ba3e5fb72a4a1840\nmsgid \"period_archives\"\nmsgstr \"period_archives\"\n\n#: ../../themes.rst:97 afad8caed5294d4bae4922b2674806ff\nmsgid \"\"\n\"A dictionary containing elements related to time-period archives (if \"\n\"enabled). See the section :ref:`Listing and Linking to Period Archives \"\n\"<period_archives_variable>` for details.\"\nmsgstr \"\"\n\"一个字典，包含与时间段存档相关的元素（若启用了时间段存档）。详见 \"\n\":ref:`时间段存档的列表和链接 <period_archives_variable>`\"\n\n#: ../../themes.rst:101 ../../themes.rst:450 0b796b141cc24e34b57bc554273720c1\n#: d5bf3dd243d04c55ace1738de4d5b81b\nmsgid \"authors\"\nmsgstr \"authors\"\n\n#: ../../themes.rst:101 10010e1b527e4eedb7477d52bbf0ed94\nmsgid \"\"\n\"A list of (author, articles) tuples, containing all the authors and \"\n\"corresponding articles (values)\"\nmsgstr \"\"\n\"元组(author, articles)的列表，包含所有作者及对应文章。\"\n\n#: ../../themes.rst:103 7bb90c8b99344911b68de2dc8ba1a9d7\nmsgid \"categories\"\nmsgstr \"categories\"\n\n#: ../../themes.rst:103 becaee92fa434a47bb2ffa4ba6d3d863\nmsgid \"\"\n\"A list of (category, articles) tuples, containing all the categories and \"\n\"corresponding articles (values)\"\nmsgstr \"\"\n\"元组(category, articles)的列表，包含所有分类及对应文章\"\n\n#: ../../themes.rst:105 ../../themes.rst:470 ../../themes.rst:529\n#: 9d21fa3040b14b91a47dff071caae024 b8597a5c585e43a0bb544bfe8cf9bd26\n#: d692f555b4ea461ca4d8c0c65a67f21a\nmsgid \"tags\"\nmsgstr \"tags\"\n\n#: ../../themes.rst:105 0c0424ec68a74f578e271d0b1fe44b28\nmsgid \"\"\n\"A list of (tag, articles) tuples, containing all the tags and \"\n\"corresponding articles (values)\"\nmsgstr \"\"\n\"元组(tag, articles)的列表，包含所有标签及对应文章\"\n\n#: ../../themes.rst:107 196d2ef3131b4ab2b7e90a43d8c17dcd\nmsgid \"pages\"\nmsgstr \"pages\"\n\n#: ../../themes.rst:107 abb2b6303bb44b3e9335fcc9bfa2a704\nmsgid \"The list of pages\"\nmsgstr \"页面的列表\"\n\n#: ../../themes.rst:108 14a71679646448d59f6ccc2c63c2cc8b\nmsgid \"hidden_pages\"\nmsgstr \"hidden_pages\"\n\n#: ../../themes.rst:108 dfc32fdbe91240a78c15ff048e2f58ce\nmsgid \"The list of hidden pages\"\nmsgstr \"处于隐藏状态的页面的列表\"\n\n#: ../../themes.rst:109 78a644f88301408e977449a4fc0ffe12\nmsgid \"draft_pages\"\nmsgstr \"draft_pages\"\n\n#: ../../themes.rst:109 7418727938f343da8cb0071239f67d71\nmsgid \"The list of draft pages\"\nmsgstr \"处于草稿状态的页面的列表\"\n\n#: ../../themes.rst:114 04e0bd5e7d504ff8975c8492ce8c250a\nmsgid \"Sorting\"\nmsgstr \"排序\"\n\n#: ../../themes.rst:116 edae254af6974908bbeb7125dca0c708\nmsgid \"\"\n\"URL wrappers (currently categories, tags, and authors), have comparison \"\n\"methods that allow them to be easily sorted by name::\"\nmsgstr \"\"\n\"URL包装器（分类、标签、作者），都拥有比较方法，使其易于按名称排序：\"\n\n#: ../../themes.rst:121 878bb8a3a3064552b7608444cb419856\nmsgid \"\"\n\"If you want to sort based on different criteria, `Jinja's sort command`__\"\n\" has a number of options.\"\nmsgstr \"\"\n\"如果你想要以不同条件进行排序，可以使用 `Jinja的排序命令`__ ，其中有丰富的选项。\"\n\n#: ../../themes.rst:128 3f3c857d79ed447f9dd3f5ce91082747\nmsgid \"Date Formatting\"\nmsgstr \"日期格式\"\n\n#: ../../themes.rst:130 37d3f94188aa435297071a869bfdca96\nmsgid \"\"\n\"Pelican formats the date according to your settings and locale \"\n\"(``DATE_FORMATS``/``DEFAULT_DATE_FORMAT``) and provides a ``locale_date``\"\n\" attribute. On the other hand, the ``date`` attribute will be a \"\n\"`datetime`_ object. If you need custom formatting for a date different \"\n\"than your settings, use the Jinja filter ``strftime`` that comes with \"\n\"Pelican. Usage is same as Python `strftime`_ format, but the filter will \"\n\"do the right thing and format your date according to the locale given in \"\n\"your settings::\"\nmsgstr \"\"\n\"Pelican会根据设置和地区（ ``DATE_FORMATS``/``DEFAULT_DATE_FORMAT`` ）对日期\"\n\"进行格式化，同时还会提供一个 ``locale_date`` 属性。 ``date`` 属性以 `datetime`_ \"\n\"类表示。如果你需要使用与设置中不同的自定义日期格式，使用Jinja中的 ``strftime`` \"\n\"过滤器即可。用法Python中的 `strftime`_ 相同，但是过滤器会根据设置中给出的地区对\"\n\"日期进行格式化：\"\n\n#: ../../themes.rst:144 cc5bc390c54b4c4f96641b2d8efe2169\nmsgid \"Checking Loaded Plugins\"\nmsgstr \"检测已加载的插件\"\n\n#: ../../themes.rst:146 2805eea94378479eafe1f9e214875f44\nmsgid \"\"\n\"Pelican provides a ``plugin_enabled`` Jinja test for checking if a \"\n\"certain plugin is enabled. This test accepts a plugin name as a string \"\n\"and will return a Boolean. Namespace plugins can be specified by full \"\n\"name (``pelican.plugins.plugin_name``) or short name (``plugin_name``). \"\n\"The following example uses the ``webassets`` plugin to minify CSS if the \"\n\"plugin is enabled and otherwise falls back to regular CSS::\"\nmsgstr \"\"\n\"Pelican 提供了一个名为 ``plugin_enabled`` 的Jinja test，可用于检测某个插件是否启用。\"\n\"此test以字符串形式接受一个插件名称，并且返回一个布尔值。命名空间插件可以通过全名\"\n\"（ ``pelican.plugins.plugin_name`` ）或者短名称（ ``plugin_name`` ）指定。\"\n\"下面的例子中通过 ``webassets`` 插件来减小CSS的体积，但若此插件未启用，则回滚回普通的CSS：\"\n\n#: ../../themes.rst:162 f31869529aef47a28224e3da3bc0c702\nmsgid \"index.html\"\nmsgstr \"index.html\"\n\n#: ../../themes.rst:164 d412aecaa8e34b2ca56032be8711b258\nmsgid \"This is the home page or index of your blog, generated at ``index.html``.\"\nmsgstr \"站点的主页，可以理解为推文的索引页，生成为 ``index.html`` 。\"\n\n#: ../../themes.rst:166 396a268629374d1aaef9857ccff9ee53\nmsgid \"\"\n\"If pagination is active, subsequent pages will reside in \"\n\"``index{number}.html``.\"\nmsgstr \"\"\n\"如果开启了分页功能，后续的页面会以 ``index{number}.html`` 的形式生成。\"\n\n#: ../../themes.rst:172 ../../themes.rst:205 ../../themes.rst:239\n#: ../../themes.rst:328 08f6e73beb544181b9b2627ad68dbbfe\n#: 244d220cd8684bb68489bf61227f87b5 34b8185111f54d8fbffa9ac5a87302a8\n#: d7bcb30486284e9dac239a40d4b9f229\nmsgid \"articles_paginator\"\nmsgstr \"articles_paginator\"\n\n#: ../../themes.rst:172 ../../themes.rst:205 ../../themes.rst:239\n#: ../../themes.rst:328 3fa810e9ae1d4dc1839754210e5d2570\n#: 9554b801f6df475caedff0345c5dfb93 bbc15c5dfe934bcd9e5f258f2008af11\n#: e5952c856b7d4670a93a99863ef94c49\nmsgid \"A paginator object for the list of articles\"\nmsgstr \"一个分页器对象，其中存放着文章列表\"\n\n#: ../../themes.rst:173 ../../themes.rst:206 ../../themes.rst:240\n#: ../../themes.rst:329 2362ac4e51264ba8b1a38272414c026c\n#: 755bbbd447fe420eb124c1dcbfecd767 7eaa5ec86823488fa38009e3a5bf1756\n#: 82eef974e6c2428eb29528b9a6cae6d3\nmsgid \"articles_page\"\nmsgstr \"articles_page\"\n\n#: ../../themes.rst:173 ../../themes.rst:206 ../../themes.rst:240\n#: ../../themes.rst:329 283875f54861414396ce8695d3002f7d\n#: b7400c136a8340df9eaa5e5f29b81766 ba00d04cfe6c4040bf704c17be73470f\n#: cdb81b11ea1a44d2890915c496eada40\nmsgid \"The current page of articles\"\nmsgstr \"当前分页包含的文章的列表\"\n\n#: ../../themes.rst:174 ../../themes.rst:207 ../../themes.rst:241\n#: ../../themes.rst:330 4fd0b5d101a74f23b8fb32e95b35af7f\n#: 6d6631ebf17e436ebd910cb778fa47e6 8869fe25c487475ea64c0ab80ee8c48b\n#: efd8e4bfc9234996870b90026c00f695\nmsgid \"articles_previous_page\"\nmsgstr \"articles_previous_page\"\n\n#: ../../themes.rst:174 ../../themes.rst:207 ../../themes.rst:241\n#: ../../themes.rst:330 228a67aba662491bb3e8b8f53d936921\n#: 4e0499da01e146d78c4c50ab293ceaec a9c5b7f1fb854f359f596f2de65510e9\n#: eaeb09fc611545ec87fbdbe32b7da599\nmsgid \"The previous page of articles (``None`` if page does not exist)\"\nmsgstr \"前一分页包含的文章的列表（若没有前一页，此变量值为 ``None`` ）\"\n\n#: ../../themes.rst:176 ../../themes.rst:209 ../../themes.rst:243\n#: ../../themes.rst:332 44e81860c57c4136953fec9d390a1896\n#: 92e4766edf0d4f1a94801521a3ccc8c6 c7f7e0e63a5e4b3f838df1082628f71f\n#: eb4130c14eef4dc59383097aa4bfd9cc\nmsgid \"articles_next_page\"\nmsgstr \"articles_next_page\"\n\n#: ../../themes.rst:176 ../../themes.rst:209 ../../themes.rst:243\n#: ../../themes.rst:332 0aaccba1bbd843f3a13da1b8b206cb47\n#: 87d1cad4927745329bf74840147f3cae 9df65206ff0040caae56f0d2185e63d4\n#: a38e11e768ec40acafdc943d00fd1c39\nmsgid \"The next page of articles (``None`` if page does not exist)\"\nmsgstr \"后一分页包含的文章的列表（若没有后一页，此变量值为 ``None`` ）\"\n\n#: ../../themes.rst:178 ../../themes.rst:211 ../../themes.rst:245\n#: ../../themes.rst:334 06c22ce247524bc59649f37ac570360d\n#: 3f913f031d1544049d4204b5c786e8eb 80e9ef1975ac43cb87b1cb1e2292a15d\n#: 9d50cd6bc33542ff9ec268664242cdac\nmsgid \"dates_paginator\"\nmsgstr \"dates_paginator\"\n\n#: ../../themes.rst:178 ../../themes.rst:211 470234ce4ff84c1282773c5e074a0984\n#: 66b61e29b0d94312be1924ffbf6a76f0\nmsgid \"A paginator object for the article list, ordered by date, ascending.\"\nmsgstr \"分页器对象，存放着以日期正序排列的文章列表。\"\n\n#: ../../themes.rst:180 ../../themes.rst:213 ../../themes.rst:247\n#: ../../themes.rst:336 06688dad88b84be0a1b8a77904d3e36c\n#: 4c3336d0cc6146c0854e1a3b0a01226a c22fbf78288d40c2a7f53a0e05827bc9\n#: cbead4319b8449948907728edd1563e5\nmsgid \"dates_page\"\nmsgstr \"dates_page\"\n\n#: ../../themes.rst:180 ../../themes.rst:213 332ab164d0d14965a064f41289fd8b5a\n#: 9c0313b487514c1a8ea9ed741a022a98\nmsgid \"The current page of articles, ordered by date, ascending.\"\nmsgstr \"以日期正序（从旧到新）排列时，当前分页包含的文章的列表。\"\n\n#: ../../themes.rst:182 ../../themes.rst:215 ../../themes.rst:249\n#: ../../themes.rst:338 225a16b1ca764c1297a6126e82294ea5\n#: 25b7b90357db4d999771a5dbb3ee46f0 f42233112a7940cfa0e448f72c254385\n#: fd276760afc04d66a3abb295db0c491b\nmsgid \"dates_previous_page\"\nmsgstr \"dates_previous_page\"\n\n#: ../../themes.rst:182 ../../themes.rst:215 ../../themes.rst:249\n#: ../../themes.rst:338 058e893b353046ffbdee082ea0ddcde2\n#: 0b15ab2a1e6e4d58a6648a72a2207ae5 13dc7929b6e9453bac9c30a9abf9a5f6\n#: 62de8d49e771412a89266c2d8731bd49\nmsgid \"\"\n\"The previous page of articles, ordered by date, ascending (``None`` if \"\n\"page does not exist)\"\nmsgstr \"\"\n\"以日期正序（从旧到新）排列时，前一分页包含的文章的列表。\"\n\"（若没有前一页，此变量值为 ``None`` ）\"\n\n#: ../../themes.rst:184 ../../themes.rst:217 ../../themes.rst:251\n#: ../../themes.rst:340 156f78d11b96475a9d52085860a1e6c5\n#: 33b0c94c117c41ee955df750c1fd728c 5763fdf2c1cd43fc96013756029661d6\n#: add31a94f5dc490684aac08b7bcad8e5\nmsgid \"dates_next_page\"\nmsgstr \"dates_next_page\"\n\n#: ../../themes.rst:184 ../../themes.rst:217 ../../themes.rst:251\n#: ../../themes.rst:340 a61d56f03b5946899f9e951eba65df08\n#: ac60da91c10449cc8d519beb0b2f1102 cdfa2284c2c54da3a366d1deaefab551\n#: dc9ea16f9bb44d1d8d1032397aac1a8e\nmsgid \"\"\n\"The next page of articles, ordered by date, ascending (``None`` if page \"\n\"does not exist)\"\nmsgstr \"\"\n\"以日期正序（从旧到新）排列时，后一分页包含的文章的列表。\"\n\"（若没有后一页，此变量值为 ``None`` ）\"\n\n#: ../../themes.rst:186 ../../themes.rst:219 ../../themes.rst:253\n#: ../../themes.rst:342 ../../themes.rst:493 501f30d99fc441f3b5070f8703c7e324\n#: 6a4735af4aa84d56bf745244c29f7e0c 8c9158f1b7f04d5ea07058d816be2e70\n#: cf1d564d80d34860a32fcddbac41375c e8c83819bbc0448799bae5ea19538100\nmsgid \"page_name\"\nmsgstr \"page_name\"\n\n#: ../../themes.rst:186 99f67be157844a6e85f1ebe6d40c9182\nmsgid \"'index' -- useful for pagination links\"\nmsgstr \"值为 'index' ——在分页链接中很实用\"\n\n#: ../../themes.rst:191 01c6da9f6c7b431d971fa0ec426f948f\nmsgid \"author.html\"\nmsgstr \"author.html\"\n\n#: ../../themes.rst:193 feee792cfdbf49b3a289762c8e0e0edb\nmsgid \"\"\n\"This template will be processed for each of the existing authors, with \"\n\"output generated according to the ``AUTHOR_SAVE_AS`` setting (`Default:` \"\n\"``author/{slug}.html``). If pagination is active, subsequent pages will \"\n\"by default reside at ``author/{slug}{number}.html``.\"\nmsgstr \"\"\n\"此模板会应用于每个已存在的作者上，并根据配置项 ``AUTHOR_SAVE_AS`` 确定输出路径\"\n\"（ `默认值为：` ``author/{slug}.html`` ）。如果启用了分页，后续页面会保存为 \"\n\"``author/{slug}{number}.html`` 。\"\n\n#: ../../themes.rst:201 ../../themes.rst:448 ../../themes.rst:511\n#: 1f0784e3f85140afab2178a061897017 af9d9be813ae4f43be00ff6770a75fe5\n#: f9ea3f154b7f4268ab412ea2e6bf6c87\nmsgid \"author\"\nmsgstr \"author\"\n\n#: ../../themes.rst:201 01d284aaf9534cc5852557cc4063b6dc\nmsgid \"The name of the author being processed\"\nmsgstr \"当前正在处理的作者名\"\n\n#: ../../themes.rst:202 9a53c5cec5fb4fdd8df98bab9cfc77fa\nmsgid \"Articles by this author\"\nmsgstr \"当前作者的文章\"\n\n#: ../../themes.rst:203 4d5fc91dac964d63a9ac28ff07f44b97\nmsgid \"Articles by this author, but ordered by date, ascending\"\nmsgstr \"当前作者的文章，以日期正序排列\"\n\n#: ../../themes.rst:219 2f5aca7ff98c4de4bfdd82d6e57803e1\nmsgid \"\"\n\"AUTHOR_URL where everything after `{slug}` is removed -- useful for \"\n\"pagination links\"\nmsgstr \"\"\n\"变量值与AUTHOR_URL一致，所有在 `{slug}` 之后的字符都会被删除——这对分页链接很有用\"\n\n#: ../../themes.rst:225 a603e6fd07f7404ca86716249a4347ef\nmsgid \"category.html\"\nmsgstr \"category.html\"\n\n#: ../../themes.rst:227 10beee5e95394fd2ac3ab29e76cc06fc\nmsgid \"\"\n\"This template will be processed for each of the existing categories, with\"\n\" output generated according to the ``CATEGORY_SAVE_AS`` setting \"\n\"(`Default:` ``category/{slug}.html``). If pagination is active, \"\n\"subsequent pages will by default reside at \"\n\"``category/{slug}{number}.html``.\"\nmsgstr \"\"\n\"此模板会应用于每个已存在的分类上，根据设置项 ``CATEGORY_SAVE_AS`` 确定输出路径\"\n\"（`默认值为：` ``category/{slug}.html`` ）。如果启用了分页，后续页面会保存为 \"\n\"``category/{slug}{number}.html`` 。\"\n\n#: ../../themes.rst:235 ../../themes.rst:269 ../../themes.rst:452\n#: 04b6f1c1d1f04e0e806f898dda0df53e a8a2719723a44a04b0cc7516a9b8e811\n#: fc79984925564ea5b5dece084dbd3f15\nmsgid \"category\"\nmsgstr \"category\"\n\n#: ../../themes.rst:235 feb49105f74f4e93b8f7f3471327cc4b\nmsgid \"The name of the category being processed\"\nmsgstr \"正在处理的分类名称\"\n\n#: ../../themes.rst:236 fa6d2909a42446edbce322e4bdd74ca9\nmsgid \"Articles for this category\"\nmsgstr \"此分类下的文章\"\n\n#: ../../themes.rst:237 c89759eb3241470fb8f098ccb022f286\nmsgid \"Articles for this category, but ordered by date, ascending\"\nmsgstr \"此分类下的文章，以日期正序排列\"\n\n#: ../../themes.rst:245 ../../themes.rst:334 03985448999c44859adcb45b7a9da87c\n#: b5506c9105b843de92190998f7d07245\nmsgid \"A paginator object for the list of articles, ordered by date, ascending\"\nmsgstr \"分页器对象，存放着以日期正序排列的文章列表\"\n\n#: ../../themes.rst:247 ../../themes.rst:336 926e4184e9fc4288be3701737c8ea3cc\n#: 929ee1e0a49d4a7fa52343db55e6201b\nmsgid \"The current page of articles, ordered by date, ascending\"\nmsgstr \"当前页面中的文章，以日期正序排列\"\n\n#: ../../themes.rst:253 6b396d9ad87e4156a694c9e31663d935\nmsgid \"\"\n\"CATEGORY_URL where everything after `{slug}` is removed -- useful for \"\n\"pagination links\"\nmsgstr \"\"\n\"变量值与CATEGORY_URL一致，所有在 `{slug}` 之后的字符都会被删除——这对分页链接很有用\"\n\n#: ../../themes.rst:259 0c7b031962f14ca78b9cd72aa2de5b03\nmsgid \"article.html\"\nmsgstr \"article.html\"\n\n#: ../../themes.rst:261 1132a54c80564ac0a2706b026b263af7\nmsgid \"\"\n\"This template will be processed for each article, with output generated \"\n\"according to the ``ARTICLE_SAVE_AS`` setting (`Default:` \"\n\"``{slug}.html``). The following variables are available when rendering.\"\nmsgstr \"\"\n\"此模板会应用于文章上，根据设置项 ``ARTICLE_SAVE_AS`` 确定输出路径（`默认值为：` \"\n\"``{slug}.html`` ）。在渲染文章过程中可以使用下列变量。\"\n\n#: ../../themes.rst:268 6cc80575f5ac41e9bca4ce466d593f1d\nmsgid \"article\"\nmsgstr \"article\"\n\n#: ../../themes.rst:268 bbad6618dfa346c396dfa8cf02cb7ee7\nmsgid \"The article object to be displayed\"\nmsgstr \"准备显示的文章对象\"\n\n#: ../../themes.rst:269 4a9bcc18543a4d9eb533092d25bd59a2\nmsgid \"The name of the category for the current article\"\nmsgstr \"当前文章所属分类的名称\"\n\n#: ../../themes.rst:272 fdbbcc85d2aa406493ae4f0b4511e1a8\nmsgid \"\"\n\"Any metadata that you put in the header of the article source file will \"\n\"be available as fields on the ``article`` object. The field name will be \"\n\"the same as the name of the metadata field, except in all-lowercase \"\n\"characters.\"\nmsgstr \"\"\n\"文章源文件开头部分的元数据都会作为 ``article`` 对象的属性存在，属性名和元数据中\"\n\"指定的相同（但是是全小写的）。\"\n\n#: ../../themes.rst:276 1c7d9a6b460849daacae3a205b6a59a6\nmsgid \"\"\n\"For example, you could add a field called `FacebookImage` to your article\"\n\" metadata, as shown below:\"\nmsgstr \"\"\n\"例如，一篇文章源文件中添加了一个额外的元数据 `FacebookImage` ：\"\n\n#: ../../themes.rst:289 b934e5fbde064a7eb6d09405abc0ba1d\nmsgid \"\"\n\"This new metadata will be made available as `article.facebookimage` in \"\n\"your `article.html` template. This would allow you, for example, to \"\n\"specify an image for the Facebook open graph tags that will change for \"\n\"each article:\"\nmsgstr \"\"\n\"此元数据在 `article.html` 模板中可以通过 `article.facebookimage` 获取。\"\n\"通过这种方式，就可以实现例如Facebook的动态打开标签：\"\n\n#: ../../themes.rst:299 dacf9a5dc4de4a5398baf9632399be4b\nmsgid \"page.html\"\nmsgstr \"page.html\"\n\n#: ../../themes.rst:301 a65649dffe0e4e1fb26e38565a89fbf2\nmsgid \"\"\n\"This template will be processed for each page, with output generated \"\n\"according to the ``PAGE_SAVE_AS`` setting (`Default:` \"\n\"``pages/{slug}.html``). The following variables are available when \"\n\"rendering.\"\nmsgstr \"\"\n\"此模板会应用于页面上，根据设置项 ``PAGE_SAVE_AS`` 确定输出路径（`默认值为：` \"\n\"``pages/{slug}.html`` ）。在渲染过程中可以使用下列变量。\"\n\n#: ../../themes.rst:308 fb581643c0c04d6b89c3aa62bcdb5225\nmsgid \"page\"\nmsgstr \"page\"\n\n#: ../../themes.rst:308 02c821223e5448d7999f67d499844684\nmsgid \"\"\n\"The page object to be displayed. You can access its title, slug, and \"\n\"content.\"\nmsgstr \"\"\n\"准备显示的页面对象，可以从中获取标题、slug和具体内容。\"\n\n#: ../../themes.rst:314 4f312193d3914a58be2a8e54e2fb61d8\nmsgid \"tag.html\"\nmsgstr \"tag.html\"\n\n#: ../../themes.rst:316 e96e2b0601e340878872dfcf5159575e\nmsgid \"\"\n\"This template will be processed for each tag, with output generated \"\n\"according to the ``TAG_SAVE_AS`` setting (`Default:` \"\n\"``tag/{slug}.html``). If pagination is active, subsequent pages will by \"\n\"default reside at ``tag/{slug}{number}.html``.\"\nmsgstr \"\"\n\"此模板会应用于标签页上，根据设置项 ``TAG_SAVE_AS`` 确定输出路径（`默认值为：` \"\n\"``tag/{slug}.html`` ）。若启用了分页，后续页面默认存储为。``tag/{slug}{number}.html`` 。\"\n\n#: ../../themes.rst:324 2c8332f2cdc144828b75e23937d3ef8e\nmsgid \"tag\"\nmsgstr \"tag\"\n\n#: ../../themes.rst:324 413cc4b9730a40d3aaee657a7d261daa\nmsgid \"The name of the tag being processed\"\nmsgstr \"当前正在处理标签的名称\"\n\n#: ../../themes.rst:325 726e68a5b71c4ba182afd29b36394c82\nmsgid \"Articles related to this tag\"\nmsgstr \"和此标签关联的文章\"\n\n#: ../../themes.rst:326 780cb9b0de1e4bc1842b8a1bc1ad9202\nmsgid \"Articles related to this tag, but ordered by date, ascending\"\nmsgstr \"和此标签关联的文章，以日期正序排列\"\n\n#: ../../themes.rst:342 c6fb1ba5f18b454ead7abdee5cded85b\nmsgid \"\"\n\"TAG_URL where everything after `{slug}` is removed -- useful for \"\n\"pagination links\"\nmsgstr \"\"\n\"变量值与TAG_URL一致，所有在 `{slug}` 之后的字符都会被删除——这对分页链接很有用\"\n\n#: ../../themes.rst:348 8786a045b390459fad281b06b7edae8c\nmsgid \"period_archives.html\"\nmsgstr \"period_archives.html\"\n\n#: ../../themes.rst:350 c2fad0f517ec40eb8309beca3794ca8b\nmsgid \"\"\n\"This template will be processed for each year of your posts if a path for\"\n\" ``YEAR_ARCHIVE_SAVE_AS`` is defined, each month if \"\n\"``MONTH_ARCHIVE_SAVE_AS`` is defined, and each day if \"\n\"``DAY_ARCHIVE_SAVE_AS`` is defined.\"\nmsgstr \"\"\n\"此模板用于生成归档页面， ``YEAR_ARCHIVE_SAVE_AS`` 、 ``MONTH_ARCHIVE_SAVE_AS`` \"\n\"与 ``DAY_ARCHIVE_SAVE_AS`` 分别对应着年、月、日的归档，只有指定了对应的路径才会生成\"\n\"归档页面。\"\n\n#: ../../themes.rst:357 ../../themes.rst:394 ef52bf257ddc4687801b9438efa2660a\n#: f6eb6f96a622406cbf6d60a5c57276c7\nmsgid \"period\"\nmsgstr \"period\"\n\n#: ../../themes.rst:357 2d01d1314880482791134dbae86647d8\nmsgid \"\"\n\"A tuple of the form (`year`, `month`, `day`) that indicates the current \"\n\"time period. `year` and `day` are numbers while `month` is a string. This\"\n\" tuple only contains `year` if the time period is a given year. It \"\n\"contains both `year` and `month` if the time period is over years and \"\n\"months and so on.\"\nmsgstr \"\"\n\"一个元组，格式为 (`year`, `month`, `day`) ，指明了当前的时间段。 `year` 和 `day` \"\n\"为数字， `month` 则为字符串。当时间段以年给定时，此元组只会有 `year` ；当时间段以年\"\n\"和月给定时此元组中则只会包含 `year` 和 `month` ；以此类推。\"\n\n#: ../../themes.rst:364 ../../themes.rst:397 2164d658ab7342839ea592c7f534c332\n#: ff99b9574a444dec9014c06b0c9b908e\nmsgid \"period_num\"\nmsgstr \"period_num\"\n\n#: ../../themes.rst:364 c4864711405b4f9fa565ac3bcc3a8803\nmsgid \"\"\n\"A tuple of the form (``year``, ``month``, ``day``), as in ``period``, \"\n\"except all values are numbers.\"\nmsgstr \"\"\n\"一个元组，格式为 (``year``, ``month``, ``day``) ，与 ``period`` 含义相同，\"\n\"只不过年月日都是以数字给出的。\"\n\n#: ../../themes.rst:369 27affb54796f4855826eaf3506ed4ed5\nmsgid \"\"\n\"You can see an example of how to use `period` in the `\\\"simple\\\" theme \"\n\"period_archives.html template \"\n\"<https://github.com/getpelican/pelican/blob/main/pelican/themes/simple/templates/period_archives.html>`_.\"\nmsgstr \"\"\n\"有关 `period` 的使用可以参考 `\\\"simple\\\" 主题中的period_archives.html模板 \"\n\"<https://github.com/getpelican/pelican/blob/main/pelican/themes/simple/templates/period_archives.html>`_ .\"\n\n#: ../../themes.rst:377 f556c7dd5ca5454888d19edf992c8dfa\nmsgid \"Listing and Linking to Period Archives\"\nmsgstr \"列出归档与链接到归档\"\n\n#: ../../themes.rst:379 d76f0d91885c42edb2652303f4a60cb6\nmsgid \"\"\n\"The ``period_archives`` variable can be used to generate a list of links \"\n\"to the set of period archives that Pelican generates. As a :ref:`common \"\n\"variable <common_variables>`, it is available for use in any template, so\"\n\" you can implement such an index in a custom direct template, or in a \"\n\"sidebar visible across different site pages.\"\nmsgstr \"\"\n\"对于Pelican给出的归档时间段， ``period_archives`` 可用于生成对应的链接列表。\"\n\"此变量作为 :ref:`通用变量 <common_variables>` ，可在所有模板中使用。因此可以借此\"\n\"在自定义直接模板中或是侧边栏中实现链接索引。\"\n\n#: ../../themes.rst:385 bf76ed577485401d8c5e180a2ea6b7fe\nmsgid \"\"\n\"``period_archives`` is a dict that may contain ``year``, ``month``, \"\n\"and/or ``day`` keys, depending on which ``*_ARCHIVE_SAVE_AS`` settings \"\n\"are enabled. The corresponding value is a list of dicts, where each dict \"\n\"in turn represents a time period (ordered according to the \"\n\"``NEWEST_FIRST_ARCHIVES`` setting) with the following keys and values:\"\nmsgstr \"\"\n\"``period_archives`` 是一个字典，根据 ``*_ARCHIVE_SAVE_AS`` 设置的启用情况，\"\n\"其键对应为 ``year`` 、 ``month`` 与 ``day`` ，其值是包含字典的列表，每个字典依次\"\n\"表示一个时间段（顺序由 ``NEWEST_FIRST_ARCHIVES`` 设置决定），并包含以下键值对：\"\n\n#: ../../themes.rst:392 d4b7e16101e24e13ac49a201f2e9b288\nmsgid \"Key\"\nmsgstr \"键\"\n\n#: ../../themes.rst:392 cda01b45b25c4b76bf38849c6b5368d0\nmsgid \"Value\"\nmsgstr \"值\"\n\n#: ../../themes.rst:394 ac2a1a43510a417fb10561cff9a5189e\nmsgid \"\"\n\"The same tuple as described in ``period_archives.html``, e.g. ``(2023, \"\n\"'June', 18)``.\"\nmsgstr \"\"\n\"一个元组，内容和 ``period_archives.html`` 中一样，例如 ``(2023, 'June', 18)`` 。\"\n\n#: ../../themes.rst:397 fdae5356b80444dc84294a4e54b7a69e\nmsgid \"\"\n\"The same tuple as described in ``period_archives.html``, e.g. ``(2023, 6,\"\n\" 18)``.\"\nmsgstr \"\"\n\"一个元组，内容和 ``period_archives.html`` 中一样，例如 ``(2023, 6, 18)`` 。\"\n\n#: ../../themes.rst:399 ../../themes.rst:476 ../../themes.rst:496\n#: ../../themes.rst:535 08cccff8dd0048a39054424ae58bfe24\n#: 3fe5b8e9d83a4cd28bfc96c745406432 c2d9d11c36e94278a94b3404e8335524\n#: c9ee356463204591986c9c17f8dfc8b4\nmsgid \"url\"\nmsgstr \"url\"\n\n#: ../../themes.rst:399 0c826cc879af4c8fa1fb4fceb92bb362\nmsgid \"\"\n\"The URL to the period archive page, e.g. ``posts/2023/06/18/``. This is \"\n\"controlled by the corresponding ``*_ARCHIVE_URL`` setting.\"\nmsgstr \"\"\n\"当前时间段归档页面的URL，例如 ``posts/2023/06/18/`` 。具体值由对应的设置项 \"\n\"``*_ARCHIVE_URL`` 决定。\"\n\n#: ../../themes.rst:402 ../../themes.rst:463 ../../themes.rst:494\n#: ../../themes.rst:522 155a764c3763409c9bdf881881da49e4\n#: 8da502261f724333814ae130f068a454 d3eaeebea8a54785a4778eac9d436479\n#: ec45a7fbd4db443ab75b13b0fb2876e7\nmsgid \"save_as\"\nmsgstr \"save_as\"\n\n#: ../../themes.rst:402 29cd2e19b0f24fa8ac20e184aea547c5\nmsgid \"\"\n\"The path to the save location of the period archive page file, e.g. \"\n\"``posts/2023/06/18/index.html``. This is used internally by Pelican and \"\n\"is usually not relevant to themes.\"\nmsgstr \"\"\n\"当前时间段归档页面的存储路径，例如 ``posts/2023/06/18/index.html`` 。此路径用于\"\n\"Pelican内部处理，往往与主题无关。\"\n\n#: ../../themes.rst:406 4bd641dcf26c4f61bf8d3c8667552501\nmsgid \"\"\n\"A list of :ref:`Article <object-article>` objects that fall under the \"\n\"time period.\"\nmsgstr \"\"\n\"一个列表，其中为当前时间段内所有文章的 :ref:`Article <object-article>` 对象。\"\n\n#: ../../themes.rst:408 c59db635e66a4ed68b2648b6cd8691a4\nmsgid \"\"\n\"Same list as ``articles``, but ordered according to the \"\n\"``NEWEST_FIRST_ARCHIVES`` setting.\"\nmsgstr \"\"\n\"和 ``articles`` 相同的列表，但按照 ``NEWEST_FIRST_ARCHIVES`` 设置项进行排列。\"\n\n#: ../../themes.rst:412 f096e1915d684d6b9bd0a1e5e034e5f0\nmsgid \"Here is an example of how ``period_archives`` can be used in a template:\"\nmsgstr \"下面的例子展示了如何在模板中使用 ``period_archives`` ：\"\n\n#: ../../themes.rst:426 3f6144d2a3914984bc376ed6f33af53b\nmsgid \"\"\n\"You can change ``period_archives.month`` in the ``for`` statement to \"\n\"``period_archives.year`` or ``period_archives.day`` as appropriate, \"\n\"depending on the time period granularity desired.\"\nmsgstr \"\"\n\"你可以根据需要的时间粒度将 ``for`` 语句中的 ``period_archives.month`` 改为 \"\n\"``period_archives.year`` 或 ``period_archives.day`` 。\"\n\n#: ../../themes.rst:432 ce9158ea38b54c5faeee718a7644ca5f\nmsgid \"Objects\"\nmsgstr \"对象\"\n\n#: ../../themes.rst:434 dd0725152df94c8f9e2d94439ccfa3a1\nmsgid \"\"\n\"Detail objects attributes that are available and useful in templates. Not\"\n\" all attributes are listed here, this is a selection of attributes \"\n\"considered useful in a template.\"\nmsgstr \"\"\n\"下面是对在模板中可用对象的属性的详细说明。以下仅列出了较常用的一些，并不是全部。\"\n\n#: ../../themes.rst:441 af8644dff51348af8e52938bb8d6a0c8\nmsgid \"Article\"\nmsgstr \"Article\"\n\n#: ../../themes.rst:443 cc283674732243e5883a99b6a32166af\nmsgid \"The string representation of an Article is the `source_path` attribute.\"\nmsgstr \"Article对象的字符串表示即为 `source_path` 属性。\"\n\n#: ../../themes.rst:446 ../../themes.rst:490 ../../themes.rst:509\n#: 3f2a9f3ea4c34e4ba7b83b17897f4b59 529f2387d2044534a0e3059defb2be46\n#: 97104fabe548459e9142574e4194afdb\nmsgid \"Attribute\"\nmsgstr \"属性\"\n\n#: ../../themes.rst:448 16d19143b7964b99953026728e8a5d4a\nmsgid \"The :ref:`Author <object-author_cat_tag>` of this article.\"\nmsgstr \"当前文章的 :ref:`Author <object-author_cat_tag>`\"\n\n#: ../../themes.rst:450 5a7ae4c0e9164288bd46cbf698ae01f8\nmsgid \"A list of :ref:`Authors <object-author_cat_tag>` of this article.\"\nmsgstr \"当前文章的多个 :ref:`Authors <object-author_cat_tag>`\"\n\n#: ../../themes.rst:452 982b4fe7fa4a41a5b3aed3a82168b462\nmsgid \"The :ref:`Category <object-author_cat_tag>` of this article.\"\nmsgstr \"当前文章的 :ref:`Category <object-author_cat_tag>`\"\n\n#: ../../themes.rst:454 ../../themes.rst:513 10ea5d1008fa4e7e9f11680013530b13\n#: 3bca890724c2487885fbfb34803f0a8b\nmsgid \"content\"\nmsgstr \"content\"\n\n#: ../../themes.rst:454 14973ea2fac140dbac7ed05f09f3b27d\nmsgid \"The rendered content of the article.\"\nmsgstr \"当前文章渲染完成的内容\"\n\n#: ../../themes.rst:455 ../../themes.rst:514 1733ed5bfe0d421d96f074c2ea46c163\n#: b577071078d5413ba0199a4b5a64a926\nmsgid \"date\"\nmsgstr \"date\"\n\n#: ../../themes.rst:455 c99033f75c6c4aabb03c1ed24e530551\nmsgid \"Datetime object representing the article date.\"\nmsgstr \"当前文章的Datetime对象\"\n\n#: ../../themes.rst:456 ../../themes.rst:515 9f8a6847d9f24162980e8bac2cc6e159\n#: c01cd89b410d45258311d8d62a0b3b24\nmsgid \"date_format\"\nmsgstr \"date_format\"\n\n#: ../../themes.rst:456 ../../themes.rst:515 14a1bee230d243da83e1a8f8e4817838\n#: 35bed86384a74210a5c5be86feb1ca83\nmsgid \"Either default date format or locale date format.\"\nmsgstr \"默认日期格式或是特定地区的日期格式\"\n\n#: ../../themes.rst:457 ../../themes.rst:516 7c05e281dd0f4b7885653f977ce73b96\n#: 942fcdc259554437b58035fd53b3f430\nmsgid \"default_template\"\nmsgstr \"default_template\"\n\n#: ../../themes.rst:457 ../../themes.rst:516 754d4caf3da64863818cae661450c76b\n#: 7fc12db08b5641f388113c447d272970\nmsgid \"Default template name.\"\nmsgstr \"默认的模板名称\"\n\n#: ../../themes.rst:458 ../../themes.rst:517 6434f76e9f2c425ab2e0f4e1df0d5eff\n#: 7a42be4c30d74d93b9778768d88f0d61\nmsgid \"in_default_lang\"\nmsgstr \"in_default_lang\"\n\n#: ../../themes.rst:458 ../../themes.rst:517 573f32f9ea2942b2849cb62bc4ad5b0d\n#: d9bbddf5ba92486faca7219d41907449\nmsgid \"Boolean representing if the article is written in the default language.\"\nmsgstr \"布尔值，用于表示当前文章是不是以默认语言写的。\"\n\n#: ../../themes.rst:460 ../../themes.rst:519 c06096412cd6477f9a9505202b65a66b\n#: cf2ee07db2b544fb8bb5867fd47b4766\nmsgid \"lang\"\nmsgstr \"lang\"\n\n#: ../../themes.rst:460 ../../themes.rst:519 5feb94756b424a1f970b45ad224ab4df\n#: bb4db90299324791bcc00c9687d458e8\nmsgid \"Language of the article.\"\nmsgstr \"当前文章使用的语言。\"\n\n#: ../../themes.rst:461 ../../themes.rst:520 3ddd8549af7f4c54bb4d1176ab4991fe\n#: f599ee9e24d24679ae8efe1b92bfabd2\nmsgid \"locale_date\"\nmsgstr \"locale_date\"\n\n#: ../../themes.rst:461 ../../themes.rst:520 492201eaff5d43bcb2a27d38dd414ea5\n#: bd9e52a8bfc24c89982c21a7ec33546b\nmsgid \"Date formatted by the `date_format`.\"\nmsgstr \"以 `date_format` 格式化后的日期。\"\n\n#: ../../themes.rst:462 ../../themes.rst:521 298a8c49a9c54aa08e92063a205b4270\n#: 91a12b6902f140a285bd808fe527e942\nmsgid \"metadata\"\nmsgstr \"metadata\"\n\n#: ../../themes.rst:462 a6266566a3764288a3439022e3a374b5\nmsgid \"Article header metadata `dict`.\"\nmsgstr \"文章元数据的字典。\"\n\n#: ../../themes.rst:463 8c8bb35d3d0a4fd4a8cbbe66da13e9f6\nmsgid \"Location to save the article page.\"\nmsgstr \"本篇文章生成保存的位置。\"\n\n#: ../../themes.rst:464 ../../themes.rst:495 ../../themes.rst:523\n#: 02324ac5ed2f418d8aeabad7ef196271 265ffa91569c417faf9edfad84909010\n#: eb3abbd690c540dc8c8f96c457a949f1\nmsgid \"slug\"\nmsgstr \"slug\"\n\n#: ../../themes.rst:464 ../../themes.rst:495 ../../themes.rst:523\n#: 6ceb857897804044822f46787b8b2e24 6f893196b6f94121aa829816652d9b8d\n#: d07f43f0b91e4e0492db289b425a66ca\nmsgid \"Page slug.\"\nmsgstr \"推文的slug\"\n\n#: ../../themes.rst:465 ../../themes.rst:524 2a6c951175234a94ad49fe66b5e0ac67\n#: 8cc7b9782316464ab8f4d93f44364487\nmsgid \"source_path\"\nmsgstr \"source_path\"\n\n#: ../../themes.rst:465 e56b161d0ff444db81b9ef5438205492\nmsgid \"Full system path of the article source file.\"\nmsgstr \"文章源文件的完整系统路径。\"\n\n#: ../../themes.rst:466 ../../themes.rst:525 3288505bb4c94604a880a6e41e854174\n#: c6d1c1970adc4b7d851fc9a62579e2c6\nmsgid \"relative_source_path\"\nmsgstr \"relative_source_path\"\n\n#: ../../themes.rst:466 efa94005826e46b1a7ace439cfea8ecd\nmsgid \"Relative path from PATH_ to the article source file.\"\nmsgstr \"从 PATH_ 到当前文章源文件的相对路径。\"\n\n#: ../../themes.rst:467 ../../themes.rst:526 0f57131e78b043bd974e545651a9eac6\n#: 4f11a741e9684957bc2ac83e1aa850ca\nmsgid \"status\"\nmsgstr \"status\"\n\n#: ../../themes.rst:467 ff6df46c090044a9afd9bafe55483999\nmsgid \"The article status, can be any of 'published' or 'draft'.\"\nmsgstr \"当前文章的状态，可能值为'published'或'draft'。\"\n\n#: ../../themes.rst:469 ../../themes.rst:528 042ac3c1853845f99752c484e341dbde\n#: 59ec1f34a47b41959621ae638ee75bf6\nmsgid \"summary\"\nmsgstr \"summary\"\n\n#: ../../themes.rst:469 ../../themes.rst:528 f13f50f1e1024ce2bb1a3cd2d6bd0f45\n#: fe9173ab1a3b42a39d1ae3f24b2e13b6\nmsgid \"Rendered summary content.\"\nmsgstr \"渲染后的摘要内容。\"\n\n#: ../../themes.rst:470 ../../themes.rst:529 455d848accf04082b6d0efe5c0451a8c\n#: 5acb76f85cdd47f0933b5c411f645ccd\nmsgid \"List of :ref:`Tag <object-author_cat_tag>` objects.\"\nmsgstr \":ref:`Tag <object-author_cat_tag>` 对象的列表。\"\n\n#: ../../themes.rst:472 ../../themes.rst:531 346843df50f64fcb8738d9a33a5991c0\n#: 5b43ff1b52e049a080dcfcf7c8532e55\nmsgid \"template\"\nmsgstr \"template\"\n\n#: ../../themes.rst:472 ../../themes.rst:531 1c98b0c5f84b438d9fbcdc7e564b532a\n#: 75b07b60fd0540ac998a7a5f8c755abb\nmsgid \"Template name to use for rendering.\"\nmsgstr \"用于渲染的模板名称\"\n\n#: ../../themes.rst:473 ../../themes.rst:532 3da31ca0f3a74f1b807028b268704562\n#: 939c8b4e82c34cdc9e11fff8728e925a\nmsgid \"title\"\nmsgstr \"title\"\n\n#: ../../themes.rst:473 4f435f74edea49abba15e465cd65bc9b\nmsgid \"Title of the article.\"\nmsgstr \"当前文章的标题。\"\n\n#: ../../themes.rst:474 ../../themes.rst:533 4c7c144119804fcc9b3aff5ba1cc1d60\n#: 60cfb30189bc4622b9f0f10d57e8cebb\nmsgid \"translations\"\nmsgstr \"translations\"\n\n#: ../../themes.rst:474 ../../themes.rst:533 5086f31401d243e5ba1e7d3a4dbc75ea\n#: 6c9e4cba9d80461787be1e245ea0e77c\nmsgid \"List of translations :ref:`Article <object-article>` objects.\"\nmsgstr \"当前文章所有翻译版本的 :ref:`Article <object-article>` 对象。\"\n\n#: ../../themes.rst:476 0bbe38a721924758b16f7ed92bd47060\nmsgid \"URL to the article page.\"\nmsgstr \"文章页面的URL。\"\n\n#: ../../themes.rst:485 6a1b829fd11b4a5aaa913e8ab5d8cb9a\nmsgid \"Author / Category / Tag\"\nmsgstr \"Author / Category / Tag\"\n\n#: ../../themes.rst:487 e74be0b0e7d7477791a14dc892a01970\nmsgid \"The string representation of those objects is the `name` attribute.\"\nmsgstr \"这些对象的字符串表示与 `name` 属性一致。\"\n\n#: ../../themes.rst:492 95f673648cd347589e30bac268c62402\nmsgid \"name\"\nmsgstr \"name\"\n\n#: ../../themes.rst:492 c85c4552f17e47ce8e75aa83968488b7\nmsgid \"Name of this object [1]_.\"\nmsgstr \"当前对象的名称 [1]_ 。\"\n\n#: ../../themes.rst:493 9ab58cf8d1c14233b5fab67bcff1ed07\nmsgid \"Author page name.\"\nmsgstr \"作者页面的名称。\"\n\n#: ../../themes.rst:494 8924be38e76744c18a232657e3e53541\nmsgid \"Location to save the author page.\"\nmsgstr \"保存当前作者页面的路径。\"\n\n#: ../../themes.rst:496 d836061f54274605b775c9a303e73355\nmsgid \"URL to the author page.\"\nmsgstr \"作者页面的URL。\"\n\n#: ../../themes.rst:499 8a004fbcd1134a6aa51ecc83ead04eb3\nmsgid \"for Author object, coming from `:authors:` or `AUTHOR`.\"\nmsgstr \"对于Author对象，此属性值由 `:authors:` 或 `AUTHOR` 得来。\"\n\n#: ../../themes.rst:504 015a5ef21bc1482baa94fe2ecc389be9\nmsgid \"Page\"\nmsgstr \"Page\"\n\n#: ../../themes.rst:506 e509492329b543b094117d9b207d40c1\nmsgid \"The string representation of a Page is the `source_path` attribute.\"\nmsgstr \"Page对象的字符串表示与 `source_path` 属性一致。\"\n\n#: ../../themes.rst:511 acbd8346326242e3a6124d349d90c83f\nmsgid \"The :ref:`Author <object-author_cat_tag>` of this page.\"\nmsgstr \"当前页面的 :ref:`Author <object-author_cat_tag>` 。\"\n\n#: ../../themes.rst:513 17df00ade1b84d89b90e0cf8949014c5\nmsgid \"The rendered content of the page.\"\nmsgstr \"当前页面渲染后的内容。\"\n\n#: ../../themes.rst:514 50ec2f44596c4f849458456113b6688d\nmsgid \"Datetime object representing the page date.\"\nmsgstr \"当前页面日期对应的Datetime对象。\"\n\n#: ../../themes.rst:521 29fd9eb25f1643bc844a9480618ddee3\nmsgid \"Page header metadata `dict`.\"\nmsgstr \"页面元数据的 `字典` 。\"\n\n#: ../../themes.rst:522 caeac875f56345dfb4b871dd5cc47ff6\nmsgid \"Location to save the page.\"\nmsgstr \"保存页面的位置。\"\n\n#: ../../themes.rst:524 ee2e9caa90d24f7f8106e82449194c5b\nmsgid \"Full system path of the page source file.\"\nmsgstr \"页面源文件的完整系统路径。\"\n\n#: ../../themes.rst:525 4ac1a61bb61b491ab05058392e561819\nmsgid \"Relative path from PATH_ to the page source file.\"\nmsgstr \"页面源文件相对于 PATH_ 的相对路径。\"\n\n#: ../../themes.rst:526 1e21d2a5056e4f56b1fb9aeb9b56240a\nmsgid \"The page status, can be any of 'published', 'hidden' or 'draft'.\"\nmsgstr \"页面的状态，可能值有'published'、'hidden'或者'draft'。\"\n\n#: ../../themes.rst:532 0afb2b618cdd49d5b6f4c37dfa84c847\nmsgid \"Title of the page.\"\nmsgstr \"页面的标题。\"\n\n#: ../../themes.rst:535 e4f719f69ae3495280e4953b0e948e02\nmsgid \"URL to the page.\"\nmsgstr \"页面的URL\"\n\n#: ../../themes.rst:542 dbc8f1369a294996ac59e07d955880b6\nmsgid \"Feeds\"\nmsgstr \"订阅源\"\n\n#: ../../themes.rst:544 dbfa3023cab6407cb324cffe523c8533\nmsgid \"\"\n\"The feed variables changed in 3.0. Each variable now explicitly lists \"\n\"ATOM or RSS in the name. ATOM is still the default. Old themes will need \"\n\"to be updated. Here is a complete list of the feed variables::\"\nmsgstr \"\"\n\"订阅源相关变量在3.0版本发生过变化。各变量现在都在名称中显示地表达了属于ATOM还是RSS。\"\n\"默认使用ATOM。旧的主题需要进行更新。下面是订阅源相关变量的完整列表：\"\n\n#: ../../themes.rst:563 ee43d4b51dda44288f9786eefb8bf62c\nmsgid \"Inheritance\"\nmsgstr \"继承\"\n\n#: ../../themes.rst:565 a921f3b3e050422db6694600b6ae3379\nmsgid \"\"\n\"Since version 3.0, Pelican supports inheritance from the ``simple`` \"\n\"theme, so you can re-use the ``simple`` theme templates in your own \"\n\"themes.\"\nmsgstr \"\"\n\"从3.0版本开始，Pelican支持从 ``simple`` 主题继承，因此可以在你自己的主题中\"\n\"重用 ``simple`` 主题。\"\n\n#: ../../themes.rst:568 36142bb5338a43a5bf0d9e53b52c0c05\nmsgid \"\"\n\"If one of the mandatory files in the ``templates/`` directory of your \"\n\"theme is missing, it will be replaced by the matching template from the \"\n\"``simple`` theme. So if the HTML structure of a template in the \"\n\"``simple`` theme is right for you, you don't have to write a new template\"\n\" from scratch.\"\nmsgstr \"\"\n\"如果 ``templates/`` 目录中缺失了的某些必须要有的文件，会自动使用 ``simple`` \"\n\"主题中的对应模板。因此如果 ``simple`` 主题中的一些模板正合你意，就没必要重新\"\n\"写个新的了。\"\n\n#: ../../themes.rst:573 d4c77f03fe8049ed82ea0870e4384991\n#, python-format\nmsgid \"\"\n\"You can also extend templates from the ``simple`` theme in your own \"\n\"themes by using the ``{% extends %}`` directive as in the following \"\n\"example:\"\nmsgstr \"\"\n\"你也可以使用 ``{% extends %}`` 指令在你自己的主题中扩展 ``simple`` 主题：\"\n\n#: ../../themes.rst:584 6c8634ea148d48e68124f8b240de47c3\nmsgid \"Example\"\nmsgstr \"例子\"\n\n#: ../../themes.rst:586 c5845f57a75642a5a2a0c9018fd1dac0\nmsgid \"With this system, it is possible to create a theme with just two files.\"\nmsgstr \"利用这种自动继承的规则，只用两个文件就可以创建一个主题。\"\n\n#: ../../themes.rst:589 c7ea4273a1ca4050968a1308a5a47c51\nmsgid \"base.html\"\nmsgstr \"base.html\"\n\n#: ../../themes.rst:591 4fa7a95ff17c4421bd39c45a9cd42f8f\nmsgid \"The first file is the ``templates/base.html`` template:\"\nmsgstr \"第一个文件是 ``templates/base.html`` 模板：\"\n\n#: ../../themes.rst:602 87484a8d548449b4b58d6773201ddf67\nmsgid \"\"\n\"On the first line, we extend the ``base.html`` template from the \"\n\"``simple`` theme, so we don't have to rewrite the entire file.\"\nmsgstr \"\"\n\"第一行中，从 ``simple`` 主题中扩展了 ``base.html`` 模板，因此无需重写整个文件。\"\n\n#: ../../themes.rst:604 20209f5462c24d3b9918f14db3dc9f0c\nmsgid \"\"\n\"On the third line, we open the ``head`` block which has already been \"\n\"defined in the ``simple`` theme.\"\nmsgstr \"\"\n\"第三行，我们开始声明 ``head`` 块，这个块已在 ``simple`` 中进行了定义。\"\n\n#: ../../themes.rst:606 9d6577b07bdd4eab814a188effd796c7\nmsgid \"\"\n\"On the fourth line, the function ``super()`` keeps the content previously\"\n\" inserted in the ``head`` block.\"\nmsgstr \"\"\n\"第四行中， ``super()`` 函数使得已添加到 ``head`` 块中的前序内容得以保留。\"\n\n#: ../../themes.rst:608 157f34425e4d4b119c97bc7a9cb513ff\nmsgid \"On the fifth line, we append a stylesheet to the page.\"\nmsgstr \"第五行为页面添加了一个样式表。\"\n\n#: ../../themes.rst:609 bf52b4834d67475194b43b35c2a9dfde\nmsgid \"On the last line, we close the ``head`` block.\"\nmsgstr \"最后一行结束对 ``head`` 块的声明。\"\n\n#: ../../themes.rst:611 968532a3244e436fba5b6df5c996888d\nmsgid \"\"\n\"This file will be extended by all the other templates, so the stylesheet \"\n\"will be linked from all pages.\"\nmsgstr \"\"\n\"其他所有模板都会在此文件基础上进行扩展，因此样式表会被所有页面引用。\"\n\n#: ../../themes.rst:615 62629bf8d5ea4271a598b95ebede4757\nmsgid \"style.css\"\nmsgstr \"style.css\"\n\n#: ../../themes.rst:617 e8e0ee6348e84ff590fe5afebe39ec63\nmsgid \"The second file is the ``static/css/style.css`` CSS stylesheet:\"\nmsgstr \"第二个文件是CSS样式表 ``static/css/style.css`` ：\"\n\n#: ../../themes.rst:661 80ec5c70bd9b49e7b22718cc18e46b84\nmsgid \"Download\"\nmsgstr \"下载\"\n\n#: ../../themes.rst:663 acf9dfc296794b3c928572374b39926e\nmsgid \"\"\n\"You can download this example theme :download:`here <_static/theme-\"\n\"basic.zip>`.\"\nmsgstr \"\"\n\"可以在 :download:`这里 <_static/theme-basic.zip>` 下载此例。\"\n\n#~ msgid \"\"\n#~ \"To generate its HTML output, Pelican \"\n#~ \"uses the `Jinja \"\n#~ \"<https://palletsprojects.com/p/jinja/>`_ templating engine\"\n#~ \" due to its flexibility and \"\n#~ \"straightforward syntax. If you want to\"\n#~ \" create your own theme, feel free \"\n#~ \"to take inspiration from the `\\\"simple\\\"\"\n#~ \" theme \"\n#~ \"<https://github.com/getpelican/pelican/tree/master/pelican/themes/simple/templates>`_.\"\n#~ msgstr \"\"\n\n#~ msgid \"\"\n#~ \"You can see an example of how \"\n#~ \"to use `period` in the `\\\"simple\\\" \"\n#~ \"theme period_archives.html template \"\n#~ \"<https://github.com/getpelican/pelican/blob/master/pelican/themes/simple/templates/period_archives.html>`_.\"\n#~ msgstr \"\"\n"
  },
  {
    "path": "docs/locale/zh_CN/LC_MESSAGES/tips.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) 2010–2024\n# This file is distributed under the same license as the PELICAN package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, 2024.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PELICAN 4\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-02-02 10:32+0800\\n\"\n\"PO-Revision-Date: 2026-02-02 10:32+0800\\n\"\n\"Last-Translator: GeorgeHu <dhxxhch@163.com>\\n\"\n\"Language: zh_CN\\n\"\n\"Language-Team: zh_CN <LL@li.org>\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=utf-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Generated-By: Babel 2.17.0\\n\"\n\n#: ../../tips.rst:2 9c4618aaecd44b0d93537cb760e227fa\nmsgid \"Tips\"\nmsgstr \"小技巧\"\n\n#: ../../tips.rst:4 f49ab5e1ef034ca29140bac3832e8e1c\nmsgid \"Here are some tips about Pelican that you might find useful.\"\nmsgstr \"以下是一些实用的小技巧。\"\n\n#: ../../tips.rst:7 ../../tips.rst:319 95bea35d0347495bb551fe9486bcd29d\n#: b64b7ed713b64f588ea7488c6d0b0441\nmsgid \"Custom 404 Pages\"\nmsgstr \"自定义404页面\"\n\n#: ../../tips.rst:9 d59dc30de5954aa1abc7c46fbac596c6\nmsgid \"\"\n\"When a browser requests a resource that the web server cannot find, the \"\n\"web server usually displays a generic \\\"File not found\\\" (404) error page\"\n\" that can be stark and unsightly. One way to provide an error page that \"\n\"matches the theme of your site is to create a custom 404 page (*not* an \"\n\"article), such as this Markdown-formatted example stored in \"\n\"``content/pages/404.md``::\"\nmsgstr \"\"\n\"当浏览器请求的资源无法在服务器中找到时，web服务器常常会显示一个通用的“File not found \"\n\"404”的错误页面，这可能会不太美观。为了能使用一个与站点主题相匹配的404页面（注意是页面而 **不是** \"\n\"文章），例如下面这个Markdown格式的例子，将此文件存为了 ``content/pages/404.md`` ：\"\n\n#: ../../tips.rst:22 416f9b3eeaac4af8bdc9f32b7cdcba39\nmsgid \"\"\n\"The next step is to configure your web server to display this custom page\"\n\" instead of its default 404 page. For Nginx, add the following to your \"\n\"configuration file's ``location`` block::\"\nmsgstr \"\"\n\"接下来就是要配置web服务器，使其显示此自定义页面而不是默认的404页面。例如对于Nginx，在配置文件的 ``location`` \"\n\"块中添加下面的命令：\"\n\n#: ../../tips.rst:28 5d52fbcc9d9d4603b3f9d97360face10\nmsgid \"For Apache::\"\nmsgstr \"对于Apache：\"\n\n#: ../../tips.rst:32 5413c6bcff6a41688ffcede94b9955e4\nmsgid \"\"\n\"For Amazon S3, first navigate to the ``Static Site Hosting`` menu in the \"\n\"bucket settings on your AWS console. From there::\"\nmsgstr \"对于Amazon S3实例，先在控制台的设置中找到  ``Static Site Hosting`` ，并添加：\"\n\n#: ../../tips.rst:38 9b02aa39367a4c33918bddef02d1788d\nmsgid \"Publishing to GitHub Pages\"\nmsgstr \"发布到GitHub Pages\"\n\n#: ../../tips.rst:40 ca3f1deb69a04d40a89576f580d63781\nmsgid \"\"\n\"If you use `GitHub <https://github.com/>`_ for your Pelican site you can \"\n\"publish your site to `GitHub Pages <https://pages.github.com/>`_ for \"\n\"free. Your site will be published to ``https://<username>.github.io`` if \"\n\"it's a user or organization site or to \"\n\"``https://<username>.github.io/<repository>`` if it's a project site. \"\n\"It's also possible to `use a custom domain with GitHub Pages \"\n\"<https://docs.github.com/en/pages/configuring-a-custom-domain-for-your-\"\n\"github-pages-site>`_.\"\nmsgstr \"\"\n\"如果将Pelican站点放在了 `GitHub <https://github.com/>`_ 上，那么你就可以将站点免费发布在 `GitHub \"\n\"Pages <https://pages.github.com/>`_ 上。如果是用户或组织的站点，发布的地址为 \"\n\"``https://<username>.github.io`` ；如果是某个项目的站点，发布的地址则为 \"\n\"``https://<username>.github.io/<repository>`` 。当然也可以 `在GitHub \"\n\"Pages上使用自定义域名 <https://docs.github.com/en/pages/configuring-a-custom-\"\n\"domain-for-your-github-pages-site>`_ 。\"\n\n#: ../../tips.rst:46 5962c3cb4a0b41289d6b08b9edd2fdee\nmsgid \"\"\n\"There are `two ways to publish a site to GitHub Pages \"\n\"<https://docs.github.com/en/pages/getting-started-with-github-\"\n\"pages/configuring-a-publishing-source-for-your-github-pages-site>`_:\"\nmsgstr \"\"\n\"总的来说，有 `两种将站点发布到GitHub Pages的方法 <https://docs.github.com/en/pages\"\n\"/getting-started-with-github-pages/configuring-a-publishing-source-for-\"\n\"your-github-pages-site>`_ ：\"\n\n#: ../../tips.rst:48 ad6f071b3cdc4529a41776f799347da0\nmsgid \"\"\n\"**Publishing from a branch:** run ``pelican`` locally and push the output\"\n\" directory to a special branch of your GitHub repo. GitHub will then \"\n\"publish the contents of this branch to your GitHub Pages site.\"\nmsgstr \"\"\n\"**从某一分支发布：** 在本地运行 ``pelican`` \"\n\"后将输出文件夹push到GitHub仓库的某一分支。GitHub就会将该分支的内容发布到GitHub Pages上。\"\n\n#: ../../tips.rst:51 6237e147cf4142d9b172588964ec00d2\nmsgid \"\"\n\"**Publishing with a custom GitHub Actions workflow:** just push the \"\n\"source files of your Pelican site to your GitHub repo's default branch \"\n\"and have a custom GitHub Actions workflow run ``pelican`` for you to \"\n\"generate the output directory and publish it to your GitHub Pages site.  \"\n\"This way you don't need to run ``pelican`` locally. You can even edit \"\n\"your site's source files using GitHub's web interface and any changes \"\n\"that you commit will be published.\"\nmsgstr \"\"\n\"**从自定义GitHub Actions工作流发布：** 将内容源文件推送到GitHub仓库的默认分支，然后在GitHub \"\n\"Actions工作流中执行 ``pelican`` 以生成输出文件夹，最后将其发布到你的GitHub Pages站点。此种方法下就无需在本地执行 \"\n\"``pelican`` 命令了。甚至可以直接在GitHub的网页中在线修改站点内容源文件。\"\n\n#: ../../tips.rst:60 f2655b8ab23147e58fd68e2385a7624a\nmsgid \"Publishing a Project Site to GitHub Pages from a Branch\"\nmsgstr \"从某一分支发布项目站点到GitHub Pages\"\n\n#: ../../tips.rst:62 1a156c5a8019400d86a33ce306b521ac\nmsgid \"\"\n\"To publish a Pelican site as a Project Page you need to *push* the \"\n\"content of the ``output`` dir generated by Pelican to a repository's \"\n\"``gh-pages`` branch on GitHub.\"\nmsgstr \"\"\n\"要将Pelican站点发布为项目页面，你需要将Pelican生成的 ``output`` 目录 **push** 到GitHub仓库的 ``gh-\"\n\"pages`` 分支。\"\n\n#: ../../tips.rst:66 22caeeba90b24dbe9f0305370de074fc\nmsgid \"\"\n\"The excellent `ghp-import <https://github.com/davisp/ghp-import>`_, which\"\n\" can be installed with ``pip``, makes this process really easy.\"\nmsgstr \"\"\n\"可通过 ``pip`` 安装的 `ghp-import <https://github.com/davisp/ghp-import>`_ \"\n\"使这一步变得非常简单。\"\n\n#: ../../tips.rst:69 6ea08af050644b58ae5255dafb4f4d8b\nmsgid \"\"\n\"For example, if the source of your Pelican site is contained in a GitHub \"\n\"repository, and if you want to publish that Pelican site in the form of \"\n\"Project Pages to this repository, you can then use the following::\"\nmsgstr \"例如，当Pelican站点的源文件已经包含在GitHub仓库中时，可以将其作为此仓库的项目页面：\"\n\n#: ../../tips.rst:77 355b81e8a2194cf9b91bee0f4ee6dca9\nmsgid \"\"\n\"The ``ghp-import output`` command updates the local ``gh-pages`` branch \"\n\"with the content of the ``output`` directory (creating the branch if it \"\n\"doesn't already exist). The ``git push origin gh-pages`` command updates \"\n\"the remote ``gh-pages`` branch, effectively publishing the Pelican site.\"\nmsgstr \"\"\n\"``ghp-import output`` 命令会用 ``output`` 目录下的内容更新本地的 ``gh-pages`` \"\n\"分支（如果此分支不存在则会先创建）。接着再用  ``git push origin gh-pages`` 命令更新远程分支 ``gh-\"\n\"pages`` ，如此就能够发布Pelican站点了。\"\n\n#: ../../tips.rst:84 8a3fd725eba44fa99541376722601cce\nmsgid \"\"\n\"The ``github`` target of the Makefile (and the ``gh_pages`` task of \"\n\"``tasks.py``) created by the ``pelican-quickstart`` command publishes the\"\n\" Pelican site as Project Pages, as described above.\"\nmsgstr \"\"\n\"``pelican-quickstart`` 在Makefile文件中所生成的 ``github`` 目标（以及为 ``gh_pages`` \"\n\"任务生成的 ``tasks.py`` ）使得Pelican站点能像上面描述的那样被发布为项目页面。\"\n\n#: ../../tips.rst:89 e8ebf23099ed45e7a65d23b9a7e4ccbd\nmsgid \"Publishing a User Site to GitHub Pages from a Branch\"\nmsgstr \"从某一分支发布用户站点到GitHub Pages\"\n\n#: ../../tips.rst:91 7dc8ae1992b7411d9d6db7cc4a0127cb\nmsgid \"\"\n\"To publish a Pelican site in the form of User Pages, you need to *push* \"\n\"the content of the ``output`` dir generated by Pelican to the ``main`` \"\n\"branch of your ``<username>.github.io`` repository on GitHub.\"\nmsgstr \"\"\n\"要以用户页面形式发布Pelican站点，你需要将Pelican生成的 ``output`` 目录内容 **push** 到 \"\n\"``<username>.github.io`` 仓库的 ``master`` 分支上。\"\n\n#: ../../tips.rst:95 da706340ef5f4d18bfb183596a4196c9\nmsgid \"Again, you can take advantage of ``ghp-import``::\"\nmsgstr \"同样的，此处也可以使用 ``ghp-import`` ：\"\n\n#: ../../tips.rst:101 61aa6f0d9fdf407682d3f781ae5475c6\nmsgid \"\"\n\"The ``git push`` command pushes the local ``gh-pages`` branch (freshly \"\n\"updated by the ``ghp-import`` command) to the ``elemoine.github.io`` \"\n\"repository's ``main`` branch on GitHub.\"\nmsgstr \"\"\n\"``git push`` 命令将本地的 ``gh-pages`` 分支（此分支在刚刚通过 ``ghp-import`` \"\n\"命令进行了更新）push到了GitHub仓库 ``elemoine.github.io`` 的 ``master`` 分支。\"\n\n#: ../../tips.rst:107 f74afbf668a1472d901fe0a16472ab98\nmsgid \"\"\n\"To publish your Pelican site as User Pages, feel free to adjust the \"\n\"``github`` target of the Makefile.\"\nmsgstr \"要将Pelican站点发布为用户页面，可以根据需要修改Makefile中的 ``github`` 目标。\"\n\n#: ../../tips.rst:110 d69dcdb58a4b4b38aa8b8bf8e4fd733a\nmsgid \"\"\n\"Another option for publishing to User Pages is to generate the output \"\n\"files in the root directory of the project.\"\nmsgstr \"发布用户页面的另一种方法就是将输出文件生成在项目的根目录下。\"\n\n#: ../../tips.rst:113 4991892f24df40b982faf01ddb292175\nmsgid \"\"\n\"For example, your main project folder is ``<username>.github.io`` and you\"\n\" can create the Pelican project in a subdirectory called ``Pelican``. \"\n\"Then from inside the ``Pelican`` folder you can run::\"\nmsgstr \"\"\n\"例如，项目的主文件夹是 ``<username>.github.io`` ，你可以在子目录 ``Pelican`` \"\n\"中创建一个Pelican项目。然后你可以在这个 ``Pelican`` 文件夹中执行下面的命令：\"\n\n#: ../../tips.rst:119 ca5939f8c58b44b69ebfb2f953a4a73b\nmsgid \"\"\n\"Now you can push the whole project ``<username>.github.io`` to the main \"\n\"branch of your GitHub repository::\"\nmsgstr \"接着可以将整个项目 ``<username>.github.io`` push到GitHub仓库的master分支中：\"\n\n#: ../../tips.rst:124 54962439805d47abb121ca9454e7a4cc\nmsgid \"(assuming origin is set to your remote repository).\"\nmsgstr \"（此处假设远程仓库命名为origin）。\"\n\n#: ../../tips.rst:127 b3fe320a90904fbda8c7ed8c7bddbd6e\nmsgid \"Publishing to GitHub Pages Using a Custom GitHub Actions Workflow\"\nmsgstr \"使用自定义GitHub Actions工作流将站点发布GitHub Pages中\"\n\n#: ../../tips.rst:129 3b368bc0a307473dae560671fd9527be\nmsgid \"\"\n\"Pelican-powered sites can be published to GitHub Pages via a `custom \"\n\"workflow \"\n\"<https://github.com/getpelican/pelican/blob/main/.github/workflows/github_pages.yml>`_.\"\n\" To use it:\"\nmsgstr \"\"\n\"Pelican已经给你准备了一份 `自定义工作流 \"\n\"<https://github.com/getpelican/pelican/blob/main/.github/workflows/github_pages.yml>`_\"\n\" ，你可以直接使用此工作流发布站点：\"\n\n#: ../../tips.rst:133 a7b1be522b694d9a8beb186b4603a7aa\nmsgid \"\"\n\"Enable GitHub Pages in your repo: go to **Settings → Pages** and choose \"\n\"**GitHub Actions** for the **Source** setting.\"\nmsgstr \"\"\n\"首先为仓库开启GitHub Pages： **Settings → Pages** 中有个 **Source** 设置项，将其选择为 \"\n\"**GitHub Actions** 。\"\n\n#: ../../tips.rst:136 9cc114d8a6b44ff49fa7fecbdbcd012f\nmsgid \"\"\n\"Commit a ``.github/workflows/pelican.yml`` file to your repo with these \"\n\"contents:\"\nmsgstr \"往你的仓库中commit一个 ``.github/workflows/pelican.yml`` 文件，文件内容如下：\"\n\n#: ../../tips.rst:155 f7d029425d7047deae43e9506c7f4779\nmsgid \"\"\n\"You may want to replace the ``@main`` with the ID of a specific commit in\"\n\" this repo in order to pin the version of the reusable workflow that \"\n\"you're using: ``uses: \"\n\"getpelican/pelican/.github/workflows/github_pages.yml@<COMMIT_ID>``. If \"\n\"you do this you might want to get Dependabot to send you automated pull \"\n\"requests to update that commit ID whenever new versions of this workflow \"\n\"are published, like so:\"\nmsgstr \"\"\n\"你可能想要将 ``@main`` 替换为这个仓库中某个特定commit的ID，以便将你使用的可重用工作流的版本固定下来，此时，可以使用 \"\n\"``uses: \"\n\"getpelican/pelican/.github/workflows/github_pages.yml@<COMMIT_ID>`` \"\n\"。在这种情况下，你可能想让Dependabot自动向你发送PR，以便在发布新版本的工作流时更新commit ID，如下所示:\"\n\n#: ../../tips.rst:172 fd060b5d5d824ab8825b384d37872894\nmsgid \"\"\n\"See `GitHub's docs about using Dependabot to keep your actions up to date\"\n\" <https://docs.github.com/en/code-security/dependabot/working-with-\"\n\"dependabot/keeping-your-actions-up-to-date-with-dependabot>`_.\"\nmsgstr \"\"\n\"请参阅 `GitHub文档 <https://docs.github.com/en/code-security/dependabot\"\n\"/working-with-dependabot/keeping-your-actions-up-to-date-with-\"\n\"dependabot>`_ ，了解如何使用Dependabot使您的action保持最新。\"\n\n#: ../../tips.rst:174 1b862876e15c4fcd898c4d9b3ba616c5\nmsgid \"\"\n\"Go to the **Actions** tab in your repo \"\n\"(``https://github.com/<username>/<repository>/actions``) and you should \"\n\"see a **Deploy to GitHub Pages** action running.\"\nmsgstr \"\"\n\"选中仓库的 **Actions** 标签栏（ \"\n\"``https://github.com/<username>/<repository>/actions`` ），此时你应该会看到已经有一个名为 \"\n\"**Deploy to GitHub Pages** 的action正在运行。\"\n\n#: ../../tips.rst:178 f8413793636140f9b017abad379b3429\nmsgid \"\"\n\"Once the action completes you should see your Pelican site deployed at \"\n\"your repo's GitHub Pages URL: ``https://<username>.github.io`` for a user\"\n\" or organization site or ``https://<username>.github.io/<repository>>`` \"\n\"for a project site.\"\nmsgstr \"\"\n\"当此action执行完成，就能够通过仓库的GitHub Pages地址 ``https://<username>.github.io`` \"\n\"看到部署好了的用户或组织站点了，对于项目站点，可通过 ``https://<username>.github.io/<repository>`` \"\n\"访问。\"\n\n#: ../../tips.rst:183 d792bb046c474f70aa98b2c16a5b1254\nmsgid \"Notes:\"\nmsgstr \"注意事项：\"\n\n#: ../../tips.rst:185 89472d2b7231439faf9e51eda07d8323\nmsgid \"\"\n\"You don't need to set ``SITEURL`` or ``FEED_DOMAIN`` in your Pelican \"\n\"settings: the workflow will set them correctly for you\"\nmsgstr \"无需在Pelican配置文件中设置 ``SITEURL`` ，工作流会帮你进行设置。\"\n\n#: ../../tips.rst:188 ea2b632160804a6e9bf1b4cecb7de716\nmsgid \"\"\n\"You don't need to commit your ``--output`` / ``OUTPUT_PATH`` directory \"\n\"(``output/``) to git: the workflow will run ``pelican`` to build the \"\n\"output directory for you on GitHub Actions\"\nmsgstr \"\"\n\"无需commit ``--output`` 或 ``OUTPUT_PATH`` 所指定的目录（ ``output/`` ）：工作流会自己执行 \"\n\"``pelican`` 命令来构建输出目录。\"\n\n#: ../../tips.rst:192 fd9fb772fba844f099cac781f2b0642f\nmsgid \"\"\n\"See `GitHub's docs about reusable workflows \"\n\"<https://docs.github.com/en/actions/using-workflows/reusing-workflows>`_ \"\n\"for more information.\"\nmsgstr \"\"\n\"更多信息请参阅 `GitHub可重用工作流文档 <https://docs.github.com/en/actions/using-\"\n\"workflows/reusing-workflows>`_ 。\"\n\n#: ../../tips.rst:195 f9c527704af24f6da0b4229b7882a25b\nmsgid \"\"\n\"A number of optional inputs can be added to the ``with:`` block when \"\n\"calling the workflow, for example:\"\nmsgstr \"有一些可选输入可以添加到工作流的 ``with:`` 块中：\"\n\n#: ../../tips.rst:206 956f5bae1fc64096acd2a2540a29004c\nmsgid \"Here's the complete list of workflow inputs:\"\nmsgstr \"下面是工作流可用输入参数的完整列表：\"\n\n#: ../../tips.rst:209 eb37c894d7bc4278ab1a92e3b82c5603\nmsgid \"Name\"\nmsgstr \"名称\"\n\n#: ../../tips.rst:209 446faf9e7d544e6aa47d4a1eca506c01\nmsgid \"Required\"\nmsgstr \"是否必需\"\n\n#: ../../tips.rst:209 de96e4f5cd09488296f97f569fe1fb90\nmsgid \"Description\"\nmsgstr \"描述\"\n\n#: ../../tips.rst:209 181bbfff09144f5b9c241b2fc79c989d\nmsgid \"Type\"\nmsgstr \"值的类型\"\n\n#: ../../tips.rst:209 c3d44d1e7be6421a83bae2f5dc6e578f\nmsgid \"Default\"\nmsgstr \"默认值\"\n\n#: ../../tips.rst:211 305d9d73681b4c6c80161cc906d60bbd\nmsgid \"``settings``\"\nmsgstr \"``settings``\"\n\n#: ../../tips.rst:211 dbe6210f19914ae3b11e4caec7a945f0\nmsgid \"Yes\"\nmsgstr \"是\"\n\n#: ../../tips.rst:211 bbd2306b324d4b5eae513cb7a7683286\nmsgid \"\"\n\"The path to your Pelican settings file (``pelican``'s ``--settings`` \"\n\"option), for example: ``\\\"publishconf.py\\\"``\"\nmsgstr \"\"\n\"Pelican配置文件的路径（会被用于 ``pelican`` 命令的 ``--settings`` 选项），例如 \"\n\"``\\\"publishconf.py\\\"`` 。\"\n\n#: ../../tips.rst:211 ../../tips.rst:216 ../../tips.rst:223 ../../tips.rst:227\n#: ../../tips.rst:231 ../../tips.rst:237 ../../tips.rst:243 ../../tips.rst:249\n#: 073e18d8ae29406eb05040d4e3a9ae60 6932c9139d4f4da7a34601a9d78ee622\n#: 7d43e6cfb091410ebec7464da05b61b4 8837cc8935f148fb80f05cc5d3d53629\n#: b2da1f7640f948039230cd835c49accd bfe3d052cdc443bb81fed82e77acf3c1\n#: c93816e00a254ef69c69f05833e8762b ee35302c7e034070af1d234ab919c32a\nmsgid \"string\"\nmsgstr \"string\"\n\n#: ../../tips.rst:216 4eab6faa96244f13a09754112a783f2f\nmsgid \"``requirements``\"\nmsgstr \"``requirements``\"\n\n#: ../../tips.rst:216 ../../tips.rst:223 ../../tips.rst:227 ../../tips.rst:231\n#: ../../tips.rst:237 ../../tips.rst:243 ../../tips.rst:249 ../../tips.rst:255\n#: ../../tips.rst:261 197d6ee11fce4a50996a0c458cfdbdad\n#: 2086d667b9b1475cb0f002924cdfde12 25e940621f5b48c9af487d898d7f93cf\n#: 3052432fbf5d420d8f6adbadb908e6f0 5664232c9fdd46c7b8278b8ecef8e3b1\n#: 6693126a0da74c61b67e14ca8e535ec3 7f8a93a2048140748fa73537bfae2a54\n#: 85fd40a29f31490bb23b20f05e574aaa 9d02d6e4689b4b55bdf832e18b0ed4bb\nmsgid \"No\"\nmsgstr \"否\"\n\n#: ../../tips.rst:216 9d5bdd70e7da4794805180cc758ebe37\nmsgid \"\"\n\"The Python requirements to install, for example to enable markdown and \"\n\"typogrify use: ``\\\"pelican[markdown] typogrify\\\"`` or if you have a \"\n\"requirements file: ``\\\"-r requirements.txt\\\"``\"\nmsgstr \"\"\n\"需要安装的Python模块，例如要开启markdown和typogrify，可指定 ``\\\"pelican[markdown] \"\n\"typogrify\\\"`` ，或者可以指定一个requirements文件： ``\\\"-r requirements.txt\\\"`` \"\n\n#: ../../tips.rst:216 03ad0b322a714032bcce9f56ce66318d\nmsgid \"``\\\"pelican\\\"``\"\nmsgstr \"``\\\"pelican\\\"``\"\n\n#: ../../tips.rst:223 e568553782b443dbacecaa7ded4c391c\nmsgid \"``output-path``\"\nmsgstr \"``output-path``\"\n\n#: ../../tips.rst:223 2920ae9de5a64ae1ad82bd2287fa7c1e\nmsgid \"Where to output the generated files (``pelican``'s ``--output`` option)\"\nmsgstr \"生成文件的输出位置（会被用于 ``pelican`` 命令的 ``--output`` 选项）\"\n\n#: ../../tips.rst:223 41b90747f0954a5799c8baf4a59d99fd\nmsgid \"``\\\"output/\\\"``\"\nmsgstr \"``\\\"output/\\\"``\"\n\n#: ../../tips.rst:227 e2cc62185182463abc5140244a808e6d\nmsgid \"``theme``\"\nmsgstr \"``theme``\"\n\n#: ../../tips.rst:227 cd3b78d03dcd4554a8ce10a873f5ff9f\nmsgid \"\"\n\"The GitHub repo URL of a custom theme to use, for example: \"\n\"``\\\"https://github.com/seanh/sidecar.git\\\"``\"\nmsgstr \"要使用的自定义主题的GitHub仓库URL，例如： ``\\\"https://github.com/seanh/sidecar.git\\\"``\"\n\n#: ../../tips.rst:227 ../../tips.rst:231 919c0e36e8ff40bcbcc4480081b49ce5\n#: d94f331173334fb2a84b1caadffb72df\nmsgid \"``\\\"\\\"``\"\nmsgstr \"``\\\"\\\"``\"\n\n#: ../../tips.rst:231 921a2ae610a84349a5654e204ba6b034\nmsgid \"``theme-checkout``\"\nmsgstr \"``theme-checkout``\"\n\n#: ../../tips.rst:231 7815b328b5f94ca496107881f5bb8aab\nmsgid \"\"\n\"Git ref (branch, tag or commit) of the theme repo to checkout. This can \"\n\"be used to pin the version of your theme. If not specified defaults to \"\n\"the theme repo's default branch.\"\nmsgstr \"\"\n\"主题仓库要checkout的Git引用 (branch, tag 或 commit)。这可以用于固定主题的版本。若未指定，\"\n\"使用仓库的默认branch。\"\n\n#: ../../tips.rst:237 44ceb2743481486b95c1c739d543f15d\nmsgid \"``python``\"\nmsgstr \"``python``\"\n\n#: ../../tips.rst:237 4b5cddab44d24c7c8560e16991b784c7\nmsgid \"\"\n\"The version of Python to use to build the site, for example: ``\\\"3.12\\\"``\"\n\" (to use the most recent version of Python 3.12, this is faster) or \"\n\"``\\\"3.12.1\\\"`` (to use an exact version, slower)\"\nmsgstr \"构建站点时使用的Python版本，例如： ``\\\"3.12\\\"`` 或 ``\\\"3.12.1\\\"``\"\n\n#: ../../tips.rst:237 919c0e36e8ff40bcbcc4480081b49ce5\nmsgid \"``\\\"3.12\\\"``\"\nmsgstr \"``\\\"3.12\\\"``\"\n\n#: ../../tips.rst:243 842af56c539f4a74a97c7a5b1525eb35\nmsgid \"``siteurl``\"\nmsgstr \"``siteurl``\"\n\n#: ../../tips.rst:243 7fc0777d6e174d6f8d757926a61aa3c8\nmsgid \"\"\n\"The base URL of your web site (Pelican's ``SITEURL`` setting). If not \"\n\"passed this will default to the URL of your GitHub Pages site, which is \"\n\"correct in most cases.\"\nmsgstr \"站点的基URL，会用于配置项 ``SITEURL`` 。若未指定，默认值为GitHub Pages站点的URL，这适用于大部分情况。\"\n\n#: ../../tips.rst:243 ../../tips.rst:249 082f65333e224d71817b82b1e4f515c4\n#: 3d786e828a4745db849bdb8f47738db8\nmsgid \"The URL of your GitHub Pages site.\"\nmsgstr \"GitHub Pages站点的URL\"\n\n#: ../../tips.rst:249 e5adb69f985547b7b3cc2bd3f31d4cc3\nmsgid \"``feed_domain``\"\nmsgstr \"``feed_domain``\"\n\n#: ../../tips.rst:249 c88f037c9f1f4148bef6347228257f7d\nmsgid \"\"\n\"The domain to be prepended to feed URLs (Pelican's ``FEED_DOMAIN`` \"\n\"setting). If not passed this will default to the URL of your GitHub Pages\"\n\" site, which is correct in most cases.\"\nmsgstr \"\"\n\"订阅源URL前要附加的域名，会用于配置项 ``FEED_DOMAIN`` 。若未指定，默认值为GitHub \"\n\"Pages站点的URL，这适用于大部分情况。\"\n\n#: ../../tips.rst:255 358c5aa434cd4ad09beab02df88413d5\nmsgid \"``deploy``\"\nmsgstr \"``deploy``\"\n\n#: ../../tips.rst:255 b8748aeace5a448d9382e225be98f90c\nmsgid \"\"\n\"This is used to determine whether you will deploy the site or not to \"\n\"GitHub Pages. This is most useful if you want to test a change to your \"\n\"website in a pull request before deploying those change.\"\nmsgstr \"此项配置用于表示是否要将站点部署至GitHub Pages。当对站点做了更改，并且在正式部署前进行测试，就可以用到此项。\"\n\n#: ../../tips.rst:255 ../../tips.rst:261 034006b9b71b4cb486f230b8aad873ce\nmsgid \"bool\"\nmsgstr \"bool\"\n\n#: ../../tips.rst:255 078ac613a8b74703af98c75bb5a007c1\nmsgid \"``true``\"\nmsgstr \"``true``\"\n\n#: ../../tips.rst:261 842af56c539f4a74a97c7a5b1525eb35\nmsgid \"``stork``\"\nmsgstr \"``stork``\"\n\n#: ../../tips.rst:261 b8748aeace5a448d9382e225be98f90c\nmsgid \"\"\n\"This is used to determine whether Stork will be installed on the runner \"\n\"to be able to build a site with Stork search enabled\"\nmsgstr \"\"\n\"此配置项用于指定是否要在runner中安装Stork搜索。\"\n\n#: ../../tips.rst:261 358c5aa434cd4ad09beab02df88413d5\nmsgid \"``false``\"\nmsgstr \"``false``\"\n\n#: ../../tips.rst:267 e63cf881e3204be8b52ee5d8635ba4cf\nmsgid \"Testing Your Build in a GitHub Pull Request\"\nmsgstr \"在Github拉取请求时进行测试\"\n\n#: ../../tips.rst:269 a2f6bd3420eb46a08f54efda35a6eaf4\nmsgid \"\"\n\"If you want to test your build in a pull request before deploying to \"\n\"GitHub, your workflow might look something like this:\"\nmsgstr \"如果想在正式部署到 GitHub 前在PR中进行测试，下面是一个可用的 workflow 示例\"\n\n#: ../../tips.rst:298 84393693279741efa82c5ee6b27cbd28\nmsgid \"\"\n\"The ``on`` section of the workflow defines the events that will trigger \"\n\"the workflow. In this example, the workflow will run on pushes to the \"\n\"main branch, pull requests to the main branch, and manual runs of the \"\n\"workflow.\"\nmsgstr \"工作流的 ``on`` 部分定义了工作流的触发器。在此示例中，工作流将在main分支收到push、有PR提起到主分支以及手动运行工作流时执行。\"\n\n#: ../../tips.rst:300 cd3c13b2af974a32aa4291d07fc11e9c\nmsgid \"\"\n\"``workflow_dispatch`` defines the deploy boolean to be true by default. \"\n\"This means that if you run the workflow manually, it will deploy the \"\n\"site.\"\nmsgstr \"``workflow_dispatch`` 将 deploy 的默认值设为 true。也就是说当手动运行工作流时，更改的内容就会正式部署。\"\n\n#: ../../tips.rst:302 5402cd211d5b4aa8a244c916bb381a5b\nmsgid \"\"\n\"The ``deploy`` input for the job is using a set of standard GitHub \"\n\"workflow variables to control when ``deploy`` will either be true or \"\n\"false (you can customize this to your needs).\"\nmsgstr \"\"\n\"job中的 ``deploy`` 使用了一些 GitHub workflow 变量来计算 ``deploy`` 值为 true 还是 \"\n\"false（您可以根据需要自定义）。\"\n\n#: ../../tips.rst:304 d084908e3a0749f0b802b43626cfe2c4\nmsgid \"\"\n\"In this example, the ``deploy`` will be true if the event is a push to \"\n\"the main branch (or merging into main from a PR) or a manual run of the \"\n\"workflow. If the event is a pull request, the ``deploy`` will be false \"\n\"and it will only build an artifact for the site.\"\nmsgstr \"\"\n\"在此示例中，如果触发事件是推送到主分支（或从 PR 合并到主分支）或手动运行工作流，则 deploy 将为 true；如果触发事件只是Pull \"\n\"Request，则 ``deploy`` 将为 false，并且此时只会为站点构建一个artifact。\"\n\n#: ../../tips.rst:307 85e70fc3faa04208979f7bbe92b025ef\nmsgid \"\\\"Insecure content\\\" warnings from browsers\"\nmsgstr \"浏览器报“不安全的内容（Insecure content）”警告\"\n\n#: ../../tips.rst:309 34f7075cf31f416da2aeb529c616d97d\nmsgid \"\"\n\"If your site uses ``https://`` and is broken because the browser is \"\n\"blocking network requests (for example for CSS files) due to \\\"insecure \"\n\"content\\\" this may be because GitHub Pages is generating ``http://`` URLs\"\n\" for your site.\"\nmsgstr \"\"\n\"当站点使用 ``https://`` \"\n\"时，可能会损坏，无法正常显示，这是由于浏览器阻拦了一些对“不安全内容”的网络请求。可能的原因之一是GitHub Pages给你的站点生成了 \"\n\"``http://`` URL。\"\n\n#: ../../tips.rst:313 47271df82577424c8e2c31a9e76a553a\nmsgid \"\"\n\"To fix this go into your site repo's settings and enable the **Enforce \"\n\"HTTPS** setting: go to **Settings → Pages** and check **Enforce HTTPS**. \"\n\"Then re-run the workflow to re-deploy your site. Alternatively, you can \"\n\"use the workflow's ``siteurl`` and ``feed_domain`` settings.\"\nmsgstr \"\"\n\"要想解决这一问题，需要为站点所在仓库开启 **强制使用HTTPS** ：点击 **Settings → Pages** 并在其中勾选 \"\n\"**Enforce HTTPS** ，接着再重新执行工作流以重新部署站点。也可以尝试通过配置 ``siteurl`` 与 \"\n\"``feed_domain`` 解决问题。\"\n\n#: ../../tips.rst:321 e69189ef4a8440fb8940d8012b4f19d6\nmsgid \"\"\n\"GitHub Pages will display the custom 404 page described above, as noted \"\n\"in the relevant `GitHub docs \"\n\"<https://help.github.com/articles/custom-404-pages/>`_.\"\nmsgstr \"\"\n\"如果按前述进行配置，GitHub Pages是能够正确显示自定义的404页面的，相关内容在 `GitHub的文档中 \"\n\"<https://help.github.com/articles/custom-404-pages/>`_ 也有提到。\"\n\n#: ../../tips.rst:325 1b8c2457f44a4d61a033363830b8bd90\nmsgid \"Update your site on each commit\"\nmsgstr \"在每次commit后都更新站点\"\n\n#: ../../tips.rst:327 476dbdb670924c02a962e78d6a7854c1\nmsgid \"\"\n\"To automatically update your Pelican site on each commit, you can create \"\n\"a post-commit hook. For example, you can add the following to \"\n\"``.git/hooks/post-commit``::\"\nmsgstr \"\"\n\"要想在每次commit后自动更新Pelican站点，你可以创建一个post-commit钩子。例如，可以将下面的内容保存为 \"\n\"``.git/hooks/post-commit`` ：\"\n\n#: ../../tips.rst:334 36dc5f05eaf84573acada36c59d8d2fc\nmsgid \"Copy static files to the root of your site\"\nmsgstr \"将静态文件拷贝到站点根目录\"\n\n#: ../../tips.rst:336 4a0722ad68e944ee80e6378259cc1dd6\nmsgid \"\"\n\"To use a `custom domain <https://help.github.com/articles/setting-up-a\"\n\"-custom-domain-with-pages>`_ with GitHub Pages, you need to put the \"\n\"domain of your site (e.g., ``blog.example.com``) inside a ``CNAME`` file \"\n\"at the root of your site. To do this, create the ``content/extra/`` \"\n\"directory and add a ``CNAME`` file to it. Then use the ``STATIC_PATHS`` \"\n\"setting to tell Pelican to copy this file to your output directory. For \"\n\"example::\"\nmsgstr \"\"\n\"要将 `自定义域名 <https://help.github.com/articles/setting-up-a-custom-domain-\"\n\"with-pages>`_ 与GitHub Pages一起使用，需要将站点的域名（例如 ``blog.example.com`` \"\n\"）添加到站点根目录的 ``CNAME`` 文件中。为此，请创建 ``content/extra/`` 目录，并在里面添加一个 ``CNAME`` \"\n\"文件。然后使用Pelican的 ``STATIC_PATHS`` 来告诉Pelican将此文件复制到输出目录：\"\n\n#: ../../tips.rst:347 8ad906848762400d9e2462034d151a16\nmsgid \"Note: use forward slashes, ``/``, even on Windows.\"\nmsgstr \"请注意：务必使用正斜杠 ``/`` ，在Windows上也是。\"\n\n#: ../../tips.rst:349 7b109f4944064382babc9158567c8e82\nmsgid \"\"\n\"You can also use the ``EXTRA_PATH_METADATA`` mechanism to place a \"\n\"``favicon.ico`` or ``robots.txt`` at the root of any site.\"\nmsgstr \"\"\n\"利用 ``EXTRA_PATH_METADATA`` 机制，你可以将 ``favicon.ico`` 或 ``robots.txt`` \"\n\"也拷贝到站点的根目录下。\"\n\n#: ../../tips.rst:353 678eea0644b5400496ad9173d05368d5\nmsgid \"How to add YouTube or Vimeo Videos\"\nmsgstr \"如何添加YouTube或Vimeo视频\"\n\n#: ../../tips.rst:355 ca57b327dd6b432d82cdc91193bde6bb\nmsgid \"\"\n\"The easiest way is to paste the embed code of the video from these sites \"\n\"directly into your source content.\"\nmsgstr \"最简单的方法是将这些网站的视频嵌入代码直接粘贴到您的源内容文件中。\"\n\n#: ../../tips.rst:358 0a4f27e2edbe494ab52f73595646986e\nmsgid \"\"\n\"Alternatively, you can also use Pelican plugins like ``liquid_tags``, \"\n\"``pelican_youtube``, or ``pelican_vimeo`` to embed videos in your \"\n\"content.\"\nmsgstr \"\"\n\"或者，您还可以使用例如 ``liquid_tags`` 、``pelican_youtube`` 或 ``pelican_vimeo`` \"\n\"等Pelican插件将视频嵌入。\"\n\n#: ../../tips.rst:361 e73517b72da347738421784b776b1f1c\nmsgid \"\"\n\"Moreover, markup languages like reST and Markdown have plugins that let \"\n\"you embed videos in the markup. You can use `reST video directive \"\n\"<https://gist.github.com/dbrgn/2922648>`_ for reST or `mdx_video plugin \"\n\"<https://github.com/italomaia/mdx-video>`_ for Markdown.\"\nmsgstr \"\"\n\"此外，像reST和 Markdown这样的标记语言都有对应插件可以让你在其中嵌入视频。可以使用 `reST的视频指令 \"\n\"<https://gist.github.com/dbrgn/2922648>`_ 或者 `Markdown的mdx_video插件 \"\n\"<https://github.com/italomaia/mdx-video>`_ 。\"\n\n#: ../../tips.rst:368 b9d27cda716048b2ab7c13646d7faf09\nmsgid \"Develop Locally Using SSL\"\nmsgstr \"在本地使用SSL进行开发\"\n\n#: ../../tips.rst:370 50df9ec072aa47eabbae132fd8f5cb68\nmsgid \"Here's how you can set up your local pelican server to support SSL.\"\nmsgstr \"以下描述了如何在本地Pelican服务器上配置SSL。\"\n\n#: ../../tips.rst:372 9b5045375a874c4d9c29f7109f05c539\nmsgid \"\"\n\"First, create a self-signed certificate and key using ``openssl`` (this \"\n\"creates ``cert.pem`` and ``key.pem``)::\"\nmsgstr \"首先，通过 ``openssl`` 创建自签名的证书和密钥，这会生成 ``cert.pem`` 和 ``key.pem`` 文件：\"\n\n#: ../../tips.rst:376 2f1cfa536fc540f69d671f8a118769d7\nmsgid \"\"\n\"And use this command to launch the server (the server starts within your \"\n\"``output`` directory)::\"\nmsgstr \"接着使用下面的命令来开启服务器（此服务器会在 ``output`` 目录下开启）：\"\n\n#: ../../tips.rst:380 029ea2b0e4fe4b0f814158ae33e3a8ff\nmsgid \"If you are using ``develop-server.sh``,  add this to the top::\"\nmsgstr \"如果你使用的是 ``develop-server.sh`` 脚本，在脚本的开头添加：\"\n\n#: ../../tips.rst:385 c2784fdd9fdb433799d57f903d0e49d8\nmsgid \"and modify the ``pelican.server`` line as follows::\"\nmsgstr \"然后修改按照下述修改 ``pelican.server`` 一行：\"\n\n#~ msgid \"\"\n#~ \"To publish a Pelican site in the\"\n#~ \" form of User Pages, you need \"\n#~ \"to *push* the content of the \"\n#~ \"``output`` dir generated by Pelican to\"\n#~ \" the ``master`` branch of your \"\n#~ \"``<username>.github.io`` repository on GitHub.\"\n#~ msgstr \"\"\n\n#~ msgid \"\"\n#~ \"The ``git push`` command pushes the \"\n#~ \"local ``gh-pages`` branch (freshly \"\n#~ \"updated by the ``ghp-import`` command)\"\n#~ \" to the ``elemoine.github.io`` repository's \"\n#~ \"``master`` branch on GitHub.\"\n#~ msgstr \"\"\n\n#~ msgid \"\"\n#~ \"Now you can push the whole project\"\n#~ \" ``<username>.github.io`` to the master \"\n#~ \"branch of your GitHub repository::\"\n#~ msgstr \"\"\n\n#~ msgid \"\"\n#~ \"Pelican-powered sites can be published\"\n#~ \" to GitHub Pages via a `custom \"\n#~ \"workflow \"\n#~ \"<https://github.com/getpelican/pelican/blob/master/.github/workflows/github_pages.yml>`_.\"\n#~ \" To use it:\"\n#~ msgstr \"\"\n\n#~ msgid \"\"\n#~ \"You may want to replace the \"\n#~ \"``@master`` with the ID of a \"\n#~ \"specific commit in this repo in \"\n#~ \"order to pin the version of the\"\n#~ \" reusable workflow that you're using: \"\n#~ \"``uses: \"\n#~ \"getpelican/pelican/.github/workflows/github_pages.yml@<COMMIT_ID>``.\"\n#~ \" If you do this you might want\"\n#~ \" to get Dependabot to send you \"\n#~ \"automated pull requests to update that\"\n#~ \" commit ID whenever new versions of\"\n#~ \" this workflow are published, like \"\n#~ \"so:\"\n#~ msgstr \"\"\n"
  },
  {
    "path": "docs/pelican-themes.rst",
    "content": "pelican-themes\n##############\n\n\n\nDescription\n===========\n\n``pelican-themes`` is a command line tool for managing themes for Pelican. See\n:ref:`settings/themes` for settings related to themes.\n\n\nUsage\n\"\"\"\"\"\n\n| pelican-themes [-h] [-l] [-i theme path [theme path ...]]\n|                      [-r theme name [theme name ...]]\n|                      [-s theme path [theme path ...]] [-v] [--version]\n\nOptional arguments:\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\n\n-h, --help                              Show the help and exit\n\n-l, --list                              Show the themes already installed\n\n-i theme_path, --install theme_path     One or more themes to install\n\n-r theme_name, --remove theme_name      One or more themes to remove\n\n-s theme_path, --symlink theme_path     Same as ``--install``, but create a symbolic link instead of copying the theme.\n                                        Useful for theme development\n\n-v, --verbose                           Verbose output\n\n--version                               Print the version of this script\n\n\n\nExamples\n========\n\n\nListing the installed themes\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nWith ``pelican-themes``, you can see the available themes by using the ``-l``\nor ``--list`` option:\n\n.. code-block:: console\n\n    $ pelican-themes -l\n    notmyidea\n    two-column@\n    simple\n    $ pelican-themes --list\n    notmyidea\n    two-column@\n    simple\n\nIn this example, we can see there are three themes available: ``notmyidea``,\n``simple``, and ``two-column``.\n\n``two-column`` is followed by an ``@`` because this theme is not copied to\nthe Pelican theme path, but is instead just linked to it (see `Creating\nsymbolic links`_ for details about creating symbolic links).\n\nNote that you can combine the ``--list`` option with the ``-v`` or\n``--verbose`` option to get more verbose output, like this:\n\n.. code-block:: console\n\n    $ pelican-themes -v -l\n    /usr/local/lib/python2.6/dist-packages/pelican-2.6.0-py2.6.egg/pelican/themes/notmyidea\n    /usr/local/lib/python2.6/dist-packages/pelican-2.6.0-py2.6.egg/pelican/themes/two-column (symbolic link to `/home/skami/Dev/Python/pelican-themes/two-column')\n    /usr/local/lib/python2.6/dist-packages/pelican-2.6.0-py2.6.egg/pelican/themes/simple\n\n\nInstalling themes\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nYou can install one or more themes using the ``-i`` or ``--install`` option.\nThis option takes as argument the path(s) of the theme(s) you want to install,\nand can be combined with the ``--verbose`` option:\n\n.. code-block:: console\n\n    # pelican-themes --install ~/Dev/Python/pelican-themes/notmyidea-cms --verbose\n\n.. code-block:: console\n\n    # pelican-themes --install ~/Dev/Python/pelican-themes/notmyidea-cms\\\n                               ~/Dev/Python/pelican-themes/martyalchin \\\n                               --verbose\n\n.. code-block:: console\n\n    # pelican-themes -vi ~/Dev/Python/pelican-themes/two-column\n\n\nRemoving themes\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nThe ``pelican-themes`` command can also remove themes from the Pelican themes\npath. The ``-r`` or ``--remove`` option takes as argument the name(s) of the\ntheme(s) you want to remove, and can be combined with the ``--verbose`` option.\n\n.. code-block:: console\n\n    # pelican-themes --remove two-column\n\n.. code-block:: console\n\n    # pelican-themes -r martyachin notmyidea-cmd -v\n\n\n\n\n\nCreating symbolic links\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\n``pelican-themes`` can also install themes by creating symbolic links instead\nof copying entire themes into the Pelican themes path.\n\nTo symbolically link a theme, you can use the ``-s`` or ``--symlink``, which\nworks exactly as the ``--install`` option:\n\n.. code-block:: console\n\n    # pelican-themes --symlink ~/Dev/Python/pelican-themes/two-column\n\nIn this example, the ``two-column`` theme is now symbolically linked to the\nPelican themes path, so we can use it, but we can also modify it without having\nto reinstall it after each modification.\n\nThis is useful for theme development:\n\n.. code-block:: console\n\n    $ sudo pelican-themes -s ~/Dev/Python/pelican-themes/two-column\n    $ pelican ~/Blog/content -o /tmp/out -t two-column\n    $ firefox /tmp/out/index.html\n    $ vim ~/Dev/Pelican/pelican-themes/two-column/static/css/main.css\n    $ pelican ~/Blog/content -o /tmp/out -t two-column\n    $ cp /tmp/bg.png ~/Dev/Pelican/pelican-themes/two-column/static/img/bg.png\n    $ pelican ~/Blog/content -o /tmp/out -t two-column\n    $ vim ~/Dev/Pelican/pelican-themes/two-column/templates/index.html\n    $ pelican ~/Blog/content -o /tmp/out -t two-column\n\n\n\nDoing several things at once\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nThe ``--install``, ``--remove`` and ``--symlink`` options are not mutually\nexclusive, so you can combine them in the same command line to do more than one\noperation at time, like this:\n\n\n.. code-block:: console\n\n    # pelican-themes --remove notmyidea-cms two-column \\\n                     --install ~/Dev/Python/pelican-themes/notmyidea-cms-fr \\\n                     --symlink ~/Dev/Python/pelican-themes/two-column \\\n                     --verbose\n\nIn this example, the theme ``notmyidea-cms`` is replaced by the theme\n``notmyidea-cms-fr``\n"
  },
  {
    "path": "docs/plugins.rst",
    "content": ".. _plugins:\n\nPlugins\n#######\n\nBeginning with version 3.0, Pelican supports plugins. Plugins are a way to add\nfeatures to Pelican without having to directly modify the Pelican core.\n\nHow to use plugins\n==================\n\nStarting with version 4.5, Pelican moved to a new plugin structure utilizing\nnamespace packages that can be easily installed via Pip_. Plugins supporting\nthis structure will install under the namespace package ``pelican.plugins`` and\ncan be automatically discovered by Pelican. To see a list of Pip-installed\nnamespace plugins that are active in your environment, run::\n\n    pelican-plugins\n\nIf you leave the ``PLUGINS`` setting as default (``None``), Pelican will\nautomatically discover namespace plugins and register them. If, on the other\nhand, you specify a ``PLUGINS`` setting as a list of plugins, this\nauto-discovery will be disabled. At that point, only the plugins you specify\nwill be registered, and you must explicitly list any namespace plugins as well.\n\nIf you are using the ``PLUGINS`` setting, you can specify plugins in two ways.\nThe first method specifies plugins as a list of strings. Namespace plugins can\nbe specified either by their full names (``pelican.plugins.myplugin``) or by\ntheir short names (``myplugin``)::\n\n    PLUGINS = ['package.myplugin',\n               'namespace_plugin1',\n               'pelican.plugins.namespace_plugin2']\n\nAlternatively, you can import them in your settings file and pass the modules::\n\n    from package import myplugin\n    from pelican.plugins import namespace_plugin1, namespace_plugin2\n    PLUGINS = [myplugin, namespace_plugin1, namespace_plugin2]\n\n.. note::\n\n   When experimenting with different plugins (especially the ones that deal\n   with metadata and content) caching may interfere and the changes may not be\n   visible. In such cases disable caching with ``LOAD_CONTENT_CACHE = False``\n   or use the ``--ignore-cache`` command-line switch.\n\nIf your plugins are not in an importable path, you can specify a list of paths\nvia the ``PLUGIN_PATHS`` setting. As shown in the following example, paths in\nthe ``PLUGIN_PATHS`` list can be absolute or relative to the settings file::\n\n    PLUGIN_PATHS = [\"plugins\", \"/srv/pelican/plugins\"]\n    PLUGINS = [\"assets\", \"liquid_tags\", \"sitemap\"]\n\nWhere to find plugins\n=====================\nNamespace plugins can be found in the `pelican-plugins organization`_ as\nindividual repositories. Legacy plugins are located in the `pelican-plugins\nrepository`_ and will be gradually phased out in favor of the namespace\nversions.\n\n.. _pelican-plugins organization: https://github.com/pelican-plugins\n.. _pelican-plugins repository: https://github.com/getpelican/pelican-plugins\n\nPlease note that while we do our best to review and maintain these plugins,\nthey are submitted by the Pelican community and thus may have varying levels of\nsupport and interoperability.\n\nHow to create plugins\n=====================\n\nPlugins are based on the concept of signals. Pelican sends signals, and plugins\nsubscribe to those signals. The list of available signals is documented in a\nsubsequent section.\n\nThe only rule to follow for plugins is to define a ``register`` callable, in\nwhich you map the signals to your plugin logic. Let's take a simple example::\n\n    import logging\n\n    from pelican import signals\n\n    log = logging.getLogger(__name__)\n\n    def test(sender):\n        log.debug(\"%s initialized !!\", sender)\n\n    def register():\n        signals.initialized.connect(test)\n\n.. note::\n\n    Signal receivers are weakly-referenced and thus must not be defined within\n    your ``register`` callable or they will be garbage-collected before the\n    signal is emitted.\n\nIf multiple plugins connect to the same signal, plugins will be invoked in the\norder they are registered. When the ``PLUGINS`` setting is defined, plugin\ninvocation order will be the order in which the plugins are listed in the\n``PLUGINS`` setting. If you rely on auto-discovered namespace plugins and have\nno ``PLUGINS`` setting defined, plugins will be invoked in the same order that\nthey are discovered (the same order as listed in the output of the\n``pelican-plugins`` command). If you want to specify the order explicitly,\ndisable auto-discovery by defining ``PLUGINS`` in the desired order.\n\nNamespace plugin structure\n--------------------------\n\nNamespace plugins must adhere to a certain structure in order to function\nproperly. They need to be installable (i.e. contain ``setup.py`` or equivalent)\nand have a folder structure as follows::\n\n    myplugin\n    ├── pelican\n    │   └── plugins\n    │       └── myplugin\n    │           ├── __init__.py\n    │           └── ...\n    ├── ...\n    └── setup.py\n\nIt is crucial that ``pelican`` or ``pelican/plugins`` folder **not**\ncontain an ``__init__.py`` file. In fact, it is best to have those folders\nempty besides the listed folders in the above structure and keep your\nplugin related files contained solely in the ``pelican/plugins/myplugin``\nfolder to avoid any issues.\n\nTo easily set up the proper structure, a `cookiecutter template for plugins`_\nis provided. Refer to that project's README for instructions on how to use it.\n\n.. _cookiecutter template for plugins: https://github.com/getpelican/cookiecutter-pelican-plugin\n\nList of signals\n===============\n\nHere is the list of currently implemented signals:\n\n=================================   ============================   ===========================================================================\nSignal                              Arguments                       Description\n=================================   ============================   ===========================================================================\ninitialized                         pelican object\nfinalized                           pelican object                 invoked after all the generators are executed and just before pelican exits\n                                                                   useful for custom post processing actions, such as:\n                                                                   - minifying js/css assets.\n                                                                   - notify/ping search engines with an updated sitemap.\ngenerator_init                      generator                      invoked in the Generator.__init__\nall_generators_finalized            generators                     invoked after all the generators are executed and before writing output\nreaders_init                        readers                        invoked in the Readers.__init__\narticle_generator_context           article_generator, metadata\narticle_generator_preread           article_generator              invoked before a article is read in ArticlesGenerator.generate_context;\n                                                                   use if code needs to do something before every article is parsed\narticle_generator_init              article_generator              invoked in the ArticlesGenerator.__init__\narticle_generator_pretaxonomy       article_generator              invoked before categories and tags lists are created\n                                                                   useful when e.g. modifying the list of articles to be generated\n                                                                   so that removed articles are not leaked in categories or tags\narticle_generator_finalized         article_generator              invoked at the end of ArticlesGenerator.generate_context\narticle_generator_write_article     article_generator, content     invoked before writing each article, the article is passed as content\narticle_writer_finalized            article_generator, writer      invoked after all articles and related pages have been written, but before\n                                                                   the article generator is closed.\nget_generators                      pelican object                 invoked in Pelican.get_generator_classes,\n                                                                   can return a Generator, or several\n                                                                   generators in a tuple or in a list.\nget_writer                          pelican object                 invoked in Pelican.get_writer,\n                                                                   can return a custom Writer.\npage_generator_context              page_generator, metadata\npage_generator_preread              page_generator                 invoked before a page is read in PageGenerator.generate_context;\n                                                                   use if code needs to do something before every page is parsed.\npage_generator_init                 page_generator                 invoked in the PagesGenerator.__init__\npage_generator_finalized            page_generator                 invoked at the end of PagesGenerator.generate_context\npage_generator_write_page           page_generator, content        invoked before writing each page, the page is passed as content\npage_writer_finalized               page_generator, writer         invoked after all pages have been written, but before the page generator\n                                                                   is closed.\nstatic_generator_context            static_generator, metadata\nstatic_generator_preread            static_generator               invoked before a static file is read in StaticGenerator.generate_context;\n                                                                   use if code needs to do something before every static file is added to the\n                                                                   staticfiles list.\nstatic_generator_init               static_generator               invoked in the StaticGenerator.__init__\nstatic_generator_finalized          static_generator               invoked at the end of StaticGenerator.generate_context\ncontent_object_init                 content_object                 invoked at the end of Content.__init__\ncontent_written                     path, context                  invoked each time a content file is written.\nfeed_generated                      context, feed                  invoked each time a feed gets generated. Can be used to modify a feed\n                                                                   object before it gets written.\nfeed_written                        path, context, feed            invoked each time a feed file is written.\n=================================   ============================   ===========================================================================\n\n.. warning::\n\n   Avoid ``content_object_init`` signal if you intend to read ``summary`` or\n   ``content`` properties of the content object. That combination can result in\n   unresolved links when :ref:`ref-linking-to-internal-content` (see\n   `pelican-plugins bug #314`_). Use ``_summary`` and ``_content`` properties\n   instead, or, alternatively, run your plugin at a later stage (e.g.\n   ``all_generators_finalized``).\n\n.. note::\n\n   After Pelican 3.2, signal names were standardized.  Older plugins may need\n   to be updated to use the new names:\n\n   ==========================  ===========================\n   Old name                    New name\n   ==========================  ===========================\n   article_generate_context    article_generator_context\n   article_generate_finalized  article_generator_finalized\n   article_generate_preread    article_generator_preread\n   pages_generate_context      page_generator_context\n   pages_generate_preread      page_generator_preread\n   pages_generator_finalized   page_generator_finalized\n   pages_generator_init        page_generator_init\n   static_generate_context     static_generator_context\n   static_generate_preread     static_generator_preread\n   ==========================  ===========================\n\nRecipes\n=======\n\nWe eventually realised some of the recipes to create plugins would be best\nshared in the documentation somewhere, so here they are!\n\nHow to create a new reader\n--------------------------\n\nOne thing you might want is to add support for your very own input format.\nWhile it might make sense to add this feature in Pelican core, we wisely chose\nto avoid this situation and instead have the different readers defined via\nplugins.\n\nThe rationale behind this choice is mainly that plugins are really easy to\nwrite and don't slow down Pelican itself when they're not active.\n\nNo more talking — here is an example::\n\n    from pelican import signals\n    from pelican.readers import BaseReader\n\n    # Create a new reader class, inheriting from the pelican.reader.BaseReader\n    class NewReader(BaseReader):\n        enabled = True  # Yeah, you probably want that :-)\n\n        # The list of file extensions you want this reader to match with.\n        # If multiple readers were to use the same extension, the latest will\n        # win (so the one you're defining here, most probably).\n        file_extensions = ['yeah']\n\n        # You need to have a read method, which takes a filename and returns\n        # some content and the associated metadata.\n        def read(self, filename):\n            metadata = {'title': 'Oh yeah',\n                        'category': 'Foo',\n                        'date': '2012-12-01'}\n\n            parsed = {}\n            for key, value in metadata.items():\n                parsed[key] = self.process_metadata(key, value)\n\n            return \"Some content\", parsed\n\n    def add_reader(readers):\n        readers.reader_classes['yeah'] = NewReader\n\n    # This is how pelican works.\n    def register():\n        signals.readers_init.connect(add_reader)\n\n\nAdding a new generator\n----------------------\n\nAdding a new generator is also really easy. You might want to have a look at\n:doc:`internals` for more information on how to create your own generator.\n\n::\n\n    def get_generators(pelican_object):\n        # define a new generator here if you need to\n        return MyGenerator\n\n    def register():\n        signals.get_generators.connect(get_generators)\n\n\nAdding a new writer\n-------------------\n\nAdding a writer will allow you to output additional file formats to disk, or\nchange how the existing formats are written to disk. Note that only one writer\nwill be active at a time, so be sure to either subclass the built-in Writer, or\ncompletely re-implement it.\n\nHere is a basic example of how to set up your own writer::\n\n    from pelican.writers import Writer\n    from pelican import signals\n\n    class MyWriter(Writer):\n        # define new writer functionality\n        pass\n\n\n    def add_writer(pelican_object):\n        # use pelican_instance to setup stuff if needed\n        return MyWriter\n\n\n    def register():\n        signals.get_writer.connect(add_writer)\n\n\nUsing Plugins to Inject Content\n-------------------------------\n\nYou can programmatically inject articles or pages using plugins. This can be\nuseful if you plan to fetch articles from an API, for example.\n\nFollowing is a simple example of how one can build a plugin that injects a\ncustom article, using the ``article_generator_pretaxonomy`` signal::\n\n    import datetime\n\n    from pelican import signals\n    from pelican.contents import Article\n    from pelican.readers import BaseReader\n\n    def addArticle(articleGenerator):\n        settings = articleGenerator.settings\n\n        # Author, category, and tags are objects, not strings, so they need to\n        # be handled using BaseReader's process_metadata() function.\n        baseReader = BaseReader(settings)\n\n        content = \"I am the body of an injected article!\"\n\n        newArticle = Article(content, {\n            \"title\": \"Injected Article!\",\n            \"date\": datetime.datetime.now(),\n            \"category\": baseReader.process_metadata(\"category\", \"fromAPI\"),\n            \"tags\": baseReader.process_metadata(\"tags\", \"tagA, tagB\")\n        })\n\n        articleGenerator.articles.insert(0, newArticle)\n\n    def register():\n        signals.article_generator_pretaxonomy.connect(addArticle)\n\n\n\n.. _Pip: https://pip.pypa.io/\n.. _pelican-plugins bug #314: https://github.com/getpelican/pelican-plugins/issues/314\n"
  },
  {
    "path": "docs/publish.rst",
    "content": "Publish your site\n#################\n\n.. _site_generation:\n\nSite generation\n===============\n\nOnce Pelican is installed and you have some content (e.g., in Markdown or reST\nformat), you can convert your content into HTML via the ``pelican`` command,\nspecifying the path to your content and (optionally) the path to your\n:doc:`settings<settings>` file::\n\n    pelican /path/to/your/content/ [-s path/to/your/settings.py]\n\nThe above command will generate your site and save it in the ``output/``\nfolder, using the default theme to produce a simple site. The default theme\nconsists of very simple HTML without styling and is provided so folks may use\nit as a basis for creating their own themes.\n\nYou can also tell Pelican to watch for your modifications, instead of manually\nre-running it every time you want to see your changes. To enable this, run the\n``pelican`` command with the ``-r`` or ``--autoreload`` option. On non-Windows\nenvironments, this option can also be combined with the ``-l`` or ``--listen``\noption to simultaneously both auto-regenerate *and* serve the output at\nhttp://localhost:8000::\n\n    pelican --autoreload --listen\n\nPelican has other command-line switches available. Have a look at the help to\nsee all the options you can use::\n\n    pelican --help\n\nViewing the generated files\n---------------------------\n\nThe files generated by Pelican are static files, so you don't actually need\nanything special to view them. You can use your browser to open the generated\nHTML files directly::\n\n    firefox output/index.html\n\nBecause the above method may have trouble locating your CSS and other linked\nassets, running Pelican's simple built-in web server will often provide a more\nreliable previewing experience::\n\n    pelican --listen\n\nOnce the web server has been started, you can preview your site at:\nhttp://localhost:8000/\n\nDeployment\n==========\n\nAfter you have generated your site, previewed it in your local development\nenvironment, and are ready to deploy it to production, you might first\nre-generate your site with any production-specific settings (e.g., analytics,\nfeeds, etc.) that you may have defined::\n\n    pelican content -s publishconf.py\n\nTo base your publish configuration on top of your ``pelicanconf.py``, you can\nimport your ``pelicanconf`` settings by including the following line in your\n``publishconf.py``::\n\n    from pelicanconf import *\n\nIf you have generated a ``publishconf.py`` using ``pelican-quickstart``, this\nline is included by default.\n\nThe steps for deploying your site will depend on where it will be hosted. If\nyou have SSH access to a server running Nginx or Apache, you might use the\n``rsync`` tool to transmit your site files::\n\n    rsync -avc --delete output/ host.example.com:/var/www/your-site/\n\nThere are many other deployment options, some of which can be configured when\nfirst setting up your site via the ``pelican-quickstart`` command. See the\n:doc:`Tips<tips>` page for detail on publishing via GitHub Pages.\n\nAutomation\n==========\n\nWhile the ``pelican`` command is the canonical way to generate your site,\nautomation tools can be used to streamline the generation and publication flow.\nOne of the questions asked during the ``pelican-quickstart`` process pertains\nto whether you want to automate site generation and publication. If you\nanswered \"yes\" to that question, a ``tasks.py`` and ``Makefile`` will be\ngenerated in the root of your project. These files, pre-populated with certain\ninformation gleaned from other answers provided during the\n``pelican-quickstart`` process, are meant as a starting point and should be\ncustomized to fit your particular needs and usage patterns. If you find one or\nboth of these automation tools to be of limited utility, these files can\nbe deleted at any time and will not affect usage of the canonical ``pelican``\ncommand.\n\nFollowing are automation tools that \"wrap\" the ``pelican`` command and can\nsimplify the process of generating, previewing, and uploading your site.\n\nInvoke\n------\n\nThe advantage of Invoke_ is that it is written in Python and thus can be used\nin a wide range of environments. The downside is that it must be installed\nseparately. Use the following command to install Invoke, prefixing with\n``sudo`` if your environment requires it::\n\n    python -m pip install invoke\n\nTake a moment to open the ``tasks.py`` file that was generated in your project\nroot. You will see a number of commands, any one of which can be renamed,\nremoved, and/or customized to your liking. Using the out-of-the-box\nconfiguration, you can generate your site via::\n\n    invoke build\n\nIf you'd prefer to have Pelican automatically regenerate your site every time a\nchange is detected (which is handy when testing locally), use the following\ncommand instead::\n\n    invoke regenerate\n\nTo serve the generated site so it can be previewed in your browser at\nhttp://localhost:8000/::\n\n    invoke serve\n\nTo serve the generated site with automatic browser reloading every time a\nchange is detected, first ``python -m pip install livereload``, then use the\nfollowing command::\n\n    invoke livereload\n\nIf during the ``pelican-quickstart`` process you answered \"yes\" when asked\nwhether you want to upload your site via SSH, you can use the following command\nto publish your site via rsync over SSH::\n\n    invoke publish\n\nThese are just a few of the commands available by default, so feel free to\nexplore ``tasks.py`` and see what other commands are available. More\nimportantly, don't hesitate to customize ``tasks.py`` to suit your specific\nneeds and preferences.\n\nMake\n----\n\nA ``Makefile`` is also automatically created for you when you say \"yes\" to the\nrelevant question during the ``pelican-quickstart`` process. The advantage of\nthis method is that the ``make`` command is built into most POSIX systems and\nthus doesn't require installing anything else in order to use it. The downside\nis that non-POSIX systems (e.g., Windows) do not include ``make``, and\ninstalling it on those systems can be a non-trivial task.\n\nIf you want to use ``make`` to generate your site using the settings in\n``pelicanconf.py``, run::\n\n    make html\n\nTo generate the site for production, using the settings in ``publishconf.py``,\nrun::\n\n    make publish\n\nIf you'd prefer to have Pelican automatically regenerate your site every time a\nchange is detected (which is handy when testing locally), use the following\ncommand instead::\n\n    make regenerate\n\nTo serve the generated site so it can be previewed in your browser at\nhttp://localhost:8000/::\n\n    make serve\n\nNormally you would need to run ``make regenerate`` and ``make serve`` in two\nseparate terminal sessions, but you can run both at once via::\n\n    make devserver\n\nThe above command will simultaneously run Pelican in regeneration mode as well\nas serve the output at http://localhost:8000.\n\nWhen you're ready to publish your site, you can upload it via the method(s) you\nchose during the ``pelican-quickstart`` questionnaire. For this example, we'll\nuse rsync over ssh::\n\n    make rsync_upload\n\nThat's it! Your site should now be live.\n\n(The default ``Makefile`` and ``devserver.sh`` scripts use the ``python`` and\n``pelican`` executables to complete its tasks. If you want to use different\nexecutables, such as ``python3``, you can set the ``PY`` and ``PELICAN``\nenvironment variables, respectively, to override the default executable names.)\n\n.. _Invoke: https://www.pyinvoke.org/\n"
  },
  {
    "path": "docs/quickstart.rst",
    "content": "Quickstart\n##########\n\nReading through all the documentation is highly recommended, but for the truly\nimpatient, following are some quick steps to get started.\n\nInstallation\n------------\n\nInstall Pelican (and optionally Markdown if you intend to use it) on Python\n|min_python| by running the following command in your preferred terminal, prefixing\nwith ``sudo`` if permissions warrant::\n\n    python -m pip install \"pelican[markdown]\"\n\nCreate a project\n----------------\n\nFirst, choose a name for your project, create an appropriately-named directory\nfor your site, and switch to that directory::\n\n    mkdir -p ~/projects/yoursite\n    cd ~/projects/yoursite\n\nCreate a skeleton project via the ``pelican-quickstart`` command, which begins\nby asking some questions about your site::\n\n    pelican-quickstart\n\nFor questions that have default values denoted in brackets, feel free to use\nthe Return key to accept those default values [#tzlocal_fn]_. When asked for\nyour URL prefix, enter your domain name as indicated (e.g.,\n``https://example.com``).\n\nCreate an article\n-----------------\n\nYou cannot run Pelican until you have created some content. Use your preferred\ntext editor to create your first article with the following content::\n\n    Title: My First Review\n    Date: 2010-12-03 10:20\n    Category: Review\n\n    Following is a review of my favorite mechanical keyboard.\n\nGiven that this example article is in Markdown format, save it as\n``~/projects/yoursite/content/keyboard-review.md``.\n\nGenerate your site\n------------------\n\nFrom your project root directory, run the ``pelican`` command to generate your site::\n\n    pelican content\n\nYour site has now been generated inside the ``output/`` directory. (You may see\na warning related to feeds, but that is normal when developing locally and can\nbe ignored for now.)\n\nPreview your site\n-----------------\n\nOpen a new terminal session, navigate to your project root directory, and\nrun the following command to launch Pelican's web server::\n\n    pelican --listen\n\nPreview your site by navigating to http://localhost:8000/ in your browser.\n\nContinue reading the other documentation sections for more detail, and check\nout the Pelican wiki's Tutorials_ page for links to community-published\ntutorials.\n\n.. _Tutorials: https://github.com/getpelican/pelican/wiki/Tutorials\n\nFootnotes\n---------\n\n.. [#tzlocal_fn] You can help localize default fields by installing the\n                 optional `tzlocal <https://pypi.org/project/tzlocal/>`_\n                 module.\n"
  },
  {
    "path": "docs/report.rst",
    "content": "Some history about Pelican\n##########################\n\n.. warning::\n\n    This page comes from a report the original author (Alexis Métaireau) wrote\n    right after writing Pelican, in December 2010. The information may not be\n    up-to-date.\n\nPelican is a simple static blog generator. It parses markup files (Markdown or\nreStructuredText for now) and generates an HTML folder with all the files in\nit. I've chosen to use Python to implement Pelican because it seemed to be\nsimple and to fit to my needs. I did not wanted to define a class for each\nthing, but still wanted to keep my things loosely coupled. It turns out that it\nwas exactly what I wanted. From time to time, thanks to the feedback of some\nusers, it took me a very few time to provide fixes on it. So far, I've\nre-factored the Pelican code by two\ntimes; each time took less than 30 minutes.\n\nUse case\n========\n\nI was previously using WordPress, a solution you can host on a web server to\nmanage your blog. Most of the time, I prefer using markup languages such as\nMarkdown or reStructuredText to type my articles. To do so, I use vim. I think\nit is important to let the people choose the tool they want to write the\narticles. In my opinion, a blog manager should just allow you to take any kind\nof input and transform it to a weblog. That's what Pelican does. You can write\nyour articles using the tool you want, and the markup language you want, and\nthen generate a static HTML weblog.\n\n.. image:: _static/overall.png\n\nTo be flexible enough, Pelican has template support, so you can easily write\nyour own themes if you want to.\n\nDesign process\n==============\n\nPelican came from a need I have. I started by creating a single file\napplication, and I have make it grow to support what it does by now. To start,\nI wrote a piece of documentation about what I wanted to do. Then, I created the\ncontent I wanted to parse (the reStructuredText files) and started\nexperimenting with the code. Pelican was 200 lines long and contained almost\nten functions and one class when it was first usable.\n\nI have been facing different problems all over the time and wanted to add\nfeatures to Pelican while using it. The first change I have done was to add the\nsupport of a settings file. It is possible to pass the options to the command\nline, but can be tedious if there is a lot of them. In the same way, I have\nadded the support of different things over time: Atom feeds, multiple themes,\nmultiple markup support, etc. At some point, it appears that the \"only one\nfile\" mantra was not good enough for Pelican, so I decided to rework a bit all\nthat, and split this in multiple different files.\n\nI’ve separated the logic in different classes and concepts:\n\n* *writers* are responsible of all the writing process of the files.\n  They are responsible of writing .html files, RSS feeds and so on. Since those\n  operations are commonly used, the object is created once, and then passed to\n  the generators.\n\n* *readers* are used to read from various formats (Markdown and\n  reStructuredText for now, but the system is extensible). Given a file, they\n  return metadata (author, tags, category, etc) and content (HTML formatted).\n\n* *generators* generate the different outputs. For instance, Pelican\n  comes with an ArticlesGenerator and PagesGenerator, into others. Given a\n  configuration, they can do whatever you want them to do. Most of the time\n  it's generating files from inputs (user inputs and files).\n\nI also deal with contents objects. They can be ``Articles``, ``Pages``,\n``Quotes``, or whatever you want. They are defined in the ``contents.py``\nmodule and represent some content to be used by the program.\n\nIn more detail\n==============\n\nHere is an overview of the classes involved in Pelican.\n\n.. image:: _static/uml.jpg\n\nThe interface does not really exist, and I have added it only to clarify the\nwhole picture. I do use duck typing and not interfaces.\n\nInternally, the following process is followed:\n\n* First of all, the command line is parsed, and some content from the user is\n  used to initialize the different generator objects.\n\n* A ``context`` is created. It contains the settings from the command line and\n  a settings file if provided.\n* The ``generate_context`` method of each generator is called, updating\n  the context.\n* The writer is created and given to the ``generate_output`` method of each\n  generator.\n\nI make two calls because it is important that when the output is generated by\nthe generators, the context will not change. In other words, the first method\n``generate_context`` should modify the context, whereas the second\n``generate_output`` method should not.\n\nThen, it is up to the generators to do what the want, in the\n``generate_context`` and ``generate_content`` method. Taking the\n``ArticlesGenerator`` class will help to understand some others concepts. Here\nis what happens when calling the ``generate_context`` method:\n\n* Read the folder “path”, looking for restructured text files, load each of\n  them, and construct a content object (``Article``) with it. To do so, use\n  ``Reader`` objects.\n* Update the ``context`` with all those articles.\n\nThen, the ``generate_content`` method uses the ``context`` and the ``writer``\nto generate the wanted output.\n"
  },
  {
    "path": "docs/settings.rst",
    "content": "Settings\n########\n\nPelican is configurable thanks to a settings file you can pass to the command\nline::\n\n    pelican content -s path/to/your/pelicanconf.py\n\nIf you used the ``pelican-quickstart`` command, your primary settings file will\nbe named ``pelicanconf.py`` by default.\n\nYou can also specify settings via ``-e`` / ``--extra-settings`` option\nflags. It will override default settings as well as any defined within the\nsetting file. Note that values must follow JSON notation::\n\n    pelican content -e SITENAME='\"A site\"' READERS='{\"html\": null}' CACHE_CONTENT=true\n\nEnvironment variables can also be used here but must be escaped appropriately::\n\n    pelican content -e API_KEY=''\\\"$API_KEY\\\"''\n\n.. note::\n\n   When experimenting with different settings (especially the metadata ones)\n   caching may interfere and the changes may not be visible. In such cases\n   disable caching with ``LOAD_CONTENT_CACHE = False`` or use the\n   ``--ignore-cache`` command-line switch.\n\nSettings are configured in the form of a Python module (a file). There is an\n`example settings file\n<https://raw.githubusercontent.com/getpelican/pelican/main/samples/pelican.conf.py>`_\navailable for reference.\n\nTo see a list of current settings in your environment, including both default\nand any customized values, run the following command (append one or more\nspecific setting names as arguments to see values for those settings only)::\n\n    pelican --print-settings\n\nAll the setting identifiers must be set in all-caps, otherwise they will not be\nprocessed. Setting values that are numbers (5, 20, etc.), booleans (True,\nFalse, None, etc.), dictionaries, or tuples should *not* be enclosed in\nquotation marks. All other values (i.e., strings) *must* be enclosed in\nquotation marks.\n\nUnless otherwise specified, settings that refer to paths can be either absolute\nor relative to the configuration file. The settings you define in the\nconfiguration file will be passed to the templates, which allows you to use\nyour settings to add site-wide content.\n\nHere is a list of settings for Pelican:\n\n\nBasic settings\n==============\n\n.. data:: USE_FOLDER_AS_CATEGORY\n\n   When you don't specify a category in your post metadata, set this setting to\n   ``True``, and organize your articles in subfolders, the subfolder will\n   become the category of your post. If set to ``False``, ``DEFAULT_CATEGORY``\n   will be used as a fallback. The default is ``True``.\n\n.. data:: DEFAULT_CATEGORY\n\n   The default category to fall back on. The default is ``'misc'``.\n\n.. data:: DISPLAY_PAGES_ON_MENU\n\n   Whether to display pages on the menu of the template. Templates may or may\n   not honor this setting. The default is ``True``.\n\n.. data:: DISPLAY_CATEGORIES_ON_MENU\n\n   Whether to display categories on the menu of the template. Templates may or\n   not honor this setting. The default is ``True``.\n\n.. data:: DOCUTILS_SETTINGS\n\n   Extra configuration settings for the docutils publisher (applicable only to\n   reStructuredText). See `Docutils Configuration`_ settings for more details.\n   The default is ``{}`` with no extra configuration settings.\n\n.. data:: DELETE_OUTPUT_DIRECTORY\n\n   Delete the output directory, and **all** of its contents, before generating\n   new files. This can be useful in preventing older, unnecessary files from\n   persisting in your output. However, **this is a destructive setting and\n   should be handled with extreme care.** The default is ``False``.\n\n.. data:: OUTPUT_RETENTION\n\n   A list of filenames that should be retained and not deleted from the output\n   directory. One use case would be the preservation of version control data.\n\n   Example::\n\n      OUTPUT_RETENTION = [\".hg\", \".git\", \".bzr\"]\n\n   The default is ``[]``.\n\n.. data:: JINJA_ENVIRONMENT\n\n   A dictionary of custom Jinja2 environment variables you want to use. This\n   also includes a list of extensions you may want to include. See `Jinja\n   Environment documentation`_. The default is\n   ``{'extensions': [], 'trim_blocks': True, 'lstrip_blocks': True}``.\n\n.. data:: JINJA_FILTERS\n\n   A dictionary of custom Jinja2 filters you want to use.  The dictionary\n   should map the filtername to the filter function.\n\n   Example::\n\n    import sys\n    sys.path.append('to/your/path')\n\n    from custom_filter import urlencode_filter\n    JINJA_FILTERS = {'urlencode': urlencode_filter}\n\n   See: `Jinja custom filters documentation`_. The default is ``{}``.\n\n.. data:: JINJA_GLOBALS\n\n   A dictionary of custom objects to map into the Jinja2 global environment\n   namespace. The dictionary should map the global name to the global\n   variable/function. See: `Jinja global namespace documentation`_. The\n   default is ``{}``.\n\n.. data:: JINJA_TESTS\n\n   A dictionary of custom Jinja2 tests you want to use. The dictionary should\n   map test names to test functions. See: `Jinja custom tests documentation`_.\n   The default is ``{}``.\n\n.. data:: LOG_FILTER\n\n   A list of tuples containing the logging level (up to ``warning``) and the\n   message to be ignored.\n\n   Example::\n\n      LOG_FILTER = [(logging.WARN, 'TAG_SAVE_AS is set to False')]\n\n   The default is ``[]``.\n\n.. data:: READERS\n\n   A dictionary of file extensions / Reader classes for Pelican to process or\n   ignore.\n\n   For example, to avoid processing .html files, set::\n\n      READERS = {'html': None}\n\n   To add a custom reader for the ``foo`` extension, set::\n\n      READERS = {'foo': FooReader}\n\n   The default is ``{}``.\n\n.. data:: IGNORE_FILES\n\n   A list of Unix glob patterns. Files and directories matching any of these patterns\n   or any of the commonly hidden files and directories set by ``watchfiles.DefaultFilter``\n   will be ignored by the processor. For example, the default ``['**/.*']`` will\n   ignore \"hidden\" files and directories, and ``['__pycache__']`` would ignore\n   Python 3's bytecode caches.\n\n   For a full list of the commonly hidden files set by ``watchfiles.DefaultFilter``,\n   please refer to the `watchfiles documentation`_.\n\n   The default is ``['**/.*']``.\n\n.. data:: MARKDOWN\n\n   Extra configuration settings for the Markdown processor. Refer to the Python\n   Markdown documentation's `Options section\n   <https://python-markdown.github.io/reference/#markdown>`_ for a complete\n   list of supported options. The ``extensions`` option will be automatically\n   computed from the ``extension_configs`` option.\n\n   The default is::\n\n        MARKDOWN = {\n            'extension_configs': {\n                'markdown.extensions.codehilite': {'css_class': 'highlight'},\n                'markdown.extensions.extra': {},\n                'markdown.extensions.meta': {},\n            },\n            'output_format': 'html5',\n        }\n\n   .. Note::\n      The dictionary defined in your settings file will replace this default\n      one.\n\n.. data:: OUTPUT_PATH\n\n   Where to output the generated files. This should correspond to your web\n   server's virtual host root directory.\n\n   The default is ``'output'``.\n\n.. data:: PATH\n\n   Path to content directory to be processed by Pelican. If undefined, and\n   content path is not specified via an argument to the ``pelican`` command,\n   Pelican will default to ``'.'``, the current working directory.\n\n.. data:: PAGE_PATHS\n\n   A list of directories and files to look at for pages, relative to ``PATH``.\n   The default is ``['pages']``.\n\n.. data:: PAGE_EXCLUDES\n\n   A list of directories to exclude when looking for pages in addition to\n   ``ARTICLE_PATHS``. The default is ``[]``.\n\n.. data:: ARTICLE_PATHS\n\n   A list of directories and files to look at for articles, relative to\n   ``PATH``. The default is ``['']``.\n\n.. data:: ARTICLE_EXCLUDES\n\n   A list of directories to exclude when looking for articles in addition to\n   ``PAGE_PATHS``. The default is ``[]``.\n\n.. data:: OUTPUT_SOURCES\n\n   Set to True if you want to copy the articles and pages in their original\n   format (e.g. Markdown or reStructuredText) to the specified ``OUTPUT_PATH``.\n   The default is ``False``.\n\n.. data:: OUTPUT_SOURCES_EXTENSION\n\n   Controls the extension that will be used by the SourcesGenerator.  Defaults\n   to ``.text``. If not a valid string the default value will be used. The\n   default is ``'.text'``.\n\n.. data:: PLUGINS\n\n   The list of plugins to load. See :ref:`plugins`. The default is ``None``.\n\n.. data:: PLUGIN_PATHS\n\n   A list of directories where to look for plugins. See :ref:`plugins`. The\n   default is ``[]``.\n\n.. data:: SITENAME\n\n   Your site's name. The default is ``'A Pelican Blog'``.\n\n.. data:: SITEURL\n\n   Base URL of your web site. Not defined by default, so it is best to specify\n   your SITEURL; if you do not, feeds will not be generated with\n   properly-formed URLs. If your site is available via HTTPS, this setting\n   should begin with ``https://`` — otherwise use ``http://``. Then append your\n   domain, with no trailing slash at the end. Example: ``SITEURL =\n   'https://example.com'``\n\n   The default is ``''``, the blank string.\n\n.. data:: STATIC_PATHS\n\n   A list of directories (relative to ``PATH``) in which to look for static\n   files. Such files will be copied to the output directory without\n   modification. Articles, pages, and other content source files will normally\n   be skipped, so it is safe for a directory to appear both here and in\n   ``PAGE_PATHS`` or ``ARTICLE_PATHS``.  Pelican's default settings include the\n   \"images\" directory here. The default is ``['images']``.\n\n.. data:: STATIC_EXCLUDES\n\n   A list of directories to exclude when looking for static files. The default\n   is ``[]``.\n\n.. data:: STATIC_EXCLUDE_SOURCES\n\n   If set to False, content source files will not be skipped when copying files\n   found in ``STATIC_PATHS``. This setting is for backward compatibility with\n   Pelican releases before version 3.5.  It has no effect unless\n   ``STATIC_PATHS`` contains a directory that is also in ``ARTICLE_PATHS`` or\n   ``PAGE_PATHS``. If you are trying to publish your site's source files,\n   consider using the ``OUTPUT_SOURCES`` setting instead. The default is\n   ``True``.\n\n.. data:: STATIC_CREATE_LINKS\n\n   Create links instead of copying files. If the content and output directories\n   are on the same device, then create hard links.  Falls back to symbolic\n   links if the output directory is on a different filesystem. If symlinks are\n   created, don't forget to add the ``-L`` or ``--copy-links`` option to rsync\n   when uploading your site. The default is ``False``.\n\n.. data:: STATIC_CHECK_IF_MODIFIED\n\n   If set to ``True``, and ``STATIC_CREATE_LINKS`` is ``False``, compare mtimes\n   of content and output files, and only copy content files that are newer than\n   existing output files. The default is ``False``.\n\n.. data:: TYPOGRIFY\n\n   If set to ``True``, several typographical improvements will be incorporated into\n   the generated HTML via the `Typogrify\n   <https://pypi.org/project/typogrify/>`_ library, which can be installed\n   via: ``python -m pip install typogrify``. The default is ``False``.\n\n.. data:: TYPOGRIFY_IGNORE_TAGS\n\n   A list of tags for Typogrify to ignore. By default Typogrify will ignore\n   ``pre`` and ``code`` tags. This requires that Typogrify version 2.0.4 or\n   later is installed. The default is ``[]``.\n\n.. data:: TYPOGRIFY_OMIT_FILTERS\n\n   A list of Typogrify filters to skip. Allowed values are: ``'amp'``,\n   ``'smartypants'``, ``'caps'``, ``'initial_quotes'``, ``'widont'``. By\n   default, no filter is omitted (in other words, all filters get applied). This\n   setting requires that Typogrify version 2.1.0 or later is installed. The\n   default is ``[]``.\n\n.. data:: TYPOGRIFY_DASHES\n\n   This setting controls how Typogrify sets up the Smartypants filter to\n   interpret multiple dash/hyphen/minus characters. A single ASCII dash\n   character (``-``) is always rendered as a hyphen. The ``default`` setting\n   does not handle en-dashes and converts double-hyphens into em-dashes. The\n   ``oldschool`` setting renders both en-dashes and em-dashes when it sees two\n   (``--``) and three (``---``) hyphen characters, respectively. The\n   ``oldschool_inverted`` setting turns two hyphens into an em-dash and three\n   hyphens into an en-dash. The default is ``'default'``.\n\n.. data:: SUMMARY_MAX_LENGTH\n\n   When creating a short summary of an article, this will be the default length\n   (measured in words) of the text created.  This only applies if your content\n   does not otherwise specify a summary. Setting to ``None`` will cause the\n   summary to be a copy of the original content. The default is ``50``.\n\n.. data:: SUMMARY_MAX_PARAGRAPHS\n\n   When creating a short summary of an article, this will be the number of\n   paragraphs to use as the summary. This only applies if your content\n   does not otherwise specify a summary. Setting to ``None`` will cause the\n   summary to use the whole text (up to ``SUMMARY_MAX_LENGTH``) instead of just\n   the first N paragraphs. The default is ``None``.\n\n.. data:: SUMMARY_END_SUFFIX\n\n   When creating a short summary of an article and the result was truncated to\n   match the required word length, this will be used as the truncation suffix.\n   The default is ``'…'``.\n\n.. data:: WITH_FUTURE_DATES\n\n   If disabled, content with dates in the future will get a default status of\n   ``draft``. See :ref:`reading_only_modified_content` for caveats. The default\n   is ``True``.\n\n.. data:: INTRASITE_LINK_REGEX\n\n   Regular expression that is used to parse internal links. Default syntax when\n   linking to internal files, tags, etc., is to enclose the identifier, say\n   ``filename``, in ``{}`` or ``||``. Identifier between ``{`` and ``}`` goes\n   into the ``what`` capturing group.  For details see\n   :ref:`ref-linking-to-internal-content`. The default is\n   ``'[{|](?P<what>.*?)[|}]'``.\n\n.. data:: PYGMENTS_RST_OPTIONS\n\n   A list of default Pygments settings for your reStructuredText code blocks.\n   See :ref:`internal_pygments_options` for a list of supported options. The\n   default is ``{}``.\n\n.. data:: CACHE_CONTENT\n\n   If ``True``, saves content in caches.  See\n   :ref:`reading_only_modified_content` for details about caching. The default\n   is ``False``.\n\n.. data:: CONTENT_CACHING_LAYER\n\n   If set to ``'reader'``, save only the raw content and metadata returned by\n   readers. If set to ``'generator'``, save processed content objects. The\n   default is ``'reader'``.\n\n.. data:: CACHE_PATH\n\n   Directory in which to store cache files. The default is ``'cache'``.\n\n.. data:: GZIP_CACHE\n\n   If ``True``, use gzip to (de)compress the cache files. The default is\n   ``True``.\n\n.. data:: CHECK_MODIFIED_METHOD\n\n   Controls how files are checked for modifications.\n\n   - If set to ``'mtime'``, the modification time of the file is\n     checked.\n   - If set to a name of a function provided by the ``hashlib``\n     module, e.g. ``'md5'``, the file hash is checked.\n\n   The default is ``'mtime'``.\n\n.. data:: LOAD_CONTENT_CACHE\n\n   If ``True``, load unmodified content from caches. The default is ``False``.\n\n.. data:: FORMATTED_FIELDS\n\n   A list of metadata fields containing reST/Markdown content to be parsed and\n   translated to HTML. The default is ``['summary']``.\n\n.. data:: PORT\n\n   The TCP port to serve content from the output folder via HTTP when pelican\n   is run with ``--listen``. The default is ``8000``.\n\n.. data:: BIND\n\n   The IP to which to bind the HTTP server. The default is ``'127.0.0.1'``.\n\n.. _url-settings:\n\nURL settings\n============\n\nThe first thing to understand is that there are currently two supported methods\nfor URL formation: *relative* and *absolute*. Relative URLs are useful when\ntesting locally, and absolute URLs are reliable and most useful when\npublishing. One method of supporting both is to have one Pelican configuration\nfile for local development and another for publishing. To see an example of\nthis type of setup, use the ``pelican-quickstart`` script as described in the\n:doc:`Installation <install>` section, which will produce two separate\nconfiguration files for local development and publishing, respectively.\n\nYou can customize the URLs and locations where files will be saved. The\n``*_URL`` and ``*_SAVE_AS`` variables use Python's format strings. These\nvariables allow you to place your articles in a location such as\n``{slug}/index.html`` and link to them as ``{slug}`` for clean URLs (see\nexample below). These settings give you the flexibility to place your articles\nand pages anywhere you want.\n\n.. note::\n    If a ``*_SAVE_AS`` setting contains a parent directory that doesn't match\n    the parent directory inside the corresponding ``*_URL`` setting, this may\n    cause Pelican to generate unexpected URLs in a few cases, such as when\n    using the ``{attach}`` syntax.\n\nIf you don't want that flexibility and instead prefer that your generated\noutput paths mirror your source content's filesystem path hierarchy, try the\nfollowing settings::\n\n    PATH_METADATA = r'(?P<path_no_ext>.*)\\..*'\n    ARTICLE_URL = ARTICLE_SAVE_AS = PAGE_URL = PAGE_SAVE_AS = '{path_no_ext}.html'\n\nOtherwise, you can use a variety of file metadata attributes within URL-related\nsettings:\n\n* slug\n* date\n* lang\n* author\n* category\n\nExample usage::\n\n   ARTICLE_URL = 'posts/{date:%Y}/{date:%b}/{date:%d}/{slug}/'\n   ARTICLE_SAVE_AS = 'posts/{date:%Y}/{date:%b}/{date:%d}/{slug}/index.html'\n   PAGE_URL = 'pages/{slug}/'\n   PAGE_SAVE_AS = 'pages/{slug}/index.html'\n\nThis would save your articles into something like\n``/posts/2011/Aug/07/sample-post/index.html``, save your pages into\n``/pages/about/index.html``, and render them available at URLs of\n``/posts/2011/Aug/07/sample-post/`` and ``/pages/about/``, respectively.\n\n.. note::\n    If you specify a ``datetime`` directive, it will be substituted using the\n    input files' date metadata attribute. If the date is not specified for a\n    particular file, Pelican will rely on the file's ``mtime`` timestamp. Check\n    the `Python datetime documentation`_ for more information.\n\n.. _Python datetime documentation:\n    https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior\n\n.. data:: RELATIVE_URLS\n\n   Defines whether Pelican should use document-relative URLs or not. Only set\n   this to ``True`` when developing/testing and only if you fully understand\n   the effect it can have on links/feeds. The default is ``False``.\n\n.. data:: ARTICLE_URL\n\n   The URL to refer to an article. The default is ``'{slug}.html'``.\n\n.. data:: ARTICLE_SAVE_AS\n\n   The place where we will save an article. The default is ``'{slug}.html'``.\n\n.. data:: ARTICLE_LANG_URL\n\n   The URL to refer to an article which doesn't use the default language.\n   The default is ``'{slug}-{lang}.html``.\n\n.. data:: ARTICLE_LANG_SAVE_AS\n\n   The place where we will save an article which doesn't use the default\n   language. The default is ``'{slug}-{lang}.html'``.\n\n.. data:: DRAFT_URL\n\n   The URL to refer to an article draft. The default is\n   ``'drafts/{slug}.html'``.\n\n.. data:: DRAFT_SAVE_AS\n\n   The place where we will save an article draft. The default is ``'drafts/{slug}.html'``.\n\n.. data:: DRAFT_LANG_URL\n\n   The URL to refer to an article draft which doesn't use the default language.\n   The default is ``'drafts/{slug}-{lang}.html'``.\n\n.. data:: DRAFT_LANG_SAVE_AS\n\n   The place where we will save an article draft which doesn't use the default\n   language. The default is ``'drafts/{slug}-{lang}.html'``.\n\n.. data:: PAGE_URL\n\n   The URL we will use to link to a page. The default is\n   ``'pages/{slug}.html'``.\n\n.. data:: PAGE_SAVE_AS\n\n   The location we will save the page. This value has to be the same as\n   PAGE_URL or you need to use a rewrite in your server config. The default\n   is ``'pages/{slug}.html'``.\n\n.. data:: PAGE_LANG_URL\n\n   The URL we will use to link to a page which doesn't use the default\n   language. The default is ``'pages/{slug}-{lang}.html'``.\n\n.. data:: PAGE_LANG_SAVE_AS\n\n   The location we will save the page which doesn't use the default language.\n   The default is ``'pages/{slug}-{lang}.html'``.\n\n.. data:: DRAFT_PAGE_URL\n\n   The URL used to link to a page draft. The default is\n   ``'drafts/pages/{slug}.html'``.\n\n.. data:: DRAFT_PAGE_SAVE_AS\n\n   The actual location a page draft is saved at. The default is\n   ``'drafts/pages/{slug}.html'``.\n\n.. data:: DRAFT_PAGE_LANG_URL\n\n   The URL used to link to a page draft which doesn't use the default\n   language. The default is ``'drafts/pages/{slug}-{lang}.html'``.\n\n.. data:: DRAFT_PAGE_LANG_SAVE_AS\n\n   The actual location a page draft which doesn't use the default language is\n   saved at. The default is ``'drafts/pages/{slug}-{lang}.html'``.\n\n.. data:: AUTHOR_URL\n\n   The URL to use for an author. The default is ``'author/{slug}.html'``.\n\n.. data:: AUTHOR_SAVE_AS\n\n   The location to save an author. The default is ``'author/{slug}.html'``.\n\n.. data:: CATEGORY_URL\n\n   The URL to use for a category. The default is ``'category/{slug}.html'``.\n\n.. data:: CATEGORY_SAVE_AS\n\n   The location to save a category. The default is ``'category/{slug}.html'``.\n\n.. data:: TAG_URL\n\n   The URL to use for a tag. The default is ``'tag/{slug}.html'``.\n\n.. data:: TAG_SAVE_AS\n\n   The location to save the tag page. The default is ``'tag/{slug}.html'``.\n\n.. note::\n\n    If you do not want one or more of the default pages to be created (e.g.,\n    you are the only author on your site and thus do not need an Authors page),\n    set the corresponding ``*_SAVE_AS`` setting to ``''`` to prevent the\n    relevant page from being generated.\n\nPelican can optionally create per-year, per-month, and per-day archives of your\nposts. These secondary archives are disabled by default but are automatically\nenabled if you supply format strings for their respective ``_SAVE_AS``\nsettings. Period archives fit intuitively with the hierarchical model of web\nURLs and can make it easier for readers to navigate through the posts you've\nwritten over time.\n\nExample usage::\n\n   YEAR_ARCHIVE_SAVE_AS = 'posts/{date:%Y}/index.html'\n   YEAR_ARCHIVE_URL = 'posts/{date:%Y}/'\n   MONTH_ARCHIVE_SAVE_AS = 'posts/{date:%Y}/{date:%b}/index.html'\n   MONTH_ARCHIVE_URL = 'posts/{date:%Y}/{date:%b}/'\n\nWith these settings, Pelican will create an archive of all your posts for the\nyear at (for instance) ``posts/2011/index.html`` and an archive of all your\nposts for the month at ``posts/2011/Aug/index.html``. These can be accessed\nthrough the URLs ``posts/2011/`` and ``posts/2011/Aug/``, respectively.\n\n.. note::\n    Period archives work best when the final path segment is ``index.html``.\n    This way a reader can remove a portion of your URL and automatically arrive\n    at an appropriate archive of posts, without having to specify a page name.\n\n.. data:: YEAR_ARCHIVE_SAVE_AS\n\n   The location to save per-year archives of your posts. The default is ``''``.\n\n.. data:: YEAR_ARCHIVE_URL\n\n   The URL to use for per-year archives of your posts. You should set this if\n   you enable per-year archives. The default is ``''``.\n\n.. data:: MONTH_ARCHIVE_SAVE_AS\n\n   The location to save per-month archives of your posts. The default is\n   ``''``.\n\n.. data:: MONTH_ARCHIVE_URL\n\n   The URL to use for per-month archives of your posts. You should set this if\n   you enable per-month archives. The default is ``''``.\n\n.. data:: DAY_ARCHIVE_SAVE_AS\n\n   The location to save per-day archives of your posts. The default is ``''``.\n\n.. data:: DAY_ARCHIVE_URL\n\n   The URL to use for per-day archives of your posts. You should set this if\n   you enable per-day archives. The default is ``''``.\n\n``DIRECT_TEMPLATES`` work a bit differently than noted above. Only the\n``_SAVE_AS`` settings are available, but it is available for any direct\ntemplate.\n\n.. data:: ARCHIVES_SAVE_AS\n\n   The location to save the article archives page. The default is ``'archives.html'``.\n\n.. data:: AUTHORS_SAVE_AS\n\n   The location to save the author list. The default is ``'authors.html'``.\n\n.. data:: CATEGORIES_SAVE_AS\n\n   The location to save the category list. The default is ``'categories.html'``.\n\n.. data:: TAGS_SAVE_AS\n\n   The location to save the tag list. The default is ``'tags.html'``.\n\n.. data:: INDEX_SAVE_AS\n\n   The location to save the list of all articles. The default is ``'index.html'``.\n\nURLs for direct template pages are theme-dependent. Some themes use\ncorresponding ``*_URL`` setting as string, while others hard-code them:\n``'archives.html'``, ``'authors.html'``, ``'categories.html'``,\n``'tags.html'``.\n\n.. data:: SLUGIFY_SOURCE\n\n   Specifies from where you want the slug to be automatically generated. Can be\n   set to ``title`` to use the \"Title:\" metadata tag or ``basename`` to use the\n   article's file name when creating the slug. The default is ``'title'``.\n\n.. data:: SLUGIFY_USE_UNICODE\n\n   Allow Unicode characters in slugs. Set ``True`` to keep Unicode characters\n   in auto-generated slugs. Otherwise, Unicode characters will be replaced\n   with ASCII equivalents. The default is ``False``.\n\n.. data:: SLUGIFY_PRESERVE_CASE\n\n   Preserve uppercase characters in slugs. Set ``True`` to keep uppercase\n   characters from ``SLUGIFY_SOURCE`` as-is. The default is ``False``.\n\n.. data:: SLUG_REGEX_SUBSTITUTIONS\n\n   Regex substitutions to make when generating slugs of articles and pages.\n   Specified as a list of pairs of ``(from, to)`` which are applied in order,\n   ignoring case. The default substitutions have the effect of removing\n   non-alphanumeric characters and converting internal whitespace to dashes.\n   Apart from these substitutions, slugs are always converted to lowercase\n   ascii characters and leading and trailing whitespace is stripped. Useful for\n   backward compatibility with existing URLs. The default is::\n\n       [\n           (r'[^\\w\\s-]', ''),   # remove non-alphabetical/whitespace/'-' chars\n           (r'(?u)\\A\\s*', ''),  # strip leading whitespace\n           (r'(?u)\\s*\\Z', ''),  # strip trailing whitespace\n           (r'[-\\s]+', '-'),     # reduce multiple whitespace or '-' to single '-'\n       ]\n\n.. data:: AUTHOR_REGEX_SUBSTITUTIONS\n\n   Regex substitutions for author slugs. The default is\n   ``SLUG_REGEX_SUBSTITUTIONS``.\n\n.. data:: CATEGORY_REGEX_SUBSTITUTIONS\n\n   Regex substitutions for category slugs. The default is\n   ``SLUG_REGEX_SUBSTITUTIONS``.\n\n.. data:: TAG_REGEX_SUBSTITUTIONS\n\n   Regex substitutions for tag slugs. The default is\n   ``SLUG_REGEX_SUBSTITUTIONS``.\n\nTime and Date\n=============\n\n.. data:: TIMEZONE\n\n   The timezone used in the date information, to generate Atom and RSS feeds.\n\n   If no timezone is defined, UTC is assumed. This means that the generated\n   Atom and RSS feeds will contain incorrect date information if your locale is\n   not UTC.\n\n   Pelican issues a warning in case this setting is not defined, as it was not\n   mandatory in previous versions.\n\n   Have a look at `the wikipedia page`_ to get a list of valid timezone values.\n\n.. _the wikipedia page: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones\n\n.. data:: DEFAULT_DATE\n\n   The default date you want to use.  If ``'fs'``, Pelican will use the file\n   system timestamp information (mtime) if it can't get date information from\n   the metadata.  If given any other string, it will be parsed by the same\n   method as article metadata.  If set to a tuple object, the default datetime\n   object will instead be generated by passing the tuple to the\n   ``datetime.datetime`` constructor. The default is ``None``.\n\n.. data:: DEFAULT_DATE_FORMAT\n\n   The default date format you want to use. The default is ``'%a %d %B %Y'``.\n\n.. data:: DATE_FORMATS\n\n   If you manage multiple languages, you can set the date formatting here.\n\n   If no ``DATE_FORMATS`` are set, Pelican will fall back to\n   ``DEFAULT_DATE_FORMAT``. If you need to maintain multiple languages with\n   different date formats, you can set the ``DATE_FORMATS`` dictionary using\n   the language name (``lang`` metadata in your post content) as the key.\n\n   In addition to the standard C89 strftime format codes that are listed in\n   `Python datetime documentation`_, you can use the ``-`` character between\n   ``%`` and the format character to remove any leading zeros. For example,\n   ``%d/%m/%Y`` will output ``01/01/2014`` whereas ``%-d/%-m/%Y`` will result\n   in ``1/1/2014``.\n\n   .. parsed-literal::\n\n       DATE_FORMATS = {\n           'en': '%a, %d %b %Y',\n           'jp': '%Y-%m-%d(%a)',\n       }\n\n   It is also possible to set different locale settings for each language by\n   using a ``(locale, format)`` tuple as a dictionary value which will override\n   the ``LOCALE`` setting:\n\n   .. parsed-literal::\n\n      # On Unix/Linux\n      DATE_FORMATS = {\n          'en': ('en_US','%a, %d %b %Y'),\n          'jp': ('ja_JP','%Y-%m-%d(%a)'),\n      }\n\n      # On Windows\n      DATE_FORMATS = {\n          'en': ('usa','%a, %d %b %Y'),\n          'jp': ('jpn','%Y-%m-%d(%a)'),\n      }\n\n   The default is ``{}``.\n\n.. data:: LOCALE\n\n   Change the locale. A list of locales can be provided here or a single\n   string representing one locale.  When providing a list, all the locales will\n   be tried until one works.\n\n   You can set locale to further control date format:\n\n   .. parsed-literal::\n\n      LOCALE = ['usa', 'jpn',      # On Windows\n                'en_US', 'ja_JP'   # On Unix/Linux\n      ]\n\n   For a list of available locales refer to `locales on Windows`_  or on\n   Unix/Linux, use the ``locale -a`` command; see manpage\n   `locale(1)`_ for more information. The default is the system locale.\n\n\n.. _Jinja custom filters documentation: https://jinja.palletsprojects.com/en/latest/api/#custom-filters\n.. _Jinja global namespace documentation: https://jinja.palletsprojects.com/en/latest/api/#the-global-namespace\n.. _Jinja custom tests documentation: https://jinja.palletsprojects.com/en/latest/api/#custom-tests\n\n.. _locales on Windows: https://www.microsoft.com/en-us/download/details.aspx?id=55979\n\n.. _locale(1): https://linux.die.net/man/1/locale\n\n\n.. _template_pages:\n\nTemplate pages\n==============\n\n.. data:: TEMPLATE_PAGES\n\n   A mapping containing template pages that will be rendered with the blog\n   entries.\n\n   If you want to generate custom pages besides your blog entries, you can\n   point any Jinja2 template file with a path pointing to the file and the\n   destination path for the generated file.\n\n   For instance, if you have a blog with three static pages — a list of books,\n   your resume, and a contact page — you could have::\n\n       TEMPLATE_PAGES = {'src/books.html': 'dest/books.html',\n                         'src/resume.html': 'dest/resume.html',\n                         'src/contact.html': 'dest/contact.html'}\n\n   The default is ``{}``.\n\n.. data:: TEMPLATE_EXTENSIONS\n\n   The extensions to use when looking up template files from template names.\n   The default is ``['.html']``.\n\n.. data:: DIRECT_TEMPLATES\n\n   List of templates that are used directly to render content. Typically direct\n   templates are used to generate index pages for collections of content (e.g.,\n   category and tag index pages). If the author, category and tag collections are not\n   needed, set ``DIRECT_TEMPLATES = ['index', 'archives']``\n\n   ``DIRECT_TEMPLATES`` are searched for over paths maintained in\n   ``THEME_TEMPLATES_OVERRIDES``.\n\n   The default is ``['index', 'tags', 'categories', 'authors', 'archives']``.\n\nMetadata\n========\n\n.. data:: AUTHOR\n\n   Default author (usually your name). The default is ``None``, which removes the byline.\n\n.. data:: DEFAULT_METADATA\n\n   The default metadata you want to use for all articles and pages. The default\n   is ``{}``.\n\n.. data:: FILENAME_METADATA\n\n   The regexp that will be used to extract any metadata from the filename. All\n   named groups that are matched will be set in the metadata object.  The\n   default value will only extract the date from the filename.\n\n   For example, to extract both the date and the slug::\n\n      FILENAME_METADATA = r'(?P<date>\\d{4}-\\d{2}-\\d{2})_(?P<slug>.*)'\n\n   See also ``SLUGIFY_SOURCE``. The default is ``r'(?P<date>\\d{4}-\\d{2}-\\d{2}).*'``.\n\n.. data:: PATH_METADATA\n\n   Like ``FILENAME_METADATA``, but parsed from a page's full path relative to\n   the content source directory. The default is ``''``.\n\n.. data:: EXTRA_PATH_METADATA\n\n   Extra metadata dictionaries keyed by relative path. Relative paths require\n   correct OS-specific directory separators (i.e. / in UNIX and \\\\ in Windows)\n   unlike some other Pelican file settings. Paths to a directory apply to all\n   files under it. The most-specific path wins conflicts.\n\nNot all metadata needs to be :ref:`embedded in source file itself\n<internal_metadata>`. For example, blog posts are often named following a\n``YYYY-MM-DD-SLUG.rst`` pattern, or nested into ``YYYY/MM/DD-SLUG``\ndirectories. To extract metadata from the filename or path, set\n``FILENAME_METADATA`` or ``PATH_METADATA`` to regular expressions that use\nPython's `group name notation`_ ``(?P<name>…)``. If you want to attach\nadditional metadata but don't want to encode it in the path, you can set\n``EXTRA_PATH_METADATA``:\n\n.. parsed-literal::\n\n    EXTRA_PATH_METADATA = {\n        'relative/path/to/file-1': {\n            'key-1a': 'value-1a',\n            'key-1b': 'value-1b',\n            },\n        'relative/path/to/file-2': {\n            'key-2': 'value-2',\n            },\n        }\n\nThis can be a convenient way to shift the installed location of a particular\nfile:\n\n.. parsed-literal::\n\n    # Take advantage of the following defaults\n    # STATIC_SAVE_AS = '{path}'\n    # STATIC_URL = '{path}'\n    STATIC_PATHS = [\n        'static/robots.txt',\n        ]\n    EXTRA_PATH_METADATA = {\n        'static/robots.txt': {'path': 'robots.txt'},\n        }\n\n.. _group name notation:\n   https://docs.python.org/3/library/re.html#regular-expression-syntax\n\n   The default is ``{}``.\n\n\nFeed settings\n=============\n\nBy default, Pelican uses Atom feeds. However, it is also possible to use RSS\nfeeds if you prefer.\n\nPelican generates category feeds as well as feeds for all your articles. It\ndoes not generate feeds for tags by default, but it is possible to do so using\nthe ``TAG_FEED_ATOM`` and ``TAG_FEED_RSS`` settings:\n\n.. data:: FEED_DOMAIN\n\n   The domain prepended to feed URLs. Since feed URLs should always be\n   absolute, it is highly recommended to define this (e.g.,\n   \"https://feeds.example.com\"). The default is ``SITEURL``.\n\n.. data:: FEED_ATOM\n\n   The location to save the Atom feed. The default is ``None``, for no Atom\n   feed.\n\n.. data:: FEED_ATOM_URL\n\n   Relative URL of the Atom feed. If not set, ``FEED_ATOM`` is used both for\n   save location and URL. The default is ``None``.\n\n.. data:: FEED_RSS\n\n   The location to save the RSS feed. The default is ``None``, for no RSS feed.\n\n.. data:: FEED_RSS_URL\n\n   Relative URL of the RSS feed. If not set, ``FEED_RSS`` is used both for save\n   location and URL. The default is ``None``.\n\n.. data:: FEED_ALL_ATOM\n\n   The location to save the all-posts Atom feed: this feed will contain all\n   posts regardless of their language. The default is ``'feeds/all.atom.xml'``.\n\n.. data:: FEED_ALL_ATOM_URL\n\n   Relative URL of the all-posts Atom feed. If not set, ``FEED_ALL_ATOM`` is\n   used both for save location and URL. The default is ``None``.\n\n.. data:: FEED_ALL_RSS\n\n   The location to save the the all-posts RSS feed: this feed will contain all\n   posts regardless of their language. The default is ``None``, for no\n   all-posts RSS feed.\n\n.. data:: FEED_ALL_RSS_URL\n\n   Relative URL of the all-posts RSS feed. If not set, ``FEED_ALL_RSS`` is used\n   both for save location and URL. The default is ``None``.\n\n.. data:: CATEGORY_FEED_ATOM\n\n   The location to save the category Atom feeds. [2]_ The default is\n   ``'feeds/{slug}.atom.xml'``.\n\n.. data:: CATEGORY_FEED_ATOM_URL\n\n   Relative URL of the category Atom feeds, including the ``{slug}``\n   placeholder. [2]_ If not set, ``CATEGORY_FEED_ATOM`` is used both for save\n   location and URL. The default is ``None``.\n\n.. data:: CATEGORY_FEED_RSS\n\n   The location to save the category RSS feeds, including the ``{slug}``\n   placeholder. [2]_ The default is ``None``, for no RSS feed.\n\n.. data:: CATEGORY_FEED_RSS_URL\n\n   Relative URL of the category RSS feeds, including the ``{slug}``\n   placeholder. [2]_ If not set, ``CATEGORY_FEED_RSS`` is used both for save\n   location and URL. The default is ``None``.\n\n.. data:: AUTHOR_FEED_ATOM\n\n   The location to save the author Atom feeds. [2]_ The default is\n   ``'feeds/{slug}.atom.xml'``.\n\n.. data:: AUTHOR_FEED_ATOM_URL\n\n   Relative URL of the author Atom feeds, including the ``{slug}`` placeholder.\n   [2]_ If not set, ``AUTHOR_FEED_ATOM`` is used both for save location and\n   URL. The default is ``None`` (not set).\n\n.. data:: AUTHOR_FEED_RSS\n\n   The location to save the author RSS feeds. [2]_ The default is\n   ``'feeds/{slug}.rss.xml'``.\n\n.. data:: AUTHOR_FEED_RSS_URL\n\n   Relative URL of the author RSS feeds, including the ``{slug}`` placeholder.\n   [2]_ If not set, ``AUTHOR_FEED_RSS`` is used both for save location and URL.\n   The default is ``None``.\n\n.. data:: TAG_FEED_ATOM\n\n   The location to save the tag Atom feed, including the ``{slug}``\n   placeholder. [2]_ The default is ``None``, for no tag feed.\n\n.. data:: TAG_FEED_ATOM_URL\n\n   Relative URL of the tag Atom feed, including the ``{slug}`` placeholder.\n   [2]_ The default is ``None``.\n\n.. data:: TAG_FEED_RSS\n\n   Relative URL to output the tag RSS feed, including the ``{slug}``\n   placeholder. If not set, ``TAG_FEED_RSS`` is used both for save location and\n   URL. The default is ``None``, for no tag feed.\n\n.. data:: FEED_MAX_ITEMS\n\n   Maximum number of items allowed in a feed. Setting to ``None`` will cause the\n   feed to contains every article. 100 if not specified. The default is ``100``.\n\n.. data:: RSS_FEED_SUMMARY_ONLY\n\n   Only include item summaries in the ``description`` tag of RSS feeds. If set\n   to ``False``, the full content will be included instead. This setting\n   doesn't affect Atom feeds, only RSS ones. The default is ``True``.\n\n.. data:: FEED_APPEND_REF\n\n   If set to ``True``, ``?ref=feed`` will be appended to links in generated\n   feeds for the purpose of referrer tracking. The default is ``False``.\n\nIf you don't want to generate some or any of these feeds, set the above\nvariables to ``None``.\n\n.. [2] ``{slug}`` is replaced by name of the category / author / tag.\n\n\nPagination\n==========\n\nThe default behaviour of Pelican is to list all the article titles along with a\nshort description on the index page. While this works well for small-to-medium\nsites, sites with a large quantity of articles will probably benefit from\npaginating this list.\n\nYou can use the following settings to configure the pagination.\n\n.. data:: DEFAULT_ORPHANS\n\n   The minimum number of articles allowed on the last page. Use this when you\n   don't want the last page to only contain a handful of articles. The default\n   is ``0``.\n\n.. data:: DEFAULT_PAGINATION\n\n   The maximum number of articles to include on a page, not including orphans.\n   False to disable pagination. The default is ``False``.\n\n.. data:: PAGINATED_TEMPLATES\n\n   The templates to use pagination with, and the number of articles to include\n   on a page. If this value is ``None``, it defaults to ``DEFAULT_PAGINATION``.\n   The default is ``{'index': None, 'tag': None, 'category': None, 'author': None}``.\n\n.. data:: PAGINATION_PATTERNS\n\n   A set of patterns that are used to determine advanced pagination output. The\n   default is::\n\n       (\n           (1, '{name}{extension}', '{name}{extension}'),\n           (2, '{name}{number}{extension}', '{name}{number}{extension}'),\n       )\n\n\nUsing Pagination Patterns\n-------------------------\n\nBy default, pages subsequent to ``.../foo.html`` are created as\n``.../foo2.html``, etc. The ``PAGINATION_PATTERNS`` setting can be used to\nchange this. It takes a sequence of triples, where each triple consists of::\n\n    (minimum_page, page_url, page_save_as,)\n\nFor ``page_url`` and ``page_save_as``, you may use a number of variables.\n``{url}`` and ``{save_as}`` correspond respectively to the ``*_URL`` and\n``*_SAVE_AS`` values of the corresponding page type (e.g. ``ARTICLE_SAVE_AS``).\nIf ``{save_as} == foo/bar.html``, then ``{name} == foo/bar`` and ``{extension}\n== .html``. ``{base_name}`` equals ``{name}`` except that it strips trailing\n``/index`` if present. ``{number}`` equals the page number.\n\nFor example, if you want to leave the first page unchanged, but place\nsubsequent pages at ``.../page/2/`` etc, you could set ``PAGINATION_PATTERNS``\nas follows::\n\n  PAGINATION_PATTERNS = (\n      (1, '{url}', '{save_as}'),\n      (2, '{base_name}/page/{number}/', '{base_name}/page/{number}/index.html'),\n  )\n\n\nIf you want a pattern to apply to the last page in the list, use ``-1``\nas the ``minimum_page`` value::\n\n    (-1, '{base_name}/last/', '{base_name}/last/index.html'),\n\nTranslations\n============\n\nPelican offers a way to translate articles. See the :doc:`Content <content>`\nsection for more information.\n\n.. data:: DEFAULT_LANG\n\n   The default language to use. The default is ``'en'``.\n\n.. data:: ARTICLE_TRANSLATION_ID\n\n   The metadata attribute(s) used to identify which articles are translations\n   of one another. May be a string or a collection of strings. Set to ``None``\n   or ``False`` to disable the identification of translations. The default is\n   ``'slug'``.\n\n.. data:: PAGE_TRANSLATION_ID\n\n   The metadata attribute(s) used to identify which pages are translations of\n   one another. May be a string or a collection of strings. Set to ``None`` or\n   ``False`` to disable the identification of translations. The default is\n   ``'slug'``.\n\n.. data:: TRANSLATION_FEED_ATOM\n\n   The location to save the Atom feed for translations. [3]_ The default is\n   ``'feeds/all-{lang}.atom.xml'``.\n\n.. data:: TRANSLATION_FEED_ATOM_URL\n\n   Relative URL of the Atom feed for translations, including the ``{lang}``\n   placeholder. [3]_ If not set, ``TRANSLATION_FEED_ATOM`` is used both for\n   save location and URL. The default is ``None``.\n\n.. data:: TRANSLATION_FEED_RSS\n\n   Where to put the RSS feed for translations. The default is ``None``,\n   meaning no RSS feed.\n\n.. data:: TRANSLATION_FEED_RSS_URL\n\n   Relative URL of the RSS feed for translations, including the ``{lang}``\n   placeholder. [3]_ If not set, ``TRANSLATION_FEED_RSS`` is used both for save\n   location and URL. The default is ``None``.\n\n.. [3] {lang} is the language code\n\nOrdering content\n================\n\n.. data:: NEWEST_FIRST_ARCHIVES\n\n   Order archives by newest first by date. (False: orders by date with older\n   articles first.) The default is ``True``.\n\n.. data:: REVERSE_CATEGORY_ORDER\n\n   Reverse the category order. (True: lists by reverse alphabetical order;\n   default lists alphabetically.) The default is ``False``.\n\n.. data:: ARTICLE_ORDER_BY\n\n   Defines how the articles (``articles_page.object_list`` in the template) are\n   sorted. Valid options are: metadata as a string (use ``reversed-`` prefix\n   to reverse the sort order), special option ``'basename'`` which will use\n   the basename of the file (without path), or a custom function to extract the\n   sorting key from articles. Using a value of ``'date'`` will sort articles in\n   chronological order, while the default value, ``'reversed-date'``, will sort\n   articles by date in reverse order (i.e., newest article comes first). The\n   default is ``'reversed-date'``.\n\n.. data:: PAGE_ORDER_BY\n\n   Defines how the pages (``pages`` variable in the template) are sorted.\n   Options are same as ``ARTICLE_ORDER_BY``.  The default value, ``'basename'``\n   will sort pages by their basename. The default is ``'basename'``.\n\n\n.. _settings/themes:\n\nThemes\n======\n\nCreating Pelican themes is addressed in a dedicated section (see\n:ref:`theming-pelican`). However, here are the settings that are related to\nthemes.\n\n.. data:: THEME\n\n   Theme to use to produce the output. Can be a relative or absolute path to a\n   theme folder, or the name of a default theme or a theme installed via\n   :doc:`pelican-themes` (see below). The default theme is \"notmyidea\".\n\n.. data:: THEME_STATIC_DIR\n\n   Destination directory in the output path where Pelican will place the files\n   collected from `THEME_STATIC_PATHS`. Default is `theme`. The default is\n   ``'theme'``.\n\n.. data:: THEME_STATIC_PATHS\n\n   Static theme paths you want to copy. Default value is `static`, but if your\n   theme has other static paths, you can put them here. If files or directories\n   with the same names are included in the paths defined in this settings, they\n   will be progressively overwritten. The default is ``['static']``.\n\n.. data:: THEME_TEMPLATES_OVERRIDES\n\n   A list of paths you want Jinja2 to search for templates before searching the\n   theme's ``templates/`` directory.  Allows for overriding individual theme\n   template files without having to fork an existing theme.  Jinja2 searches in\n   the following order: files in ``THEME_TEMPLATES_OVERRIDES`` first, then the\n   theme's ``templates/``. The default is ``[]``.\n\n   You can also extend templates from the theme using the ``{% extends %}``\n   directive utilizing the ``!theme`` prefix as shown in the following example:\n\n   .. parsed-literal::\n\n      {% extends '!theme/article.html' %}\n\n.. data:: CSS_FILE\n\n   Specify the CSS file you want to load. The default is ``'main.css'``.\n\nBy default, two themes are available. You can specify them using the ``THEME``\nsetting or by passing the ``-t`` option to the ``pelican`` command:\n\n* notmyidea\n* simple (a synonym for \"plain text\" :)\n\nThere are a number of other themes available at\nhttps://github.com/getpelican/pelican-themes. Pelican comes with\n:doc:`pelican-themes`, a small script for managing themes.\n\nYou can define your own theme, either by starting from scratch or by\nduplicating and modifying a pre-existing theme. Here is :doc:`a guide on how to\ncreate your theme <themes>`.\n\nFollowing are example ways to specify your preferred theme::\n\n    # Specify name of a built-in theme\n    THEME = \"notmyidea\"\n    # Specify name of a theme installed via the pelican-themes tool\n    THEME = \"chunk\"\n    # Specify a customized theme, via path relative to the settings file\n    THEME = \"themes/mycustomtheme\"\n    # Specify a customized theme, via absolute path\n    THEME = \"/home/myuser/projects/mysite/themes/mycustomtheme\"\n\nThe built-in ``simple`` theme can be customized using the following settings.\n\n.. data:: STYLESHEET_URL\n\n   The URL of the stylesheet to use. The default is ``None``.\n\nThe built-in ``notmyidea`` theme can make good use of the following settings.\nFeel free to use them in your themes as well.\n\n.. data:: SITESUBTITLE\n\n   A subtitle to appear in the header. The default is ``None``.\n\n.. data:: DISQUS_SITENAME\n\n   Pelican can handle Disqus comments. Specify the Disqus sitename identifier\n   here. The default is ``None``.\n\n.. data:: GITHUB_URL\n\n   Your GitHub URL (if you have one). It will then use this information to\n   create a GitHub ribbon. The default is ``None``.\n\n.. data:: ANALYTICS\n\n   Put any desired analytics scripts in this setting in ``publishconf.py``.\n   Example:\n\n   .. parsed-literal::\n\n      ANALYTICS = \"\"\"\n          <script src=\"/theme/js/primary-analytics.js\"></script>\n          <script>\n              [ … in-line Javascript code for secondary analytics … ]\n          </script>\n      \"\"\"\n\n   The default is ``None``.\n\n.. data:: MENUITEMS\n\n   A list of tuples (Title, URL) for additional menu items to appear at the\n   beginning of the main menu. The default is ``None``.\n\n.. data:: LINKS\n\n   A list of tuples (Title, URL) for links to appear on the header. The\n   default is ``None``.\n\n.. data:: SOCIAL\n\n   A list of tuples (Title, URL) to appear in the \"social\" section. The\n   default is ``None``.\n\n.. data:: TWITTER_USERNAME\n\n   Allows for adding a button to articles to encourage others to tweet about\n   them. Add your Twitter username if you want this button to appear. The\n   default is ``None``.\n\n.. data:: LINKS_WIDGET_NAME\n\n   Allows override of the name of the links widget.  If not specified, defaults\n   to \"links\". The default is ``None``.\n\n.. data:: SOCIAL_WIDGET_NAME\n\n   Allows override of the name of the \"social\" widget.  If not specified,\n   defaults to \"social\". The default is ``None``.\n\nIn addition, you can use the \"wide\" version of the ``notmyidea`` theme by\nadding the following to your configuration::\n\n    CSS_FILE = \"wide.css\"\n\n\nLogging\n=======\n\nSometimes, a long list of warnings may appear during site generation. Finding\nthe **meaningful** error message in the middle of tons of annoying log output\ncan be quite tricky. In order to filter out redundant log messages, Pelican\ncomes with the ``LOG_FILTER`` setting.\n\n``LOG_FILTER`` should be a list of tuples ``(level, msg)``, each of them being\ncomposed of the logging level (up to ``warning``) and the message to be\nignored. Simply populate the list with the log messages you want to hide, and\nthey will be filtered out.\n\nFor example::\n\n   import logging\n   LOG_FILTER = [(logging.WARN, 'TAG_SAVE_AS is set to False')]\n\nIt is possible to filter out messages by a template. Check out source code to\nobtain a template.\n\nFor example::\n\n   import logging\n   LOG_FILTER = [(logging.WARN, 'Empty alt attribute for image %s in %s')]\n\n.. Warning::\n\n   Silencing messages by templates is a dangerous feature. It is possible to\n   unintentionally filter out multiple message types with the same template\n   (including messages from future Pelican versions). Proceed with caution.\n\n.. note::\n\n    This option does nothing if ``--debug`` is passed.\n\n.. _reading_only_modified_content:\n\n\nReading only modified content\n=============================\n\nTo speed up the build process, Pelican can optionally read only articles and\npages with modified content.\n\nWhen Pelican is about to read some content source file:\n\n1. The hash or modification time information for the file from a\n   previous build are loaded from a cache file if ``LOAD_CONTENT_CACHE`` is\n   ``True``. These files are stored in the ``CACHE_PATH`` directory.  If the\n   file has no record in the cache file, it is read as usual.\n2. The file is checked according to ``CHECK_MODIFIED_METHOD``:\n\n    - If set to ``'mtime'``, the modification time of the file is\n      checked.\n    - If set to a name of a function provided by the ``hashlib``\n      module, e.g. ``'md5'``, the file hash is checked.\n    - If set to anything else or the necessary information about the\n      file cannot be found in the cache file, the content is read as usual.\n\n3. If the file is considered unchanged, the content data saved in a\n   previous build corresponding to the file is loaded from the cache, and the\n   file is not read.\n4. If the file is considered changed, the file is read and the new\n   modification information and the content data are saved to the cache if\n   ``CACHE_CONTENT`` is ``True``.\n\nIf ``CONTENT_CACHING_LAYER`` is set to ``'reader'`` (the default), the raw\ncontent and metadata returned by a reader are cached. If this setting is\ninstead set to ``'generator'``, the processed content object is cached. Caching\nthe processed content object may conflict with plugins (as some reading related\nsignals may be skipped) and the ``WITH_FUTURE_DATES`` functionality (as the\n``draft`` status of the cached content objects would not change automatically\nover time).\n\nChecking modification times is faster than comparing file hashes, but it is not\nas reliable because ``mtime`` information can be lost, e.g., when copying\ncontent source files using the ``cp`` or ``rsync`` commands without the\n``mtime`` preservation mode (which for ``rsync`` can be invoked by passing the\n``--archive`` flag).\n\nThe cache files are Python pickles, so they may not be readable by different\nversions of Python as the pickle format often changes. If such an error is\nencountered, it is caught and the cache file is rebuilt automatically in the\nnew format. The cache files will also be rebuilt after the ``GZIP_CACHE``\nsetting has been changed.\n\nThe ``--ignore-cache`` command-line option is useful when the whole cache needs\nto be regenerated, such as when making modifications to the settings file that\nwill affect the cached content, or just for debugging purposes. When Pelican\nruns in autoreload mode, modification of the settings file will make it ignore\nthe cache automatically if ``AUTORELOAD_IGNORE_CACHE`` is ``True``.\n\nNote that even when using cached content, all output is always written, so the\nmodification times of the generated ``*.html`` files will always change.\nTherefore, ``rsync``-based uploading may benefit from the ``--checksum``\noption.\n\n\nExample settings\n================\n\n.. literalinclude:: ../samples/pelican.conf.py\n    :language: python\n\n\n.. _Jinja Environment documentation: https://jinja.palletsprojects.com/en/latest/api/#jinja2.Environment\n.. _Docutils Configuration: http://docutils.sourceforge.net/docs/user/config.html\n.. _`watchfiles documentation`: https://watchfiles.helpmanual.io/api/filters/#watchfiles.DefaultFilter.ignore_dirs\n"
  },
  {
    "path": "docs/themes.rst",
    "content": ".. _theming-pelican:\n\nThemes\n######\n\nThere is a community-managed repository of `Pelican Themes`_ for people to share\nand use.\n\nPlease note that while we do our best to review and merge theme contributions,\nthey are submitted by the Pelican community and thus may have varying levels of\nsupport and interoperability.\n\nCreating Themes\n~~~~~~~~~~~~~~~\n\nTo generate its HTML output, Pelican uses the `Jinja\n<https://palletsprojects.com/p/jinja/>`_ templating engine due to its flexibility and\nstraightforward syntax. If you want to create your own theme, feel free to take\ninspiration from the `\"simple\" theme\n<https://github.com/getpelican/pelican/tree/main/pelican/themes/simple/templates>`_.\n\nTo generate your site using a theme you have created (or downloaded manually\nand then modified), you can specify that theme via the ``-t`` flag::\n\n    pelican content -s pelicanconf.py -t /projects/your-site/themes/your-theme\n\nIf you'd rather not specify the theme on every invocation, you can define\n``THEME`` in your settings to point to the location of your preferred theme.\n\n\nStructure\n=========\n\nTo make your own theme, you must follow the following structure::\n\n    ├── static\n    │   ├── css\n    │   └── images\n    └── templates\n        ├── archives.html         // to display archives\n        ├── article.html          // processed for each article\n        ├── author.html           // processed for each author\n        ├── authors.html          // must list all the authors\n        ├── categories.html       // must list all the categories\n        ├── category.html         // processed for each category\n        ├── index.html            // the index (list all the articles)\n        ├── page.html             // processed for each page\n        ├── period_archives.html  // to display time-period archives\n        ├── tag.html              // processed for each tag\n        └── tags.html             // must list all the tags. Can be a tag cloud.\n\n* `static` contains all the static assets, which will be copied to the output\n  `theme` folder. The above filesystem layout includes CSS and image folders,\n  but those are just examples. Put what you need here.\n\n* `templates` contains all the templates that will be used to generate the\n  content. The template files listed above are mandatory; you can add your own\n  templates if it helps you keep things organized while creating your theme.\n\n\n.. _templates-variables:\n\nTemplates and Variables\n=======================\n\nThe idea is to use a simple syntax that you can embed into your HTML pages.\nThis document describes which templates should exist in a theme, and which\nvariables will be passed to each template at generation time.\n\nAll templates will receive the variables defined in your settings file, as long\nas they are in all-caps. You can access them directly.\n\n\n.. _common_variables:\n\nCommon Variables\n----------------\n\nAll of these settings will be available to all templates.\n\n=============== ===================================================\nVariable        Description\n=============== ===================================================\noutput_file     The name of the file currently being generated. For\n                instance, when Pelican is rendering the home page,\n                output_file will be \"index.html\".\narticles        The list of articles, ordered descending by date.\n                All the elements are `Article` objects, so you can\n                access their attributes (e.g. title, summary, author\n                etc.). Sometimes this is shadowed (for instance, in\n                the tags page). You will then find info about it\n                in the `all_articles` variable.\ndates           The same list of articles, but ordered by date,\n                ascending.\nhidden_articles The list of hidden articles\ndrafts          The list of draft articles\nperiod_archives A dictionary containing elements related to\n                time-period archives (if enabled). See the section\n                :ref:`Listing and Linking to Period Archives\n                <period_archives_variable>` for details.\nauthors         A list of (author, articles) tuples, containing all\n                the authors and corresponding articles (values)\ncategories      A list of (category, articles) tuples, containing\n                all the categories and corresponding articles (values)\ntags            A list of (tag, articles) tuples, containing all\n                the tags and corresponding articles (values)\npages           The list of pages\nhidden_pages    The list of hidden pages\ndraft_pages     The list of draft pages\n=============== ===================================================\n\n\nSorting\n-------\n\nURL wrappers (currently categories, tags, and authors), have comparison methods\nthat allow them to be easily sorted by name::\n\n    {% for tag, articles in tags|sort %}\n\nIf you want to sort based on different criteria, `Jinja's sort command`__ has a\nnumber of options.\n\n__ https://jinja.palletsprojects.com/en/latest/templates/#sort\n\n\nDate Formatting\n---------------\n\nPelican formats the date according to your settings and locale\n(``DATE_FORMATS``/``DEFAULT_DATE_FORMAT``) and provides a ``locale_date``\nattribute. On the other hand, the ``date`` attribute will be a `datetime`_\nobject. If you need custom formatting for a date different than your settings,\nuse the Jinja filter ``strftime`` that comes with Pelican. Usage is same as\nPython `strftime`_ format, but the filter will do the right thing and format\nyour date according to the locale given in your settings::\n\n    {{ article.date|strftime('%d %B %Y') }}\n\n.. _datetime: https://docs.python.org/3/library/datetime.html#datetime-objects\n.. _strftime: https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior\n\nChecking Loaded Plugins\n-----------------------\n\nPelican provides a ``plugin_enabled`` Jinja test for checking if a certain plugin\nis enabled. This test accepts a plugin name as a string and will return a Boolean.\nNamespace plugins can be specified by full name (``pelican.plugins.plugin_name``)\nor short name (``plugin_name``). The following example uses the ``webassets`` plugin\nto minify CSS if the plugin is enabled and otherwise falls back to regular CSS::\n\n    {% if \"webassets\" is plugin_enabled %}\n        {% assets filters=\"cssmin\", output=\"css/style.min.css\", \"css/style.scss\" %}\n            <link rel=\"stylesheet\" href=\"{{SITEURL}}/{{ASSET_URL}}\">\n        {% endassets %}\n    {% else %}\n        <link rel=\"stylesheet\" href=\"{{SITEURL}}/css/style.css}\">\n    {% endif %}\n\n\nindex.html\n----------\n\nThis is the home page or index of your blog, generated at ``index.html``.\n\nIf pagination is active, subsequent pages will reside in\n``index{number}.html``.\n\n======================  ===================================================\nVariable                Description\n======================  ===================================================\narticles_paginator      A paginator object for the list of articles\narticles_page           The current page of articles\narticles_previous_page  The previous page of articles (``None`` if page does\n                        not exist)\narticles_next_page      The next page of articles (``None`` if page does\n                        not exist)\ndates_paginator         A paginator object for the article list, ordered by\n                        date, ascending.\ndates_page              The current page of articles, ordered by date,\n                        ascending.\ndates_previous_page     The previous page of articles, ordered by date,\n                        ascending (``None`` if page does not exist)\ndates_next_page         The next page of articles, ordered by date,\n                        ascending (``None`` if page does not exist)\npage_name               'index' -- useful for pagination links\n======================  ===================================================\n\n\nauthor.html\n-------------\n\nThis template will be processed for each of the existing authors, with output\ngenerated according to the ``AUTHOR_SAVE_AS`` setting (`Default:`\n``author/{slug}.html``). If pagination is active, subsequent pages will by\ndefault reside at ``author/{slug}{number}.html``.\n\n======================  ===================================================\nVariable                Description\n======================  ===================================================\nauthor                  The name of the author being processed\narticles                Articles by this author\ndates                   Articles by this author, but ordered by date,\n                        ascending\narticles_paginator      A paginator object for the list of articles\narticles_page           The current page of articles\narticles_previous_page  The previous page of articles (``None`` if page does\n                        not exist)\narticles_next_page      The next page of articles (``None`` if page does\n                        not exist)\ndates_paginator         A paginator object for the article list, ordered by\n                        date, ascending.\ndates_page              The current page of articles, ordered by date,\n                        ascending.\ndates_previous_page     The previous page of articles, ordered by date,\n                        ascending (``None`` if page does not exist)\ndates_next_page         The next page of articles, ordered by date,\n                        ascending (``None`` if page does not exist)\npage_name               AUTHOR_URL where everything after `{slug}` is\n                        removed -- useful for pagination links\n======================  ===================================================\n\n\ncategory.html\n-------------\n\nThis template will be processed for each of the existing categories, with\noutput generated according to the ``CATEGORY_SAVE_AS`` setting (`Default:`\n``category/{slug}.html``). If pagination is active, subsequent pages will by\ndefault reside at ``category/{slug}{number}.html``.\n\n======================  ===================================================\nVariable                Description\n======================  ===================================================\ncategory                The name of the category being processed\narticles                Articles for this category\ndates                   Articles for this category, but ordered by date,\n                        ascending\narticles_paginator      A paginator object for the list of articles\narticles_page           The current page of articles\narticles_previous_page  The previous page of articles (``None`` if page does\n                        not exist)\narticles_next_page      The next page of articles (``None`` if page does\n                        not exist)\ndates_paginator         A paginator object for the list of articles,\n                        ordered by date, ascending\ndates_page              The current page of articles, ordered by date,\n                        ascending\ndates_previous_page     The previous page of articles, ordered by date,\n                        ascending (``None`` if page does not exist)\ndates_next_page         The next page of articles, ordered by date,\n                        ascending (``None`` if page does not exist)\npage_name               CATEGORY_URL where everything after `{slug}` is\n                        removed -- useful for pagination links\n======================  ===================================================\n\n\narticle.html\n-------------\n\nThis template will be processed for each article, with output generated\naccording to the ``ARTICLE_SAVE_AS`` setting (`Default:` ``{slug}.html``). The\nfollowing variables are available when rendering.\n\n=============   ===================================================\nVariable        Description\n=============   ===================================================\narticle         The article object to be displayed\ncategory        The name of the category for the current article\n=============   ===================================================\n\nAny metadata that you put in the header of the article source file will be\navailable as fields on the ``article`` object. The field name will be the same\nas the name of the metadata field, except in all-lowercase characters.\n\nFor example, you could add a field called `FacebookImage` to your article\nmetadata, as shown below:\n\n.. code-block:: md\n\n    Title: I love Python more than music\n    Date: 2013-11-06 10:06\n    Tags: personal, python\n    Category: Tech\n    Slug: python-je-l-aime-a-mourir\n    Author: Francis Cabrel\n    FacebookImage: http://franciscabrel.com/images/pythonlove.png\n\nThis new metadata will be made available as `article.facebookimage` in your\n`article.html` template. This would allow you, for example, to specify an image\nfor the Facebook open graph tags that will change for each article:\n\n.. code-block:: html+jinja\n\n    <meta property=\"og:image\" content=\"{{ article.facebookimage }}\"/>\n\n\npage.html\n---------\n\nThis template will be processed for each page, with output generated according\nto the ``PAGE_SAVE_AS`` setting (`Default:` ``pages/{slug}.html``). The\nfollowing variables are available when rendering.\n\n=============   ===================================================\nVariable        Description\n=============   ===================================================\npage            The page object to be displayed. You can access its\n                title, slug, and content.\n=============   ===================================================\n\n\ntag.html\n--------\n\nThis template will be processed for each tag, with output generated according\nto the ``TAG_SAVE_AS`` setting (`Default:` ``tag/{slug}.html``). If pagination\nis active, subsequent pages will by default reside at\n``tag/{slug}{number}.html``.\n\n======================  ===================================================\nVariable                Description\n======================  ===================================================\ntag                     The name of the tag being processed\narticles                Articles related to this tag\ndates                   Articles related to this tag, but ordered by date,\n                        ascending\narticles_paginator      A paginator object for the list of articles\narticles_page           The current page of articles\narticles_previous_page  The previous page of articles (``None`` if page does\n                        not exist)\narticles_next_page      The next page of articles (``None`` if page does\n                        not exist)\ndates_paginator         A paginator object for the list of articles,\n                        ordered by date, ascending\ndates_page              The current page of articles, ordered by date,\n                        ascending\ndates_previous_page     The previous page of articles, ordered by date,\n                        ascending (``None`` if page does not exist)\ndates_next_page         The next page of articles, ordered by date,\n                        ascending (``None`` if page does not exist)\npage_name               TAG_URL where everything after `{slug}` is removed\n                        -- useful for pagination links\n======================  ===================================================\n\n\nperiod_archives.html\n--------------------\n\nThis template will be processed for each year of your posts if a path for\n``YEAR_ARCHIVE_SAVE_AS`` is defined, each month if ``MONTH_ARCHIVE_SAVE_AS`` is\ndefined, and each day if ``DAY_ARCHIVE_SAVE_AS`` is defined.\n\n===================     ===================================================\nVariable                Description\n===================     ===================================================\nperiod                  A tuple of the form (`year`, `month`, `day`) that\n                        indicates the current time period. `year` and `day`\n                        are numbers while `month` is a string. This tuple\n                        only contains `year` if the time period is a\n                        given year. It contains both `year` and `month`\n                        if the time period is over years and months and\n                        so on.\nperiod_num              A tuple of the form (``year``, ``month``, ``day``),\n                        as in ``period``, except all values are numbers.\n\n===================     ===================================================\n\nYou can see an example of how to use `period` in the `\"simple\" theme\nperiod_archives.html template\n<https://github.com/getpelican/pelican/blob/main/pelican/themes/simple/templates/period_archives.html>`_.\n\n\n.. _period_archives_variable:\n\nListing and Linking to Period Archives\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nThe ``period_archives`` variable can be used to generate a list of links to\nthe set of period archives that Pelican generates. As a :ref:`common variable\n<common_variables>`, it is available for use in any template, so you\ncan implement such an index in a custom direct template, or in a sidebar\nvisible across different site pages.\n\n``period_archives`` is a dict that may contain ``year``, ``month``, and/or\n``day`` keys, depending on which ``*_ARCHIVE_SAVE_AS`` settings are enabled.\nThe corresponding value is a list of dicts, where each dict in turn represents\na time period (ordered according to the ``NEWEST_FIRST_ARCHIVES`` setting)\nwith the following keys and values:\n\n===================     ===================================================\nKey                     Value\n===================     ===================================================\nperiod                  The same tuple as described in\n                        ``period_archives.html``, e.g.\n                        ``(2023, 'June', 18)``.\nperiod_num              The same tuple as described in\n                        ``period_archives.html``, e.g. ``(2023, 6, 18)``.\nurl                     The URL to the period archive page, e.g.\n                        ``posts/2023/06/18/``. This is controlled by the\n                        corresponding ``*_ARCHIVE_URL`` setting.\nsave_as                 The path to the save location of the period archive\n                        page file, e.g. ``posts/2023/06/18/index.html``.\n                        This is used internally by Pelican and is usually\n                        not relevant to themes.\narticles                A list of :ref:`Article <object-article>` objects\n                        that fall under the time period.\ndates                   Same list as ``articles``, but ordered according\n                        to the ``NEWEST_FIRST_ARCHIVES`` setting.\n===================     ===================================================\n\nHere is an example of how ``period_archives`` can be used in a template:\n\n.. code-block:: html+jinja\n\n    <ul>\n    {% for archive in period_archives.month %}\n        <li>\n            <a href=\"{{ SITEURL }}/{{ archive.url }}\">\n                {{ archive.period | reverse | join(' ') }} ({{ archive.articles|count }})\n            </a>\n        </li>\n    {% endfor %}\n    </ul>\n\nYou can change ``period_archives.month`` in the ``for`` statement to\n``period_archives.year`` or ``period_archives.day`` as appropriate, depending\non the time period granularity desired.\n\n\nObjects\n=======\n\nDetail objects attributes that are available and useful in templates. Not all\nattributes are listed here, this is a selection of attributes considered useful\nin a template.\n\n.. _object-article:\n\nArticle\n-------\n\nThe string representation of an Article is the `source_path` attribute.\n\n======================  ===================================================\nAttribute               Description\n======================  ===================================================\nauthor                  The :ref:`Author <object-author_cat_tag>` of\n                        this article.\nauthors                 A list of :ref:`Authors <object-author_cat_tag>`\n                        of this article.\ncategory                The :ref:`Category <object-author_cat_tag>`\n                        of this article.\ncontent                 The rendered content of the article.\ndate                    Datetime object representing the article date.\ndate_format             Either default date format or locale date format.\ndefault_template        Default template name.\nin_default_lang         Boolean representing if the article is written\n                        in the default language.\nlang                    Language of the article.\nlocale_date             Date formatted by the `date_format`.\nmetadata                Article header metadata `dict`.\nsave_as                 Location to save the article page.\nslug                    Page slug.\nsource_path             Full system path of the article source file.\nrelative_source_path    Relative path from PATH_ to the article source file.\nstatus                  The article status, can be any of 'published' or\n                        'draft'.\nsummary                 Rendered summary content.\ntags                    List of :ref:`Tag <object-author_cat_tag>`\n                        objects.\ntemplate                Template name to use for rendering.\ntitle                   Title of the article.\ntranslations            List of translations\n                        :ref:`Article <object-article>` objects.\nurl                     URL to the article page.\n======================  ===================================================\n\n.. _PATH: settings.html#PATH\n\n\n.. _object-author_cat_tag:\n\nAuthor / Category / Tag\n-----------------------\n\nThe string representation of those objects is the `name` attribute.\n\n===================     ===================================================\nAttribute               Description\n===================     ===================================================\nname                    Name of this object [1]_.\npage_name               Author page name.\nsave_as                 Location to save the author page.\nslug                    Page slug.\nurl                     URL to the author page.\n===================     ===================================================\n\n.. [1] for Author object, coming from `:authors:` or `AUTHOR`.\n\n.. _object-page:\n\nPage\n----\n\nThe string representation of a Page is the `source_path` attribute.\n\n=====================  ===================================================\nAttribute              Description\n=====================  ===================================================\nauthor                 The :ref:`Author <object-author_cat_tag>` of\n                       this page.\ncontent                The rendered content of the page.\ndate                   Datetime object representing the page date.\ndate_format            Either default date format or locale date format.\ndefault_template       Default template name.\nin_default_lang        Boolean representing if the article is written\n                       in the default language.\nlang                   Language of the article.\nlocale_date            Date formatted by the `date_format`.\nmetadata               Page header metadata `dict`.\nsave_as                Location to save the page.\nslug                   Page slug.\nsource_path            Full system path of the page source file.\nrelative_source_path   Relative path from PATH_ to the page source file.\nstatus                 The page status, can be any of 'published', 'hidden' or\n                       'draft'.\nsummary                Rendered summary content.\ntags                   List of :ref:`Tag <object-author_cat_tag>`\n                       objects.\ntemplate               Template name to use for rendering.\ntitle                  Title of the page.\ntranslations           List of translations\n                       :ref:`Article <object-article>` objects.\nurl                    URL to the page.\n=====================  ===================================================\n\n.. _PATH: settings.html#PATH\n\n\nFeeds\n=====\n\nThe feed variables changed in 3.0. Each variable now explicitly lists ATOM or\nRSS in the name. ATOM is still the default. Old themes will need to be updated.\nHere is a complete list of the feed variables::\n\n    AUTHOR_FEED_ATOM\n    AUTHOR_FEED_RSS\n    CATEGORY_FEED_ATOM\n    CATEGORY_FEED_RSS\n    FEED_ALL_ATOM\n    FEED_ALL_RSS\n    FEED_ATOM\n    FEED_RSS\n    TAG_FEED_ATOM\n    TAG_FEED_RSS\n    TRANSLATION_FEED_ATOM\n    TRANSLATION_FEED_RSS\n\n\nInheritance\n===========\n\nSince version 3.0, Pelican supports inheritance from the ``simple`` theme, so\nyou can re-use the ``simple`` theme templates in your own themes.\n\nIf one of the mandatory files in the ``templates/`` directory of your theme is\nmissing, it will be replaced by the matching template from the ``simple``\ntheme. So if the HTML structure of a template in the ``simple`` theme is right\nfor you, you don't have to write a new template from scratch.\n\nYou can also extend templates from the ``simple`` theme in your own themes by\nusing the ``{% extends %}`` directive as in the following example:\n\n.. code-block:: html+jinja\n\n    {% extends \"!simple/index.html\" %}   <!-- extends the ``index.html`` template from the ``simple`` theme -->\n\n    {% extends \"index.html\" %}   <!-- \"regular\" extending -->\n\n\nExample\n-------\n\nWith this system, it is possible to create a theme with just two files.\n\nbase.html\n\"\"\"\"\"\"\"\"\"\n\nThe first file is the ``templates/base.html`` template:\n\n.. code-block:: html+jinja\n\n    {% extends \"!simple/base.html\" %}\n\n    {% block head %}\n    {{ super() }}\n       <link rel=\"stylesheet\" type=\"text/css\" href=\"{{ SITEURL }}/theme/css/style.css\" />\n    {% endblock %}\n\n1. On the first line, we extend the ``base.html`` template from the ``simple``\n   theme, so we don't have to rewrite the entire file.\n2. On the third line, we open the ``head`` block which has already been defined\n   in the ``simple`` theme.\n3. On the fourth line, the function ``super()`` keeps the content previously\n   inserted in the ``head`` block.\n4. On the fifth line, we append a stylesheet to the page.\n5. On the last line, we close the ``head`` block.\n\nThis file will be extended by all the other templates, so the stylesheet will\nbe linked from all pages.\n\nstyle.css\n\"\"\"\"\"\"\"\"\"\n\nThe second file is the ``static/css/style.css`` CSS stylesheet:\n\n.. code-block:: css\n\n    body {\n        font-family : monospace ;\n        font-size : 100% ;\n        background-color : white ;\n        color : #111 ;\n        width : 80% ;\n        min-width : 400px ;\n        min-height : 200px ;\n        padding : 1em ;\n        margin : 5% 10% ;\n        border : thin solid gray ;\n        border-radius : 5px ;\n        display : block ;\n    }\n\n    a:link    { color : blue ; text-decoration : none ;      }\n    a:hover   { color : blue ; text-decoration : underline ; }\n    a:visited { color : blue ;                               }\n\n    h1 a { color : inherit !important }\n    h2 a { color : inherit !important }\n    h3 a { color : inherit !important }\n    h4 a { color : inherit !important }\n    h5 a { color : inherit !important }\n    h6 a { color : inherit !important }\n\n    pre {\n        margin : 2em 1em 2em 4em ;\n    }\n\n    #menu li {\n        display : inline ;\n    }\n\n    #post-list {\n        margin-bottom : 1em ;\n        margin-top : 1em ;\n    }\n\nDownload\n\"\"\"\"\"\"\"\"\n\nYou can download this example theme :download:`here <_static/theme-basic.zip>`.\n\n\n.. Links\n\n.. _`Pelican Themes`: https://github.com/getpelican/pelican-themes\n"
  },
  {
    "path": "docs/tips.rst",
    "content": "Tips\n####\n\nHere are some tips about Pelican that you might find useful.\n\nCustom 404 Pages\n================\n\nWhen a browser requests a resource that the web server cannot find, the web\nserver usually displays a generic \"File not found\" (404) error page that can be\nstark and unsightly. One way to provide an error page that matches the theme of\nyour site is to create a custom 404 page (*not* an article), such as this\nMarkdown-formatted example stored in ``content/pages/404.md``::\n\n    Title: Not Found\n    Status: hidden\n    Save_as: 404.html\n\n    The requested item could not be located. Perhaps you might want to check\n    the [Archives](/archives.html)?\n\nThe next step is to configure your web server to display this custom page\ninstead of its default 404 page. For Nginx, add the following to your\nconfiguration file's ``location`` block::\n\n    error_page 404 /404.html;\n\nFor Apache::\n\n    ErrorDocument 404 /404.html\n\nFor Amazon S3, first navigate to the ``Static Site Hosting`` menu in the bucket\nsettings on your AWS console. From there::\n\n    Error Document: 404.html\n\nPublishing to GitHub Pages\n==========================\n\nIf you use `GitHub <https://github.com/>`_ for your Pelican site you can\npublish your site to `GitHub Pages <https://pages.github.com/>`_ for free.\nYour site will be published to ``https://<username>.github.io`` if it's a user or\norganization site or to ``https://<username>.github.io/<repository>`` if it's a\nproject site. It's also possible to `use a custom domain with GitHub Pages <https://docs.github.com/en/pages/configuring-a-custom-domain-for-your-github-pages-site>`_.\n\nThere are `two ways to publish a site to GitHub Pages <https://docs.github.com/en/pages/getting-started-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site>`_:\n\n1. **Publishing from a branch:** run ``pelican`` locally and push the output\n   directory to a special branch of your GitHub repo. GitHub will then publish\n   the contents of this branch to your GitHub Pages site.\n2. **Publishing with a custom GitHub Actions workflow:** just push the source\n   files of your Pelican site to your GitHub repo's default branch and have a\n   custom GitHub Actions workflow run ``pelican`` for you to generate the\n   output directory and publish it to your GitHub Pages site.  This way you\n   don't need to run ``pelican`` locally. You can even edit your site's source\n   files using GitHub's web interface and any changes that you commit will be\n   published.\n\nPublishing a Project Site to GitHub Pages from a Branch\n-------------------------------------------------------\n\nTo publish a Pelican site as a Project Page you need to *push* the content of\nthe ``output`` dir generated by Pelican to a repository's ``gh-pages`` branch\non GitHub.\n\nThe excellent `ghp-import <https://github.com/davisp/ghp-import>`_, which can\nbe installed with ``pip``, makes this process really easy.\n\nFor example, if the source of your Pelican site is contained in a GitHub\nrepository, and if you want to publish that Pelican site in the form of Project\nPages to this repository, you can then use the following::\n\n    $ pelican content -o output -s pelicanconf.py\n    $ ghp-import output -b gh-pages\n    $ git push origin gh-pages\n\nThe ``ghp-import output`` command updates the local ``gh-pages`` branch with\nthe content of the ``output`` directory (creating the branch if it doesn't\nalready exist). The ``git push origin gh-pages`` command updates the remote\n``gh-pages`` branch, effectively publishing the Pelican site.\n\n.. note::\n\n    The ``github`` target of the Makefile (and the ``gh_pages`` task of\n    ``tasks.py``) created by the ``pelican-quickstart`` command publishes the\n    Pelican site as Project Pages, as described above.\n\nPublishing a User Site to GitHub Pages from a Branch\n----------------------------------------------------\n\nTo publish a Pelican site in the form of User Pages, you need to *push* the\ncontent of the ``output`` dir generated by Pelican to the ``main`` branch of\nyour ``<username>.github.io`` repository on GitHub.\n\nAgain, you can take advantage of ``ghp-import``::\n\n    $ pelican content -o output -s pelicanconf.py\n    $ ghp-import output -b gh-pages\n    $ git push git@github.com:elemoine/elemoine.github.io.git gh-pages:main\n\nThe ``git push`` command pushes the local ``gh-pages`` branch (freshly updated\nby the ``ghp-import`` command) to the ``elemoine.github.io`` repository's\n``main`` branch on GitHub.\n\n.. note::\n\n    To publish your Pelican site as User Pages, feel free to adjust the\n    ``github`` target of the Makefile.\n\nAnother option for publishing to User Pages is to generate the output files in\nthe root directory of the project.\n\nFor example, your main project folder is ``<username>.github.io`` and you can\ncreate the Pelican project in a subdirectory called ``Pelican``. Then from\ninside the ``Pelican`` folder you can run::\n\n    $ pelican content -o .. -s pelicanconf.py\n\nNow you can push the whole project ``<username>.github.io`` to the main\nbranch of your GitHub repository::\n\n    $ git push origin main\n\n(assuming origin is set to your remote repository).\n\nPublishing to GitHub Pages Using a Custom GitHub Actions Workflow\n-----------------------------------------------------------------\n\nPelican-powered sites can be published to GitHub Pages via a `custom workflow\n<https://github.com/getpelican/pelican/blob/main/.github/workflows/github_pages.yml>`_.\nTo use it:\n\n1. Enable GitHub Pages in your repo: go to **Settings → Pages** and choose\n   **GitHub Actions** for the **Source** setting.\n\n2. Commit a ``.github/workflows/pelican.yml`` file to your repo with these contents:\n\n   .. code-block:: yaml\n\n       name: Deploy to GitHub Pages\n       on:\n         push:\n           branches: [\"main\"]\n         workflow_dispatch:\n       jobs:\n         deploy:\n           uses: \"getpelican/pelican/.github/workflows/github_pages.yml@main\"\n           permissions:\n             contents: \"read\"\n             pages: \"write\"\n             id-token: \"write\"\n           with:\n             settings: \"publishconf.py\"\n\n   You may want to replace the ``@main`` with the ID of a specific commit in\n   this repo in order to pin the version of the reusable workflow that you're using:\n   ``uses: getpelican/pelican/.github/workflows/github_pages.yml@<COMMIT_ID>``.\n   If you do this you might want to get Dependabot to send you automated pull\n   requests to update that commit ID whenever new versions of this workflow are\n   published, like so:\n\n   .. code-block:: yaml\n\n       # .github/dependabot.yml\n       version: 2\n       updates:\n         - package-ecosystem: \"github-actions\"\n           directory: \"/\"\n           schedule:\n             interval: \"monthly\"\n\n   See `GitHub's docs about using Dependabot to keep your actions up to date <https://docs.github.com/en/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot>`_.\n\n3. Go to the **Actions** tab in your repo\n   (``https://github.com/<username>/<repository>/actions``) and you should see a\n   **Deploy to GitHub Pages** action running.\n\n4. Once the action completes you should see your Pelican site deployed at your\n   repo's GitHub Pages URL: ``https://<username>.github.io`` for a user or\n   organization site or ``https://<username>.github.io/<repository>>`` for a\n   project site.\n\nNotes:\n\n* You don't need to set ``SITEURL`` or ``FEED_DOMAIN`` in your Pelican\n  settings: the workflow will set them correctly for you\n\n* You don't need to commit your ``--output`` / ``OUTPUT_PATH`` directory\n  (``output/``) to git: the workflow will run ``pelican`` to build the output\n  directory for you on GitHub Actions\n\nSee `GitHub's docs about reusable workflows <https://docs.github.com/en/actions/using-workflows/reusing-workflows>`_\nfor more information.\n\nA number of optional inputs can be added to the ``with:`` block when calling\nthe workflow, for example:\n\n.. code-block:: yaml\n\n    with:\n      settings: \"publishconf.py\"\n      requirements: \"pelican[markdown] typogrify\"\n      theme: \"https://github.com/seanh/sidecar.git\"\n      python: \"3.12\"\n\nHere's the complete list of workflow inputs:\n\n+--------------------+----------+--------------------------------------------+--------+---------------+\n| Name               | Required | Description                                | Type   | Default       |\n+====================+==========+============================================+========+===============+\n| ``settings``       | Yes      | The path to your Pelican settings          | string |               |\n|                    |          | file (``pelican``'s                        |        |               |\n|                    |          | ``--settings`` option),                    |        |               |\n|                    |          | for example: ``\"publishconf.py\"``          |        |               |\n+--------------------+----------+--------------------------------------------+--------+---------------+\n| ``requirements``   | No       | The Python requirements to                 | string | ``\"pelican\"`` |\n|                    |          | install, for example to enable             |        |               |\n|                    |          | markdown and typogrify use:                |        |               |\n|                    |          | ``\"pelican[markdown] typogrify\"``          |        |               |\n|                    |          | or if you have a requirements              |        |               |\n|                    |          | file: ``\"-r requirements.txt\"``            |        |               |\n+--------------------+----------+--------------------------------------------+--------+---------------+\n| ``output-path``    | No       | Where to output the generated              | string | ``\"output/\"`` |\n|                    |          | files (``pelican``'s ``--output``          |        |               |\n|                    |          | option)                                    |        |               |\n+--------------------+----------+--------------------------------------------+--------+---------------+\n| ``theme``          | No       | The GitHub repo URL of a custom            | string | ``\"\"``        |\n|                    |          | theme to use, for example:                 |        |               |\n|                    |          | ``\"https://github.com/seanh/sidecar.git\"`` |        |               |\n+--------------------+----------+--------------------------------------------+--------+---------------+\n| ``theme-checkout`` | No       | Git ref (branch, tag or commit) of the     | string | ``\"\"``        |\n|                    |          | theme repo to checkout. This can be used   |        |               |\n|                    |          | to pin the version of your theme. If not   |        |               |\n|                    |          | specified defaults to the theme repo's     |        |               |\n|                    |          | default branch.                            |        |               |\n+--------------------+----------+--------------------------------------------+--------+---------------+\n| ``python``         | No       | The version of Python to use to build the  | string | ``\"3.12\"``    |\n|                    |          | site, for example: ``\"3.12\"`` (to use the  |        |               |\n|                    |          | most recent version of Python 3.12, this   |        |               |\n|                    |          | is faster) or ``\"3.12.1\"`` (to use an      |        |               |\n|                    |          | exact version, slower)                     |        |               |\n+--------------------+----------+--------------------------------------------+--------+---------------+\n| ``siteurl``        | No       | The base URL of your web site (Pelican's   | string | The URL of    |\n|                    |          | ``SITEURL`` setting). If not passed this   |        | your GitHub   |\n|                    |          | will default to the URL of your GitHub     |        | Pages site.   |\n|                    |          | Pages site, which is correct in most       |        |               |\n|                    |          | cases.                                     |        |               |\n+--------------------+----------+--------------------------------------------+--------+---------------+\n| ``feed_domain``    | No       | The domain to be prepended to feed URLs    | string | The URL of    |\n|                    |          | (Pelican's ``FEED_DOMAIN`` setting). If    |        | your GitHub   |\n|                    |          | not passed this will default to the URL of |        | Pages site.   |\n|                    |          | your GitHub Pages site, which is correct   |        |               |\n|                    |          | in most cases.                             |        |               |\n+--------------------+----------+--------------------------------------------+--------+---------------+\n| ``deploy``         | No       | This is used to determine whether you will | bool   | ``true``      |\n|                    |          | deploy the site or not to GitHub Pages.    |        |               |\n|                    |          | This is most useful if you want to test a  |        |               |\n|                    |          | change to your website in a pull request   |        |               |\n|                    |          | before deploying those change.             |        |               |\n+--------------------+----------+--------------------------------------------+--------+---------------+\n| ``stork``          | No       | This is used to determine whether Stork    | bool   | ``false``     |\n|                    |          | will be installed on the runner to be able |        |               |\n|                    |          | to build a site with Stork search enabled  |        |               |\n+--------------------+----------+--------------------------------------------+--------+---------------+\n\nTesting Your Build in a GitHub Pull Request\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nIf you want to test your build in a pull request before deploying to GitHub, your workflow might look something like this:\n\n.. code-block:: yaml\n\n    name: Build and Deploy Site\n    on:\n      push:\n        branches: [\"main\"]\n      pull_request:\n        branches: [\"main\"]\n      workflow_dispatch:\n        inputs:\n          deploy:\n            required: false\n            default: true\n            description: \"Whether to deploy the site. If checked, then build the site and deploy it. If not checked, then just test that the site builds successfully but don't deploy anything.\"\n            type: boolean\n    jobs:\n      deploy:\n        uses: \"getpelican/pelican/.github/workflows/github_pages.yml@main\"\n        permissions:\n          id-token: write\n          contents: read\n          pages: write\n        with:\n          settings: \"publishconf.py\"\n          requirements: \"-r requirements.txt\"\n          deploy: ${{ (github.event_name == 'workflow_dispatch' && inputs.deploy == true) || (github.event_name == 'push' && github.ref_type == 'branch' && github.ref_name == github.event.repository.default_branch) }}\n\nThe ``on`` section of the workflow defines the events that will trigger the workflow. In this example, the workflow will run on pushes to the main branch, pull requests to the main branch, and manual runs of the workflow.\n\n``workflow_dispatch`` defines the deploy boolean to be true by default. This means that if you run the workflow manually, it will deploy the site.\n\nThe ``deploy`` input for the job is using a set of standard GitHub workflow variables to control when ``deploy`` will either be true or false (you can customize this to your needs).\n\nIn this example, the ``deploy`` will be true if the event is a push to the main branch (or merging into main from a PR) or a manual run of the workflow. If the event is a pull request, the ``deploy`` will be false and it will only build an artifact for the site.\n\n\"Insecure content\" warnings from browsers\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nIf your site uses ``https://`` and is broken because the browser is blocking\nnetwork requests (for example for CSS files) due to \"insecure content\" this\nmay be because GitHub Pages is generating ``http://`` URLs for your site.\n\nTo fix this go into your site repo's settings and enable the **Enforce HTTPS** setting:\ngo to **Settings → Pages** and check **Enforce HTTPS**.\nThen re-run the workflow to re-deploy your site.\nAlternatively, you can use the workflow's ``siteurl`` and ``feed_domain`` settings.\n\nCustom 404 Pages\n----------------\n\nGitHub Pages will display the custom 404 page described above, as noted in the\nrelevant `GitHub docs <https://help.github.com/articles/custom-404-pages/>`_.\n\nUpdate your site on each commit\n-------------------------------\n\nTo automatically update your Pelican site on each commit, you can create a\npost-commit hook. For example, you can add the following to\n``.git/hooks/post-commit``::\n\n    pelican content -o output -s pelicanconf.py && ghp-import output && git push origin gh-pages\n\nCopy static files to the root of your site\n------------------------------------------\n\nTo use a `custom domain\n<https://help.github.com/articles/setting-up-a-custom-domain-with-pages>`_ with\nGitHub Pages, you need to put the domain of your site (e.g.,\n``blog.example.com``) inside a ``CNAME`` file at the root of your site. To do\nthis, create the ``content/extra/`` directory and add a ``CNAME`` file to it.\nThen use the ``STATIC_PATHS`` setting to tell Pelican to copy this file to your\noutput directory. For example::\n\n    STATIC_PATHS = ['images', 'extra/CNAME']\n    EXTRA_PATH_METADATA = {'extra/CNAME': {'path': 'CNAME'},}\n\nNote: use forward slashes, ``/``, even on Windows.\n\nYou can also use the ``EXTRA_PATH_METADATA`` mechanism to place a\n``favicon.ico`` or ``robots.txt`` at the root of any site.\n\nHow to add YouTube or Vimeo Videos\n==================================\n\nThe easiest way is to paste the embed code of the video from these sites\ndirectly into your source content.\n\nAlternatively, you can also use Pelican plugins like ``liquid_tags``,\n``pelican_youtube``, or ``pelican_vimeo`` to embed videos in your content.\n\nMoreover, markup languages like reST and Markdown have plugins that let you\nembed videos in the markup. You can use `reST video directive\n<https://gist.github.com/dbrgn/2922648>`_ for reST or `mdx_video plugin\n<https://github.com/italomaia/mdx-video>`_ for Markdown.\n\n\nDevelop Locally Using SSL\n==================================\n\nHere's how you can set up your local pelican server to support SSL.\n\nFirst, create a self-signed certificate and key using ``openssl`` (this creates ``cert.pem`` and ``key.pem``)::\n\n    $ openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes\n\nAnd use this command to launch the server (the server starts within your ``output`` directory)::\n\n    python -m pelican.server 8443 --key=../key.pem --cert=../cert.pem\n\nIf you are using ``develop-server.sh``,  add this to the top::\n\n    CERT=\"$BASEDIR/cert.pem\"\n    KEY=\"$BASEDIR/key.pem\"\n\nand modify the ``pelican.server`` line as follows::\n\n    $PY -m pelican.server $port --ssl --cert=\"$CERT\" --key=\"$KEY\" &\n"
  },
  {
    "path": "pelican/__init__.py",
    "content": "import argparse\nimport importlib.metadata\nimport json\nimport logging\nimport multiprocessing\nimport os\nimport pprint\nimport sys\nimport time\nimport traceback\nfrom collections.abc import Iterable\n\n# Combines all paths to `pelican` package accessible from `sys.path`\n# Makes it possible to install `pelican` and namespace plugins into different\n# locations in the file system (e.g. pip with `-e` or `--user`)\nfrom pkgutil import extend_path\n\n__path__ = extend_path(__path__, __name__)\n\n# pelican.log has to be the first pelican module to be loaded\n# because logging.setLoggerClass has to be called before logging.getLogger\nfrom pelican.log import console, DEFAULT_LOG_HANDLER  # noqa: I001\nfrom pelican.log import init as init_logging\nfrom pelican.generators import (\n    ArticlesGenerator,\n    PagesGenerator,\n    SourceFileGenerator,\n    StaticGenerator,\n    TemplatePagesGenerator,\n)\nfrom pelican.plugins import signals\nfrom pelican.plugins._utils import get_plugin_name, load_plugins\nfrom pelican.server import ComplexHTTPRequestHandler, RootedHTTPServer\nfrom pelican.settings import read_settings\nfrom pelican.utils import clean_output_dir, maybe_pluralize, wait_for_changes\nfrom pelican.writers import Writer\n\ntry:\n    __version__ = importlib.metadata.version(\"pelican\")\nexcept importlib.metadata.PackageNotFoundError:\n    __version__ = \"unknown\"\n\nDEFAULT_CONFIG_NAME = \"pelicanconf.py\"\nlogger = logging.getLogger(__name__)\n\n\nclass Pelican:\n    def __init__(self, settings):\n        \"\"\"Pelican initialization\n\n        Performs some checks on the environment before doing anything else.\n        \"\"\"\n\n        # define the default settings\n        self.settings = settings\n\n        self.path = settings[\"PATH\"]\n        self.theme = settings[\"THEME\"]\n        self.output_path = settings[\"OUTPUT_PATH\"]\n        self.ignore_files = settings[\"IGNORE_FILES\"]\n        self.delete_outputdir = settings[\"DELETE_OUTPUT_DIRECTORY\"]\n        self.output_retention = settings[\"OUTPUT_RETENTION\"]\n\n        self.init_path()\n        self.init_plugins()\n        signals.initialized.send(self)\n\n    def init_path(self):\n        if not any(p in sys.path for p in [\"\", os.curdir]):\n            logger.debug(\"Adding current directory to system path\")\n            sys.path.insert(0, \"\")\n\n    def init_plugins(self):\n        self.plugins = []\n        for plugin in load_plugins(self.settings):\n            name = get_plugin_name(plugin)\n            logger.debug(\"Registering plugin `%s`\", name)\n            try:\n                plugin.register()\n                self.plugins.append(plugin)\n            except Exception:\n                logger.exception(\n                    \"Cannot register plugin `%s`\",\n                    name,\n                    stacklevel=2,\n                )\n                if self.settings.get(\"DEBUG\", False):\n                    console.print_exception()\n\n        self.settings[\"PLUGINS\"] = [get_plugin_name(p) for p in self.plugins]\n\n    def run(self):\n        \"\"\"Run the generators and return\"\"\"\n        start_time = time.time()\n\n        context = self.settings.copy()\n        # Share these among all the generators and content objects\n        # They map source paths to Content objects or None\n        context[\"generated_content\"] = {}\n        context[\"static_links\"] = set()\n        context[\"static_content\"] = {}\n        context[\"localsiteurl\"] = self.settings[\"SITEURL\"]\n\n        generators = [\n            cls(\n                context=context,\n                settings=self.settings,\n                path=self.path,\n                theme=self.theme,\n                output_path=self.output_path,\n            )\n            for cls in self._get_generator_classes()\n        ]\n\n        # Delete the output directory if (1) the appropriate setting is True\n        # and (2) that directory is not the parent of the source directory\n        if self.delete_outputdir and os.path.commonpath(\n            [os.path.realpath(self.output_path)]\n        ) != os.path.commonpath(\n            [os.path.realpath(self.output_path), os.path.realpath(self.path)]\n        ):\n            clean_output_dir(self.output_path, self.output_retention)\n\n        for p in generators:\n            if hasattr(p, \"generate_context\"):\n                p.generate_context()\n            if hasattr(p, \"check_disabled_readers\"):\n                p.check_disabled_readers()\n\n        # for plugins that create/edit the summary\n        logger.debug(\"Signal all_generators_finalized.send(<generators>)\")\n        signals.all_generators_finalized.send(generators)\n\n        # update links in the summary, etc\n        for p in generators:\n            if hasattr(p, \"refresh_metadata_intersite_links\"):\n                p.refresh_metadata_intersite_links()\n\n        writer = self._get_writer()\n\n        for p in generators:\n            if hasattr(p, \"generate_output\"):\n                p.generate_output(writer)\n\n        signals.finalized.send(self)\n\n        articles_generator = next(\n            g for g in generators if isinstance(g, ArticlesGenerator)\n        )\n        pages_generator = next(g for g in generators if isinstance(g, PagesGenerator))\n\n        pluralized_articles = maybe_pluralize(\n            (len(articles_generator.articles) + len(articles_generator.translations)),\n            \"article\",\n            \"articles\",\n        )\n        pluralized_drafts = maybe_pluralize(\n            (\n                len(articles_generator.drafts)\n                + len(articles_generator.drafts_translations)\n            ),\n            \"draft\",\n            \"drafts\",\n        )\n        pluralized_hidden_articles = maybe_pluralize(\n            (\n                len(articles_generator.hidden_articles)\n                + len(articles_generator.hidden_translations)\n            ),\n            \"hidden article\",\n            \"hidden articles\",\n        )\n        pluralized_pages = maybe_pluralize(\n            (len(pages_generator.pages) + len(pages_generator.translations)),\n            \"page\",\n            \"pages\",\n        )\n        pluralized_hidden_pages = maybe_pluralize(\n            (\n                len(pages_generator.hidden_pages)\n                + len(pages_generator.hidden_translations)\n            ),\n            \"hidden page\",\n            \"hidden pages\",\n        )\n        pluralized_draft_pages = maybe_pluralize(\n            (\n                len(pages_generator.draft_pages)\n                + len(pages_generator.draft_translations)\n            ),\n            \"draft page\",\n            \"draft pages\",\n        )\n\n        console.print(\n            f\"Done: Processed {pluralized_articles}, {pluralized_drafts}, {pluralized_hidden_articles}, {pluralized_pages}, {pluralized_hidden_pages} and {pluralized_draft_pages} in {time.time() - start_time:.2f} seconds.\"\n        )\n\n    def _get_generator_classes(self):\n        discovered_generators = [\n            (ArticlesGenerator, \"internal\"),\n            (PagesGenerator, \"internal\"),\n        ]\n\n        if self.settings[\"TEMPLATE_PAGES\"]:\n            discovered_generators.append((TemplatePagesGenerator, \"internal\"))\n\n        if self.settings[\"OUTPUT_SOURCES\"]:\n            discovered_generators.append((SourceFileGenerator, \"internal\"))\n\n        for receiver, values in signals.get_generators.send(self):\n            if not isinstance(values, Iterable):\n                values = (values,)\n            for generator in values:\n                if generator is None:\n                    continue  # plugin did not return a generator\n                discovered_generators.append((generator, receiver.__module__))\n\n        # StaticGenerator must run last, so it can identify files that\n        # were skipped by the other generators, and so static files can\n        # have their output paths overridden by the {attach} link syntax.\n        discovered_generators.append((StaticGenerator, \"internal\"))\n\n        generators = []\n\n        for generator, origin in discovered_generators:\n            if not isinstance(generator, type):\n                logger.error(\"Generator %s (%s) cannot be loaded\", generator, origin)\n                continue\n\n            logger.debug(\"Found generator: %s (%s)\", generator.__name__, origin)\n            generators.append(generator)\n\n        return generators\n\n    def _get_writer(self):\n        writers = [w for _, w in signals.get_writer.send(self) if isinstance(w, type)]\n        num_writers = len(writers)\n\n        if num_writers == 0:\n            return Writer(self.output_path, settings=self.settings)\n\n        if num_writers > 1:\n            logger.warning(\"%s writers found, using only first one\", num_writers)\n\n        writer = writers[0]\n\n        logger.debug(\"Found writer: %s (%s)\", writer.__name__, writer.__module__)\n        return writer(self.output_path, settings=self.settings)\n\n\nclass PrintSettings(argparse.Action):\n    def __call__(self, parser, namespace, values, option_string):\n        del option_string  # Unused argument\n        init_logging(name=__name__)\n\n        try:\n            instance, settings = get_instance(namespace)\n        except Exception as e:\n            logger.critical(\"%s\", e.__class__.__name__, exc_info=True)\n            console.print_exception()\n            sys.exit(getattr(e, \"exitcode\", 1))\n\n        if values:\n            # One or more arguments provided, so only print those settings\n            for setting in values:\n                if setting in settings:\n                    # Only add newline between setting name and value if dict\n                    if isinstance(settings[setting], dict | tuple | list):\n                        setting_format = \"\\n{}:\\n{}\"\n                    else:\n                        setting_format = \"\\n{}: {}\"\n                    console.print(\n                        setting_format.format(\n                            setting, pprint.pformat(settings[setting])\n                        )\n                    )\n                else:\n                    console.print(f\"\\n{setting} is not a recognized setting.\")\n                    break\n        else:\n            # No argument was given to --print-settings, so print all settings\n            console.print(settings)\n\n        parser.exit()\n\n\nclass ParseOverrides(argparse.Action):\n    def __call__(self, parser, namespace, values, option_string=None):\n        del parser, option_string  # Unused arguments\n        overrides = {}\n        for item in values:\n            try:\n                k, v = item.split(\"=\", 1)\n            except ValueError:\n                raise ValueError(\n                    \"Extra settings must be specified as KEY=VALUE pairs \"\n                    f\"but you specified {item}\"\n                ) from None\n            try:\n                overrides[k] = json.loads(v)\n            except json.decoder.JSONDecodeError:\n                raise ValueError(\n                    f\"Invalid JSON value: {v}. \"\n                    \"Values specified via -e / --extra-settings flags \"\n                    \"must be in JSON notation. \"\n                    \"Use -e KEY='\\\"string\\\"' to specify a string value; \"\n                    \"-e KEY=null to specify None; \"\n                    \"-e KEY=false (or true) to specify False (or True).\"\n                ) from None\n        setattr(namespace, self.dest, overrides)\n\n\nLOG_HANDLERS = {\"plain\": None, \"rich\": DEFAULT_LOG_HANDLER}\n\n\ndef parse_arguments(argv=None):\n    parser = argparse.ArgumentParser(\n        description=\"A tool to generate a static blog, \"\n        \" with restructured text input files.\",\n        formatter_class=argparse.ArgumentDefaultsHelpFormatter,\n    )\n\n    parser.add_argument(\n        dest=\"path\",\n        nargs=\"?\",\n        help=\"Path where to find the content files.\",\n        default=None,\n    )\n\n    parser.add_argument(\n        \"-t\",\n        \"--theme-path\",\n        dest=\"theme\",\n        help=\"Path where to find the theme templates. If not \"\n        \"specified, it will use the default one included with \"\n        \"pelican.\",\n    )\n\n    parser.add_argument(\n        \"-o\",\n        \"--output\",\n        dest=\"output\",\n        help=\"Where to output the generated files. If not \"\n        \"specified, a directory will be created, named \"\n        '\"output\" in the current path.',\n    )\n\n    parser.add_argument(\n        \"-s\",\n        \"--settings\",\n        dest=\"settings\",\n        help=\"The settings of the application, this is \"\n        f\"automatically set to {DEFAULT_CONFIG_NAME} if a file exists with this \"\n        \"name.\",\n    )\n\n    parser.add_argument(\n        \"-d\",\n        \"--delete-output-directory\",\n        dest=\"delete_outputdir\",\n        action=\"store_true\",\n        default=None,\n        help=\"Delete the output directory.\",\n    )\n\n    parser.add_argument(\n        \"-v\",\n        \"--verbose\",\n        action=\"store_const\",\n        const=logging.INFO,\n        dest=\"verbosity\",\n        help=\"Show all messages.\",\n    )\n\n    parser.add_argument(\n        \"-q\",\n        \"--quiet\",\n        action=\"store_const\",\n        const=logging.CRITICAL,\n        dest=\"verbosity\",\n        help=\"Show only critical errors.\",\n    )\n\n    parser.add_argument(\n        \"-D\",\n        \"--debug\",\n        action=\"store_const\",\n        const=logging.DEBUG,\n        dest=\"verbosity\",\n        help=\"Show all messages, including debug messages.\",\n    )\n\n    parser.add_argument(\n        \"--version\",\n        action=\"version\",\n        version=__version__,\n        help=\"Print the pelican version and exit.\",\n    )\n\n    parser.add_argument(\n        \"-r\",\n        \"--autoreload\",\n        dest=\"autoreload\",\n        action=\"store_true\",\n        help=\"Relaunch pelican each time a modification occurs on the content files.\",\n    )\n\n    parser.add_argument(\n        \"--print-settings\",\n        dest=\"print_settings\",\n        nargs=\"*\",\n        action=PrintSettings,\n        metavar=\"SETTING_NAME\",\n        help=\"Print current configuration settings and exit. \"\n        \"Append one or more setting name arguments to see the \"\n        \"values for specific settings only.\",\n    )\n\n    parser.add_argument(\n        \"--relative-urls\",\n        dest=\"relative_paths\",\n        action=\"store_true\",\n        help=\"Use relative urls in output, useful for site development\",\n    )\n\n    parser.add_argument(\n        \"--cache-path\",\n        dest=\"cache_path\",\n        help=(\n            \"Directory in which to store cache files. \"\n            'If not specified, defaults to \"cache\".'\n        ),\n    )\n\n    parser.add_argument(\n        \"--ignore-cache\",\n        action=\"store_true\",\n        dest=\"ignore_cache\",\n        help=\"Ignore content cache from previous runs by not loading cache files.\",\n    )\n\n    parser.add_argument(\n        \"--fatal\",\n        metavar=\"errors|warnings\",\n        choices=(\"errors\", \"warnings\"),\n        default=\"\",\n        help=(\n            \"Exit the program with non-zero status if any errors/warnings encountered.\"\n        ),\n    )\n\n    parser.add_argument(\n        \"--log-handler\",\n        default=\"rich\",\n        choices=LOG_HANDLERS,\n        help=(\n            \"Which handler to use to format log messages. \"\n            \"The `rich` handler prints output in columns.\"\n        ),\n    )\n\n    parser.add_argument(\n        \"--logs-dedup-min-level\",\n        default=\"WARNING\",\n        choices=(\"DEBUG\", \"INFO\", \"WARNING\", \"ERROR\"),\n        help=(\n            \"Only enable log de-duplication for levels equal\"\n            \" to or above the specified value\"\n        ),\n    )\n\n    parser.add_argument(\n        \"-l\",\n        \"--listen\",\n        dest=\"listen\",\n        action=\"store_true\",\n        help=\"Serve content files via HTTP and port 8000.\",\n    )\n\n    parser.add_argument(\n        \"-p\",\n        \"--port\",\n        dest=\"port\",\n        type=int,\n        help=\"Port to serve HTTP files at. (default: 8000)\",\n    )\n\n    parser.add_argument(\n        \"-b\",\n        \"--bind\",\n        dest=\"bind\",\n        help=\"IP to bind to when serving files via HTTP (default: 127.0.0.1)\",\n    )\n\n    parser.add_argument(\n        \"-e\",\n        \"--extra-settings\",\n        dest=\"overrides\",\n        help=\"Specify one or more SETTING=VALUE pairs to \"\n        \"override settings. VALUE must be in JSON notation: \"\n        \"specify string values as SETTING='\\\"some string\\\"'; \"\n        \"booleans as SETTING=true or SETTING=false; \"\n        \"None as SETTING=null.\",\n        nargs=\"*\",\n        action=ParseOverrides,\n        default={},\n    )\n\n    args = parser.parse_args(argv)\n\n    if args.port is not None and not args.listen:\n        logger.warning(\"--port without --listen has no effect\")\n    if args.bind is not None and not args.listen:\n        logger.warning(\"--bind without --listen has no effect\")\n\n    return args\n\n\ndef get_config(args):\n    \"\"\"Builds a config dictionary based on supplied `args`.\"\"\"\n    config = {}\n    if args.path:\n        config[\"PATH\"] = os.path.abspath(os.path.expanduser(args.path))\n    if args.output:\n        config[\"OUTPUT_PATH\"] = os.path.abspath(os.path.expanduser(args.output))\n    if args.theme:\n        abstheme = os.path.abspath(os.path.expanduser(args.theme))\n        config[\"THEME\"] = abstheme if os.path.exists(abstheme) else args.theme\n    if args.delete_outputdir is not None:\n        config[\"DELETE_OUTPUT_DIRECTORY\"] = args.delete_outputdir\n    if args.ignore_cache:\n        config[\"LOAD_CONTENT_CACHE\"] = False\n    if args.cache_path:\n        config[\"CACHE_PATH\"] = args.cache_path\n    if args.relative_paths:\n        config[\"RELATIVE_URLS\"] = args.relative_paths\n    if args.port is not None:\n        config[\"PORT\"] = args.port\n    if args.bind is not None:\n        config[\"BIND\"] = args.bind\n    config[\"DEBUG\"] = args.verbosity == logging.DEBUG\n    config.update(args.overrides)\n\n    return config\n\n\ndef get_instance(args):\n    config_file = args.settings\n    if config_file is None and os.path.isfile(DEFAULT_CONFIG_NAME):\n        config_file = DEFAULT_CONFIG_NAME\n        args.settings = DEFAULT_CONFIG_NAME\n\n    settings = read_settings(config_file, override=get_config(args))\n\n    cls = settings[\"PELICAN_CLASS\"]\n    if isinstance(cls, str):\n        module, cls_name = cls.rsplit(\".\", 1)\n        module = __import__(module)\n        cls = getattr(module, cls_name)\n\n    return cls(settings), settings\n\n\ndef autoreload(args, excqueue=None):\n    console.print(\n        \"  --- AutoReload Mode: Monitoring `content`, `theme` and\"\n        \" `settings` for changes. ---\"\n    )\n    pelican, settings = get_instance(args)\n    settings_file = os.path.abspath(args.settings)\n    while True:\n        try:\n            pelican.run()\n\n            changed_files = wait_for_changes(args.settings, settings)\n            changed_files = {c[1] for c in changed_files}\n\n            if settings_file in changed_files:\n                pelican, settings = get_instance(args)\n\n            console.print(\n                \"\\n-> Modified: {}. re-generating...\".format(\", \".join(changed_files))\n            )\n\n        except KeyboardInterrupt:\n            if excqueue is not None:\n                excqueue.put(None)\n                return\n            raise\n\n        except Exception as e:\n            if args.verbosity == logging.DEBUG:\n                if excqueue is not None:\n                    excqueue.put(traceback.format_exception_only(type(e), e)[-1])\n                else:\n                    raise\n            logger.warning(\n                'Caught exception:\\n\"%s\".', e, exc_info=settings.get(\"DEBUG\", False)\n            )\n\n\ndef listen(server, port, output, excqueue=None):\n    # set logging level to at least \"INFO\" (so we can see the server requests)\n    if logger.level < logging.INFO:\n        logger.setLevel(logging.INFO)\n\n    RootedHTTPServer.allow_reuse_address = True\n    try:\n        httpd = RootedHTTPServer(output, (server, port), ComplexHTTPRequestHandler)\n    except OSError as e:\n        logging.error(\"Could not listen on port %s, server %s.\", port, server)\n        if excqueue is not None:\n            excqueue.put(traceback.format_exception_only(type(e), e)[-1])\n        return\n\n    try:\n        console.print(f\"Serving site at: http://{server}:{port} - Tap CTRL-C to stop\")\n        httpd.serve_forever()\n    except Exception as e:\n        if excqueue is not None:\n            excqueue.put(traceback.format_exception_only(type(e), e)[-1])\n        else:\n            logging.exception(\"Listening aborted unexpectedly.\")\n\n    except KeyboardInterrupt:\n        httpd.socket.close()\n        if excqueue is not None:\n            return\n        raise\n\n\ndef main(argv=None):\n    args = parse_arguments(argv)\n    logs_dedup_min_level = getattr(logging, args.logs_dedup_min_level)\n    init_logging(\n        level=args.verbosity,\n        fatal=args.fatal,\n        name=__name__,\n        handler=LOG_HANDLERS[args.log_handler],\n        logs_dedup_min_level=logs_dedup_min_level,\n    )\n\n    logger.debug(\"Pelican version: %s\", __version__)\n    logger.debug(\"Python version: %s\", sys.version.split()[0])\n\n    try:\n        pelican, settings = get_instance(args)\n\n        if args.autoreload and args.listen:\n            excqueue = multiprocessing.Queue()\n            p1 = multiprocessing.Process(target=autoreload, args=(args, excqueue))\n            p2 = multiprocessing.Process(\n                target=listen,\n                args=(\n                    settings.get(\"BIND\"),\n                    settings.get(\"PORT\"),\n                    settings.get(\"OUTPUT_PATH\"),\n                    excqueue,\n                ),\n            )\n            try:\n                p1.start()\n                p2.start()\n                exc = excqueue.get()\n                if exc is not None:\n                    logger.critical(exc)\n            finally:\n                p1.terminate()\n                p2.terminate()\n        elif args.autoreload:\n            autoreload(args)\n        elif args.listen:\n            listen(\n                settings.get(\"BIND\"), settings.get(\"PORT\"), settings.get(\"OUTPUT_PATH\")\n            )\n        else:\n            with console.status(\"Generating...\"):\n                pelican.run()\n    except KeyboardInterrupt:\n        logger.warning(\"Keyboard interrupt received. Exiting.\")\n    except Exception as e:\n        logger.critical(\"%s: %s\", e.__class__.__name__, e, exc_info=True)\n\n        if args.verbosity == logging.DEBUG:\n            console.print_exception()\n        sys.exit(getattr(e, \"exitcode\", 1))\n"
  },
  {
    "path": "pelican/__main__.py",
    "content": "\"\"\"\npython -m pelican module entry point to run via python -m\n\"\"\"\n\nfrom . import main\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "pelican/cache.py",
    "content": "import gzip\nimport hashlib\nimport logging\nimport os\nimport pickle\n\nfrom pelican.utils import mkdir_p\n\nlogger = logging.getLogger(__name__)\n\n\nclass FileDataCacher:\n    \"\"\"Class that can cache data contained in files\"\"\"\n\n    def __init__(self, settings, cache_name, caching_policy, load_policy):\n        \"\"\"Load the specified cache within CACHE_PATH in settings\n\n        only if *load_policy* is True,\n        May use gzip if GZIP_CACHE ins settings is True.\n        Sets caching policy according to *caching_policy*.\n        \"\"\"\n        self.settings = settings\n        self._cache_path = os.path.join(self.settings[\"CACHE_PATH\"], cache_name)\n        self._cache_data_policy = caching_policy\n        if self.settings[\"GZIP_CACHE\"]:\n            self._cache_open = gzip.open\n        else:\n            self._cache_open = open\n        if load_policy:\n            try:\n                with self._cache_open(self._cache_path, \"rb\") as fhandle:\n                    self._cache = pickle.load(fhandle)\n            except (OSError, UnicodeDecodeError) as err:\n                logger.debug(\n                    \"Cannot load cache %s (this is normal on first \"\n                    \"run). Proceeding with empty cache.\\n%s\",\n                    self._cache_path,\n                    err,\n                )\n                self._cache = {}\n            except pickle.PickleError as err:\n                logger.warning(\n                    \"Cannot unpickle cache %s, cache may be using \"\n                    \"an incompatible protocol (see pelican \"\n                    \"caching docs). \"\n                    \"Proceeding with empty cache.\\n%s\",\n                    self._cache_path,\n                    err,\n                )\n                self._cache = {}\n        else:\n            self._cache = {}\n\n    def cache_data(self, filename, data):\n        \"\"\"Cache data for given file\"\"\"\n        if self._cache_data_policy:\n            self._cache[filename] = data\n\n    def get_cached_data(self, filename, default=None):\n        \"\"\"Get cached data for the given file\n\n        if no data is cached, return the default object\n        \"\"\"\n        return self._cache.get(filename, default)\n\n    def save_cache(self):\n        \"\"\"Save the updated cache\"\"\"\n        if self._cache_data_policy:\n            try:\n                mkdir_p(self.settings[\"CACHE_PATH\"])\n                with self._cache_open(self._cache_path, \"wb\") as fhandle:\n                    pickle.dump(self._cache, fhandle)\n            except (OSError, pickle.PicklingError, TypeError) as err:\n                logger.warning(\n                    \"Could not save cache %s\\n ... %s\", self._cache_path, err\n                )\n\n\nclass FileStampDataCacher(FileDataCacher):\n    \"\"\"Subclass that also caches the stamp of the file\"\"\"\n\n    def __init__(self, settings, cache_name, caching_policy, load_policy):\n        \"\"\"This subclass additionally sets filestamp function\n        and base path for filestamping operations\n        \"\"\"\n\n        super().__init__(settings, cache_name, caching_policy, load_policy)\n\n        method = self.settings[\"CHECK_MODIFIED_METHOD\"]\n        if method == \"mtime\":\n            self._filestamp_func = os.path.getmtime\n        else:\n            try:\n                hash_func = getattr(hashlib, method)\n\n                def filestamp_func(filename):\n                    \"\"\"return hash of file contents\"\"\"\n                    with open(filename, \"rb\") as fhandle:\n                        return hash_func(fhandle.read()).digest()\n\n                self._filestamp_func = filestamp_func\n            except AttributeError as err:\n                logger.warning(\"Could not get hashing function\\n\\t%s\", err)\n                self._filestamp_func = None\n\n    def cache_data(self, filename, data):\n        \"\"\"Cache stamp and data for the given file\"\"\"\n        stamp = self._get_file_stamp(filename)\n        super().cache_data(filename, (stamp, data))\n\n    def _get_file_stamp(self, filename):\n        \"\"\"Check if the given file has been modified\n        since the previous build.\n\n        depending on CHECK_MODIFIED_METHOD\n        a float may be returned for 'mtime',\n        a hash for a function name in the hashlib module\n        or an empty bytes string otherwise\n        \"\"\"\n\n        try:\n            return self._filestamp_func(filename)\n        except (OSError, TypeError) as err:\n            logger.warning(\"Cannot get modification stamp for %s\\n\\t%s\", filename, err)\n            return \"\"\n\n    def get_cached_data(self, filename, default=None):\n        \"\"\"Get the cached data for the given filename\n        if the file has not been modified.\n\n        If no record exists or file has been modified, return default.\n        Modification is checked by comparing the cached\n        and current file stamp.\n        \"\"\"\n\n        stamp, data = super().get_cached_data(filename, (None, default))\n        if stamp != self._get_file_stamp(filename):\n            return default\n        return data\n"
  },
  {
    "path": "pelican/contents.py",
    "content": "import copy\nimport datetime\nimport locale\nimport logging\nimport os\nimport re\nfrom html import unescape\nfrom typing import Any\nfrom urllib.parse import ParseResult, unquote, urljoin, urlparse, urlunparse\n\ntry:\n    from zoneinfo import ZoneInfo\nexcept ModuleNotFoundError:\n    from backports.zoneinfo import ZoneInfo\n\n\nfrom pelican.plugins import signals\nfrom pelican.settings import DEFAULT_CONFIG, Settings\n\n# Import these so that they're available when you import from pelican.contents.\nfrom pelican.urlwrappers import Author, Category, Tag, URLWrapper  # NOQA\nfrom pelican.utils import (\n    deprecated_attribute,\n    memoized,\n    path_to_url,\n    posixize_path,\n    sanitised_join,\n    set_date_tzinfo,\n    slugify,\n    truncate_html_paragraphs,\n    truncate_html_words,\n)\n\nlogger = logging.getLogger(__name__)\n\n\nclass Content:\n    \"\"\"Represents a content.\n\n    :param content: the string to parse, containing the original content.\n    :param metadata: the metadata associated to this page (optional).\n    :param settings: the settings dictionary (optional).\n    :param source_path: The location of the source of this content (if any).\n    :param context: The shared context between generators.\n\n    \"\"\"\n\n    default_template: str | None = None\n    mandatory_properties: tuple[str, ...] = ()\n\n    @deprecated_attribute(old=\"filename\", new=\"source_path\", since=(3, 2, 0))\n    def filename():\n        return None\n\n    def __init__(\n        self,\n        content: str,\n        metadata: dict[str, Any] | None = None,\n        settings: Settings | None = None,\n        source_path: str | None = None,\n        context: dict[Any, Any] | None = None,\n    ):\n        if metadata is None:\n            metadata = {}\n        if settings is None:\n            settings = copy.deepcopy(DEFAULT_CONFIG)\n\n        self.settings = settings\n        self._content = content\n        if context is None:\n            context = {}\n        self._context = context\n        self.translations = []\n\n        local_metadata = {}\n        local_metadata.update(metadata)\n\n        # set metadata as attributes\n        for key, value in local_metadata.items():\n            if key in (\"save_as\", \"url\"):\n                key = \"override_\" + key\n            setattr(self, key.lower(), value)\n\n        # also keep track of the metadata attributes available\n        self.metadata = local_metadata\n\n        # default template if it's not defined in page\n        self.template = self._get_template()\n\n        # First, read the authors from \"authors\", if not, fallback to \"author\"\n        # and if not use the settings defined one, if any.\n        if not hasattr(self, \"author\"):\n            if hasattr(self, \"authors\"):\n                self.author = self.authors[0]\n            elif \"AUTHOR\" in settings:\n                self.author = Author(settings[\"AUTHOR\"], settings)\n\n        if not hasattr(self, \"authors\") and hasattr(self, \"author\"):\n            self.authors = [self.author]\n\n        # XXX Split all the following code into pieces, there is too much here.\n\n        # manage languages\n        self.in_default_lang = True\n        if \"DEFAULT_LANG\" in settings:\n            default_lang = settings[\"DEFAULT_LANG\"].lower()\n            if not hasattr(self, \"lang\"):\n                self.lang = default_lang\n\n            self.in_default_lang = self.lang == default_lang\n\n        # create the slug if not existing, generate slug according to\n        # setting of SLUG_ATTRIBUTE\n        if not hasattr(self, \"slug\"):\n            if settings[\"SLUGIFY_SOURCE\"] == \"title\" and hasattr(self, \"title\"):\n                value = self.title\n            elif settings[\"SLUGIFY_SOURCE\"] == \"basename\" and source_path is not None:\n                value = os.path.basename(os.path.splitext(source_path)[0])\n            else:\n                value = None\n            if value is not None:\n                self.slug = slugify(\n                    value,\n                    regex_subs=settings.get(\"SLUG_REGEX_SUBSTITUTIONS\", []),\n                    preserve_case=settings.get(\"SLUGIFY_PRESERVE_CASE\", False),\n                    use_unicode=settings.get(\"SLUGIFY_USE_UNICODE\", False),\n                )\n\n        self.source_path = source_path\n        self.relative_source_path = self.get_relative_source_path()\n\n        # manage the date format\n        if not hasattr(self, \"date_format\"):\n            if hasattr(self, \"lang\") and self.lang in settings[\"DATE_FORMATS\"]:\n                self.date_format = settings[\"DATE_FORMATS\"][self.lang]\n            else:\n                self.date_format = settings[\"DEFAULT_DATE_FORMAT\"]\n\n        if isinstance(self.date_format, tuple):\n            locale_string = self.date_format[0]\n            locale.setlocale(locale.LC_ALL, locale_string)\n            self.date_format = self.date_format[1]\n\n        # manage timezone\n        default_timezone = settings.get(\"TIMEZONE\", \"UTC\")\n        timezone = getattr(self, \"timezone\", default_timezone)\n        self.timezone = ZoneInfo(timezone)\n\n        if hasattr(self, \"date\"):\n            self.date = set_date_tzinfo(self.date, timezone)\n            self.locale_date = self.date.strftime(self.date_format)\n\n        if hasattr(self, \"modified\"):\n            self.modified = set_date_tzinfo(self.modified, timezone)\n            self.locale_modified = self.modified.strftime(self.date_format)\n\n        # manage status\n        if not hasattr(self, \"status\"):\n            # Previous default of None broke comment plugins and perhaps others\n            self.status = getattr(self, \"default_status\", \"\")\n\n        # store the summary metadata if it is set\n        if \"summary\" in metadata:\n            self._summary = metadata[\"summary\"]\n\n        signals.content_object_init.send(self)\n\n    def __str__(self) -> str:\n        return self.source_path or repr(self)\n\n    def _has_valid_mandatory_properties(self) -> bool:\n        \"\"\"Test mandatory properties are set.\"\"\"\n        for prop in self.mandatory_properties:\n            if not hasattr(self, prop):\n                logger.error(\n                    \"Skipping %s: could not find information about '%s'\", self, prop\n                )\n                return False\n        return True\n\n    def _has_valid_save_as(self) -> bool:\n        \"\"\"Return true if save_as doesn't write outside output path, false\n        otherwise.\"\"\"\n        try:\n            output_path = self.settings[\"OUTPUT_PATH\"]\n        except KeyError:\n            # we cannot check\n            return True\n\n        try:\n            sanitised_join(output_path, self.save_as)\n        except RuntimeError:  # outside output_dir\n            logger.error(\n                \"Skipping %s: file %r would be written outside output path\",\n                self,\n                self.save_as,\n            )\n            return False\n\n        return True\n\n    def _has_valid_status(self) -> bool:\n        if hasattr(self, \"allowed_statuses\"):\n            if self.status not in self.allowed_statuses:\n                logger.error(\n                    \"Unknown status '%s' for file %s, skipping it. (Not in %s)\",\n                    self.status,\n                    self,\n                    self.allowed_statuses,\n                )\n                return False\n\n        # if undefined we allow all\n        return True\n\n    def is_valid(self) -> bool:\n        \"\"\"Validate Content\"\"\"\n        # Use all() to not short circuit and get results of all validations\n        return all(\n            [\n                self._has_valid_mandatory_properties(),\n                self._has_valid_save_as(),\n                self._has_valid_status(),\n            ]\n        )\n\n    @property\n    def url_format(self) -> dict[str, Any]:\n        \"\"\"Returns the URL, formatted with the proper values\"\"\"\n        metadata = copy.copy(self.metadata)\n        path = self.metadata.get(\"path\", self.get_relative_source_path())\n        metadata.update(\n            {\n                \"path\": path_to_url(path),\n                \"slug\": getattr(self, \"slug\", \"\"),\n                \"lang\": getattr(self, \"lang\", \"en\"),\n                \"date\": getattr(self, \"date\", datetime.datetime.now()),\n                \"author\": self.author.slug if hasattr(self, \"author\") else \"\",\n                \"category\": self.category.slug if hasattr(self, \"category\") else \"\",\n            }\n        )\n        return metadata\n\n    def _expand_settings(self, key: str, klass: str | None = None) -> str:\n        if not klass:\n            klass = self.__class__.__name__\n        fq_key = (f\"{klass}_{key}\").upper()\n        return str(self.settings[fq_key]).format(**self.url_format)\n\n    def get_url_setting(self, key: str) -> str:\n        if hasattr(self, \"override_\" + key):\n            return getattr(self, \"override_\" + key)\n        key = key if self.in_default_lang else f\"lang_{key}\"\n        return self._expand_settings(key)\n\n    def _link_replacer(self, siteurl: str, m: re.Match) -> str:\n        what = m.group(\"what\")\n        value = urlparse(m.group(\"value\"))\n        path = value.path\n        origin = m.group(\"path\")\n\n        # urllib.parse.urljoin() produces `a.html` for urljoin(\"..\", \"a.html\")\n        # so if RELATIVE_URLS are enabled, we fall back to os.path.join() to\n        # properly get `../a.html`. However, os.path.join() produces\n        # `baz/http://foo/bar.html` for join(\"baz\", \"http://foo/bar.html\")\n        # instead of correct \"http://foo/bar.html\", so one has to pick a side\n        # as there is no silver bullet.\n        if self.settings[\"RELATIVE_URLS\"]:\n            joiner = os.path.join\n        else:\n            joiner = urljoin\n\n            # However, it's not *that* simple: urljoin(\"blog\", \"index.html\")\n            # produces just `index.html` instead of `blog/index.html` (unlike\n            # os.path.join()), so in order to get a correct answer one needs to\n            # append a trailing slash to siteurl in that case. This also makes\n            # the new behavior fully compatible with Pelican 3.7.1.\n            if not siteurl.endswith(\"/\"):\n                siteurl += \"/\"\n\n        # XXX Put this in a different location.\n        if what in {\"filename\", \"static\", \"attach\"}:\n\n            def _get_linked_content(key: str, url: ParseResult) -> Content | None:\n                nonlocal value\n\n                def _find_path(path: str) -> Content | None:\n                    if path.startswith(\"/\"):\n                        path = path[1:]\n                    else:\n                        # relative to the source path of this content\n                        path = self.get_relative_source_path(  # type: ignore\n                            os.path.join(self.relative_dir, path)\n                        )\n                    return self._context[key].get(path, None)\n\n                # try path\n                result = _find_path(url.path)\n                if result is not None:\n                    return result\n\n                # try unquoted path\n                result = _find_path(unquote(url.path))\n                if result is not None:\n                    return result\n\n                # try html unescaped url\n                unescaped_url = urlparse(unescape(url.geturl()))\n                result = _find_path(unescaped_url.path)\n                if result is not None:\n                    value = unescaped_url\n                    return result\n\n                # check if a static file is linked with {filename}\n                if what == \"filename\" and key == \"generated_content\":\n                    linked_content = _get_linked_content(\"static_content\", value)\n                    if linked_content:\n                        logger.warning(\n                            \"{filename} used for linking to static\"\n                            \" content %s in %s. Use {static} instead\",\n                            value.path,\n                            self.get_relative_source_path(),\n                        )\n                        return linked_content\n\n                return None\n\n            if what == \"filename\":\n                key = \"generated_content\"\n            else:\n                key = \"static_content\"\n\n            linked_content = _get_linked_content(key, value)\n            if linked_content:\n                if what == \"attach\":\n                    linked_content.attach_to(self)  # type: ignore\n                origin = joiner(siteurl, linked_content.url)\n                origin = origin.replace(\"\\\\\", \"/\")  # for Windows paths.\n            else:\n                logger.warning(\n                    \"Unable to find '%s', skipping url replacement.\",\n                    value.geturl(),\n                    extra={\n                        \"limit_msg\": (\n                            \"Other resources were not found and their urls not replaced\"\n                        )\n                    },\n                )\n        elif what == \"category\":\n            origin = joiner(siteurl, Category(path, self.settings).url)\n        elif what == \"tag\":\n            origin = joiner(siteurl, Tag(path, self.settings).url)\n        elif what == \"index\":\n            origin = joiner(siteurl, self.settings[\"INDEX_SAVE_AS\"])\n        elif what == \"author\":\n            origin = joiner(siteurl, Author(path, self.settings).url)\n        else:\n            logger.warning(\n                \"Replacement Indicator %r not recognized in %r, skipping replacement\",\n                what,\n                origin,\n            )\n\n        # keep all other parts, such as query, fragment, etc.\n        parts = list(value)\n        parts[2] = origin\n        origin = urlunparse(parts)\n\n        return \"\".join((m.group(\"markup\"), m.group(\"quote\"), origin, m.group(\"quote\")))\n\n    def _get_intrasite_link_regex(self) -> re.Pattern:\n        intrasite_link_regex = self.settings[\"INTRASITE_LINK_REGEX\"]\n        regex = rf\"\"\"\n            (?P<markup><[^\\>]+  # match tag with all url-value attributes\n                (?:href|src|poster|data|cite|formaction|action|content)\\s*=\\s*)\n\n            (?P<quote>[\"\\'])      # require value to be quoted\n            (?P<path>{intrasite_link_regex}(?P<value>.*?))  # the url value\n            (?P=quote)\"\"\"\n        return re.compile(regex, re.X)\n\n    def _update_content(self, content: str, siteurl: str) -> str:\n        \"\"\"Update the content attribute.\n\n        Change all the relative paths of the content to relative paths\n        suitable for the output content.\n\n        :param content: content resource that will be passed to the templates.\n        :param siteurl: siteurl which is locally generated by the writer in\n                        case of RELATIVE_URLS.\n        \"\"\"\n        if not content:\n            return content\n\n        hrefs = self._get_intrasite_link_regex()\n        return hrefs.sub(lambda m: self._link_replacer(siteurl, m), content)\n\n    def get_static_links(self) -> set[str]:\n        static_links = set()\n        hrefs = self._get_intrasite_link_regex()\n        for m in hrefs.finditer(self._content):\n            what = m.group(\"what\")\n            value = urlparse(m.group(\"value\"))\n            path = value.path\n            if what not in {\"static\", \"attach\"}:\n                continue\n            if path.startswith(\"/\"):\n                path = path[1:]\n            else:\n                # relative to the source path of this content\n                path = self.get_relative_source_path(\n                    os.path.join(self.relative_dir, path)\n                )\n            path = path.replace(\"%20\", \" \")  # type: ignore\n            static_links.add(path)\n        return static_links\n\n    def get_siteurl(self) -> str:\n        return self._context.get(\"localsiteurl\", \"\")\n\n    @memoized\n    def get_content(self, siteurl: str) -> str:\n        if hasattr(self, \"_get_content\"):\n            content = self._get_content()\n        else:\n            content = self._content\n        return self._update_content(content, siteurl)\n\n    @property\n    def content(self) -> str:\n        return self.get_content(self.get_siteurl())\n\n    @memoized\n    def get_summary(self, _siteurl: str) -> str:\n        \"\"\"Returns the summary of an article.\n\n        This is based on the summary metadata if set, otherwise truncate the\n        content.\n        \"\"\"\n        if \"summary\" in self.metadata:\n            return self.metadata[\"summary\"]\n\n        content = self.content\n        max_paragraphs = self.settings.get(\"SUMMARY_MAX_PARAGRAPHS\")\n        if max_paragraphs is not None:\n            content = truncate_html_paragraphs(self.content, max_paragraphs)\n\n        if self.settings[\"SUMMARY_MAX_LENGTH\"] is None:\n            return content\n\n        return truncate_html_words(\n            content,\n            self.settings[\"SUMMARY_MAX_LENGTH\"],\n            self.settings[\"SUMMARY_END_SUFFIX\"],\n        )\n\n    @property\n    def summary(self) -> str:\n        return self.get_summary(self.get_siteurl())\n\n    def _get_summary(self) -> str:\n        \"\"\"deprecated function to access summary\"\"\"\n\n        logger.warning(\n            \"_get_summary() has been deprecated since 3.6.4. \"\n            \"Use the summary decorator instead\"\n        )\n        return self.summary\n\n    @summary.setter\n    def summary(self, value: str):\n        \"\"\"Dummy function\"\"\"\n\n    @property\n    def status(self) -> str:\n        return self._status\n\n    @status.setter\n    def status(self, value: str) -> None:\n        # TODO maybe typecheck\n        self._status = value.lower()\n\n    @property\n    def url(self) -> str:\n        return self.get_url_setting(\"url\")\n\n    @property\n    def save_as(self) -> str:\n        return self.get_url_setting(\"save_as\")\n\n    def _get_template(self) -> str:\n        if hasattr(self, \"template\") and self.template is not None:\n            return self.template\n        else:\n            return self.default_template\n\n    def get_relative_source_path(self, source_path: str | None = None) -> str | None:\n        \"\"\"Return the relative path (from the content path) to the given\n        source_path.\n\n        If no source path is specified, use the source path of this\n        content object.\n        \"\"\"\n        if not source_path:\n            source_path = self.source_path\n        if source_path is None:\n            return None\n\n        return posixize_path(\n            os.path.relpath(\n                os.path.abspath(os.path.join(self.settings[\"PATH\"], source_path)),\n                os.path.abspath(self.settings[\"PATH\"]),\n            )\n        )\n\n    @property\n    def relative_dir(self) -> str:\n        return posixize_path(\n            os.path.dirname(\n                os.path.relpath(\n                    os.path.abspath(self.source_path),\n                    os.path.abspath(self.settings[\"PATH\"]),\n                )\n            )\n        )\n\n    def refresh_metadata_intersite_links(self) -> None:\n        for key in self.settings[\"FORMATTED_FIELDS\"]:\n            if key in self.metadata and key != \"summary\":\n                value = self._update_content(self.metadata[key], self.get_siteurl())\n                self.metadata[key] = value\n                setattr(self, key.lower(), value)\n\n        # _summary is an internal variable that some plugins may be writing to,\n        # so ensure changes to it are picked up, and write summary back to it\n        if \"summary\" in self.settings[\"FORMATTED_FIELDS\"]:\n            if hasattr(self, \"_summary\"):\n                self.metadata[\"summary\"] = self._summary\n\n            if \"summary\" in self.metadata:\n                self.metadata[\"summary\"] = self._update_content(\n                    self.metadata[\"summary\"], self.get_siteurl()\n                )\n                self._summary = self.metadata[\"summary\"]\n\n\nclass SkipStub(Content):\n    \"\"\"Stub class representing content that should not be processed in any way.\"\"\"\n\n    def __init__(\n        self, content, metadata=None, settings=None, source_path=None, context=None\n    ):\n        del content, metadata, settings, context  # Unused arguments\n        self.source_path = source_path\n\n    def is_valid(self):\n        return False\n\n    @property\n    def content(self):\n        raise NotImplementedError(\"Stub content should not be read\")\n\n    @property\n    def save_as(self):\n        raise NotImplementedError(\"Stub content cannot be saved\")\n\n\nclass Page(Content):\n    mandatory_properties = (\"title\",)\n    allowed_statuses = (\"published\", \"hidden\", \"draft\", \"skip\")\n    default_status = \"published\"\n    default_template = \"page\"\n\n    def _expand_settings(self, key: str) -> str:\n        klass = \"draft_page\" if self.status == \"draft\" else None\n        return super()._expand_settings(key, klass)\n\n\nclass Article(Content):\n    mandatory_properties = (\"title\", \"date\", \"category\")\n    allowed_statuses = (\"published\", \"hidden\", \"draft\", \"skip\")\n    default_status = \"published\"\n    default_template = \"article\"\n\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n\n        # handle WITH_FUTURE_DATES (designate article to draft based on date)\n        if not self.settings[\"WITH_FUTURE_DATES\"] and hasattr(self, \"date\"):\n            if self.date.tzinfo is None:\n                now = datetime.datetime.now()\n            else:\n                now = datetime.datetime.now(datetime.timezone.utc)\n            if self.date > now:\n                self.status = \"draft\"\n\n        # if we are a draft and there is no date provided, set max datetime\n        if not hasattr(self, \"date\") and self.status == \"draft\":\n            self.date = datetime.datetime.max.replace(tzinfo=self.timezone)\n\n    def _expand_settings(self, key: str) -> str:\n        klass = \"draft\" if self.status == \"draft\" else \"article\"\n        return super()._expand_settings(key, klass)\n\n\nclass Static(Content):\n    mandatory_properties = (\"title\",)\n    default_status = \"published\"\n    default_template = None\n\n    def __init__(self, *args, **kwargs) -> None:\n        super().__init__(*args, **kwargs)\n        self._output_location_referenced = False\n\n    @deprecated_attribute(old=\"filepath\", new=\"source_path\", since=(3, 2, 0))\n    def filepath():\n        return None\n\n    @deprecated_attribute(old=\"src\", new=\"source_path\", since=(3, 2, 0))\n    def src():\n        return None\n\n    @deprecated_attribute(old=\"dst\", new=\"save_as\", since=(3, 2, 0))\n    def dst():\n        return None\n\n    @property\n    def url(self) -> str:\n        # Note when url has been referenced, so we can avoid overriding it.\n        self._output_location_referenced = True\n        return super().url\n\n    @property\n    def save_as(self) -> str:\n        # Note when save_as has been referenced, so we can avoid overriding it.\n        self._output_location_referenced = True\n        return super().save_as\n\n    def attach_to(self, content: Content) -> None:\n        \"\"\"Override our output directory with that of the given content object.\"\"\"\n\n        # Determine our file's new output path relative to the linking\n        # document. If it currently lives beneath the linking\n        # document's source directory, preserve that relationship on output.\n        # Otherwise, make it a sibling.\n\n        linking_source_dir = os.path.dirname(content.source_path)\n        tail_path = os.path.relpath(self.source_path, linking_source_dir)\n        if tail_path.startswith(os.pardir + os.sep):\n            tail_path = os.path.basename(tail_path)\n        new_save_as = os.path.join(os.path.dirname(content.save_as), tail_path)\n\n        # We do not build our new url by joining tail_path with the linking\n        # document's url, because we cannot know just by looking at the latter\n        # whether it points to the document itself or to its parent directory.\n        # (An url like 'some/content' might mean a directory named 'some'\n        # with a file named 'content', or it might mean a directory named\n        # 'some/content' with a file named 'index.html'.) Rather than trying\n        # to figure it out by comparing the linking document's url and save_as\n        # path, we simply build our new url from our new save_as path.\n\n        new_url = path_to_url(new_save_as)\n\n        def _log_reason(reason: str) -> None:\n            logger.warning(\n                \"The {attach} link in %s cannot relocate \"\n                \"%s because %s. Falling back to \"\n                \"{filename} link behavior instead.\",\n                content.get_relative_source_path(),\n                self.get_relative_source_path(),\n                reason,\n                extra={\"limit_msg\": \"More {attach} warnings silenced.\"},\n            )\n\n        # We never override an override, because we don't want to interfere\n        # with user-defined overrides that might be in EXTRA_PATH_METADATA.\n        if hasattr(self, \"override_save_as\") or hasattr(self, \"override_url\"):\n            if new_save_as != self.save_as or new_url != self.url:\n                _log_reason(\"its output location was already overridden\")\n            return\n\n        # We never change an output path that has already been referenced,\n        # because we don't want to break links that depend on that path.\n        if self._output_location_referenced:\n            if new_save_as != self.save_as or new_url != self.url:\n                _log_reason(\"another link already referenced its location\")\n            return\n\n        self.override_save_as = new_save_as\n        self.override_url = new_url\n"
  },
  {
    "path": "pelican/generators.py",
    "content": "import calendar\nimport errno\nimport fnmatch\nimport logging\nimport os\nfrom collections import defaultdict\nfrom functools import partial\nfrom itertools import chain, groupby\nfrom operator import attrgetter\n\nfrom jinja2 import (\n    BaseLoader,\n    ChoiceLoader,\n    Environment,\n    FileSystemLoader,\n    PrefixLoader,\n    TemplateNotFound,\n)\n\nfrom pelican.cache import FileStampDataCacher\nfrom pelican.contents import Article, Page, SkipStub, Static\nfrom pelican.plugins import signals\nfrom pelican.plugins._utils import plugin_enabled\nfrom pelican.readers import Readers\nfrom pelican.utils import (\n    DateFormatter,\n    copy,\n    mkdir_p,\n    order_content,\n    posixize_path,\n    process_translations,\n)\n\nlogger = logging.getLogger(__name__)\n\n\nclass PelicanTemplateNotFound(Exception):\n    pass\n\n\nclass Generator:\n    \"\"\"Baseclass generator\"\"\"\n\n    def __init__(\n        self,\n        context,\n        settings,\n        path,\n        theme,\n        output_path,\n        readers_cache_name=\"\",\n        **kwargs,\n    ):\n        self.context = context\n        self.settings = settings\n        self.path = path\n        self.theme = theme\n        self.output_path = output_path\n\n        for arg, value in kwargs.items():\n            setattr(self, arg, value)\n\n        self.readers = Readers(self.settings, readers_cache_name)\n\n        # templates cache\n        self._templates = {}\n        self._templates_path = list(self.settings[\"THEME_TEMPLATES_OVERRIDES\"])\n\n        theme_templates_path = os.path.expanduser(os.path.join(self.theme, \"templates\"))\n        self._templates_path.append(theme_templates_path)\n        theme_loader = FileSystemLoader(theme_templates_path)\n\n        simple_theme_path = os.path.dirname(os.path.abspath(__file__))\n        simple_loader = FileSystemLoader(\n            os.path.join(simple_theme_path, \"themes\", \"simple\", \"templates\")\n        )\n\n        self.env = Environment(\n            loader=ChoiceLoader(\n                [\n                    FileSystemLoader(self._templates_path),\n                    simple_loader,  # implicit inheritance\n                    PrefixLoader(\n                        {\"!simple\": simple_loader, \"!theme\": theme_loader}\n                    ),  # explicit ones\n                ]\n            ),\n            **self.settings[\"JINJA_ENVIRONMENT\"],\n        )\n\n        logger.debug(\"Template list: %s\", self.env.list_templates())\n\n        # provide utils.strftime as a jinja filter\n        self.env.filters.update({\"strftime\": DateFormatter()})\n\n        # get custom Jinja filters from user settings\n        custom_filters = self.settings[\"JINJA_FILTERS\"]\n        self.env.filters.update(custom_filters)\n\n        # get custom Jinja globals from user settings\n        custom_globals = self.settings[\"JINJA_GLOBALS\"]\n        self.env.globals.update(custom_globals)\n\n        # get custom Jinja tests from user settings\n        custom_tests = self.settings[\"JINJA_TESTS\"]\n        self.env.tests[\"plugin_enabled\"] = partial(\n            plugin_enabled, plugin_list=self.settings[\"PLUGINS\"]\n        )\n        self.env.tests.update(custom_tests)\n\n        signals.generator_init.send(self)\n\n    def get_template(self, name):\n        \"\"\"Return the template by name.\n        Use self.theme to get the templates to use, and return a list of\n        templates ready to use with Jinja2.\n        \"\"\"\n        if name not in self._templates:\n            for ext in self.settings[\"TEMPLATE_EXTENSIONS\"]:\n                try:\n                    self._templates[name] = self.env.get_template(name + ext)\n                    break\n                except TemplateNotFound:\n                    continue\n\n            if name not in self._templates:\n                raise PelicanTemplateNotFound(\n                    \"[templates] unable to load {}[{}] from {}\".format(\n                        name,\n                        \", \".join(self.settings[\"TEMPLATE_EXTENSIONS\"]),\n                        self._templates_path,\n                    )\n                )\n\n        return self._templates[name]\n\n    def _include_path(self, path, extensions=None):\n        \"\"\"Inclusion logic for .get_files(), returns True/False\n\n        :param path: potential path to include (relative to content root)\n        :param extensions: the list of allowed extensions, or False if all\n            extensions are allowed\n        \"\"\"\n        if extensions is None:\n            extensions = tuple(self.readers.extensions)\n        basename = os.path.basename(path)\n\n        # check IGNORE_FILES\n        ignores = self.settings[\"IGNORE_FILES\"]\n        if any(fnmatch.fnmatch(basename, ignore) for ignore in ignores):\n            return False\n\n        ext = os.path.splitext(basename)[1][1:]\n        if extensions is False or ext in extensions:\n            return True\n\n        return False\n\n    def get_files(\n        self, paths, exclude: list[str] | None = None, extensions=None\n    ) -> set[str]:\n        \"\"\"Return a list of files to use, based on rules\n\n        :param paths: the list pf paths to search (relative to self.path)\n        :param exclude: the list of path to exclude\n        :param extensions: the list of allowed extensions (if False, all\n            extensions are allowed)\n        \"\"\"\n        if exclude is None:\n            exclude = []\n        # backward compatibility for older generators\n        if isinstance(paths, str):\n            paths = [paths]\n\n        # group the exclude dir names by parent path, for use with os.walk()\n        exclusions_by_dirpath = {}\n        for e in exclude:\n            parent_path, subdir = os.path.split(os.path.join(self.path, e))\n            exclusions_by_dirpath.setdefault(parent_path, set()).add(subdir)\n\n        files = set()\n        ignores = self.settings[\"IGNORE_FILES\"]\n        for path in paths:\n            # careful: os.path.join() will add a slash when path == ''.\n            root = os.path.join(self.path, path) if path else self.path\n\n            if os.path.isdir(root):\n                for dirpath, dirs, temp_files in os.walk(\n                    root, topdown=True, followlinks=True\n                ):\n                    excl = exclusions_by_dirpath.get(dirpath, ())\n                    # We copy the `dirs` list as we will modify it in the loop:\n                    for d in list(dirs):\n                        if d in excl or any(\n                            fnmatch.fnmatch(d, ignore) for ignore in ignores\n                        ):\n                            if d in dirs:\n                                dirs.remove(d)\n\n                    reldir = os.path.relpath(dirpath, self.path)\n                    for f in temp_files:\n                        fp = os.path.join(reldir, f)\n                        if self._include_path(fp, extensions):\n                            files.add(fp)\n            elif os.path.exists(root) and self._include_path(path, extensions):\n                files.add(path)  # can't walk non-directories\n        return files\n\n    def add_source_path(self, content, static=False):\n        \"\"\"Record a source file path that a Generator found and processed.\n        Store a reference to its Content object, for url lookups later.\n        \"\"\"\n        location = content.get_relative_source_path()\n        key = \"static_content\" if static else \"generated_content\"\n        self.context[key][location] = content\n\n    def _add_failed_source_path(self, path, static=False):\n        \"\"\"Record a source file path that a Generator failed to process.\n        (For example, one that was missing mandatory metadata.)\n        The path argument is expected to be relative to self.path.\n        \"\"\"\n        key = \"static_content\" if static else \"generated_content\"\n        self.context[key][posixize_path(os.path.normpath(path))] = None\n\n    def _is_potential_source_path(self, path, static=False):\n        \"\"\"Return True if path was supposed to be used as a source file.\n        (This includes all source files that have been found by generators\n        before this method is called, even if they failed to process.)\n        The path argument is expected to be relative to self.path.\n        \"\"\"\n        key = \"static_content\" if static else \"generated_content\"\n        return posixize_path(os.path.normpath(path)) in self.context[key]\n\n    def add_static_links(self, content):\n        \"\"\"Add file links in content to context to be processed as Static\n        content.\n        \"\"\"\n        self.context[\"static_links\"] |= content.get_static_links()\n\n    def _update_context(self, items):\n        \"\"\"Update the context with the given items from the current processor.\n\n        Note that dictionary arguments will be converted to a list of tuples.\n        \"\"\"\n        for item in items:\n            value = getattr(self, item)\n            if hasattr(value, \"items\"):\n                value = list(value.items())  # py3k safeguard for iterators\n            self.context[item] = value\n\n    def __str__(self):\n        # return the name of the class for logging purposes\n        return self.__class__.__name__\n\n    def _check_disabled_readers(self, paths, exclude: list[str] | None) -> None:\n        \"\"\"Log warnings for files that would have been processed by disabled readers.\"\"\"\n        for fil in self.get_files(\n            paths, exclude=exclude, extensions=self.readers.disabled_extensions\n        ):\n            self.readers.check_file(fil)\n\n\nclass CachingGenerator(Generator, FileStampDataCacher):\n    \"\"\"Subclass of Generator and FileStampDataCacher classes\n\n    enables content caching, either at the generator or reader level\n    \"\"\"\n\n    def __init__(self, *args, **kwargs):\n        \"\"\"Initialize the generator, then set up caching\n\n        note the multiple inheritance structure\n        \"\"\"\n        cls_name = self.__class__.__name__\n        Generator.__init__(\n            self, *args, readers_cache_name=(cls_name + \"-Readers\"), **kwargs\n        )\n\n        cache_this_level = self.settings[\"CONTENT_CACHING_LAYER\"] == \"generator\"\n        caching_policy = cache_this_level and self.settings[\"CACHE_CONTENT\"]\n        load_policy = cache_this_level and self.settings[\"LOAD_CONTENT_CACHE\"]\n        FileStampDataCacher.__init__(\n            self, self.settings, cls_name, caching_policy, load_policy\n        )\n\n    def _get_file_stamp(self, filename):\n        \"\"\"Get filestamp for path relative to generator.path\"\"\"\n        filename = os.path.join(self.path, filename)\n        return super()._get_file_stamp(filename)\n\n\nclass _FileLoader(BaseLoader):\n    def __init__(self, path, basedir):\n        self.path = path\n        self.fullpath = os.path.join(basedir, path)\n\n    def get_source(self, environment, template):\n        del environment  # Unused argument\n        if template != self.path or not os.path.exists(self.fullpath):\n            raise TemplateNotFound(template)\n        mtime = os.path.getmtime(self.fullpath)\n        with open(self.fullpath, encoding=\"utf-8\") as f:\n            source = f.read()\n        return (source, self.fullpath, lambda: mtime == os.path.getmtime(self.fullpath))\n\n\nclass TemplatePagesGenerator(Generator):\n    def generate_output(self, writer):\n        for source, dest in self.settings[\"TEMPLATE_PAGES\"].items():\n            self.env.loader.loaders.insert(0, _FileLoader(source, self.path))\n            try:\n                template = self.env.get_template(source)\n                rurls = self.settings[\"RELATIVE_URLS\"]\n                writer.write_file(\n                    dest, template, self.context, rurls, override_output=True, url=\"\"\n                )\n            finally:\n                del self.env.loader.loaders[0]\n\n\nclass ArticlesGenerator(CachingGenerator):\n    \"\"\"Generate blog articles\"\"\"\n\n    def __init__(self, *args, **kwargs):\n        \"\"\"initialize properties\"\"\"\n        # Published, listed articles\n        self.articles = []  # only articles in default language\n        self.translations = []\n        # Published, unlisted articles\n        self.hidden_articles = []\n        self.hidden_translations = []\n        # Draft articles\n        self.drafts = []  # only drafts in default language\n        self.drafts_translations = []\n        self.dates = {}\n        self.period_archives = defaultdict(list)\n        self.tags = defaultdict(list)\n        self.categories = defaultdict(list)\n        self.related_posts = []\n        self.authors = defaultdict(list)\n        super().__init__(*args, **kwargs)\n        signals.article_generator_init.send(self)\n\n    def generate_feeds(self, writer):\n        \"\"\"Generate the feeds from the current context, and output files.\"\"\"\n\n        if self.settings.get(\"FEED_ATOM\"):\n            writer.write_feed(\n                self.articles,\n                self.context,\n                self.settings[\"FEED_ATOM\"],\n                self.settings.get(\"FEED_ATOM_URL\", self.settings[\"FEED_ATOM\"]),\n            )\n\n        if self.settings.get(\"FEED_RSS\"):\n            writer.write_feed(\n                self.articles,\n                self.context,\n                self.settings[\"FEED_RSS\"],\n                self.settings.get(\"FEED_RSS_URL\", self.settings[\"FEED_RSS\"]),\n                feed_type=\"rss\",\n            )\n\n        if self.settings.get(\"FEED_ALL_ATOM\") or self.settings.get(\"FEED_ALL_RSS\"):\n            all_articles = list(self.articles)\n            for article in self.articles:\n                all_articles.extend(article.translations)\n            order_content(all_articles, order_by=self.settings[\"ARTICLE_ORDER_BY\"])\n\n            if self.settings.get(\"FEED_ALL_ATOM\"):\n                writer.write_feed(\n                    all_articles,\n                    self.context,\n                    self.settings[\"FEED_ALL_ATOM\"],\n                    self.settings.get(\n                        \"FEED_ALL_ATOM_URL\", self.settings[\"FEED_ALL_ATOM\"]\n                    ),\n                )\n\n            if self.settings.get(\"FEED_ALL_RSS\"):\n                writer.write_feed(\n                    all_articles,\n                    self.context,\n                    self.settings[\"FEED_ALL_RSS\"],\n                    self.settings.get(\n                        \"FEED_ALL_RSS_URL\", self.settings[\"FEED_ALL_RSS\"]\n                    ),\n                    feed_type=\"rss\",\n                )\n\n        for cat, arts in self.categories:\n            if self.settings.get(\"CATEGORY_FEED_ATOM\"):\n                writer.write_feed(\n                    arts,\n                    self.context,\n                    str(self.settings[\"CATEGORY_FEED_ATOM\"]).format(slug=cat.slug),\n                    self.settings.get(\n                        \"CATEGORY_FEED_ATOM_URL\",\n                        str(self.settings[\"CATEGORY_FEED_ATOM\"]),\n                    ).format(slug=cat.slug),\n                    feed_title=cat.name,\n                )\n\n            if self.settings.get(\"CATEGORY_FEED_RSS\"):\n                writer.write_feed(\n                    arts,\n                    self.context,\n                    str(self.settings[\"CATEGORY_FEED_RSS\"]).format(slug=cat.slug),\n                    self.settings.get(\n                        \"CATEGORY_FEED_RSS_URL\",\n                        str(self.settings[\"CATEGORY_FEED_RSS\"]),\n                    ).format(slug=cat.slug),\n                    feed_title=cat.name,\n                    feed_type=\"rss\",\n                )\n\n        for auth, arts in self.authors:\n            if self.settings.get(\"AUTHOR_FEED_ATOM\"):\n                writer.write_feed(\n                    arts,\n                    self.context,\n                    str(self.settings[\"AUTHOR_FEED_ATOM\"]).format(slug=auth.slug),\n                    self.settings.get(\n                        \"AUTHOR_FEED_ATOM_URL\",\n                        str(self.settings[\"AUTHOR_FEED_ATOM\"]),\n                    ).format(slug=auth.slug),\n                    feed_title=auth.name,\n                )\n\n            if self.settings.get(\"AUTHOR_FEED_RSS\"):\n                writer.write_feed(\n                    arts,\n                    self.context,\n                    str(self.settings[\"AUTHOR_FEED_RSS\"]).format(slug=auth.slug),\n                    self.settings.get(\n                        \"AUTHOR_FEED_RSS_URL\",\n                        str(self.settings[\"AUTHOR_FEED_RSS\"]),\n                    ).format(slug=auth.slug),\n                    feed_title=auth.name,\n                    feed_type=\"rss\",\n                )\n\n        if self.settings.get(\"TAG_FEED_ATOM\") or self.settings.get(\"TAG_FEED_RSS\"):\n            for tag, arts in self.tags.items():\n                if self.settings.get(\"TAG_FEED_ATOM\"):\n                    writer.write_feed(\n                        arts,\n                        self.context,\n                        str(self.settings[\"TAG_FEED_ATOM\"]).format(slug=tag.slug),\n                        self.settings.get(\n                            \"TAG_FEED_ATOM_URL\",\n                            str(self.settings[\"TAG_FEED_ATOM\"]),\n                        ).format(slug=tag.slug),\n                        feed_title=tag.name,\n                    )\n\n                if self.settings.get(\"TAG_FEED_RSS\"):\n                    writer.write_feed(\n                        arts,\n                        self.context,\n                        str(self.settings[\"TAG_FEED_RSS\"]).format(slug=tag.slug),\n                        self.settings.get(\n                            \"TAG_FEED_RSS_URL\",\n                            str(self.settings[\"TAG_FEED_RSS\"]),\n                        ).format(slug=tag.slug),\n                        feed_title=tag.name,\n                        feed_type=\"rss\",\n                    )\n\n        if self.settings.get(\"TRANSLATION_FEED_ATOM\") or self.settings.get(\n            \"TRANSLATION_FEED_RSS\"\n        ):\n            translations_feeds = defaultdict(list)\n            for article in chain(self.articles, self.translations):\n                translations_feeds[article.lang].append(article)\n\n            for lang, items in translations_feeds.items():\n                items = order_content(items, order_by=self.settings[\"ARTICLE_ORDER_BY\"])\n                if self.settings.get(\"TRANSLATION_FEED_ATOM\"):\n                    writer.write_feed(\n                        items,\n                        self.context,\n                        str(self.settings[\"TRANSLATION_FEED_ATOM\"]).format(lang=lang),\n                        self.settings.get(\n                            \"TRANSLATION_FEED_ATOM_URL\",\n                            str(self.settings[\"TRANSLATION_FEED_ATOM\"]),\n                        ).format(lang=lang),\n                    )\n                if self.settings.get(\"TRANSLATION_FEED_RSS\"):\n                    writer.write_feed(\n                        items,\n                        self.context,\n                        str(self.settings[\"TRANSLATION_FEED_RSS\"]).format(lang=lang),\n                        self.settings.get(\n                            \"TRANSLATION_FEED_RSS_URL\",\n                            str(self.settings[\"TRANSLATION_FEED_RSS\"]),\n                        ).format(lang=lang),\n                        feed_type=\"rss\",\n                    )\n\n    def generate_articles(self, write):\n        \"\"\"Generate the articles.\"\"\"\n        for article in chain(\n            self.translations,\n            self.articles,\n            self.hidden_translations,\n            self.hidden_articles,\n        ):\n            signals.article_generator_write_article.send(self, content=article)\n            write(\n                article.save_as,\n                self.get_template(article.template),\n                self.context,\n                article=article,\n                category=article.category,\n                override_output=hasattr(article, \"override_save_as\"),\n                url=article.url,\n                blog=True,\n            )\n\n    def generate_period_archives(self, write):\n        \"\"\"Generate per-year, per-month, and per-day archives.\"\"\"\n        try:\n            template = self.get_template(\"period_archives\")\n        except PelicanTemplateNotFound:\n            template = self.get_template(\"archives\")\n\n        for granularity in self.period_archives:\n            for period in self.period_archives[granularity]:\n                context = self.context.copy()\n                context[\"period\"] = period[\"period\"]\n                context[\"period_num\"] = period[\"period_num\"]\n\n                write(\n                    period[\"save_as\"],\n                    template,\n                    context,\n                    articles=period[\"articles\"],\n                    dates=period[\"dates\"],\n                    template_name=\"period_archives\",\n                    blog=True,\n                    url=period[\"url\"],\n                    all_articles=self.articles,\n                )\n\n    def generate_direct_templates(self, write):\n        \"\"\"Generate direct templates pages\"\"\"\n        for template in self.settings[\"DIRECT_TEMPLATES\"]:\n            save_as = self.settings.get(\n                f\"{template.upper()}_SAVE_AS\", f\"{template}.html\"\n            )\n            url = self.settings.get(f\"{template.upper()}_URL\", f\"{template}.html\")\n            if not save_as:\n                continue\n\n            write(\n                save_as,\n                self.get_template(template),\n                self.context,\n                articles=self.articles,\n                dates=self.dates,\n                blog=True,\n                template_name=template,\n                page_name=os.path.splitext(save_as)[0],\n                url=url,\n            )\n\n    def generate_tags(self, write):\n        \"\"\"Generate Tags pages.\"\"\"\n        tag_template = self.get_template(\"tag\")\n        for tag, articles in self.tags.items():\n            dates = [article for article in self.dates if article in articles]\n            write(\n                tag.save_as,\n                tag_template,\n                self.context,\n                tag=tag,\n                url=tag.url,\n                articles=articles,\n                dates=dates,\n                template_name=\"tag\",\n                blog=True,\n                page_name=tag.page_name,\n                all_articles=self.articles,\n            )\n\n    def generate_categories(self, write):\n        \"\"\"Generate category pages.\"\"\"\n        category_template = self.get_template(\"category\")\n        for cat, articles in self.categories:\n            dates = [article for article in self.dates if article in articles]\n            write(\n                cat.save_as,\n                category_template,\n                self.context,\n                url=cat.url,\n                category=cat,\n                articles=articles,\n                dates=dates,\n                template_name=\"category\",\n                blog=True,\n                page_name=cat.page_name,\n                all_articles=self.articles,\n            )\n\n    def generate_authors(self, write):\n        \"\"\"Generate Author pages.\"\"\"\n        author_template = self.get_template(\"author\")\n        for aut, articles in self.authors:\n            dates = [article for article in self.dates if article in articles]\n            write(\n                aut.save_as,\n                author_template,\n                self.context,\n                url=aut.url,\n                author=aut,\n                articles=articles,\n                dates=dates,\n                template_name=\"author\",\n                blog=True,\n                page_name=aut.page_name,\n                all_articles=self.articles,\n            )\n\n    def generate_drafts(self, write):\n        \"\"\"Generate drafts pages.\"\"\"\n        for draft in chain(self.drafts_translations, self.drafts):\n            write(\n                draft.save_as,\n                self.get_template(draft.template),\n                self.context,\n                article=draft,\n                category=draft.category,\n                override_output=hasattr(draft, \"override_save_as\"),\n                blog=True,\n                all_articles=self.articles,\n                url=draft.url,\n            )\n\n    def generate_pages(self, writer):\n        \"\"\"Generate the pages on the disk\"\"\"\n        write = partial(writer.write_file, relative_urls=self.settings[\"RELATIVE_URLS\"])\n\n        # to minimize the number of relative path stuff modification\n        # in writer, articles pass first\n        self.generate_articles(write)\n        self.generate_period_archives(write)\n        self.generate_direct_templates(write)\n\n        # and subfolders after that\n        self.generate_tags(write)\n        self.generate_categories(write)\n        self.generate_authors(write)\n        self.generate_drafts(write)\n\n    def check_disabled_readers(self) -> None:\n        self._check_disabled_readers(\n            self.settings[\"ARTICLE_PATHS\"], exclude=self.settings[\"ARTICLE_EXCLUDES\"]\n        )\n\n    def generate_context(self):\n        \"\"\"Add the articles into the shared context\"\"\"\n\n        all_articles = []\n        all_drafts = []\n        hidden_articles = []\n        for f in self.get_files(\n            self.settings[\"ARTICLE_PATHS\"], exclude=self.settings[\"ARTICLE_EXCLUDES\"]\n        ):\n            article = self.get_cached_data(f, None)\n            if article is None:\n                try:\n                    article = self.readers.read_file(\n                        base_path=self.path,\n                        path=f,\n                        content_class=Article,\n                        context=self.context,\n                        preread_signal=signals.article_generator_preread,\n                        preread_sender=self,\n                        context_signal=signals.article_generator_context,\n                        context_sender=self,\n                    )\n                except Exception:\n                    logger.exception(\n                        \"Could not process %s\",\n                        f,\n                        exc_info=self.settings.get(\"DEBUG\", False),\n                    )\n                    self._add_failed_source_path(f)\n                    continue\n\n                if isinstance(article, SkipStub):\n                    logger.debug(\"Safely skipping %s\", f)\n                    continue\n\n                if not article.is_valid():\n                    self._add_failed_source_path(f)\n                    continue\n\n                self.cache_data(f, article)\n\n            if article.status == \"published\":\n                all_articles.append(article)\n            elif article.status == \"draft\":\n                all_drafts.append(article)\n            elif article.status == \"hidden\":\n                hidden_articles.append(article)\n            elif article.status == \"skip\":\n                raise AssertionError(\"Documents with 'skip' status should be skipped\")\n\n            self.add_source_path(article)\n            self.add_static_links(article)\n\n        def _process(arts):\n            origs, translations = process_translations(\n                arts, translation_id=self.settings[\"ARTICLE_TRANSLATION_ID\"]\n            )\n            origs = order_content(origs, self.settings[\"ARTICLE_ORDER_BY\"])\n            return origs, translations\n\n        self.articles, self.translations = _process(all_articles)\n        self.hidden_articles, self.hidden_translations = _process(hidden_articles)\n        self.drafts, self.drafts_translations = _process(all_drafts)\n\n        signals.article_generator_pretaxonomy.send(self)\n\n        for article in self.articles:\n            # only main articles are listed in categories and tags\n            # not translations or hidden articles\n            self.categories[article.category].append(article)\n            if hasattr(article, \"tags\"):\n                for tag in article.tags:\n                    self.tags[tag].append(article)\n            for author in getattr(article, \"authors\", []):\n                self.authors[author].append(article)\n\n        self.dates = list(self.articles)\n        self.dates.sort(\n            key=attrgetter(\"date\"), reverse=self.context[\"NEWEST_FIRST_ARCHIVES\"]\n        )\n\n        self.period_archives = self._build_period_archives(\n            self.dates, self.articles, self.settings\n        )\n\n        # and generate the output :)\n\n        # order the categories per name\n        self.categories = list(self.categories.items())\n        self.categories.sort(reverse=self.settings[\"REVERSE_CATEGORY_ORDER\"])\n\n        self.authors = list(self.authors.items())\n        self.authors.sort()\n\n        self._update_context(\n            (\n                \"articles\",\n                \"drafts\",\n                \"hidden_articles\",\n                \"dates\",\n                \"tags\",\n                \"categories\",\n                \"authors\",\n                \"related_posts\",\n            )\n        )\n        # _update_context flattens dicts, which should not happen to\n        # period_archives, so we update the context directly for it:\n        self.context[\"period_archives\"] = self.period_archives\n        self.save_cache()\n        self.readers.save_cache()\n        signals.article_generator_finalized.send(self)\n\n    def _build_period_archives(self, sorted_articles, articles, settings):\n        \"\"\"\n        Compute the groupings of articles, with related attributes, for\n        per-year, per-month, and per-day archives.\n        \"\"\"\n\n        period_archives = defaultdict(list)\n\n        period_archives_settings = {\n            \"year\": {\n                \"save_as\": settings[\"YEAR_ARCHIVE_SAVE_AS\"],\n                \"url\": settings[\"YEAR_ARCHIVE_URL\"],\n            },\n            \"month\": {\n                \"save_as\": settings[\"MONTH_ARCHIVE_SAVE_AS\"],\n                \"url\": settings[\"MONTH_ARCHIVE_URL\"],\n            },\n            \"day\": {\n                \"save_as\": settings[\"DAY_ARCHIVE_SAVE_AS\"],\n                \"url\": settings[\"DAY_ARCHIVE_URL\"],\n            },\n        }\n\n        granularity_key_func = {\n            \"year\": attrgetter(\"date.year\"),\n            \"month\": attrgetter(\"date.year\", \"date.month\"),\n            \"day\": attrgetter(\"date.year\", \"date.month\", \"date.day\"),\n        }\n\n        for granularity in \"year\", \"month\", \"day\":\n            save_as_fmt = period_archives_settings[granularity][\"save_as\"]\n            url_fmt = period_archives_settings[granularity][\"url\"]\n            key_func = granularity_key_func[granularity]\n\n            if not save_as_fmt:\n                # the archives for this period granularity are not needed\n                continue\n\n            for period, group in groupby(sorted_articles, key=key_func):\n                archive = {}\n\n                dates = list(group)\n                archive[\"dates\"] = dates\n                archive[\"articles\"] = [a for a in articles if a in dates]\n\n                # use the first date to specify the period archive URL\n                # and save_as; the specific date used does not matter as\n                # they all belong to the same period\n                d = dates[0].date\n                archive[\"save_as\"] = save_as_fmt.format(date=d)\n                archive[\"url\"] = url_fmt.format(date=d)\n\n                if granularity == \"year\":\n                    archive[\"period\"] = (period,)\n                    archive[\"period_num\"] = (period,)\n                else:\n                    month_name = calendar.month_name[period[1]]\n                    if granularity == \"month\":\n                        archive[\"period\"] = (period[0], month_name)\n                    else:\n                        archive[\"period\"] = (period[0], month_name, period[2])\n                    archive[\"period_num\"] = tuple(period)\n\n                period_archives[granularity].append(archive)\n\n        return period_archives\n\n    def generate_output(self, writer):\n        self.generate_feeds(writer)\n        self.generate_pages(writer)\n        signals.article_writer_finalized.send(self, writer=writer)\n\n    def refresh_metadata_intersite_links(self):\n        for e in chain(\n            self.articles,\n            self.translations,\n            self.drafts,\n            self.drafts_translations,\n            self.hidden_articles,\n            self.hidden_translations,\n        ):\n            if hasattr(e, \"refresh_metadata_intersite_links\"):\n                e.refresh_metadata_intersite_links()\n\n\nclass PagesGenerator(CachingGenerator):\n    \"\"\"Generate pages\"\"\"\n\n    def __init__(self, *args, **kwargs):\n        self.pages = []\n        self.translations = []\n        self.hidden_pages = []\n        self.hidden_translations = []\n        self.draft_pages = []\n        self.draft_translations = []\n        super().__init__(*args, **kwargs)\n        signals.page_generator_init.send(self)\n\n    def check_disabled_readers(self) -> None:\n        self._check_disabled_readers(\n            self.settings[\"PAGE_PATHS\"], exclude=self.settings[\"PAGE_EXCLUDES\"]\n        )\n\n    def generate_context(self):\n        all_pages = []\n        hidden_pages = []\n        draft_pages = []\n        for f in self.get_files(\n            self.settings[\"PAGE_PATHS\"], exclude=self.settings[\"PAGE_EXCLUDES\"]\n        ):\n            page = self.get_cached_data(f, None)\n            if page is None:\n                try:\n                    page = self.readers.read_file(\n                        base_path=self.path,\n                        path=f,\n                        content_class=Page,\n                        context=self.context,\n                        preread_signal=signals.page_generator_preread,\n                        preread_sender=self,\n                        context_signal=signals.page_generator_context,\n                        context_sender=self,\n                    )\n                except Exception:\n                    logger.exception(\n                        \"Could not process %s\",\n                        f,\n                        exc_info=self.settings.get(\"DEBUG\", False),\n                    )\n                    self._add_failed_source_path(f)\n                    continue\n\n                if isinstance(page, SkipStub):\n                    logger.debug(\"Safely skipping %s\", f)\n                    continue\n\n                if not page.is_valid():\n                    self._add_failed_source_path(f)\n                    continue\n\n                self.cache_data(f, page)\n\n            if page.status == \"published\":\n                all_pages.append(page)\n            elif page.status == \"hidden\":\n                hidden_pages.append(page)\n            elif page.status == \"draft\":\n                draft_pages.append(page)\n            elif page.status == \"skip\":\n                raise AssertionError(\"Documents with 'skip' status should be skipped\")\n\n            self.add_source_path(page)\n            self.add_static_links(page)\n\n        def _process(pages):\n            origs, translations = process_translations(\n                pages, translation_id=self.settings[\"PAGE_TRANSLATION_ID\"]\n            )\n            origs = order_content(origs, self.settings[\"PAGE_ORDER_BY\"])\n            return origs, translations\n\n        self.pages, self.translations = _process(all_pages)\n        self.hidden_pages, self.hidden_translations = _process(hidden_pages)\n        self.draft_pages, self.draft_translations = _process(draft_pages)\n\n        self._update_context((\"pages\", \"hidden_pages\", \"draft_pages\"))\n\n        self.save_cache()\n        self.readers.save_cache()\n        signals.page_generator_finalized.send(self)\n\n    def generate_output(self, writer):\n        for page in chain(\n            self.translations,\n            self.pages,\n            self.hidden_translations,\n            self.hidden_pages,\n            self.draft_translations,\n            self.draft_pages,\n        ):\n            signals.page_generator_write_page.send(self, content=page)\n            writer.write_file(\n                page.save_as,\n                self.get_template(page.template),\n                self.context,\n                page=page,\n                relative_urls=self.settings[\"RELATIVE_URLS\"],\n                override_output=hasattr(page, \"override_save_as\"),\n                url=page.url,\n            )\n        signals.page_writer_finalized.send(self, writer=writer)\n\n    def refresh_metadata_intersite_links(self):\n        for e in chain(\n            self.pages,\n            self.hidden_pages,\n            self.hidden_translations,\n            self.draft_pages,\n            self.draft_translations,\n        ):\n            if hasattr(e, \"refresh_metadata_intersite_links\"):\n                e.refresh_metadata_intersite_links()\n\n\nclass StaticGenerator(Generator):\n    \"\"\"copy static paths (what you want to copy, like images, medias etc.\n    to output\"\"\"\n\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        self.fallback_to_symlinks = False\n        signals.static_generator_init.send(self)\n\n    def check_disabled_readers(self) -> None:\n        self._check_disabled_readers(\n            self.settings[\"STATIC_PATHS\"], exclude=self.settings[\"STATIC_EXCLUDES\"]\n        )\n\n    def generate_context(self):\n        self.staticfiles = []\n        linked_files = set(self.context[\"static_links\"])\n        found_files = self.get_files(\n            self.settings[\"STATIC_PATHS\"],\n            exclude=self.settings[\"STATIC_EXCLUDES\"],\n            extensions=False,\n        )\n        for f in linked_files | found_files:\n            # skip content source files unless the user explicitly wants them\n            if self.settings[\"STATIC_EXCLUDE_SOURCES\"]:\n                if self._is_potential_source_path(f):\n                    continue\n\n            static = self.readers.read_file(\n                base_path=self.path,\n                path=f,\n                content_class=Static,\n                fmt=\"static\",\n                context=self.context,\n                preread_signal=signals.static_generator_preread,\n                preread_sender=self,\n                context_signal=signals.static_generator_context,\n                context_sender=self,\n            )\n            self.staticfiles.append(static)\n            self.add_source_path(static, static=True)\n        self._update_context((\"staticfiles\",))\n        signals.static_generator_finalized.send(self)\n\n    def generate_output(self, writer):\n        del writer  # Unused argument\n        self._copy_paths(\n            self.settings[\"THEME_STATIC_PATHS\"],\n            self.theme,\n            self.settings[\"THEME_STATIC_DIR\"],\n            self.output_path,\n            os.curdir,\n        )\n        for sc in self.context[\"staticfiles\"]:\n            if self._file_update_required(sc):\n                self._link_or_copy_staticfile(sc)\n            else:\n                logger.debug(\"%s is up to date, not copying\", sc.source_path)\n\n    def _copy_paths(self, paths, source, destination, output_path, final_path=None):\n        \"\"\"Copy all the paths from source to destination\"\"\"\n        for path in paths:\n            source_path = os.path.join(source, path)\n\n            if final_path:\n                if os.path.isfile(source_path):\n                    destination_path = os.path.join(\n                        output_path, destination, final_path, os.path.basename(path)\n                    )\n                else:\n                    destination_path = os.path.join(\n                        output_path, destination, final_path\n                    )\n            else:\n                destination_path = os.path.join(output_path, destination, path)\n\n            copy(source_path, destination_path, self.settings[\"IGNORE_FILES\"])\n\n    def _file_update_required(self, staticfile):\n        source_path = os.path.join(self.path, staticfile.source_path)\n        save_as = os.path.join(self.output_path, staticfile.save_as)\n        if not os.path.exists(save_as):\n            return True\n        elif self.settings[\"STATIC_CREATE_LINKS\"] and os.path.samefile(\n            source_path, save_as\n        ):\n            return False\n        elif (\n            self.settings[\"STATIC_CREATE_LINKS\"]\n            and os.path.realpath(save_as) == source_path\n        ):\n            return False\n        elif not self.settings[\"STATIC_CHECK_IF_MODIFIED\"]:\n            return True\n        else:\n            return self._source_is_newer(staticfile)\n\n    def _source_is_newer(self, staticfile):\n        source_path = os.path.join(self.path, staticfile.source_path)\n        save_as = os.path.join(self.output_path, staticfile.save_as)\n        s_mtime = os.path.getmtime(source_path)\n        d_mtime = os.path.getmtime(save_as)\n        return s_mtime - d_mtime > 0.000001  # noqa: PLR2004\n\n    def _link_or_copy_staticfile(self, sc):\n        if self.settings[\"STATIC_CREATE_LINKS\"]:\n            self._link_staticfile(sc)\n        else:\n            self._copy_staticfile(sc)\n\n    def _copy_staticfile(self, sc):\n        source_path = os.path.join(self.path, sc.source_path)\n        save_as = os.path.join(self.output_path, sc.save_as)\n        self._mkdir(os.path.dirname(save_as))\n        copy(source_path, save_as)\n        logger.info(\"Copying %s to %s\", sc.source_path, sc.save_as)\n\n    def _link_staticfile(self, sc):\n        source_path = os.path.join(self.path, sc.source_path)\n        save_as = os.path.join(self.output_path, sc.save_as)\n        self._mkdir(os.path.dirname(save_as))\n        try:\n            if os.path.lexists(save_as):\n                os.unlink(save_as)\n            logger.info(\"Linking %s and %s\", sc.source_path, sc.save_as)\n            if self.fallback_to_symlinks:\n                os.symlink(source_path, save_as)\n            else:\n                os.link(source_path, save_as)\n        except OSError as err:\n            if err.errno == errno.EXDEV:  # 18: Invalid cross-device link\n                logger.debug(\n                    \"Cross-device links not valid. Creating symbolic links instead.\"\n                )\n                self.fallback_to_symlinks = True\n                self._link_staticfile(sc)\n            else:\n                raise err\n\n    def _mkdir(self, path):\n        if os.path.lexists(path) and not os.path.isdir(path):\n            os.unlink(path)\n        mkdir_p(path)\n\n\nclass SourceFileGenerator(Generator):\n    def generate_context(self):\n        self.output_extension = self.settings[\"OUTPUT_SOURCES_EXTENSION\"]\n\n    def _create_source(self, obj):\n        output_path, _ = os.path.splitext(obj.save_as)\n        dest = os.path.join(self.output_path, output_path + self.output_extension)\n        copy(obj.source_path, dest)\n\n    def generate_output(self, writer=None):\n        del writer  # Unused argument\n        logger.info(\"Generating source files...\")\n        for obj in chain(self.context[\"articles\"], self.context[\"pages\"]):\n            self._create_source(obj)\n            for obj_trans in obj.translations:\n                self._create_source(obj_trans)\n"
  },
  {
    "path": "pelican/log.py",
    "content": "import logging\nimport warnings\nfrom collections import defaultdict\n\nfrom rich.console import Console\nfrom rich.logging import RichHandler\n\n__all__ = [\"init\"]\n\nconsole = Console()\n\n\nclass LimitFilter(logging.Filter):\n    \"\"\"\n    Remove duplicates records, and limit the number of records in the same\n    group.\n\n    Groups are specified by the message to use when the number of records in\n    the same group hit the limit.\n    E.g.: log.warning(('43 is not the answer', 'More erroneous answers'))\n    \"\"\"\n\n    LOGS_DEDUP_MIN_LEVEL = logging.WARNING\n\n    _ignore = set()\n    _raised_messages = set()\n    _threshold = 5\n    _group_count = defaultdict(int)\n\n    def filter(self, record):\n        # don't limit log messages for anything above \"warning\"\n        if record.levelno > self.LOGS_DEDUP_MIN_LEVEL:\n            return True\n\n        # extract group\n        group = record.__dict__.get(\"limit_msg\", None)\n        group_args = record.__dict__.get(\"limit_args\", ())\n\n        # ignore record if it was already raised\n        message_key = (record.levelno, record.getMessage())\n        if message_key in self._raised_messages:\n            return False\n        else:\n            self._raised_messages.add(message_key)\n\n        # ignore LOG_FILTER records by templates or messages\n        # when \"debug\" isn't enabled\n        logger_level = logging.getLogger().getEffectiveLevel()\n        if logger_level > logging.DEBUG:\n            template_key = (record.levelno, record.msg)\n            message_key = (record.levelno, record.getMessage())\n            if template_key in self._ignore or message_key in self._ignore:\n                return False\n\n        # check if we went over threshold\n        if group:\n            key = (record.levelno, group)\n            self._group_count[key] += 1\n            if self._group_count[key] == self._threshold:\n                record.msg = group\n                record.args = group_args\n            elif self._group_count[key] > self._threshold:\n                return False\n        return True\n\n\nclass LimitLogger(logging.Logger):\n    \"\"\"\n    A logger which adds LimitFilter automatically\n    \"\"\"\n\n    limit_filter = LimitFilter()\n\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        self.enable_filter()\n\n    def disable_filter(self):\n        self.removeFilter(LimitLogger.limit_filter)\n\n    def enable_filter(self):\n        self.addFilter(LimitLogger.limit_filter)\n\n\nclass FatalLogger(LimitLogger):\n    warnings_fatal = False\n    errors_fatal = False\n\n    def warning(self, *args, stacklevel=1, **kwargs):\n        \"\"\"\n        Displays a logging warning.\n\n        Wrapping it here allows Pelican to filter warnings, and conditionally\n        make warnings fatal.\n\n        Args:\n            stacklevel (int): the stacklevel that would be used to display the\n            calling location, except for this function. Adjusting the\n            stacklevel allows you to see the \"true\" calling location of the\n            warning, rather than this wrapper location.\n        \"\"\"\n        stacklevel += 1\n        super().warning(*args, stacklevel=stacklevel, **kwargs)\n        if FatalLogger.warnings_fatal:\n            raise RuntimeError(\"Warning encountered\")\n\n    def error(self, *args, stacklevel=1, **kwargs):\n        \"\"\"\n        Displays a logging error.\n\n        Wrapping it here allows Pelican to filter errors, and conditionally\n        make errors non-fatal.\n\n        Args:\n            stacklevel (int): the stacklevel that would be used to display the\n            calling location, except for this function. Adjusting the\n            stacklevel allows you to see the \"true\" calling location of the\n            error, rather than this wrapper location.\n        \"\"\"\n        stacklevel += 1\n        super().error(*args, stacklevel=stacklevel, **kwargs)\n        if FatalLogger.errors_fatal:\n            raise RuntimeError(\"Error encountered\")\n\n\nlogging.setLoggerClass(FatalLogger)\n# force root logger to be of our preferred class\nlogging.getLogger().__class__ = FatalLogger\n\nDEFAULT_LOG_HANDLER = RichHandler(console=console)\n\n\ndef init(\n    level=None,\n    fatal=\"\",\n    handler=DEFAULT_LOG_HANDLER,\n    name=None,\n    logs_dedup_min_level=None,\n):\n    FatalLogger.warnings_fatal = fatal.startswith(\"warning\")\n    FatalLogger.errors_fatal = bool(fatal)\n\n    LOG_FORMAT = \"%(message)s\"\n    logging.basicConfig(\n        level=level,\n        format=LOG_FORMAT,\n        datefmt=\"[%H:%M:%S]\",\n        handlers=[handler] if handler else [],\n    )\n\n    logger = logging.getLogger(name)\n\n    if level:\n        logger.setLevel(level)\n    if logs_dedup_min_level:\n        LimitFilter.LOGS_DEDUP_MIN_LEVEL = logs_dedup_min_level\n\n\ndef log_warnings():\n    logging.captureWarnings(True)\n    warnings.simplefilter(\"default\", DeprecationWarning)\n    init(logging.DEBUG, name=\"py.warnings\")\n\n\nif __name__ == \"__main__\":\n    init(level=logging.DEBUG, name=__name__)\n\n    root_logger = logging.getLogger(__name__)\n    root_logger.debug(\"debug\")\n    root_logger.info(\"info\")\n    root_logger.warning(\"warning\")\n    root_logger.error(\"error\")\n    root_logger.critical(\"critical\")\n"
  },
  {
    "path": "pelican/paginator.py",
    "content": "import functools\nimport logging\nimport os\nfrom collections import namedtuple\nfrom math import ceil\n\nlogger = logging.getLogger(__name__)\nPaginationRule = namedtuple(  # noqa: PYI024\n    \"PaginationRule\",\n    \"min_page URL SAVE_AS\",\n)\n\n\nclass Paginator:\n    def __init__(self, name, url, object_list, settings, per_page=None):\n        self.name = name\n        self.url = url\n        self.object_list = object_list\n        self.settings = settings\n        if per_page:\n            self.per_page = per_page\n            self.orphans = settings[\"DEFAULT_ORPHANS\"]\n        else:\n            self.per_page = len(object_list)\n            self.orphans = 0\n\n        self._num_pages = self._count = None\n\n    def page(self, number):\n        \"Returns a Page object for the given 1-based page number.\"\n        bottom = (number - 1) * self.per_page\n        top = bottom + self.per_page\n        if top + self.orphans >= self.count:\n            top = self.count\n        return Page(\n            self.name,\n            self.url,\n            self.object_list[bottom:top],\n            number,\n            self,\n            self.settings,\n        )\n\n    def _get_count(self):\n        \"Returns the total number of objects, across all pages.\"\n        if self._count is None:\n            self._count = len(self.object_list)\n        return self._count\n\n    count = property(_get_count)\n\n    def _get_num_pages(self):\n        \"Returns the total number of pages.\"\n        if self._num_pages is None:\n            hits = max(1, self.count - self.orphans)\n            self._num_pages = ceil(hits / (float(self.per_page) or 1))\n        return self._num_pages\n\n    num_pages = property(_get_num_pages)\n\n    def _get_page_range(self):\n        \"\"\"\n        Returns a 1-based range of pages for iterating through within\n        a template for loop.\n        \"\"\"\n        return list(range(1, self.num_pages + 1))\n\n    page_range = property(_get_page_range)\n\n\nclass Page:\n    def __init__(self, name, url, object_list, number, paginator, settings):\n        self.full_name = name\n        self.name, self.extension = os.path.splitext(name)\n        dn, fn = os.path.split(name)\n        self.base_name = dn if fn in (\"index.htm\", \"index.html\") else self.name\n        self.base_url = url\n        self.object_list = object_list\n        self.number = number\n        self.paginator = paginator\n        self.settings = settings\n\n    def __repr__(self):\n        return f\"<Page {self.number} of {self.paginator.num_pages}>\"\n\n    def has_next(self):\n        return self.number < self.paginator.num_pages\n\n    def has_previous(self):\n        return self.number > 1\n\n    def has_other_pages(self):\n        return self.has_previous() or self.has_next()\n\n    def next_page_number(self):\n        return self.number + 1\n\n    def previous_page_number(self):\n        return self.number - 1\n\n    def start_index(self):\n        \"\"\"\n        Returns the 1-based index of the first object on this page,\n        relative to total objects in the paginator.\n        \"\"\"\n        # Special case, return zero if no items.\n        if self.paginator.count == 0:\n            return 0\n        return (self.paginator.per_page * (self.number - 1)) + 1\n\n    def end_index(self):\n        \"\"\"\n        Returns the 1-based index of the last object on this page,\n        relative to total objects found (hits).\n        \"\"\"\n        # Special case for the last page because there can be orphans.\n        if self.number == self.paginator.num_pages:\n            return self.paginator.count\n        return self.number * self.paginator.per_page\n\n    def _from_settings(self, key):\n        \"\"\"Returns URL information as defined in settings. Similar to\n        URLWrapper._from_settings, but specialized to deal with pagination\n        logic.\"\"\"\n\n        rule = None\n\n        # find the last matching pagination rule\n        for p in self.settings[\"PAGINATION_PATTERNS\"]:\n            if p.min_page == -1:\n                if not self.has_next():\n                    rule = p\n                    break\n            elif p.min_page <= self.number:\n                rule = p\n\n        if not rule:\n            return \"\"\n\n        prop_value = getattr(rule, key)\n\n        if not isinstance(prop_value, str):\n            logger.warning(\"%s is set to %s\", key, prop_value)\n            return prop_value\n\n        # URL or SAVE_AS is a string, format it with a controlled context\n        context = {\n            \"save_as\": self.full_name,\n            \"url\": self.base_url,\n            \"name\": self.name,\n            \"base_name\": self.base_name,\n            \"extension\": self.extension,\n            \"number\": self.number,\n        }\n\n        ret = prop_value.format(**context)\n        # Remove a single leading slash, if any. This is done for backwards\n        # compatibility reasons. If a leading slash is needed (for URLs\n        # relative to server root or absolute URLs without the scheme such as\n        # //blog.my.site/), it can be worked around by prefixing the pagination\n        # pattern by an additional slash (which then gets removed, preserving\n        # the other slashes). This also means the following code *can't* be\n        # changed to lstrip() because that would remove all leading slashes and\n        # thus make the workaround impossible. See\n        # test_custom_pagination_pattern() for a verification of this.\n        if ret.startswith(\"/\"):\n            ret = ret[1:]\n        return ret\n\n    url = property(functools.partial(_from_settings, key=\"URL\"))\n    save_as = property(functools.partial(_from_settings, key=\"SAVE_AS\"))\n"
  },
  {
    "path": "pelican/plugins/_utils.py",
    "content": "import importlib\nimport importlib.machinery\nimport importlib.util\nimport inspect\nimport logging\nimport pkgutil\nimport sys\n\nlogger = logging.getLogger(__name__)\n\n\ndef iter_namespace(ns_pkg):\n    # Specifying the second argument (prefix) to iter_modules makes the\n    # returned name an absolute name instead of a relative one. This allows\n    # import_module to work without having to do additional modification to\n    # the name.\n    return pkgutil.iter_modules(ns_pkg.__path__, ns_pkg.__name__ + \".\")\n\n\ndef get_namespace_plugins(ns_pkg=None):\n    if ns_pkg is None:\n        import pelican.plugins as ns_pkg  # noqa: PLC0415\n\n    return {\n        name: importlib.import_module(name)\n        for finder, name, ispkg in iter_namespace(ns_pkg)\n        if ispkg\n    }\n\n\ndef list_plugins(ns_pkg=None):\n    from pelican.log import init as init_logging  # noqa: PLC0415\n\n    init_logging(logging.INFO)\n    ns_plugins = get_namespace_plugins(ns_pkg)\n    if ns_plugins:\n        logger.info(\"Plugins found:\\n\" + \"\\n\".join(ns_plugins))\n    else:\n        logger.info(\"No plugins are installed\")\n\n\ndef plugin_enabled(name, plugin_list=None):\n    if plugin_list is None or not plugin_list:\n        # no plugins are loaded\n        return False\n\n    if name in plugin_list:\n        # search name as is\n        return True\n\n    if f\"pelican.plugins.{name}\" in plugin_list:\n        # check if short name is a namespace plugin\n        return True\n\n    return False\n\n\ndef load_legacy_plugin(plugin, plugin_paths):\n    if \".\" in plugin:\n        # it is in a package, try to resolve package first\n        package, _, _ = plugin.rpartition(\".\")\n        load_legacy_plugin(package, plugin_paths)\n\n    # Try to find plugin in PLUGIN_PATHS\n    spec = importlib.machinery.PathFinder.find_spec(plugin, plugin_paths)\n    if spec is None:\n        # If failed, try to find it in normal importable locations\n        spec = importlib.util.find_spec(plugin)\n    if spec is None:\n        raise ImportError(f\"Cannot import plugin `{plugin}`\")\n    else:\n        # Avoid loading the same plugin twice\n        if spec.name in sys.modules:\n            return sys.modules[spec.name]\n        # create module object from spec\n        mod = importlib.util.module_from_spec(spec)\n        # place it into sys.modules cache\n        # necessary if module imports itself at some point (e.g. packages)\n        sys.modules[spec.name] = mod\n        try:\n            # try to execute it inside module object\n            spec.loader.exec_module(mod)\n        except Exception:  # problem with import\n            try:\n                # remove module from sys.modules since it can't be loaded\n                del sys.modules[spec.name]\n            except KeyError:\n                pass\n            raise\n\n        # if all went well, we have the plugin module\n        return mod\n\n\ndef load_plugins(settings):\n    logger.debug(\"Finding namespace plugins\")\n    namespace_plugins = get_namespace_plugins()\n    if namespace_plugins:\n        logger.debug(\"Namespace plugins found:\\n\" + \"\\n\".join(namespace_plugins))\n    plugins = []\n    if settings.get(\"PLUGINS\") is not None:\n        for plugin in settings[\"PLUGINS\"]:\n            if isinstance(plugin, str):\n                logger.debug(\"Loading plugin `%s`\", plugin)\n                # try to find in namespace plugins\n                if plugin in namespace_plugins:\n                    plugin = namespace_plugins[plugin]\n                elif f\"pelican.plugins.{plugin}\" in namespace_plugins:\n                    plugin = namespace_plugins[f\"pelican.plugins.{plugin}\"]\n                # try to import it\n                else:\n                    try:\n                        plugin = load_legacy_plugin(\n                            plugin, settings.get(\"PLUGIN_PATHS\", [])\n                        )\n                    except ImportError as e:\n                        logger.error(\"Cannot load plugin `%s`\\n%s\", plugin, e)\n                        continue\n            plugins.append(plugin)\n    else:\n        plugins = list(namespace_plugins.values())\n\n    return plugins\n\n\ndef get_plugin_name(plugin):\n    \"\"\"\n    Plugins can be passed as module objects, however this breaks caching as\n    module objects cannot be pickled. To work around this, all plugins are\n    stringified post-initialization.\n    \"\"\"\n    if inspect.isclass(plugin):\n        return plugin.__qualname__\n\n    if inspect.ismodule(plugin):\n        return plugin.__name__\n\n    return type(plugin).__qualname__\n"
  },
  {
    "path": "pelican/plugins/signals.py",
    "content": "from blinker import Signal, signal\nfrom ordered_set import OrderedSet\n\n# Signals will call functions in the order of connection, i.e. plugin order\nSignal.set_class = OrderedSet\n\n# Run-level signals:\n\ninitialized = signal(\"pelican_initialized\")\nget_generators = signal(\"get_generators\")\nall_generators_finalized = signal(\"all_generators_finalized\")\nget_writer = signal(\"get_writer\")\nfinalized = signal(\"pelican_finalized\")\n\n# Reader-level signals\n\nreaders_init = signal(\"readers_init\")\n\n# Generator-level signals\n\ngenerator_init = signal(\"generator_init\")\n\narticle_generator_init = signal(\"article_generator_init\")\narticle_generator_pretaxonomy = signal(\"article_generator_pretaxonomy\")\narticle_generator_finalized = signal(\"article_generator_finalized\")\narticle_generator_write_article = signal(\"article_generator_write_article\")\narticle_writer_finalized = signal(\"article_writer_finalized\")\n\npage_generator_init = signal(\"page_generator_init\")\npage_generator_finalized = signal(\"page_generator_finalized\")\npage_generator_write_page = signal(\"page_generator_write_page\")\npage_writer_finalized = signal(\"page_writer_finalized\")\n\nstatic_generator_init = signal(\"static_generator_init\")\nstatic_generator_finalized = signal(\"static_generator_finalized\")\n\n# Page-level signals\n\narticle_generator_preread = signal(\"article_generator_preread\")\narticle_generator_context = signal(\"article_generator_context\")\n\npage_generator_preread = signal(\"page_generator_preread\")\npage_generator_context = signal(\"page_generator_context\")\n\nstatic_generator_preread = signal(\"static_generator_preread\")\nstatic_generator_context = signal(\"static_generator_context\")\n\ncontent_object_init = signal(\"content_object_init\")\n\n# Writers signals\ncontent_written = signal(\"content_written\")\nfeed_generated = signal(\"feed_generated\")\nfeed_written = signal(\"feed_written\")\n"
  },
  {
    "path": "pelican/readers.py",
    "content": "import datetime\nimport logging\nimport os\nimport re\nfrom collections import OrderedDict\nfrom html import escape\nfrom html.parser import HTMLParser\nfrom io import StringIO\n\nimport docutils\nimport docutils.core\nimport docutils.io\nfrom docutils.parsers.rst.languages import get_language as get_docutils_lang\nfrom docutils.writers.html4css1 import HTMLTranslator, Writer\n\nfrom pelican import rstdirectives  # NOQA\nfrom pelican.cache import FileStampDataCacher\nfrom pelican.contents import Author, Category, Page, SkipStub, Tag\nfrom pelican.plugins import signals\nfrom pelican.utils import file_suffix, get_date, pelican_open, posixize_path\n\ntry:\n    from markdown import Markdown\nexcept ImportError:\n    Markdown = False\n\n# Metadata processors have no way to discard an unwanted value, so we have\n# them return this value instead to signal that it should be discarded later.\n# This means that _filter_discardable_metadata() must be called on processed\n# metadata dicts before use, to remove the items with the special value.\n_DISCARD = object()\n\nDUPLICATES_DEFINITIONS_ALLOWED = {\n    \"tags\": False,\n    \"date\": False,\n    \"modified\": False,\n    \"status\": False,\n    \"category\": False,\n    \"author\": False,\n    \"save_as\": False,\n    \"url\": False,\n    \"authors\": False,\n    \"slug\": False,\n}\n\nMETADATA_PROCESSORS = {\n    \"tags\": lambda x, y: ([Tag(tag, y) for tag in ensure_metadata_list(x)] or _DISCARD),\n    \"date\": lambda x, _y: get_date(x.replace(\"_\", \" \")),\n    \"modified\": lambda x, _y: get_date(x),\n    \"status\": lambda x, _y: x.strip() or _DISCARD,\n    \"category\": lambda x, y: _process_if_nonempty(Category, x, y),\n    \"author\": lambda x, y: _process_if_nonempty(Author, x, y),\n    \"authors\": lambda x, y: (\n        [Author(author, y) for author in ensure_metadata_list(x)] or _DISCARD\n    ),\n    \"slug\": lambda x, _y: x.strip() or _DISCARD,\n}\n\nlogger = logging.getLogger(__name__)\n\n\ndef ensure_metadata_list(text):\n    \"\"\"Canonicalize the format of a list of authors or tags.  This works\n    the same way as Docutils' \"authors\" field: if it's already a list,\n    those boundaries are preserved; otherwise, it must be a string;\n    if the string contains semicolons, it is split on semicolons;\n    otherwise, it is split on commas.  This allows you to write\n    author lists in either \"Jane Doe, John Doe\" or \"Doe, Jane; Doe, John\"\n    format.\n\n    Regardless, all list items undergo .strip() before returning, and\n    empty items are discarded.\n    \"\"\"\n    if isinstance(text, str):\n        if \";\" in text:\n            text = text.split(\";\")\n        else:\n            text = text.split(\",\")\n\n    return list(OrderedDict.fromkeys([v for v in (w.strip() for w in text) if v]))\n\n\ndef _process_if_nonempty(processor, name, settings):\n    \"\"\"Removes extra whitespace from name and applies a metadata processor.\n    If name is empty or all whitespace, returns _DISCARD instead.\n    \"\"\"\n    name = name.strip()\n    return processor(name, settings) if name else _DISCARD\n\n\ndef _filter_discardable_metadata(metadata):\n    \"\"\"Return a copy of a dict, minus any items marked as discardable.\"\"\"\n    return {name: val for name, val in metadata.items() if val is not _DISCARD}\n\n\nclass BaseReader:\n    \"\"\"Base class to read files.\n\n    This class is used to process static files, and it can be inherited for\n    other types of file. A Reader class must have the following attributes:\n\n    - enabled: (boolean) tell if the Reader class is enabled. It\n      generally depends on the import of some dependency.\n    - file_extensions: a list of file extensions that the Reader will process.\n    - extensions: a list of extensions to use in the reader (typical use is\n      Markdown).\n\n    \"\"\"\n\n    enabled = True\n    file_extensions = [\"static\"]\n    extensions = None\n\n    def __init__(self, settings):\n        self.settings = settings\n\n    def process_metadata(self, name, value):\n        if name in METADATA_PROCESSORS:\n            return METADATA_PROCESSORS[name](value, self.settings)\n        return value\n\n    def read(self, source_path):\n        \"No-op parser\"\n        del source_path  # Unused argument\n        content = None\n        metadata = {}\n        return content, metadata\n\n    def disabled_message(self) -> str:\n        \"\"\"Message about why this plugin was disabled.\"\"\"\n        return \"\"\n\n\nclass _FieldBodyTranslator(HTMLTranslator):\n    def __init__(self, document):\n        super().__init__(document)\n        self.compact_p = None\n\n    def astext(self):\n        return \"\".join(self.body)\n\n    def visit_field_body(self, node):\n        pass\n\n    def depart_field_body(self, node):\n        pass\n\n\ndef render_node_to_html(document, node, field_body_translator_class):\n    visitor = field_body_translator_class(document)\n    node.walkabout(visitor)\n    return visitor.astext()\n\n\nclass PelicanHTMLWriter(Writer):\n    def __init__(self):\n        super().__init__()\n        self.translator_class = PelicanHTMLTranslator\n\n\nclass PelicanHTMLTranslator(HTMLTranslator):\n    def visit_abbreviation(self, node):\n        attrs = {}\n        if node.hasattr(\"explanation\"):\n            attrs[\"title\"] = node[\"explanation\"]\n        self.body.append(self.starttag(node, \"abbr\", \"\", **attrs))\n\n    def depart_abbreviation(self, node):\n        del node  # Unused argument\n        self.body.append(\"</abbr>\")\n\n    def visit_image(self, node):\n        # set an empty alt if alt is not specified\n        # avoids that alt is taken from src\n        node[\"alt\"] = node.get(\"alt\", \"\")\n        return HTMLTranslator.visit_image(self, node)\n\n\nclass RstReader(BaseReader):\n    \"\"\"Reader for reStructuredText files\n\n    By default the output HTML is written using\n    docutils.writers.html4css1.Writer and translated using a subclass of\n    docutils.writers.html4css1.HTMLTranslator. If you want to override it with\n    your own writer/translator (e.g. a HTML5-based one), pass your classes to\n    these two attributes. Look in the source code for details.\n\n        writer_class                    Used for writing contents\n        field_body_translator_class     Used for translating metadata such\n            as article summary\n\n    \"\"\"\n\n    enabled = bool(docutils)\n    file_extensions = [\"rst\"]\n\n    writer_class = PelicanHTMLWriter\n    field_body_translator_class = _FieldBodyTranslator\n\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n\n        lang_code = self.settings.get(\"DEFAULT_LANG\", \"en\")\n        if get_docutils_lang(lang_code):\n            self._language_code = lang_code\n        else:\n            logger.warning(\n                \"Docutils has no localization for '%s'. Using 'en' instead.\",\n                lang_code,\n            )\n            self._language_code = \"en\"\n\n    def _parse_metadata(self, document, source_path):\n        \"\"\"Return the dict containing document metadata\"\"\"\n        formatted_fields = self.settings[\"FORMATTED_FIELDS\"]\n\n        output = {}\n\n        if document.first_child_matching_class(docutils.nodes.title) is None:\n            logger.warning(\n                \"Document title missing in file %s: \"\n                \"Ensure exactly one top level section\",\n                source_path,\n            )\n\n        try:\n            # docutils 0.18.1+\n            nodes = document.findall(docutils.nodes.docinfo)\n        except AttributeError:\n            # docutils 0.18.0 or before\n            nodes = document.traverse(docutils.nodes.docinfo)\n\n        for docinfo in nodes:\n            for element in docinfo.children:\n                if element.tagname == \"field\":  # custom fields (e.g. summary)\n                    name_elem, body_elem = element.children\n                    name = name_elem.astext()\n                    if name.lower() in formatted_fields:\n                        value = render_node_to_html(\n                            document, body_elem, self.field_body_translator_class\n                        )\n                    else:\n                        value = body_elem.astext()\n                elif element.tagname == \"authors\":  # author list\n                    name = element.tagname\n                    value = [element.astext() for element in element.children]\n                else:  # standard fields (e.g. address)\n                    name = element.tagname\n                    value = element.astext()\n                name = name.lower()\n\n                output[name] = self.process_metadata(name, value)\n        return output\n\n    def _get_publisher(self, source_path):\n        extra_params = {\n            \"initial_header_level\": \"2\",\n            \"syntax_highlight\": \"short\",\n            \"input_encoding\": \"utf-8\",\n            \"language_code\": self._language_code,\n            \"halt_level\": 2,\n            \"traceback\": True,\n            \"warning_stream\": StringIO(),\n            \"embed_stylesheet\": False,\n        }\n        user_params = self.settings.get(\"DOCUTILS_SETTINGS\")\n        if user_params:\n            extra_params.update(user_params)\n\n        pub = docutils.core.Publisher(\n            reader=\"standalone\",\n            parser=\"restructuredtext\",\n            writer=self.writer_class(),\n            destination_class=docutils.io.StringOutput,\n        )\n        pub.process_programmatic_settings(None, extra_params, None)\n        pub.set_source(source_path=source_path)\n        pub.publish()\n        return pub\n\n    def read(self, source_path):\n        \"\"\"Parses restructured text\"\"\"\n        pub = self._get_publisher(source_path)\n        parts = pub.writer.parts\n        content = parts.get(\"body\")\n\n        metadata = self._parse_metadata(pub.document, source_path)\n        metadata.setdefault(\"title\", parts.get(\"title\"))\n\n        return content, metadata\n\n\nclass MarkdownReader(BaseReader):\n    \"\"\"Reader for Markdown files\"\"\"\n\n    enabled = bool(Markdown)\n    file_extensions = [\"md\", \"markdown\", \"mkd\", \"mdown\"]\n\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        settings = self.settings[\"MARKDOWN\"]\n        settings.setdefault(\"extension_configs\", {})\n        settings.setdefault(\"extensions\", [])\n        for extension in settings[\"extension_configs\"].keys():\n            if extension not in settings[\"extensions\"]:\n                settings[\"extensions\"].append(extension)\n        if \"markdown.extensions.meta\" not in settings[\"extensions\"]:\n            settings[\"extensions\"].append(\"markdown.extensions.meta\")\n        self._source_path = None\n\n    def _parse_metadata(self, meta):\n        \"\"\"Return the dict containing document metadata\"\"\"\n        formatted_fields = self.settings[\"FORMATTED_FIELDS\"]\n\n        # prevent metadata extraction in fields\n        self._md.preprocessors.deregister(\"meta\")\n\n        output = {}\n        for name, value in meta.items():\n            name = name.lower()\n            if name in formatted_fields:\n                # formatted metadata is special case and join all list values\n                formatted_values = \"\\n\".join(value)\n                # reset the markdown instance to clear any state\n                self._md.reset()\n                formatted = self._md.convert(formatted_values)\n                output[name] = self.process_metadata(name, formatted)\n            elif not DUPLICATES_DEFINITIONS_ALLOWED.get(name, True):\n                if len(value) > 1:\n                    logger.warning(\n                        \"Duplicate definition of `%s` for %s. Using first one.\",\n                        name,\n                        self._source_path,\n                    )\n                output[name] = self.process_metadata(name, value[0])\n            elif len(value) > 1:\n                # handle list metadata as list of string\n                output[name] = self.process_metadata(name, value)\n            else:\n                # otherwise, handle metadata as single string\n                output[name] = self.process_metadata(name, value[0])\n        return output\n\n    def read(self, source_path):\n        \"\"\"Parse content and metadata of markdown files\"\"\"\n\n        self._source_path = source_path\n        self._md = Markdown(**self.settings[\"MARKDOWN\"])\n        with pelican_open(source_path) as text:\n            content = self._md.convert(text)\n\n        if hasattr(self._md, \"Meta\"):\n            metadata = self._parse_metadata(self._md.Meta)\n        else:\n            metadata = {}\n        return content, metadata\n\n    def disabled_message(self) -> str:\n        return (\n            \"Could not import 'markdown.Markdown'. \"\n            \"Have you installed the 'markdown' package?\"\n        )\n\n\nclass HTMLReader(BaseReader):\n    \"\"\"Parses HTML files as input, looking for meta, title, and body tags\"\"\"\n\n    file_extensions = [\"htm\", \"html\"]\n    enabled = True\n\n    class _HTMLParser(HTMLParser):\n        def __init__(self, settings, filename):\n            super().__init__(convert_charrefs=False)\n            self.body = \"\"\n            self.metadata = {}\n            self.settings = settings\n\n            self._data_buffer = \"\"\n\n            self._filename = filename\n\n            self._in_top_level = True\n            self._in_head = False\n            self._in_title = False\n            self._in_body = False\n            self._in_tags = False\n\n        def handle_starttag(self, tag, attrs):\n            if tag == \"head\" and self._in_top_level:\n                self._in_top_level = False\n                self._in_head = True\n            elif tag == \"title\" and self._in_head:\n                self._in_title = True\n                self._data_buffer = \"\"\n            elif tag == \"body\" and self._in_top_level:\n                self._in_top_level = False\n                self._in_body = True\n                self._data_buffer = \"\"\n            elif tag == \"meta\" and self._in_head:\n                self._handle_meta_tag(attrs)\n\n            elif self._in_body:\n                self._data_buffer += self.build_tag(tag, attrs, False)\n\n        def handle_endtag(self, tag):\n            if tag == \"head\":\n                if self._in_head:\n                    self._in_head = False\n                    self._in_top_level = True\n            elif self._in_head and tag == \"title\":\n                self._in_title = False\n                self.metadata[\"title\"] = self._data_buffer\n            elif tag == \"body\":\n                self.body = self._data_buffer\n                self._in_body = False\n                self._in_top_level = True\n            elif self._in_body:\n                self._data_buffer += f\"</{escape(tag)}>\"\n\n        def handle_startendtag(self, tag, attrs):\n            if tag == \"meta\" and self._in_head:\n                self._handle_meta_tag(attrs)\n            if self._in_body:\n                self._data_buffer += self.build_tag(tag, attrs, True)\n\n        def handle_comment(self, data):\n            self._data_buffer += f\"<!--{data}-->\"\n\n        def handle_data(self, data):\n            self._data_buffer += data\n\n        def handle_entityref(self, data):\n            self._data_buffer += f\"&{data};\"\n\n        def handle_charref(self, data):\n            self._data_buffer += f\"&#{data};\"\n\n        def build_tag(self, tag, attrs, close_tag):\n            result = f\"<{escape(tag)}\"\n            for k, v in attrs:\n                result += \" \" + escape(k)\n                if v is not None:\n                    # If the attribute value contains a double quote, surround\n                    # with single quotes, otherwise use double quotes.\n                    if '\"' in v:\n                        result += f\"='{escape(v, quote=False)}'\"\n                    else:\n                        result += f'=\"{escape(v, quote=False)}\"'\n            if close_tag:\n                return result + \" />\"\n            return result + \">\"\n\n        def _handle_meta_tag(self, attrs):\n            name = self._attr_value(attrs, \"name\")\n            if name is None:\n                attr_list = [f'{k}=\"{v}\"' for k, v in attrs]\n                attr_serialized = \", \".join(attr_list)\n                logger.warning(\n                    \"Meta tag in file %s does not have a 'name' \"\n                    \"attribute, skipping. Attributes: %s\",\n                    self._filename,\n                    attr_serialized,\n                )\n                return\n            name = name.lower()\n            contents = self._attr_value(attrs, \"content\", \"\")\n            if not contents:\n                contents = self._attr_value(attrs, \"contents\", \"\")\n                if contents:\n                    logger.warning(\n                        \"Meta tag attribute 'contents' used in file %s, should\"\n                        \" be changed to 'content'\",\n                        self._filename,\n                        extra={\n                            \"limit_msg\": \"Other files have meta tag \"\n                            \"attribute 'contents' that should \"\n                            \"be changed to 'content'\"\n                        },\n                    )\n\n            if name == \"keywords\":\n                name = \"tags\"\n\n            if name in self.metadata:\n                # if this metadata already exists (i.e. a previous tag with the\n                # same name has already been specified then either convert to\n                # list or append to list\n                if isinstance(self.metadata[name], list):\n                    self.metadata[name].append(contents)\n                else:\n                    self.metadata[name] = [self.metadata[name], contents]\n            else:\n                self.metadata[name] = contents\n\n        @classmethod\n        def _attr_value(cls, attrs, name, default=None):\n            return next((x[1] for x in attrs if x[0] == name), default)\n\n    def read(self, filename):\n        \"\"\"Parse content and metadata of HTML files\"\"\"\n        with pelican_open(filename) as content:\n            parser = self._HTMLParser(self.settings, filename)\n            parser.feed(content)\n            parser.close()\n\n        metadata = {}\n        for k in parser.metadata:\n            metadata[k] = self.process_metadata(k, parser.metadata[k])\n        return parser.body, metadata\n\n\nclass Readers(FileStampDataCacher):\n    \"\"\"Interface for all readers.\n\n    This class contains a mapping of file extensions / Reader classes, to know\n    which Reader class must be used to read a file (based on its extension).\n    This is customizable both with the 'READERS' setting, and with the\n    'readers_init' signall for plugins.\n\n    \"\"\"\n\n    def __init__(self, settings=None, cache_name=\"\"):\n        self.settings = settings or {}\n        self.readers = {}\n        self.disabled_readers = {}\n        # extension => reader for readers that are enabled\n        self.reader_classes = {}\n        # extension => reader for readers that are not enabled\n        disabled_reader_classes = {}\n\n        for cls in [BaseReader] + BaseReader.__subclasses__():\n            if not cls.enabled:\n                logger.debug(\n                    \"Missing dependencies for %s\", \", \".join(cls.file_extensions)\n                )\n\n            for ext in cls.file_extensions:\n                if cls.enabled:\n                    self.reader_classes[ext] = cls\n                else:\n                    disabled_reader_classes[ext] = cls\n\n        if self.settings[\"READERS\"]:\n            self.reader_classes.update(self.settings[\"READERS\"])\n\n        signals.readers_init.send(self)\n\n        for fmt, reader_class in self.reader_classes.items():\n            if not reader_class:\n                continue\n\n            self.readers[fmt] = reader_class(self.settings)\n\n        for fmt, reader_class in disabled_reader_classes.items():\n            self.disabled_readers[fmt] = reader_class(self.settings)\n\n        # set up caching\n        cache_this_level = (\n            cache_name != \"\" and self.settings[\"CONTENT_CACHING_LAYER\"] == \"reader\"\n        )\n        caching_policy = cache_this_level and self.settings[\"CACHE_CONTENT\"]\n        load_policy = cache_this_level and self.settings[\"LOAD_CONTENT_CACHE\"]\n        super().__init__(settings, cache_name, caching_policy, load_policy)\n\n    @property\n    def extensions(self):\n        \"\"\"File extensions that will be processed by a reader.\"\"\"\n        return self.readers.keys()\n\n    @property\n    def disabled_extensions(self):\n        return self.disabled_readers.keys()\n\n    def read_file(\n        self,\n        base_path,\n        path,\n        content_class=Page,\n        fmt=None,\n        context=None,\n        preread_signal=None,\n        preread_sender=None,\n        context_signal=None,\n        context_sender=None,\n    ):\n        \"\"\"Return a content object parsed with the given format.\"\"\"\n\n        path = os.path.abspath(os.path.join(base_path, path))\n        source_path = posixize_path(os.path.relpath(path, base_path))\n        logger.debug(\"Read file %s -> %s\", source_path, content_class.__name__)\n\n        if not fmt:\n            fmt = file_suffix(path)\n\n        if fmt not in self.readers:\n            raise TypeError(\"Pelican does not know how to parse %s\", path)\n\n        if preread_signal:\n            logger.debug(\"Signal %s.send(%s)\", preread_signal.name, preread_sender)\n            preread_signal.send(preread_sender)\n\n        reader = self.readers[fmt]\n\n        metadata = _filter_discardable_metadata(\n            default_metadata(settings=self.settings, process=reader.process_metadata)\n        )\n        metadata.update(\n            path_metadata(\n                full_path=path, source_path=source_path, settings=self.settings\n            )\n        )\n        metadata.update(\n            _filter_discardable_metadata(\n                parse_path_metadata(\n                    source_path=source_path,\n                    settings=self.settings,\n                    process=reader.process_metadata,\n                )\n            )\n        )\n        reader_name = reader.__class__.__name__\n        metadata[\"reader\"] = reader_name.replace(\"Reader\", \"\").lower()\n\n        content, reader_metadata = self.get_cached_data(path, (None, None))\n        if content is None:\n            content, reader_metadata = reader.read(path)\n            reader_metadata = _filter_discardable_metadata(reader_metadata)\n            self.cache_data(path, (content, reader_metadata))\n        metadata.update(reader_metadata)\n\n        if content:\n            # find images with empty alt\n            find_empty_alt(content, path)\n\n        # eventually filter the content with typogrify if asked so\n        if self.settings[\"TYPOGRIFY\"]:\n            # typogrify is an optional feature, user may not have it installed\n            import smartypants  # noqa: PLC0415\n            from typogrify.filters import typogrify  # noqa: PLC0415\n\n            typogrify_dashes = self.settings[\"TYPOGRIFY_DASHES\"]\n            if typogrify_dashes == \"oldschool\":\n                smartypants.Attr.default = smartypants.Attr.set2\n            elif typogrify_dashes == \"oldschool_inverted\":\n                smartypants.Attr.default = smartypants.Attr.set3\n            else:\n                smartypants.Attr.default = smartypants.Attr.set1\n\n            # Tell `smartypants` to also replace &quot; HTML entities with\n            # smart quotes. This is necessary because Docutils has already\n            # replaced double quotes with said entities by the time we run\n            # this filter.\n            smartypants.Attr.default |= smartypants.Attr.w\n\n            def typogrify_wrapper(text):\n                \"\"\"Ensure compatibility with older versions of Typogrify.\n\n                The 'TYPOGRIFY_IGNORE_TAGS' and/or 'TYPOGRIFY_OMIT_FILTERS'\n                settings will be ignored if the installed version of Typogrify\n                doesn't have the corresponding features.\"\"\"\n                try:\n                    return typogrify(\n                        text,\n                        self.settings[\"TYPOGRIFY_IGNORE_TAGS\"],\n                        **dict.fromkeys(self.settings[\"TYPOGRIFY_OMIT_FILTERS\"], False),\n                    )\n                except TypeError:\n                    try:\n                        typogrify(text, self.settings[\"TYPOGRIFY_IGNORE_TAGS\"])\n                    except TypeError:\n                        return typogrify(text)\n\n            if content:\n                content = typogrify_wrapper(content)\n\n            if \"title\" in metadata:\n                metadata[\"title\"] = typogrify_wrapper(metadata[\"title\"])\n\n            if \"summary\" in metadata:\n                metadata[\"summary\"] = typogrify_wrapper(metadata[\"summary\"])\n\n        if context_signal:\n            logger.debug(\n                \"Signal %s.send(%s, <metadata>)\", context_signal.name, context_sender\n            )\n            context_signal.send(context_sender, metadata=metadata)\n\n        if metadata.get(\"status\") == \"skip\":\n            content_class = SkipStub\n\n        return content_class(\n            content=content,\n            metadata=metadata,\n            settings=self.settings,\n            source_path=path,\n            context=context,\n        )\n\n    def check_file(self, source_path: str) -> None:\n        \"\"\"Log a warning if a file is processed by a disabled reader.\"\"\"\n        reader = self.disabled_readers.get(file_suffix(source_path), None)\n        if reader:\n            logger.warning(f\"{source_path}: {reader.disabled_message()}\")\n\n\ndef find_empty_alt(content, path):\n    \"\"\"Find images with empty alt\n\n    Create warnings for all images with empty alt (up to a certain number),\n    as they are really likely to be accessibility flaws.\n\n    \"\"\"\n    imgs = re.compile(\n        r\"\"\"\n        (?:\n            # src before alt\n            <img\n            [^\\>]*\n            src=(['\"])(.*?)\\1\n            [^\\>]*\n            alt=(['\"])\\3\n        )|(?:\n            # alt before src\n            <img\n            [^\\>]*\n            alt=(['\"])\\4\n            [^\\>]*\n            src=(['\"])(.*?)\\5\n        )\n        \"\"\",\n        re.X,\n    )\n    for match in re.findall(imgs, content):\n        logger.warning(\n            \"Empty alt attribute for image %s in %s\",\n            os.path.basename(match[1] + match[5]),\n            path,\n            extra={\"limit_msg\": \"Other images have empty alt attributes\"},\n        )\n\n\ndef default_metadata(settings=None, process=None):\n    metadata = {}\n    if settings:\n        for name, value in dict(settings.get(\"DEFAULT_METADATA\", {})).items():\n            if process:\n                value = process(name, value)\n            metadata[name] = value\n        if \"DEFAULT_CATEGORY\" in settings:\n            value = settings[\"DEFAULT_CATEGORY\"]\n            if process:\n                value = process(\"category\", value)\n            metadata[\"category\"] = value\n        if settings.get(\"DEFAULT_DATE\", None) and settings[\"DEFAULT_DATE\"] != \"fs\":\n            if isinstance(settings[\"DEFAULT_DATE\"], str):\n                metadata[\"date\"] = get_date(settings[\"DEFAULT_DATE\"])\n            else:\n                metadata[\"date\"] = datetime.datetime(*settings[\"DEFAULT_DATE\"])\n    return metadata\n\n\ndef path_metadata(full_path, source_path, settings=None):\n    metadata = {}\n    if settings:\n        if settings.get(\"DEFAULT_DATE\", None) == \"fs\":\n            metadata[\"date\"] = datetime.datetime.fromtimestamp(\n                os.stat(full_path).st_mtime\n            )\n            metadata[\"modified\"] = metadata[\"date\"]\n\n        # Apply EXTRA_PATH_METADATA for the source path and the paths of any\n        # parent directories. Sorting EPM first ensures that the most specific\n        # path wins conflicts.\n\n        epm = settings.get(\"EXTRA_PATH_METADATA\", {})\n        for path, meta in sorted(epm.items()):\n            # Enforce a trailing slash when checking for parent directories.\n            # This prevents false positives when one file or directory's name\n            # is a prefix of another's.\n            dirpath = posixize_path(os.path.join(path, \"\"))\n            if source_path == path or source_path.startswith(dirpath):\n                metadata.update(meta)\n\n    return metadata\n\n\ndef parse_path_metadata(source_path, settings=None, process=None):\n    r\"\"\"Extract a metadata dictionary from a file's path\n\n    >>> import pprint\n    >>> settings = {\n    ...     'FILENAME_METADATA': r'(?P<slug>[^.]*).*',\n    ...     'PATH_METADATA':\n    ...         r'(?P<category>[^/]*)/(?P<date>\\d{4}-\\d{2}-\\d{2})/.*',\n    ...     }\n    >>> reader = BaseReader(settings=settings)\n    >>> metadata = parse_path_metadata(\n    ...     source_path='my-cat/2013-01-01/my-slug.html',\n    ...     settings=settings,\n    ...     process=reader.process_metadata)\n    >>> pprint.pprint(metadata)  # doctest: +ELLIPSIS\n    {'category': <pelican.urlwrappers.Category object at ...>,\n     'date': datetime.datetime(2013, 1, 1, 0, 0),\n     'slug': 'my-slug'}\n    \"\"\"\n    metadata = {}\n    dirname, basename = os.path.split(source_path)\n    base, ext = os.path.splitext(basename)\n    subdir = os.path.basename(dirname)\n    if settings:\n        checks = []\n        for key, data in [(\"FILENAME_METADATA\", base), (\"PATH_METADATA\", source_path)]:\n            checks.append((settings.get(key, None), data))\n        if settings.get(\"USE_FOLDER_AS_CATEGORY\", None):\n            checks.append((\"(?P<category>.*)\", subdir))\n        for regexp, data in checks:\n            if regexp and data:\n                match = re.match(regexp, data)\n                if match:\n                    # .items() for py3k compat.\n                    for k, v in match.groupdict().items():\n                        k = k.lower()  # metadata must be lowercase\n                        if v is not None and k not in metadata:\n                            if process:\n                                v = process(k, v)\n                            metadata[k] = v\n    return metadata\n"
  },
  {
    "path": "pelican/rstdirectives.py",
    "content": "import re\n\nfrom docutils import nodes, utils\nfrom docutils.parsers.rst import Directive, directives, roles\nfrom pygments import highlight\nfrom pygments.formatters import HtmlFormatter\nfrom pygments.lexers import TextLexer, get_lexer_by_name\n\nimport pelican.settings as pys\n\n\nclass Pygments(Directive):\n    \"\"\"Source code syntax highlighting.\"\"\"\n\n    required_arguments = 1\n    optional_arguments = 0\n    final_argument_whitespace = True\n    option_spec = {\n        \"anchorlinenos\": directives.flag,\n        \"classprefix\": directives.unchanged,\n        \"hl_lines\": directives.unchanged,\n        \"lineanchors\": directives.unchanged,\n        \"linenos\": directives.unchanged,\n        \"linenospecial\": directives.nonnegative_int,\n        \"linenostart\": directives.nonnegative_int,\n        \"linenostep\": directives.nonnegative_int,\n        \"lineseparator\": directives.unchanged,\n        \"linespans\": directives.unchanged,\n        \"nobackground\": directives.flag,\n        \"nowrap\": directives.flag,\n        \"tagsfile\": directives.unchanged,\n        \"tagurlformat\": directives.unchanged,\n    }\n    has_content = True\n\n    def run(self):\n        self.assert_has_content()\n        try:\n            lexer = get_lexer_by_name(self.arguments[0])\n        except ValueError:\n            # no lexer found - use the text one instead of an exception\n            lexer = TextLexer()\n\n        # Fetch the defaults\n        if pys.PYGMENTS_RST_OPTIONS is not None:\n            for k, v in pys.PYGMENTS_RST_OPTIONS.items():\n                # Locally set options overrides the defaults\n                if k not in self.options:\n                    self.options[k] = v\n\n        if \"linenos\" in self.options and self.options[\"linenos\"] not in (\n            \"table\",\n            \"inline\",\n        ):\n            if self.options[\"linenos\"] == \"none\":\n                self.options.pop(\"linenos\")\n            else:\n                self.options[\"linenos\"] = \"table\"\n\n        for flag in (\"nowrap\", \"nobackground\", \"anchorlinenos\"):\n            if flag in self.options:\n                self.options[flag] = True\n\n        # noclasses should already default to False, but just in case...\n        formatter = HtmlFormatter(noclasses=False, **self.options)\n        parsed = highlight(\"\\n\".join(self.content), lexer, formatter)\n        return [nodes.raw(\"\", parsed, format=\"html\")]\n\n\ndirectives.register_directive(\"code-block\", Pygments)\ndirectives.register_directive(\"sourcecode\", Pygments)\n\n\n_abbr_re = re.compile(r\"\\((.*)\\)$\", re.DOTALL)\n\n\nclass abbreviation(nodes.Inline, nodes.TextElement):\n    pass\n\n\ndef abbr_role(typ, rawtext, text, lineno, inliner, options=None, content=None):\n    del typ, rawtext, lineno, inliner, options, content  # Unused arguments\n    text = utils.unescape(text)\n    m = _abbr_re.search(text)\n    if m is None:\n        return [abbreviation(text, text)], []\n    abbr = text[: m.start()].strip()\n    expl = m.group(1)\n    return [abbreviation(abbr, abbr, explanation=expl)], []\n\n\nroles.register_local_role(\"abbr\", abbr_role)\n"
  },
  {
    "path": "pelican/server.py",
    "content": "import argparse\nimport logging\nimport os\nimport posixpath\nimport ssl\nimport sys\nimport urllib\nfrom http import server\n\ntry:\n    from magic import from_file as magic_from_file\nexcept ImportError:\n    magic_from_file = None\n\nfrom pelican.log import console  # noqa: F401\nfrom pelican.log import init as init_logging\n\nlogger = logging.getLogger(__name__)\n\n\ndef parse_arguments():\n    parser = argparse.ArgumentParser(\n        description=\"Pelican Development Server\",\n        formatter_class=argparse.ArgumentDefaultsHelpFormatter,\n    )\n    parser.add_argument(\n        \"port\", default=8000, type=int, nargs=\"?\", help=\"Port to Listen On\"\n    )\n    parser.add_argument(\"server\", default=\"\", nargs=\"?\", help=\"Interface to Listen On\")\n    parser.add_argument(\"--ssl\", action=\"store_true\", help=\"Activate SSL listener\")\n    parser.add_argument(\n        \"--cert\",\n        default=\"./cert.pem\",\n        nargs=\"?\",\n        help=\"Path to certificate file. Relative to current directory\",\n    )\n    parser.add_argument(\n        \"--key\",\n        default=\"./key.pem\",\n        nargs=\"?\",\n        help=\"Path to certificate key file. Relative to current directory\",\n    )\n    parser.add_argument(\n        \"--path\",\n        default=\".\",\n        help=\"Path to pelican source directory to serve. Relative to current directory\",\n    )\n    return parser.parse_args()\n\n\nclass ComplexHTTPRequestHandler(server.SimpleHTTPRequestHandler):\n    SUFFIXES = [\".html\", \"/index.html\", \"/\", \"\"]\n\n    extensions_map = {\n        **server.SimpleHTTPRequestHandler.extensions_map,\n        # web fonts\n        \".oft\": \"font/oft\",\n        \".sfnt\": \"font/sfnt\",\n        \".ttf\": \"font/ttf\",\n        \".woff\": \"font/woff\",\n        \".woff2\": \"font/woff2\",\n    }\n\n    def translate_path(self, path):\n        # abandon query parameters\n        path = path.split(\"?\", 1)[0]\n        path = path.split(\"#\", 1)[0]\n        # Don't forget explicit trailing slash when normalizing. Issue17324\n        trailing_slash = path.rstrip().endswith(\"/\")\n        path = urllib.parse.unquote(path)\n        path = posixpath.normpath(path)\n        words = path.split(\"/\")\n        words = filter(None, words)\n        path = self.base_path\n        for word in words:\n            if os.path.dirname(word) or word in (os.curdir, os.pardir):\n                # Ignore components that are not a simple file/directory name\n                continue\n            path = os.path.join(path, word)\n        if trailing_slash:\n            path += \"/\"\n        return path\n\n    def do_GET(self):\n        # cut off a query string\n        original_path = self.path.split(\"?\", 1)[0]\n        # try to find file\n        self.path = self.get_path_that_exists(original_path)\n\n        if not self.path:\n            return\n\n        server.SimpleHTTPRequestHandler.do_GET(self)\n\n    def get_path_that_exists(self, original_path):\n        # Try to strip trailing slash\n        trailing_slash = original_path.endswith(\"/\")\n        original_path = original_path.rstrip(\"/\")\n        # Try to detect file by applying various suffixes\n        tries = []\n        for suffix in self.SUFFIXES:\n            if not trailing_slash and suffix == \"/\":\n                # if original request does not have trailing slash, skip the '/' suffix\n                # so that base class can redirect if needed\n                continue\n            path = original_path + suffix\n            if os.path.exists(self.translate_path(path)):\n                return path\n            tries.append(path)\n        logger.warning(\n            \"Unable to find `%s` or variations:\\n%s\", original_path, \"\\n\".join(tries)\n        )\n        return None\n\n    def guess_type(self, path):\n        \"\"\"Guess at the mime type for the specified file.\"\"\"\n        mimetype = server.SimpleHTTPRequestHandler.guess_type(self, path)\n\n        # If the default guess is too generic, try the python-magic library\n        if mimetype == \"application/octet-stream\" and magic_from_file:\n            mimetype = magic_from_file(path, mime=True)\n\n        return mimetype\n\n    def log_message(self, msg_format, *args):\n        logger.info(msg_format, *args)\n\n\nclass RootedHTTPServer(server.HTTPServer):\n    def __init__(self, base_path, *args, **kwargs):\n        server.HTTPServer.__init__(self, *args, **kwargs)\n        self.RequestHandlerClass.base_path = base_path\n\n\nif __name__ == \"__main__\":\n    init_logging(level=logging.INFO)\n    logger.warning(\n        \"'python -m pelican.server' is deprecated.\\nThe \"\n        \"Pelican development server should be run via \"\n        \"'pelican --listen' or 'pelican -l'.\\nThis can be combined \"\n        \"with regeneration as 'pelican -lr'.\\nRerun 'pelican-\"\n        \"quickstart' to get new Makefile and tasks.py files.\"\n    )\n    args = parse_arguments()\n    RootedHTTPServer.allow_reuse_address = True\n    try:\n        httpd = RootedHTTPServer(\n            args.path, (args.server, args.port), ComplexHTTPRequestHandler\n        )\n        if args.ssl:\n            httpd.socket = ssl.wrap_socket(\n                httpd.socket, keyfile=args.key, certfile=args.cert, server_side=True\n            )\n    except ssl.SSLError as e:\n        logger.error(\n            \"Couldn't open certificate file %s or key file %s\", args.cert, args.key\n        )\n        logger.error(\"Could not listen on port %s, server %s.\", args.port, args.server)\n        sys.exit(getattr(e, \"exitcode\", 1))\n\n    logger.info(\"Serving at port %s, server %s.\", args.port, args.server)\n    try:\n        httpd.serve_forever()\n    except KeyboardInterrupt:\n        logger.info(\"Shutting down server.\")\n        httpd.socket.close()\n"
  },
  {
    "path": "pelican/settings.py",
    "content": "import copy\nimport importlib.util\nimport inspect\nimport locale\nimport logging\nimport os\nimport re\nimport sys\nfrom os.path import isabs\nfrom pathlib import Path\nfrom types import ModuleType\nfrom typing import Any\n\nfrom pelican.log import LimitFilter\nfrom pelican.paginator import PaginationRule\n\n\ndef load_source(name: str, path: str) -> ModuleType:\n    spec = importlib.util.spec_from_file_location(name, path)\n    mod = importlib.util.module_from_spec(spec)\n    sys.modules[name] = mod\n    spec.loader.exec_module(mod)\n    return mod\n\n\nlogger = logging.getLogger(__name__)\n\nSettings = dict[str, Any]\n\nDEFAULT_THEME = os.path.join(\n    os.path.dirname(os.path.abspath(__file__)), \"themes\", \"notmyidea\"\n)\nDEFAULT_CONFIG = {\n    \"PATH\": os.curdir,\n    \"ARTICLE_PATHS\": [\"\"],\n    \"ARTICLE_EXCLUDES\": [],\n    \"PAGE_PATHS\": [\"pages\"],\n    \"PAGE_EXCLUDES\": [],\n    \"THEME\": DEFAULT_THEME,\n    \"OUTPUT_PATH\": \"output\",\n    \"READERS\": {},\n    \"STATIC_PATHS\": [\"images\"],\n    \"STATIC_EXCLUDES\": [],\n    \"STATIC_EXCLUDE_SOURCES\": True,\n    \"THEME_STATIC_DIR\": \"theme\",\n    \"THEME_STATIC_PATHS\": [\n        \"static\",\n    ],\n    \"FEED_ALL_ATOM\": \"feeds/all.atom.xml\",\n    \"CATEGORY_FEED_ATOM\": \"feeds/{slug}.atom.xml\",\n    \"AUTHOR_FEED_ATOM\": \"feeds/{slug}.atom.xml\",\n    \"AUTHOR_FEED_RSS\": \"feeds/{slug}.rss.xml\",\n    \"TRANSLATION_FEED_ATOM\": \"feeds/all-{lang}.atom.xml\",\n    \"FEED_MAX_ITEMS\": 100,\n    \"RSS_FEED_SUMMARY_ONLY\": True,\n    \"FEED_APPEND_REF\": False,\n    \"SITEURL\": \"\",\n    \"SITENAME\": \"A Pelican Blog\",\n    \"DISPLAY_PAGES_ON_MENU\": True,\n    \"DISPLAY_CATEGORIES_ON_MENU\": True,\n    \"DOCUTILS_SETTINGS\": {},\n    \"OUTPUT_SOURCES\": False,\n    \"OUTPUT_SOURCES_EXTENSION\": \".text\",\n    \"USE_FOLDER_AS_CATEGORY\": True,\n    \"DEFAULT_CATEGORY\": \"misc\",\n    \"WITH_FUTURE_DATES\": True,\n    \"CSS_FILE\": \"main.css\",\n    \"NEWEST_FIRST_ARCHIVES\": True,\n    \"REVERSE_CATEGORY_ORDER\": False,\n    \"DELETE_OUTPUT_DIRECTORY\": False,\n    \"OUTPUT_RETENTION\": [],\n    \"INDEX_SAVE_AS\": \"index.html\",\n    \"ARTICLE_URL\": \"{slug}.html\",\n    \"ARTICLE_SAVE_AS\": \"{slug}.html\",\n    \"ARTICLE_ORDER_BY\": \"reversed-date\",\n    \"ARTICLE_LANG_URL\": \"{slug}-{lang}.html\",\n    \"ARTICLE_LANG_SAVE_AS\": \"{slug}-{lang}.html\",\n    \"DRAFT_URL\": \"drafts/{slug}.html\",\n    \"DRAFT_SAVE_AS\": \"drafts/{slug}.html\",\n    \"DRAFT_LANG_URL\": \"drafts/{slug}-{lang}.html\",\n    \"DRAFT_LANG_SAVE_AS\": \"drafts/{slug}-{lang}.html\",\n    \"PAGE_URL\": \"pages/{slug}.html\",\n    \"PAGE_SAVE_AS\": \"pages/{slug}.html\",\n    \"PAGE_ORDER_BY\": \"basename\",\n    \"PAGE_LANG_URL\": \"pages/{slug}-{lang}.html\",\n    \"PAGE_LANG_SAVE_AS\": \"pages/{slug}-{lang}.html\",\n    \"DRAFT_PAGE_URL\": \"drafts/pages/{slug}.html\",\n    \"DRAFT_PAGE_SAVE_AS\": \"drafts/pages/{slug}.html\",\n    \"DRAFT_PAGE_LANG_URL\": \"drafts/pages/{slug}-{lang}.html\",\n    \"DRAFT_PAGE_LANG_SAVE_AS\": \"drafts/pages/{slug}-{lang}.html\",\n    \"STATIC_URL\": \"{path}\",\n    \"STATIC_SAVE_AS\": \"{path}\",\n    \"STATIC_CREATE_LINKS\": False,\n    \"STATIC_CHECK_IF_MODIFIED\": False,\n    \"CATEGORY_URL\": \"category/{slug}.html\",\n    \"CATEGORY_SAVE_AS\": \"category/{slug}.html\",\n    \"TAG_URL\": \"tag/{slug}.html\",\n    \"TAG_SAVE_AS\": \"tag/{slug}.html\",\n    \"AUTHOR_URL\": \"author/{slug}.html\",\n    \"AUTHOR_SAVE_AS\": \"author/{slug}.html\",\n    \"PAGINATION_PATTERNS\": [\n        (1, \"{name}{extension}\", \"{name}{extension}\"),\n        (2, \"{name}{number}{extension}\", \"{name}{number}{extension}\"),\n    ],\n    \"YEAR_ARCHIVE_URL\": \"\",\n    \"YEAR_ARCHIVE_SAVE_AS\": \"\",\n    \"MONTH_ARCHIVE_URL\": \"\",\n    \"MONTH_ARCHIVE_SAVE_AS\": \"\",\n    \"DAY_ARCHIVE_URL\": \"\",\n    \"DAY_ARCHIVE_SAVE_AS\": \"\",\n    \"RELATIVE_URLS\": False,\n    \"DEFAULT_LANG\": \"en\",\n    \"ARTICLE_TRANSLATION_ID\": \"slug\",\n    \"PAGE_TRANSLATION_ID\": \"slug\",\n    \"DIRECT_TEMPLATES\": [\"index\", \"tags\", \"categories\", \"authors\", \"archives\"],\n    \"THEME_TEMPLATES_OVERRIDES\": [],\n    \"PAGINATED_TEMPLATES\": {\n        \"index\": None,\n        \"tag\": None,\n        \"category\": None,\n        \"author\": None,\n    },\n    \"PELICAN_CLASS\": \"pelican.Pelican\",\n    \"DEFAULT_DATE_FORMAT\": \"%a %d %B %Y\",\n    \"DATE_FORMATS\": {},\n    \"MARKDOWN\": {\n        \"extension_configs\": {\n            \"markdown.extensions.codehilite\": {\"css_class\": \"highlight\"},\n            \"markdown.extensions.extra\": {},\n            \"markdown.extensions.meta\": {},\n        },\n        \"output_format\": \"html5\",\n    },\n    \"JINJA_FILTERS\": {},\n    \"JINJA_GLOBALS\": {},\n    \"JINJA_TESTS\": {},\n    \"JINJA_ENVIRONMENT\": {\n        \"trim_blocks\": True,\n        \"lstrip_blocks\": True,\n        \"extensions\": [],\n    },\n    \"LOG_FILTER\": [],\n    \"LOCALE\": [\"\"],  # defaults to user locale\n    \"DEFAULT_PAGINATION\": False,\n    \"DEFAULT_ORPHANS\": 0,\n    \"DEFAULT_METADATA\": {},\n    \"FILENAME_METADATA\": r\"(?P<date>\\d{4}-\\d{2}-\\d{2}).*\",\n    \"PATH_METADATA\": r\"\",\n    \"EXTRA_PATH_METADATA\": {},\n    \"ARTICLE_PERMALINK_STRUCTURE\": \"\",\n    \"TYPOGRIFY\": False,\n    \"TYPOGRIFY_IGNORE_TAGS\": [],\n    \"TYPOGRIFY_OMIT_FILTERS\": [],\n    \"TYPOGRIFY_DASHES\": \"default\",\n    \"SUMMARY_END_SUFFIX\": \"…\",\n    \"SUMMARY_MAX_LENGTH\": 50,\n    \"PLUGIN_PATHS\": [],\n    \"PLUGINS\": None,\n    \"PYGMENTS_RST_OPTIONS\": {},\n    \"TEMPLATE_PAGES\": {},\n    \"TEMPLATE_EXTENSIONS\": [\".html\"],\n    \"IGNORE_FILES\": [\"**/.*\"],\n    \"SLUG_REGEX_SUBSTITUTIONS\": [\n        (r\"[^\\w\\s-]\", \"\"),  # remove non-alphabetical/whitespace/'-' chars\n        (r\"(?u)\\A\\s*\", \"\"),  # strip leading whitespace\n        (r\"(?u)\\s*\\Z\", \"\"),  # strip trailing whitespace\n        (r\"[-\\s]+\", \"-\"),  # reduce multiple whitespace or '-' to single '-'\n    ],\n    \"INTRASITE_LINK_REGEX\": \"[{|](?P<what>.*?)[|}]\",\n    \"SLUGIFY_SOURCE\": \"title\",\n    \"SLUGIFY_USE_UNICODE\": False,\n    \"SLUGIFY_PRESERVE_CASE\": False,\n    \"CACHE_CONTENT\": False,\n    \"CONTENT_CACHING_LAYER\": \"reader\",\n    \"CACHE_PATH\": \"cache\",\n    \"GZIP_CACHE\": True,\n    \"CHECK_MODIFIED_METHOD\": \"mtime\",\n    \"LOAD_CONTENT_CACHE\": False,\n    \"FORMATTED_FIELDS\": [\"summary\"],\n    \"PORT\": 8000,\n    \"BIND\": \"127.0.0.1\",\n}\n\nPYGMENTS_RST_OPTIONS = None\n\n\ndef read_settings(\n    path: str | None = None, override: Settings | None = None\n) -> Settings:\n    settings = override or {}\n\n    if path:\n        settings = dict(get_settings_from_file(path), **settings)\n\n    if settings:\n        settings = handle_deprecated_settings(settings)\n\n    if path:\n        # Make relative paths absolute\n        def getabs(maybe_relative, base_path=path):\n            if isabs(maybe_relative):\n                return maybe_relative\n            return os.path.abspath(\n                os.path.normpath(\n                    os.path.join(os.path.dirname(base_path), maybe_relative)\n                )\n            )\n\n        for p in [\"PATH\", \"OUTPUT_PATH\", \"THEME\", \"CACHE_PATH\"]:\n            if settings.get(p) is not None:\n                absp = getabs(settings[p])\n                # THEME may be a name rather than a path\n                if p != \"THEME\" or os.path.exists(absp):\n                    settings[p] = absp\n\n        if settings.get(\"PLUGIN_PATHS\") is not None:\n            settings[\"PLUGIN_PATHS\"] = [\n                getabs(pluginpath) for pluginpath in settings[\"PLUGIN_PATHS\"]\n            ]\n\n    settings = dict(copy.deepcopy(DEFAULT_CONFIG), **settings)\n    settings = configure_settings(settings)\n\n    # This is because there doesn't seem to be a way to pass extra\n    # parameters to docutils directive handlers, so we have to have a\n    # variable here that we'll import from within Pygments.run (see\n    # rstdirectives.py) to see what the user defaults were.\n    global PYGMENTS_RST_OPTIONS  # noqa: PLW0603\n    PYGMENTS_RST_OPTIONS = settings.get(\"PYGMENTS_RST_OPTIONS\", None)\n    return settings\n\n\ndef get_settings_from_module(module: ModuleType | None = None) -> Settings:\n    \"\"\"Loads settings from a module, returns a dictionary.\"\"\"\n\n    context = {}\n    if module is not None:\n        context.update((k, v) for k, v in inspect.getmembers(module) if k.isupper())\n    return context\n\n\ndef get_settings_from_file(path: str) -> Settings:\n    \"\"\"Loads settings from a file path, returning a dict.\"\"\"\n\n    name, ext = os.path.splitext(os.path.basename(path))\n    module = load_source(name, path)\n    return get_settings_from_module(module)\n\n\ndef get_jinja_environment(settings: Settings) -> Settings:\n    \"\"\"Sets the environment for Jinja\"\"\"\n\n    jinja_env = settings.setdefault(\n        \"JINJA_ENVIRONMENT\", DEFAULT_CONFIG[\"JINJA_ENVIRONMENT\"]\n    )\n\n    # Make sure we include the defaults if the user has set env variables\n    for key, value in DEFAULT_CONFIG[\"JINJA_ENVIRONMENT\"].items():\n        if key not in jinja_env:\n            jinja_env[key] = value\n\n    return settings\n\n\ndef _printf_s_to_format_field(printf_string: str, format_field: str) -> str:\n    \"\"\"Tries to replace %s with {format_field} in the provided printf_string.\n    Raises ValueError in case of failure.\n    \"\"\"\n    TEST_STRING = \"PELICAN_PRINTF_S_DEPRECATION\"\n    expected = printf_string % TEST_STRING\n\n    result = printf_string.replace(\"{\", \"{{\").replace(\"}\", \"}}\") % f\"{{{format_field}}}\"\n    if result.format(**{format_field: TEST_STRING}) != expected:\n        raise ValueError(f\"Failed to safely replace %s with {{{format_field}}}\")\n\n    return result\n\n\ndef handle_deprecated_settings(settings: Settings) -> Settings:\n    \"\"\"Converts deprecated settings and issues warnings. Issues an exception\n    if both old and new setting is specified.\n    \"\"\"\n\n    # PLUGIN_PATH -> PLUGIN_PATHS\n    if \"PLUGIN_PATH\" in settings:\n        logger.warning(\n            \"PLUGIN_PATH setting has been replaced by \"\n            \"PLUGIN_PATHS, moving it to the new setting name.\"\n        )\n        settings[\"PLUGIN_PATHS\"] = settings[\"PLUGIN_PATH\"]\n        del settings[\"PLUGIN_PATH\"]\n\n    # PLUGIN_PATHS: str -> [str]\n    if isinstance(settings.get(\"PLUGIN_PATHS\"), str):\n        logger.warning(\n            \"Defining PLUGIN_PATHS setting as string \"\n            \"has been deprecated (should be a list)\"\n        )\n        settings[\"PLUGIN_PATHS\"] = [settings[\"PLUGIN_PATHS\"]]\n\n    # JINJA_EXTENSIONS -> JINJA_ENVIRONMENT > extensions\n    if \"JINJA_EXTENSIONS\" in settings:\n        logger.warning(\n            \"JINJA_EXTENSIONS setting has been deprecated, \"\n            \"moving it to JINJA_ENVIRONMENT setting.\"\n        )\n        settings[\"JINJA_ENVIRONMENT\"][\"extensions\"] = settings[\"JINJA_EXTENSIONS\"]\n        del settings[\"JINJA_EXTENSIONS\"]\n\n    # {ARTICLE,PAGE}_DIR -> {ARTICLE,PAGE}_PATHS\n    for key in [\"ARTICLE\", \"PAGE\"]:\n        old_key = key + \"_DIR\"\n        new_key = key + \"_PATHS\"\n        if old_key in settings:\n            logger.warning(\n                \"Deprecated setting %s, moving it to %s list\", old_key, new_key\n            )\n            settings[new_key] = [settings[old_key]]  # also make a list\n            del settings[old_key]\n\n    # EXTRA_TEMPLATES_PATHS -> THEME_TEMPLATES_OVERRIDES\n    if \"EXTRA_TEMPLATES_PATHS\" in settings:\n        logger.warning(\n            \"EXTRA_TEMPLATES_PATHS is deprecated use THEME_TEMPLATES_OVERRIDES instead.\"\n        )\n        if settings.get(\"THEME_TEMPLATES_OVERRIDES\"):\n            raise Exception(\n                \"Setting both EXTRA_TEMPLATES_PATHS and \"\n                \"THEME_TEMPLATES_OVERRIDES is not permitted. Please move to \"\n                \"only setting THEME_TEMPLATES_OVERRIDES.\"\n            )\n        settings[\"THEME_TEMPLATES_OVERRIDES\"] = settings[\"EXTRA_TEMPLATES_PATHS\"]\n        del settings[\"EXTRA_TEMPLATES_PATHS\"]\n\n    # MD_EXTENSIONS -> MARKDOWN\n    if \"MD_EXTENSIONS\" in settings:\n        logger.warning(\n            \"MD_EXTENSIONS is deprecated use MARKDOWN \"\n            \"instead. Falling back to the default.\"\n        )\n        settings[\"MARKDOWN\"] = DEFAULT_CONFIG[\"MARKDOWN\"]\n\n    # LESS_GENERATOR -> Webassets plugin\n    # FILES_TO_COPY -> STATIC_PATHS, EXTRA_PATH_METADATA\n    for old, new, doc in [\n        (\"LESS_GENERATOR\", \"the Webassets plugin\", None),\n        (\n            \"FILES_TO_COPY\",\n            \"STATIC_PATHS and EXTRA_PATH_METADATA\",\n            \"https://github.com/getpelican/pelican/\"\n            \"blob/main/docs/settings.rst#path-metadata\",\n        ),\n    ]:\n        if old in settings:\n            message = f\"The {old} setting has been removed in favor of {new}\"\n            if doc:\n                message += f\", see {doc} for details\"\n            logger.warning(message)\n\n    # PAGINATED_DIRECT_TEMPLATES -> PAGINATED_TEMPLATES\n    if \"PAGINATED_DIRECT_TEMPLATES\" in settings:\n        message = \"The {} setting has been removed in favor of {}\".format(\n            \"PAGINATED_DIRECT_TEMPLATES\", \"PAGINATED_TEMPLATES\"\n        )\n        logger.warning(message)\n\n        # set PAGINATED_TEMPLATES\n        if \"PAGINATED_TEMPLATES\" not in settings:\n            settings[\"PAGINATED_TEMPLATES\"] = {\n                \"tag\": None,\n                \"category\": None,\n                \"author\": None,\n            }\n\n        for t in settings[\"PAGINATED_DIRECT_TEMPLATES\"]:\n            if t not in settings[\"PAGINATED_TEMPLATES\"]:\n                settings[\"PAGINATED_TEMPLATES\"][t] = None\n        del settings[\"PAGINATED_DIRECT_TEMPLATES\"]\n\n    # {SLUG,CATEGORY,TAG,AUTHOR}_SUBSTITUTIONS ->\n    # {SLUG,CATEGORY,TAG,AUTHOR}_REGEX_SUBSTITUTIONS\n    url_settings_url = \"http://docs.getpelican.com/en/latest/settings.html#url-settings\"\n    flavours = {\"SLUG\", \"CATEGORY\", \"TAG\", \"AUTHOR\"}\n    old_values = {\n        f: settings[f + \"_SUBSTITUTIONS\"]\n        for f in flavours\n        if f + \"_SUBSTITUTIONS\" in settings\n    }\n    new_values = {\n        f: settings[f + \"_REGEX_SUBSTITUTIONS\"]\n        for f in flavours\n        if f + \"_REGEX_SUBSTITUTIONS\" in settings\n    }\n    if old_values and new_values:\n        raise Exception(\n            \"Setting both {new_key} and {old_key} (or variants thereof) is \"\n            \"not permitted. Please move to only setting {new_key}.\".format(\n                old_key=\"SLUG_SUBSTITUTIONS\", new_key=\"SLUG_REGEX_SUBSTITUTIONS\"\n            )\n        )\n    if old_values:\n        message = (\n            \"{} and variants thereof are deprecated and will be \"\n            \"removed in the future. Please use {} and variants thereof \"\n            \"instead. Check {}.\".format(\n                \"SLUG_SUBSTITUTIONS\", \"SLUG_REGEX_SUBSTITUTIONS\", url_settings_url\n            )\n        )\n        logger.warning(message)\n        if old_values.get(\"SLUG\"):\n            for f in (\"CATEGORY\", \"TAG\"):\n                if old_values.get(f):\n                    old_values[f] = old_values[\"SLUG\"] + old_values[f]\n            old_values[\"AUTHOR\"] = old_values.get(\"AUTHOR\", [])\n        for f in flavours:\n            if old_values.get(f) is not None:\n                regex_subs = []\n                # by default will replace non-alphanum characters\n                replace = True\n                for tpl in old_values[f]:\n                    try:\n                        src, dst, skip = tpl\n                        if skip:\n                            replace = False\n                    except ValueError:\n                        src, dst = tpl\n                    regex_subs.append((re.escape(src), dst.replace(\"\\\\\", r\"\\\\\")))\n\n                if replace:\n                    regex_subs += [\n                        (r\"[^\\w\\s-]\", \"\"),\n                        (r\"(?u)\\A\\s*\", \"\"),\n                        (r\"(?u)\\s*\\Z\", \"\"),\n                        (r\"[-\\s]+\", \"-\"),\n                    ]\n                else:\n                    regex_subs += [\n                        (r\"(?u)\\A\\s*\", \"\"),\n                        (r\"(?u)\\s*\\Z\", \"\"),\n                    ]\n                settings[f + \"_REGEX_SUBSTITUTIONS\"] = regex_subs\n            settings.pop(f + \"_SUBSTITUTIONS\", None)\n\n    # `%s` -> '{slug}` or `{lang}` in FEED settings\n    for key in [\"TRANSLATION_FEED_ATOM\", \"TRANSLATION_FEED_RSS\"]:\n        if (\n            settings.get(key)\n            and not isinstance(settings[key], Path)\n            and \"%s\" in settings[key]\n        ):\n            logger.warning(\"%%s usage in %s is deprecated, use {lang} instead.\", key)\n            try:\n                settings[key] = _printf_s_to_format_field(settings[key], \"lang\")\n            except ValueError:\n                logger.warning(\n                    \"Failed to convert %%s to {lang} for %s. Falling back to default.\",\n                    key,\n                )\n                settings[key] = DEFAULT_CONFIG[key]\n    for key in [\n        \"AUTHOR_FEED_ATOM\",\n        \"AUTHOR_FEED_RSS\",\n        \"CATEGORY_FEED_ATOM\",\n        \"CATEGORY_FEED_RSS\",\n        \"TAG_FEED_ATOM\",\n        \"TAG_FEED_RSS\",\n    ]:\n        if (\n            settings.get(key)\n            and not isinstance(settings[key], Path)\n            and \"%s\" in settings[key]\n        ):\n            logger.warning(\"%%s usage in %s is deprecated, use {slug} instead.\", key)\n            try:\n                settings[key] = _printf_s_to_format_field(settings[key], \"slug\")\n            except ValueError:\n                logger.warning(\n                    \"Failed to convert %%s to {slug} for %s. Falling back to default.\",\n                    key,\n                )\n                settings[key] = DEFAULT_CONFIG[key]\n\n    # CLEAN_URLS\n    if settings.get(\"CLEAN_URLS\", False):\n        logger.warning(\n            \"Found deprecated `CLEAN_URLS` in settings.\"\n            \" Modifying the following settings for the\"\n            \" same behaviour.\"\n        )\n\n        settings[\"ARTICLE_URL\"] = \"{slug}/\"\n        settings[\"ARTICLE_LANG_URL\"] = \"{slug}-{lang}/\"\n        settings[\"PAGE_URL\"] = \"pages/{slug}/\"\n        settings[\"PAGE_LANG_URL\"] = \"pages/{slug}-{lang}/\"\n\n        for setting in (\"ARTICLE_URL\", \"ARTICLE_LANG_URL\", \"PAGE_URL\", \"PAGE_LANG_URL\"):\n            logger.warning(\"%s = '%s'\", setting, settings[setting])\n\n    # AUTORELOAD_IGNORE_CACHE -> --ignore-cache\n    if settings.get(\"AUTORELOAD_IGNORE_CACHE\"):\n        logger.warning(\n            \"Found deprecated `AUTORELOAD_IGNORE_CACHE` in \"\n            \"settings. Use --ignore-cache instead.\"\n        )\n        settings.pop(\"AUTORELOAD_IGNORE_CACHE\")\n\n    # ARTICLE_PERMALINK_STRUCTURE\n    if settings.get(\"ARTICLE_PERMALINK_STRUCTURE\", False):\n        logger.warning(\n            \"Found deprecated `ARTICLE_PERMALINK_STRUCTURE` in\"\n            \" settings.  Modifying the following settings for\"\n            \" the same behaviour.\"\n        )\n\n        structure = settings[\"ARTICLE_PERMALINK_STRUCTURE\"]\n\n        # Convert %(variable) into {variable}.\n        structure = re.sub(r\"%\\((\\w+)\\)s\", r\"{\\g<1>}\", structure)\n\n        # Convert %x into {date:%x} for strftime\n        structure = re.sub(r\"(%[A-z])\", r\"{date:\\g<1>}\", structure)\n\n        # Strip a / prefix\n        structure = re.sub(\"^/\", \"\", structure)\n\n        for setting in (\n            \"ARTICLE_URL\",\n            \"ARTICLE_LANG_URL\",\n            \"PAGE_URL\",\n            \"PAGE_LANG_URL\",\n            \"DRAFT_URL\",\n            \"DRAFT_LANG_URL\",\n            \"ARTICLE_SAVE_AS\",\n            \"ARTICLE_LANG_SAVE_AS\",\n            \"DRAFT_SAVE_AS\",\n            \"DRAFT_LANG_SAVE_AS\",\n            \"PAGE_SAVE_AS\",\n            \"PAGE_LANG_SAVE_AS\",\n        ):\n            settings[setting] = os.path.join(structure, settings[setting])\n            logger.warning(\"%s = '%s'\", setting, settings[setting])\n\n    # {,TAG,CATEGORY,TRANSLATION}_FEED -> {,TAG,CATEGORY,TRANSLATION}_FEED_ATOM\n    for new, old in [\n        (\"FEED\", \"FEED_ATOM\"),\n        (\"TAG_FEED\", \"TAG_FEED_ATOM\"),\n        (\"CATEGORY_FEED\", \"CATEGORY_FEED_ATOM\"),\n        (\"TRANSLATION_FEED\", \"TRANSLATION_FEED_ATOM\"),\n    ]:\n        if settings.get(new, False):\n            logger.warning(\n                \"Found deprecated `%(new)s` in settings. Modify %(new)s \"\n                \"to %(old)s in your settings and theme for the same \"\n                \"behavior. Temporarily setting %(old)s for backwards \"\n                \"compatibility.\",\n                {\"new\": new, \"old\": old},\n            )\n            settings[old] = settings[new]\n\n    # Warn if removed WRITE_SELECTED is present\n    if \"WRITE_SELECTED\" in settings:\n        logger.warning(\n            \"WRITE_SELECTED is present in settings but this functionality was removed. \"\n            \"It will have no effect.\"\n        )\n\n    return settings\n\n\ndef configure_settings(settings: Settings) -> Settings:\n    \"\"\"Provide optimizations, error checking, and warnings for the given\n    settings.\n    Also, specify the log messages to be ignored.\n    \"\"\"\n    if \"PATH\" not in settings or not os.path.isdir(settings[\"PATH\"]):\n        raise Exception(\n            \"You need to specify a path containing the content\"\n            \" (see pelican --help for more information)\"\n        )\n\n    # specify the log messages to be ignored\n    log_filter = settings.get(\"LOG_FILTER\", DEFAULT_CONFIG[\"LOG_FILTER\"])\n    LimitFilter._ignore.update(set(log_filter))\n\n    # lookup the theme in \"pelican/themes\" if the given one doesn't exist\n    if not os.path.isdir(settings[\"THEME\"]):\n        theme_path = os.path.join(\n            os.path.dirname(os.path.abspath(__file__)), \"themes\", settings[\"THEME\"]\n        )\n        if os.path.exists(theme_path):\n            settings[\"THEME\"] = theme_path\n        else:\n            raise Exception(\"Could not find the theme {}\".format(settings[\"THEME\"]))\n\n    # standardize strings to lowercase strings\n    for key in [\"DEFAULT_LANG\"]:\n        if key in settings:\n            settings[key] = settings[key].lower()\n\n    # set defaults for Jinja environment\n    settings = get_jinja_environment(settings)\n\n    # standardize strings to lists\n    for key in [\"LOCALE\"]:\n        if key in settings and isinstance(settings[key], str):\n            settings[key] = [settings[key]]\n\n    # check settings that must be a particular type\n    for key, types in [\n        (\"OUTPUT_SOURCES_EXTENSION\", str),\n        (\"FILENAME_METADATA\", str),\n    ]:\n        if key in settings and not isinstance(settings[key], types):\n            value = settings.pop(key)\n            logger.warning(\n                \"Detected misconfigured %s (%s), falling back to the default (%s)\",\n                key,\n                value,\n                DEFAULT_CONFIG[key],\n            )\n\n    # try to set the different locales, fallback on the default.\n    locales = settings.get(\"LOCALE\", DEFAULT_CONFIG[\"LOCALE\"])\n\n    for locale_ in locales:\n        try:\n            locale.setlocale(locale.LC_ALL, str(locale_))\n            break  # break if it is successful\n        except locale.Error:\n            pass\n    else:\n        logger.warning(\n            \"Locale could not be set. Check the LOCALE setting, ensuring it \"\n            \"is valid and available on your system.\"\n        )\n\n    if \"SITEURL\" in settings:\n        # If SITEURL has a trailing slash, remove it and provide a warning\n        siteurl = settings[\"SITEURL\"]\n        if siteurl.endswith(\"/\"):\n            settings[\"SITEURL\"] = siteurl[:-1]\n            logger.warning(\"Removed extraneous trailing slash from SITEURL.\")\n        # If SITEURL is defined but FEED_DOMAIN isn't,\n        # set FEED_DOMAIN to SITEURL\n        if \"FEED_DOMAIN\" not in settings:\n            settings[\"FEED_DOMAIN\"] = settings[\"SITEURL\"]\n\n    # check content caching layer and warn of incompatibilities\n    if (\n        settings.get(\"CACHE_CONTENT\", False)\n        and settings.get(\"CONTENT_CACHING_LAYER\", \"\") == \"generator\"\n        and not settings.get(\"WITH_FUTURE_DATES\", True)\n    ):\n        logger.warning(\n            \"WITH_FUTURE_DATES conflicts with CONTENT_CACHING_LAYER \"\n            \"set to 'generator', use 'reader' layer instead\"\n        )\n\n    # Warn if feeds are generated with both SITEURL & FEED_DOMAIN undefined\n    feed_keys = [\n        \"FEED_ATOM\",\n        \"FEED_RSS\",\n        \"FEED_ALL_ATOM\",\n        \"FEED_ALL_RSS\",\n        \"CATEGORY_FEED_ATOM\",\n        \"CATEGORY_FEED_RSS\",\n        \"AUTHOR_FEED_ATOM\",\n        \"AUTHOR_FEED_RSS\",\n        \"TAG_FEED_ATOM\",\n        \"TAG_FEED_RSS\",\n        \"TRANSLATION_FEED_ATOM\",\n        \"TRANSLATION_FEED_RSS\",\n    ]\n\n    if any(settings.get(k) for k in feed_keys):\n        if not settings.get(\"SITEURL\"):\n            logger.warning(\n                \"Feeds generated without SITEURL set properly may not be valid\"\n            )\n\n    if \"TIMEZONE\" not in settings:\n        logger.warning(\n            \"No timezone information specified in the settings. Assuming\"\n            \" your timezone is UTC for feed generation. Check \"\n            \"https://docs.getpelican.com/en/latest/settings.html#TIMEZONE \"\n            \"for more information\"\n        )\n\n    # fix up pagination rules\n    pagination_rules = [\n        PaginationRule(*r)\n        for r in settings.get(\n            \"PAGINATION_PATTERNS\",\n            DEFAULT_CONFIG[\"PAGINATION_PATTERNS\"],\n        )\n    ]\n    settings[\"PAGINATION_PATTERNS\"] = sorted(\n        pagination_rules,\n        key=lambda r: r[0],\n    )\n\n    # Save people from accidentally setting a string rather than a list\n    path_keys = (\n        \"ARTICLE_EXCLUDES\",\n        \"DEFAULT_METADATA\",\n        \"DIRECT_TEMPLATES\",\n        \"THEME_TEMPLATES_OVERRIDES\",\n        \"FILES_TO_COPY\",\n        \"IGNORE_FILES\",\n        \"PAGINATED_DIRECT_TEMPLATES\",\n        \"PLUGINS\",\n        \"STATIC_EXCLUDES\",\n        \"STATIC_PATHS\",\n        \"THEME_STATIC_PATHS\",\n        \"ARTICLE_PATHS\",\n        \"PAGE_PATHS\",\n    )\n    for PATH_KEY in filter(lambda k: k in settings, path_keys):\n        if isinstance(settings[PATH_KEY], str):\n            logger.warning(\n                \"Detected misconfiguration with %s setting \"\n                \"(must be a list), falling back to the default\",\n                PATH_KEY,\n            )\n            settings[PATH_KEY] = DEFAULT_CONFIG[PATH_KEY]\n\n    # Add {PAGE,ARTICLE}_PATHS to {ARTICLE,PAGE}_EXCLUDES\n    mutually_exclusive = (\"ARTICLE\", \"PAGE\")\n    for type_1, type_2 in [mutually_exclusive, mutually_exclusive[::-1]]:\n        try:\n            includes = settings[type_1 + \"_PATHS\"]\n            excludes = settings[type_2 + \"_EXCLUDES\"]\n            for path in includes:\n                if path not in excludes:\n                    excludes.append(path)\n        except KeyError:\n            continue  # setting not specified, nothing to do\n\n    return settings\n"
  },
  {
    "path": "pelican/signals.py",
    "content": "raise ImportError(\n    \"Importing from `pelican.signals` is deprecated. \"\n    \"Use `from pelican import signals` or `import pelican.plugins.signals` instead.\"\n)\n"
  },
  {
    "path": "pelican/tests/TestPages/bad_page.rst",
    "content": "This is a test bad page\n#######################\n\n:status: invalid\n\nThe quick brown fox jumped over the lazy dog's back.\n\nThe status here is invalid, the page should not render.\n"
  },
  {
    "path": "pelican/tests/TestPages/draft_page.rst",
    "content": "This is a test draft page\n##########################\n\n:status: draft\n\nThe quick brown fox .\n\nThis page is a draft.\n"
  },
  {
    "path": "pelican/tests/TestPages/draft_page_markdown.md",
    "content": "title: This is a markdown test draft page\nstatus: draft\n\nTest Markdown File Header\n=========================\n\nUsed for pelican test\n---------------------\n\nThe quick brown fox .\n\nThis page is a draft\n"
  },
  {
    "path": "pelican/tests/TestPages/draft_page_with_template.rst",
    "content": "This is a test draft page with a custom template\n#################################################\n\n:status: draft\n:template: custom\n\nThe quick brown fox .\n\nThis page is a draft\n\nThis page has a custom template to be called when rendered\n"
  },
  {
    "path": "pelican/tests/TestPages/hidden_page.rst",
    "content": "This is a test hidden page\n##########################\n\n:status: hidden\n\nThe quick brown fox jumped over the lazy dog's back.\n\nThis page is hidden\n"
  },
  {
    "path": "pelican/tests/TestPages/hidden_page_markdown.md",
    "content": "title: This is a markdown test hidden page\nstatus: hidden\n\nTest Markdown File Header\n=========================\n\nUsed for pelican test\n---------------------\n\nThe quick brown fox jumped over the lazy dog's back.\n\nThis page is hidden\n"
  },
  {
    "path": "pelican/tests/TestPages/hidden_page_with_template.rst",
    "content": "This is a test hidden page with a custom template\n#################################################\n\n:status: hidden\n:template: custom\n\nThe quick brown fox jumped over the lazy dog's back.\n\nThis page is hidden\n\nThis page has a custom template to be called when rendered\n"
  },
  {
    "path": "pelican/tests/TestPages/page.rst",
    "content": "This is a test page\n###################\n\nThe quick brown fox jumped over the lazy dog's back.\n"
  },
  {
    "path": "pelican/tests/TestPages/page_markdown.md",
    "content": "title: This is a markdown test page\n\nTest Markdown File Header\n=========================\n\nUsed for pelican test\n---------------------\n\nThe quick brown fox jumped over the lazy dog's back.\n"
  },
  {
    "path": "pelican/tests/TestPages/page_used_for_sorting_test.rst",
    "content": "A Page (Test) for sorting\n#########################\n\n:slug: zzzz\n\nWhen using title, should be first. When using slug, should be last.\n"
  },
  {
    "path": "pelican/tests/TestPages/page_with_category_and_tag_links.md",
    "content": "Title: Page with a bunch of links\n\nMy links:\n\n[Link 1]({tag}マック)\n\n[Link 2]({category}Yeah)\n"
  },
  {
    "path": "pelican/tests/TestPages/page_with_static_links.md",
    "content": "Title: Page with static links\n\nMy links:\n\n[Link 0]({static}image0.jpg)\n\n[Link 1]({attach}image1.jpg)\n"
  },
  {
    "path": "pelican/tests/TestPages/page_with_template.rst",
    "content": "This is a test page with a preset template\n##########################################\n\n:template: custom\n\nThe quick brown fox jumped over the lazy dog's back.\n\nThis article has a custom template to be called when rendered\n"
  },
  {
    "path": "pelican/tests/__init__.py",
    "content": "import logging\nimport warnings\n\nfrom pelican.log import log_warnings\n\n# redirect warnings module to use logging instead\nlog_warnings()\n\n# setup warnings to log DeprecationWarning's and error on\n# warnings in pelican's codebase\nwarnings.simplefilter(\"default\", DeprecationWarning)\nwarnings.filterwarnings(\"error\", \".*\", Warning, \"pelican\")\n\n# Add a NullHandler to silence warning about no available handlers\nlogging.getLogger().addHandler(logging.NullHandler())\n"
  },
  {
    "path": "pelican/tests/build_test/conftest.py",
    "content": "def pytest_addoption(parser):\n    parser.addoption(\n        \"--check-build\",\n        action=\"store\",\n        default=False,\n        help=\"Check wheel contents.\",\n    )\n"
  },
  {
    "path": "pelican/tests/build_test/test_build_files.py",
    "content": "import importlib.metadata\nimport tarfile\nfrom pathlib import Path\nfrom re import match\nfrom zipfile import ZipFile\n\nimport pytest\n\nversion = importlib.metadata.version(\"pelican\")\n\n\n@pytest.mark.skipif(\n    \"not config.getoption('--check-build')\",\n    reason=\"Only run when --check-build is given\",\n)\ndef test_wheel_contents(pytestconfig):\n    \"\"\"\n    This test should test the contents of the wheel to make sure\n    that everything that is needed is included in the final build\n    \"\"\"\n    dist_folder = pytestconfig.getoption(\"--check-build\")\n    wheels = Path(dist_folder).rglob(f\"pelican-{version}-py3-none-any.whl\")\n    for wheel_file in wheels:\n        files_list = ZipFile(wheel_file).namelist()\n        # Check if theme files are copied to wheel\n        simple_theme = Path(\"./pelican/themes/simple/templates\")\n        for x in simple_theme.iterdir():\n            assert str(x) in files_list\n\n        # Check if tool templates are copied to wheel\n        tools = Path(\"./pelican/tools/templates\")\n        for x in tools.iterdir():\n            assert str(x) in files_list\n\n        assert \"pelican/tools/templates/tasks.py.jinja2\" in files_list\n\n\n@pytest.mark.skipif(\n    \"not config.getoption('--check-build')\",\n    reason=\"Only run when --check-build is given\",\n)\n@pytest.mark.parametrize(\n    \"expected_file\",\n    [\n        (\"THANKS\"),\n        (\"README.rst\"),\n        (\"CONTRIBUTING.rst\"),\n        (\"docs/changelog.rst\"),\n        (\"samples/\"),\n    ],\n)\ndef test_sdist_contents(pytestconfig, expected_file):\n    \"\"\"\n    This test should test the contents of the source distribution to make sure\n    that everything that is needed is included in the final build.\n    \"\"\"\n    dist_folder = pytestconfig.getoption(\"--check-build\")\n    sdist_files = Path(dist_folder).rglob(f\"pelican-{version}.tar.gz\")\n    for dist in sdist_files:\n        files_list = tarfile.open(dist, \"r:gz\").getnames()\n        dir_matcher = \"\"\n        if expected_file.endswith(\"/\"):\n            dir_matcher = \".*\"\n        filtered_values = [\n            path\n            for path in files_list\n            if match(rf\"^pelican-{version}/{expected_file}{dir_matcher}$\", path)\n        ]\n        assert len(filtered_values) > 0\n"
  },
  {
    "path": "pelican/tests/content/2012-11-29_rst_w_filename_meta#foo-bar.rst",
    "content": "\nRst with filename metadata\n##########################\n\n:category: yeah\n:author: Alexis Métaireau\n"
  },
  {
    "path": "pelican/tests/content/2012-11-30_md_w_filename_meta#foo-bar.md",
    "content": "category: yeah\nauthor: Alexis Métaireau\n\nMarkdown with filename metadata\n===============================\n"
  },
  {
    "path": "pelican/tests/content/TestCategory/article_with_category.rst",
    "content": "This is an article with category !\n##################################\n\n:category: yeah\n:date: 1970-01-01\n\nThis article should be in 'yeah' category.\n"
  },
  {
    "path": "pelican/tests/content/TestCategory/article_without_category.rst",
    "content": "This is an article without category !\n#####################################\n\nThis article should be in 'TestCategory' category.\n"
  },
  {
    "path": "pelican/tests/content/article.rst",
    "content": "Article title\n#############\n\nTHIS is some content. With some stuff to \"typogrify\"...\n\nNow with added support for :abbr:`TLA (three letter acronym)`.\n"
  },
  {
    "path": "pelican/tests/content/article_draft.md",
    "content": "Title: Draft article\nDate: 2012-10-31\nStatus: draft\n\nThis is some content.\n"
  },
  {
    "path": "pelican/tests/content/article_hidden.md",
    "content": "Title: Hidden article\nDate: 2012-10-31\nStatus: hidden\n\nThis is some unlisted content.\n"
  },
  {
    "path": "pelican/tests/content/article_skip.md",
    "content": "Title: Skipped article\nDate: 2024-06-30\nStatus: skip\n\nThis content will not be rendered.\n"
  },
  {
    "path": "pelican/tests/content/article_with_attributes_containing_double_quotes.html",
    "content": "<html>\n    <head>\n    </head>\n    <body>\n        Ensure that if an attribute value contains a double quote, it is\n        surrounded with single quotes, otherwise with double quotes.\n        <span data-test=\"'single quoted string'\">Span content</span>\n        <span data-test='\"double quoted string\"'>Span content</span>\n        <span data-test=\"string without quotes\">Span content</span>\n    </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/content/article_with_capitalized_metadata.rst",
    "content": "\nThis is a super article !\n#########################\n\n:TAGS: foo, bar, foobar\n:DATE: 2010-12-02 10:14\n:MODIFIED: 2010-12-02 10:20\n:CATEGORY: yeah\n:AUTHOR: Alexis Métaireau\n:SUMMARY:\n    Multi-line metadata should be supported\n    as well as **inline markup** and stuff to \"typogrify\"...\n:CUSTOM_FIELD: http://notmyidea.org\n:CUSTOM_FORMATTED_FIELD:\n    Multi-line metadata should also be supported\n    as well as *inline markup* and stuff to \"typogrify\"...\n"
  },
  {
    "path": "pelican/tests/content/article_with_code_block.rst",
    "content": "An Article With Code Block To Test Typogrify Ignore\n###################################################\n\nAn article with some code\n\n.. code-block:: python\n\n   x & y\n\nA block quote:\n\n   x & y\n\nNormal:\nx & y\n"
  },
  {
    "path": "pelican/tests/content/article_with_comments.html",
    "content": "<html>\n    <head>\n    </head>\n    <body>\n        Body content\n        <!--  This comment is included (including extra whitespace)   -->\n    </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/content/article_with_duplicate_tags_authors.md",
    "content": "Title: Test metadata duplicates\nCategory: test\nTags: foo, bar, foobar, foo, bar\nAuthors: Author, First; Author, Second; Author, First\nDate: 2010-12-02 10:14\nModified: 2010-12-02 10:20\nSummary: I have a lot to test\n\nTest Markdown File Header\n=========================\n\nUsed for pelican test\n---------------------\n\nThe quick brown fox jumped over the lazy dog's back.\n"
  },
  {
    "path": "pelican/tests/content/article_with_inline_svg.html",
    "content": "<html>\n    <head>\n        <title>Article with an inline SVG</title>\n    </head>\n    <body>\n        Ensure that the title attribute in an inline svg is not handled as an HTML title.\n        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"210mm\" height=\"297mm\" viewBox=\"0 0 210 297\">\n            <path fill=\"#b2b2ff\" stroke=\"#000\" stroke-width=\"2.646\" d=\"M88.698 89.869l-8.899 15.63a38.894 38.894 0 00-16.474 31.722 38.894 38.894 0 0038.894 38.894 38.894 38.894 0 0038.894-38.894 38.894 38.894 0 00-9-24.83l-2.38-16.886-14.828 4.994a38.894 38.894 0 00-12.13-2.144z\">\n                <title>A different title inside the inline SVG</title>\n            </path>\n            <ellipse cx=\"100.806\" cy=\"125.285\" rx=\"3.704\" ry=\"10.583\"/>\n            <ellipse cx=\"82.021\" cy=\"125.285\" rx=\"3.704\" ry=\"10.583\"/>\n            <ellipse cx=\"-111.432\" cy=\"146.563\" rx=\"3.704\" ry=\"10.583\" transform=\"rotate(-64.822)\"/>\n            <ellipse cx=\"-118.245\" cy=\"91.308\" rx=\"6.18\" ry=\"8.62\" transform=\"matrix(.063 -.99801 .96163 .27436 0 0)\"/>\n        </svg>\n    </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/content/article_with_keywords.html",
    "content": "<html>\n    <head>\n        <title>This is a super article !</title>\n        <meta name=\"keywords\" content=\"foo, bar, foobar\" />\n    </head>\n</html>\n"
  },
  {
    "path": "pelican/tests/content/article_with_markdown_and_empty_tags.md",
    "content": "Title: Article with markdown and empty tags\nTags:\n\nThis is some content.\n"
  },
  {
    "path": "pelican/tests/content/article_with_markdown_and_footnote.md",
    "content": "Title: Article with markdown containing footnotes\nDate: 2012-10-31\nModified: 2012-11-01\nSummary: Summary with **inline** markup *should* be supported.\nMultiline: Line Metadata should be handle properly.\n    See syntax of Meta-Data extension of Python Markdown package:\n    If a line is indented by 4 or more spaces,\n    that line is assumed to be an additional line of the value\n    for the previous keyword.\n    A keyword may have as many lines as desired.\n\nThis is some content[^1] with some footnotes[^footnote]\n\n[^1]: Numbered footnote\n[^footnote]: Named footnote\n"
  },
  {
    "path": "pelican/tests/content/article_with_markdown_and_nested_metadata.md",
    "content": "Title: Article with markdown and nested summary metadata\nDate: 2012-10-30\nSummary: Test: This metadata value looks like metadata\n\nThis is some content.\n"
  },
  {
    "path": "pelican/tests/content/article_with_markdown_and_nonascii_summary.md",
    "content": "Title: マックOS X 10.8でパイソンとVirtualenvをインストールと設定\nSlug: python-virtualenv-on-mac-osx-mountain-lion-10.8\nDate: 2012-12-20\nModified: 2012-12-22\nTags: パイソン, マック\nCategory: 指導書\nSummary: パイソンとVirtualenvをまっくでインストールする方法について明確に説明します。\n\nWriting unicode is certainly fun.\n\nパイソンとVirtualenvをまっくでインストールする方法について明確に説明します。\n\nAnd let's mix languages.\n\nпервый пост\n\nNow another.\n\nİlk yazı çok özel değil.\n"
  },
  {
    "path": "pelican/tests/content/article_with_markdown_and_summary_metadata_multi.md",
    "content": "Title: Article with markdown and summary metadata multi\nDate: 2012-10-31\nSummary:\n    A multi-line summary should be supported\n    as well as **inline markup**.\ncustom_formatted_field:\n    Multi-line metadata should also be supported\n    as well as *inline markup* and stuff to \"typogrify\"...\n\nThis is some content.\n"
  },
  {
    "path": "pelican/tests/content/article_with_markdown_and_summary_metadata_single.md",
    "content": "Title: Article with markdown and summary metadata single\nDate: 2012-10-30\nSummary: A single-line summary should be supported as well as **inline markup**.\n\nThis is some content.\n"
  },
  {
    "path": "pelican/tests/content/article_with_markdown_extension.markdown",
    "content": "title: Test markdown File\ncategory: test\n\nTest Markdown File Header\n=========================\n\nUsed for pelican test\n---------------------\n\nThis is another markdown test file.  Uses the markdown extension.\n"
  },
  {
    "path": "pelican/tests/content/article_with_markdown_markup_extensions.md",
    "content": "Title: Test Markdown extensions\n\n[TOC]\n\n## Level1\n\n### Level2\n"
  },
  {
    "path": "pelican/tests/content/article_with_md_extension.md",
    "content": "Title: Test md File\nCategory: test\nTags: foo, bar, foobar\nDate: 2010-12-02 10:14\nModified: 2010-12-02 10:20\nSummary: I have a lot to test\n\nTest Markdown File Header\n=========================\n\nUsed for pelican test\n---------------------\n\nThe quick brown fox jumped over the lazy dog's back.\n"
  },
  {
    "path": "pelican/tests/content/article_with_mdown_extension.mdown",
    "content": "title: Test mdown File\ncategory: test\n\nTest Markdown File Header\n=========================\n\nUsed for pelican test\n---------------------\n\nThis is another markdown test file.  Uses the mdown extension.\n"
  },
  {
    "path": "pelican/tests/content/article_with_metadata.html",
    "content": "<html>\n    <head>\n        <title>This is a super article !</title>\n        <meta name=\"tags\" content=\"foo, bar, foobar\" />\n        <meta name=\"date\" content=\"2010-12-02 10:14\" />\n        <meta name=\"category\" content=\"yeah\" />\n        <meta name=\"author\" content=\"Alexis Métaireau\" />\n        <meta name=\"summary\" content=\"Summary and stuff\" />\n        <meta name=\"custom_field\" content=\"http://notmyidea.org\" />\n    </head>\n    <body>\n        Multi-line metadata should be supported\n        as well as <strong>inline markup</strong>.\n    </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/content/article_with_metadata.rst",
    "content": "\nThis is a super article !\n#########################\n\n:tags: foo, bar, foobar\n:date: 2010-12-02 10:14\n:modified: 2010-12-02 10:20\n:category: yeah\n:author: Alexis Métaireau\n:summary:\n    Multi-line metadata should be supported\n    as well as **inline markup** and stuff to \"typogrify\"...\n:custom_field: http://notmyidea.org\n:custom_formatted_field:\n    Multi-line metadata should also be supported\n    as well as *inline markup* and stuff to \"typogrify\"...\n"
  },
  {
    "path": "pelican/tests/content/article_with_metadata.unknownextension",
    "content": "\nThis is a super article !\n#########################\n\n:tags: foo, bar, foobar\n:date: 2010-12-02 10:14\n:category: yeah\n:author: Alexis Métaireau\n:summary:\n    Multi-line metadata should be supported\n    as well as **inline markup**.\n:custom_field: http://notmyidea.org\n"
  },
  {
    "path": "pelican/tests/content/article_with_metadata_and_contents.html",
    "content": "<html>\n    <head>\n        <title>This is a super article !</title>\n        <meta name=\"tags\" contents=\"foo, bar, foobar\" />\n        <meta name=\"date\" contents=\"2010-12-02 10:14\" />\n        <meta name=\"category\" contents=\"yeah\" />\n        <meta name=\"author\" contents=\"Alexis Métaireau\" />\n        <meta name=\"summary\" contents=\"Summary and stuff\" />\n        <meta name=\"custom_field\" contents=\"http://notmyidea.org\" />\n    </head>\n    <body>\n        Multi-line metadata should be supported\n        as well as <strong>inline markup</strong>.\n    </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/content/article_with_metadata_explicit_date_implicit_modified.html",
    "content": "<html>\n    <head>\n        <title>This is a super article !</title>\n        <meta name=\"tags\" content=\"foo, bar, foobar\" />\n        <meta name=\"date\" content=\"2010-12-02 10:14\" />\n        <meta name=\"category\" content=\"yeah\" />\n        <meta name=\"author\" content=\"Alexis Métaireau\" />\n        <meta name=\"summary\" content=\"Summary and stuff\" />\n        <meta name=\"custom_field\" content=\"http://notmyidea.org\" />\n    </head>\n    <body>\n        Multi-line metadata should be supported\n        as well as <strong>inline markup</strong>.\n    </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/content/article_with_metadata_explicit_dates.html",
    "content": "<html>\n    <head>\n        <title>This is a super article !</title>\n        <meta name=\"tags\" content=\"foo, bar, foobar\" />\n        <meta name=\"date\" content=\"2010-12-02 10:14\" />\n        <meta name=\"modified\" content=\"2010-12-31 23:59\" />\n        <meta name=\"category\" content=\"yeah\" />\n        <meta name=\"author\" content=\"Alexis Métaireau\" />\n        <meta name=\"summary\" content=\"Summary and stuff\" />\n        <meta name=\"custom_field\" content=\"http://notmyidea.org\" />\n    </head>\n    <body>\n        Multi-line metadata should be supported\n        as well as <strong>inline markup</strong>.\n    </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/content/article_with_metadata_implicit_date_explicit_modified.html",
    "content": "<html>\n    <head>\n        <title>This is a super article !</title>\n        <meta name=\"tags\" content=\"foo, bar, foobar\" />\n        <meta name=\"modified\" content=\"2010-12-02 10:14\" />\n        <meta name=\"category\" content=\"yeah\" />\n        <meta name=\"author\" content=\"Alexis Métaireau\" />\n        <meta name=\"summary\" content=\"Summary and stuff\" />\n        <meta name=\"custom_field\" content=\"http://notmyidea.org\" />\n    </head>\n    <body>\n        Multi-line metadata should be supported\n        as well as <strong>inline markup</strong>.\n    </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/content/article_with_metadata_implicit_dates.html",
    "content": "<html>\n    <head>\n        <title>This is a super article !</title>\n        <meta name=\"tags\" content=\"foo, bar, foobar\" />\n        <meta name=\"category\" content=\"yeah\" />\n        <meta name=\"author\" content=\"Alexis Métaireau\" />\n        <meta name=\"summary\" content=\"Summary and stuff\" />\n        <meta name=\"custom_field\" content=\"http://notmyidea.org\" />\n    </head>\n    <body>\n        Multi-line metadata should be supported\n        as well as <strong>inline markup</strong>.\n    </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/content/article_with_mkd_extension.mkd",
    "content": "title: Test mkd File\ncategory: test\n\nTest Markdown File Header\n=========================\n\nUsed for pelican test\n---------------------\n\nThis is another markdown test file.  Uses the mkd extension.\n"
  },
  {
    "path": "pelican/tests/content/article_with_multiple_authors.html",
    "content": "<html>\n    <head>\n        <title>This is an article with multiple authors!</title>\n        <meta name=\"authors\" content=\"First Author, Second Author\" />\n    </head>\n</html>\n"
  },
  {
    "path": "pelican/tests/content/article_with_multiple_authors.rst",
    "content": "This is an article with multiple authors!\n#########################################\n\n:date: 2014-02-09 02:20\n:modified: 2014-02-09 02:20\n:authors: First Author, Second Author\n"
  },
  {
    "path": "pelican/tests/content/article_with_multiple_authors_list.rst",
    "content": "This is an article with multiple authors in list format!\n########################################################\n\n:date: 2014-02-09 02:20\n:modified: 2014-02-09 02:20\n:authors: - Author, First\n          - Author, Second\n\nThe author names are in last,first form to verify that\nthey are not just getting split on commas.\n"
  },
  {
    "path": "pelican/tests/content/article_with_multiple_authors_semicolon.rst",
    "content": "This is an article with multiple authors in lastname, firstname format!\n#######################################################################\n\n:date: 2014-02-09 02:20\n:modified: 2014-02-09 02:20\n:authors: Author, First; Author, Second\n"
  },
  {
    "path": "pelican/tests/content/article_with_multiple_metadata_tags.html",
    "content": "<html>\n    <head>\n        <title>Metadata tags as list!</title>\n        <meta name=\"custom_field\" content=\"https://getpelican.com\" />\n        <meta name=\"custom_field\" content=\"https://www.eff.org\" />\n    </head>\n    <body>\n        When custom metadata tags are specified more than once\n        they are collected into a list!\n    </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/content/article_with_nonconformant_meta_tags.html",
    "content": "<html>\n    <head>\n        <meta charset=\"utf-8\" />\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <title>Article with Nonconformant HTML meta tags</title>\n        <meta name=\"summary\" content=\"Summary and stuff\" />\n    </head>\n    <body>\n        Multi-line metadata should be supported\n        as well as <strong>inline markup</strong>.\n    </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/content/article_with_null_attributes.html",
    "content": "<html>\n    <head>\n    </head>\n    <body>\n        Ensure that empty attributes are copied properly.\n        <input name=\"test\" disabled style=\"\" />\n    </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/content/article_with_template.rst",
    "content": "Article with template\n#####################\n\n:template: custom\n\nThis article has a custom template to be called when rendered\n\nThis is some content. With some stuff to \"typogrify\".\n"
  },
  {
    "path": "pelican/tests/content/article_with_typogrify_dashes.md",
    "content": "Title: One -, two --, three --- dashes!\n\nOne: -; Two: --; Three: ---\n"
  },
  {
    "path": "pelican/tests/content/article_with_typogrify_dashes.rst",
    "content": "One -, two --, three --- dashes!\n################################\n\nOne: -; Two: --; Three: ---\n"
  },
  {
    "path": "pelican/tests/content/article_with_uppercase_metadata.html",
    "content": "<html>\n    <head>\n        <title>This is a super article !</title>\n        <meta name=\"Category\" content=\"Yeah\" />\n    </head>\n</html>\n"
  },
  {
    "path": "pelican/tests/content/article_with_uppercase_metadata.rst",
    "content": "\nThis is a super article !\n#########################\n\n:Category: Yeah\n"
  },
  {
    "path": "pelican/tests/content/article_without_category.rst",
    "content": "\nThis is an article without category !\n#####################################\n\nThis article should be in the DEFAULT_CATEGORY.\n"
  },
  {
    "path": "pelican/tests/content/bad_extension.mmd",
    "content": "Title: Bad Extension\n\nThis file shouldn't be included because its file extension is `.mmd`.\n"
  },
  {
    "path": "pelican/tests/content/bloggerexport.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"https://www.blogger.com/styles/atom.css\" type=\"text/css\"?>\n<feed xmlns=\"http://www.w3.org/2005/Atom\" xmlns:gd=\"http://schemas.google.com/g/2005\" xmlns:georss=\"http://www.georss.org/georss\" xmlns:openSearch=\"http://a9.com/-/spec/opensearchrss/1.0/\" xmlns:thr=\"http://purl.org/syndication/thread/1.0\">\n <id>tag:blogger.com,1999:blog-6303278419262689239.archive\n </id>\n <updated>2018-08-02T12:38:27.320-07:00\n </updated>\n <title type=\"text\">Notes of a Young Doctor </title>\n <link href=\"https://www.blogger.com/feeds/6303278419262689239/archive\" rel=\"http://schemas.google.com/g/2005#feed\" type=\"application/atom+xml\"/>\n <link href=\"https://www.blogger.com/feeds/6303278419262689239/archive\" rel=\"self\" type=\"application/atom+xml\"/>\n <link href=\"https://www.blogger.com/feeds/6303278419262689239/archive\" rel=\"http://schemas.google.com/g/2005#post\" type=\"application/atom+xml\"/>\n <link href=\"http://youngdoctornotes.blogspot.com/\" rel=\"alternate\" type=\"text/html\"/>\n <author>\n  <name>Mikhail Afanasyevich Bulgakov\n  </name>\n  <uri>https://www.blogger.com/profile/000082957\n  </uri>\n  <email>noreply@blogger.com\n  </email>\n  <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n </author>\n <generator uri=\"https://www.blogger.com\" version=\"7.00\">Blogger\n </generator>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.layout</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#template\"/>\n  <title type=\"text\">Template: Notes of a Young Doctor</title>\n  <content type=\"text\">[Over 2000 lines of mostly css that we don't need here.]</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/template/default\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/template/default\" rel=\"self\" type=\"application/atom+xml\"/>\n  <link href=\"http://youngdoctornotes.blogspot.com/\" rel=\"alternate\" type=\"text/html\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_PUBLISHING_MODE</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Het type publicatie voor deze blog.</title>\n  <content type=\"text\">PUBLISH_MODE_BLOGSPOT</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_PUBLISHING_MODE\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_PUBLISHING_MODE\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_ADMIN_PERMISSION</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">De lijst van e-mails van beheerders voor de blog.</title>\n  <content type=\"text\">mikhail.afanasyevich.bulgakov@gmail.com</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_ADMIN_PERMISSION\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_ADMIN_PERMISSION\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_ADULT_CONTENT</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Hier wordt aangegeven of deze blog content voor volwassenen bevat</title>\n  <content type=\"text\">false</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_ADULT_CONTENT\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_ADULT_CONTENT\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_ALTERNATE_JSRENDER_ALLOWED</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Hier wordt aangegeven of alternatieve weergaven in JavaScript zijn toegestaan</title>\n  <content type=\"text\">true</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_ALTERNATE_JSRENDER_ALLOWED\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_ALTERNATE_JSRENDER_ALLOWED\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_ANALYTICS_ACCOUNT_NUMBER</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Google Analytics-accountnummer voor een blog</title>\n  <content type=\"text\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_ANALYTICS_ACCOUNT_NUMBER\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_ANALYTICS_ACCOUNT_NUMBER\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_ARCHIVE_DATE_FORMAT</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Het getal van de datumnotatie voor de archiefindex</title>\n  <content type=\"text\">9</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_ARCHIVE_DATE_FORMAT\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_ARCHIVE_DATE_FORMAT\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_ARCHIVE_FREQUENCY</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Hoe vaak deze blog moet worden gearchiveerd</title>\n  <content type=\"text\">MONTHLY</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_ARCHIVE_FREQUENCY\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_ARCHIVE_FREQUENCY\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_AUTHOR_PERMISSION</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">De lijst van e-mails van auteurs die toestemming hebben om te publiceren.</title>\n  <content type=\"text\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_AUTHOR_PERMISSION\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_AUTHOR_PERMISSION\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_BACKLINKS_ALLOWED</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Hier wordt aangegeven of reactiebacklinks op de blog moeten worden getoond</title>\n  <content type=\"text\">false</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_BACKLINKS_ALLOWED\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_BACKLINKS_ALLOWED\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_BY_POST_ARCHIVING</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Hier wordt aangegeven of iedere post moet worden voorzien van een archiefpagina</title>\n  <content type=\"text\">true</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_BY_POST_ARCHIVING\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_BY_POST_ARCHIVING\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_COMMENT_ACCESS</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Wie kan reacties achterlaten</title>\n  <content type=\"text\">BLOGGERS</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_COMMENT_ACCESS\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_COMMENT_ACCESS\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_COMMENT_CAPTCHA</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Hier wordt aangegeven of personen die reacties geven, een Captcha (woordverificatie) moeten invullen</title>\n  <content type=\"text\">true</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_COMMENT_CAPTCHA\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_COMMENT_CAPTCHA\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_COMMENT_EMAIL</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Lijst met e-mailadressen om meldingen van nieuwe reacties naar te sturen</title>\n  <content type=\"text\">mikhail.afanasyevich.bulgakov@gmail.com</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_COMMENT_EMAIL\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_COMMENT_EMAIL\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_COMMENT_FEED</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Het type feed dat voor blogreacties moet worden gegeven</title>\n  <content type=\"text\">FULL</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_COMMENT_FEED\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_COMMENT_FEED\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_COMMENT_FORM_LOCATION</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Locatie van formulier voor blogreacties</title>\n  <content type=\"text\">EMBEDDED_IFRAME</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_COMMENT_FORM_LOCATION\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_COMMENT_FORM_LOCATION\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_COMMENT_MESSAGE</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Bericht bij blogreactie</title>\n  <content type=\"text\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_COMMENT_MESSAGE\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_COMMENT_MESSAGE\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_COMMENT_MODERATION</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Hier wordt aangegeven of het modereren van reacties moet worden ingeschakeld</title>\n  <content type=\"text\">DISABLED</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_COMMENT_MODERATION\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_COMMENT_MODERATION\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_COMMENT_MODERATION_DELAY</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Aantal dagen waarna nieuwe reacties in aanmerking komen voor moderaten</title>\n  <content type=\"text\">14</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_COMMENT_MODERATION_DELAY\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_COMMENT_MODERATION_DELAY\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_COMMENT_MODERATION_EMAIL</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">E-mailadres waar meldingen binnenkomen over welke nieuwe reacties bewerkt of verwijderd moeten worden</title>\n  <content type=\"text\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_COMMENT_MODERATION_EMAIL\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_COMMENT_MODERATION_EMAIL\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_COMMENT_PROFILE_IMAGES</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Hier wordt aangegeven of profielafbeeldingen in reacties moeten worden getoond</title>\n  <content type=\"text\">true</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_COMMENT_PROFILE_IMAGES\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_COMMENT_PROFILE_IMAGES\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_COMMENTS_ALLOWED</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Hier wordt aangegeven of er reacties moeten worden weergegeven</title>\n  <content type=\"text\">true</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_COMMENTS_ALLOWED\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_COMMENTS_ALLOWED\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_COMMENTS_TIME_STAMP_FORMAT</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Getal van de tijdstempelnotatie voor reacties</title>\n  <content type=\"text\">29</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_COMMENTS_TIME_STAMP_FORMAT\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_COMMENTS_TIME_STAMP_FORMAT\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_CONVERT_LINE_BREAKS</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Hier wordt aangegeven of de regelscheidingen moeten worden omgezet in &lt;br /&gt;-tags in de posteditor</title>\n  <content type=\"text\">true</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_CONVERT_LINE_BREAKS\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_CONVERT_LINE_BREAKS\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_CUSTOM_ADS_TXT</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">De aangepaste ads.txt-content van de blog die aan advertentiezoekmachines wordt getoond.</title>\n  <content type=\"text\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_CUSTOM_ADS_TXT\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_CUSTOM_ADS_TXT\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_CUSTOM_ADS_TXT_ENABLED</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Bepaalt of deze blog aangepaste ads.txt-content aan advertentiezoekmachines toont.</title>\n  <content type=\"text\">false</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_CUSTOM_ADS_TXT_ENABLED\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_CUSTOM_ADS_TXT_ENABLED\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_CUSTOM_PAGE_NOT_FOUND</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">De content die wordt weergegeven wanneer een post of pagina niet is gevonden.</title>\n  <content type=\"text\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_CUSTOM_PAGE_NOT_FOUND\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_CUSTOM_PAGE_NOT_FOUND\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_CUSTOM_ROBOTS_TXT</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">De aangepaste robots.txt-content van de blog wordt aan zoekmachines getoond.</title>\n  <content type=\"text\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_CUSTOM_ROBOTS_TXT\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_CUSTOM_ROBOTS_TXT\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_CUSTOM_ROBOTS_TXT_ENABLED</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Bepaalt of deze blog aangepaste robots.txt-content aan zoekmachines toont.</title>\n  <content type=\"text\">false</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_CUSTOM_ROBOTS_TXT_ENABLED\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_CUSTOM_ROBOTS_TXT_ENABLED\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_DATE_FORMAT</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Het getal van de datumnotatie voor koppen</title>\n  <content type=\"text\">26</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_DATE_FORMAT\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_DATE_FORMAT\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_DEFAULT_BACKLINKS_MODE</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Standaardbacklinks voor posts</title>\n  <content type=\"text\">DEFAULT_HAVE_BACKLINKS</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_DEFAULT_BACKLINKS_MODE\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_DEFAULT_BACKLINKS_MODE\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_DEFAULT_COMMENTS_MODE</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Standaardreactie voor posts</title>\n  <content type=\"text\">DEFAULT_HAVE_COMMENTS</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_DEFAULT_COMMENTS_MODE\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_DEFAULT_COMMENTS_MODE\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_DESCRIPTION</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Een beschrijving van de blog</title>\n  <content type=\"text\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_DESCRIPTION\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_DESCRIPTION\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_EMAIL_POST_LINKS</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Hier wordt aangegeven of er een link moet worden weergegeven waarmee gebruikers posts kunnen e-mailen</title>\n  <content type=\"text\">true</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_EMAIL_POST_LINKS\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_EMAIL_POST_LINKS\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_FEED_REDIRECT_URL</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">URL waar verzoeken om postfeed naartoe worden geleid</title>\n  <content type=\"text\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_FEED_REDIRECT_URL\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_FEED_REDIRECT_URL\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_FLOAT_ALIGNMENT</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Hier wordt aangegeven of zwevende uitlijning is ingeschakeld voor de blog</title>\n  <content type=\"text\">true</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_FLOAT_ALIGNMENT\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_FLOAT_ALIGNMENT\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_LOCALE</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Taal voor deze blog</title>\n  <content type=\"text\">nl</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_LOCALE\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_LOCALE\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_M2B_WHITELIST_EMAIL</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Lijst met e-mailadressen die via e-mail posts op de blog kunnen plaatsen.</title>\n  <content type=\"text\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_M2B_WHITELIST_EMAIL\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_M2B_WHITELIST_EMAIL\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_MAX_NUM</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Maximaal aantal items voor weergave op de hoofdpagina\"</title>\n  <content type=\"text\">100</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_MAX_NUM\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_MAX_NUM\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_MAX_UNIT</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Eenheid van items voor weergave op de hoofdpagina</title>\n  <content type=\"text\">POSTS</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_MAX_UNIT\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_MAX_UNIT\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_META_DESCRIPTION</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">De metabeschrijving van de blog die wordt gebruikt door zoekmachines.</title>\n  <content type=\"text\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_META_DESCRIPTION\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_META_DESCRIPTION\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_META_DESCRIPTION_ENABLED</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Of deze blog wordt weergegeven met metabeschrijvingen.</title>\n  <content type=\"text\">false</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_META_DESCRIPTION_ENABLED\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_META_DESCRIPTION_ENABLED\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_NAME</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">De naam van de blog</title>\n  <content type=\"text\">Notes of a Young Doctor</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_NAME\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_NAME\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_PER_POST_FEED</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Het type feed dat voor reacties op afzonderlijke posts moet worden gegeven</title>\n  <content type=\"text\">FULL</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_PER_POST_FEED\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_PER_POST_FEED\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_POST_FEED</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Het type feed dat voor blogposts moet worden gegeven</title>\n  <content type=\"text\">FULL</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_POST_FEED\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_POST_FEED\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_POST_FEED_FOOTER</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Voettekst om aan het einde van iedere vermelding in de postfeed toe te voegen</title>\n  <content type=\"text\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_POST_FEED_FOOTER\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_POST_FEED_FOOTER\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_POST_TEMPLATE</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">De template voor blogposts</title>\n  <content type=\"text\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_POST_TEMPLATE\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_POST_TEMPLATE\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_PROMOTED</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Hier wordt aangegeven of deze blog op Blogger kan worden aangeprezen</title>\n  <content type=\"text\">true</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_PROMOTED\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_PROMOTED\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_QUICK_EDITING</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Hier wordt aangegeven of Snel bewerken is ingeschakeld</title>\n  <content type=\"text\">true</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_QUICK_EDITING\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_QUICK_EDITING\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_READ_ACCESS_MODE</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Het type toegang voor de lezers van de blog.</title>\n  <content type=\"text\">PUBLIC</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_READ_ACCESS_MODE\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_READ_ACCESS_MODE\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_READER_PERMISSION</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">De e-maillijst voor gebruikers die toestemming hebben om de blog te lezen.</title>\n  <content type=\"text\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_READER_PERMISSION\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_READER_PERMISSION\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_SEARCHABLE</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Hier wordt aangegeven of deze blog door zoekmachines moet worden geïndexeerd</title>\n  <content type=\"text\">true</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_SEARCHABLE\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_SEARCHABLE\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_SEND_EMAIL</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Door komma's gescheiden lijst met e-mailadressen om nieuwe blogposts naar te sturen</title>\n  <content type=\"text\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_SEND_EMAIL\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_SEND_EMAIL\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_SHOW_TITLE</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Hier wordt aangegeven of het titelveld moet worden weergegeven</title>\n  <content type=\"text\">true</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_SHOW_TITLE\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_SHOW_TITLE\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_SHOW_URL</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Hier wordt aangegeven of er een verwante link in de postopsteller moet worden weergegeven</title>\n  <content type=\"text\">false</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_SHOW_URL\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_SHOW_URL\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_SUBDOMAIN</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Het subdomein van BlogSpot om je blog op te publiceren</title>\n  <content type=\"text\">youngdoctornotes</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_SUBDOMAIN\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_SUBDOMAIN\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_TIME_STAMP_FORMAT</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Het getal van de tijdstempelnotatie</title>\n  <content type=\"text\">27</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_TIME_STAMP_FORMAT\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_TIME_STAMP_FORMAT\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_TIME_ZONE</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">De tijdzone voor deze blog</title>\n  <content type=\"text\">America/Los_Angeles</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_TIME_ZONE\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_TIME_ZONE\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.settings.BLOG_USE_LIGHTBOX</id>\n  <published>2010-11-27T07:08:20.877-08:00</published>\n  <updated>2018-08-02T12:38:27.320-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#settings\"/>\n  <title type=\"text\">Of afbeeldingen worden weergegeven in de lightbox wanneer erop wordt geklikt</title>\n  <content type=\"text\">true</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_USE_LIGHTBOX\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/settings/BLOG_USE_LIGHTBOX\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.post-1276418104709695660</id>\n  <published>2010-11-27T08:21:00.000-08:00</published>\n  <updated>2018-08-02T12:22:48.286-07:00</updated>\n  <app:control>\n   <app:draft>yes</app:draft>\n  </app:control>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#post\"/>\n  <category scheme=\"http://www.blogger.com/atom/ns#\" term=\"Interesting cases\"/>\n  <category scheme=\"http://www.blogger.com/atom/ns#\" term=\"amputations\"/>\n  <title type=\"text\">Black as Egypt's Night</title>\n  <content type=\"html\">Write next story here</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/posts/default/1276418104709695660\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/posts/default/1276418104709695660\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n  <thr:total>0</thr:total>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.post-1858599377741856733</id>\n  <published>2010-11-27T07:12:00.000-08:00</published>\n  <updated>2010-11-27T07:56:43.964-08:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#post\"/>\n  <title type=\"text\">The Steel Windpipe</title>\n  <content type=\"html\">It was a cold Winter's night.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Very cold indeed.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Note to self: pad out ending&lt;/li&gt;&lt;/ul&gt;</content>\n  <link href=\"https://youngdoctornotes.blogspot.com/feeds/1858599377741856733/comments/default\" rel=\"replies\" title=\"Reacties posten\" type=\"application/atom+xml\"/>\n  <link href=\"http://youngdoctornotes.blogspot.com/2010/11/the-steel-windpipe.html#comment-form\" rel=\"replies\" title=\"1 reacties\" type=\"text/html\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/posts/default/1858599377741856733\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/posts/default/1858599377741856733\" rel=\"self\" type=\"application/atom+xml\"/>\n  <link href=\"http://youngdoctornotes.blogspot.com/2010/11/the-steel-windpipe.html\" rel=\"alternate\" title=\"The Steel Windpipe\" type=\"text/html\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n  <thr:total>1</thr:total>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.page-4386962582497458967</id>\n  <published>2018-08-02T12:38:00.001-07:00</published>\n  <updated>2018-08-02T12:38:27.171-07:00</updated>\n  <app:control>\n   <app:draft>yes</app:draft>\n  </app:control>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#page\"/>\n  <title type=\"text\">Test page 2</title>\n  <content type=\"html\">&lt;div dir=\"ltr\" style=\"text-align: left;\" trbidi=\"on\"&gt;This is a second test&lt;/div&gt;</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/pages/default/4386962582497458967\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/pages/default/4386962582497458967\" rel=\"self\" type=\"application/atom+xml\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.page-1406163839769953231</id>\n  <published>2018-08-02T12:37:00.004-07:00</published>\n  <updated>2018-08-02T12:37:47.424-07:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#page\"/>\n  <title type=\"text\">Test page</title>\n  <content type=\"html\">&lt;div dir=\"ltr\" style=\"text-align: left;\" trbidi=\"on\"&gt;This is a test.&lt;/div&gt;</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/pages/default/1406163839769953231\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/pages/default/1406163839769953231\" rel=\"self\" type=\"application/atom+xml\"/>\n  <link href=\"http://youngdoctornotes.blogspot.com/p/test-page.html\" rel=\"alternate\" title=\"Test page\" type=\"text/html\"/>\n  <author>\n   <name>Mikhail Afanasyevich Bulgakov</name>\n   <uri>https://www.blogger.com/profile/000082957</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n </entry>\n <entry>\n  <id>tag:blogger.com,1999:blog-6303278419262689239.post-5590533389087749201</id>\n  <published>2010-11-29T12:35:44.027-08:00</published>\n  <updated>2010-11-29T12:35:44.027-08:00</updated>\n  <category scheme=\"http://schemas.google.com/g/2005#kind\" term=\"http://schemas.google.com/blogger/2008/kind#comment\"/>\n  <title type=\"text\">Mishka, always a pleasure to read your adventures!...</title>\n  <content type=\"html\">Mishka, always a pleasure to read your adventures!&lt;br /&gt;&lt;br /&gt;It's a shame you don't get more time for writing.</content>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/1858599377741856733/comments/default/5590533389087749201\" rel=\"edit\" type=\"application/atom+xml\"/>\n  <link href=\"https://www.blogger.com/feeds/6303278419262689239/1858599377741856733/comments/default/5590533389087749201\" rel=\"self\" type=\"application/atom+xml\"/>\n  <link href=\"http://youngdoctornotes.blogspot.com/2010/11/the-steel-windpipe.html?showComment=1291062944027#c5590533389087749201\" rel=\"alternate\" title=\"\" type=\"text/html\"/>\n  <author>\n   <name>Thomas Isidore Noël Sankara</name>\n   <uri>https://www.blogger.com/profile/0617349827</uri>\n   <email>noreply@blogger.com</email>\n   <gd:image height=\"35\" rel=\"http://schemas.google.com/g/2005#thumbnail\" src=\"//lh3.googleusercontent.com/zFdxGE77vvD2w5xHy6jkVuElKv-U9_9qLkRYK8OnbDeJPtjSZ82UPq5w6hJ-SA=s35\" width=\"35\"/>\n  </author>\n  <thr:in-reply-to href=\"http://youngdoctornotes.blogspot.com/2010/11/the-steel-windpipe.html\" ref=\"tag:blogger.com,1999:blog-6303278419262689239.post-1858599377741856733\" source=\"https://www.blogger.com/feeds/6303278419262689239/posts/default/1858599377741856733\" type=\"text/html\"/>\n  <gd:extendedProperty name=\"blogger.itemClass\" value=\"pid-944253050\"/>\n  <gd:extendedProperty name=\"blogger.displayTime\" value=\"29 november 2010 om 12:35\"/>\n </entry>\n</feed>\n"
  },
  {
    "path": "pelican/tests/content/empty.md",
    "content": ""
  },
  {
    "path": "pelican/tests/content/empty_with_bom.md",
    "content": "﻿\n"
  },
  {
    "path": "pelican/tests/content/medium_post_content.txt",
    "content": "\n<hr/><h3>Title header</h3><p>A paragraph of content.</p><p>Paragraph number two.</p><p>A list:</p><ol><li>One.</li><li>Two.</li><li>Three.</li></ol><p>A link: <a data-href=\"https://example.com/example\" href=\"https://example.com/example\" target=\"_blank\">link text</a>.</p><h3>Header 2</h3><p>A block quote:</p><blockquote>quote words <strong>strong words</strong></blockquote><p>after blockquote</p><figure><img data-height=\"282\" data-image-id=\"image1.png\" data-width=\"739\" src=\"https://cdn-images-1.medium.com/max/800/image1.png\"/><figcaption>A figure caption.</figcaption></figure><p>A final note: <a data-href=\"http://stats.stackexchange.com/\" href=\"http://stats.stackexchange.com/\" rel=\"noopener\" target=\"_blank\">Cross-Validated</a> has sometimes been helpful.</p><hr/><p><em>Next: </em><a data-href=\"https://medium.com/@username/post-url\" href=\"https://medium.com/@username/post-url\" target=\"_blank\"><em>Next post</em>\n</a></p>\n<p>By <a href=\"https://medium.com/@username\">User Name</a> on <a href=\"https://medium.com/p/medium-short-url\"><time datetime=\"2017-04-21T17:11:55.799Z\">April 21, 2017</time></a>.</p><p><a href=\"https://medium.com/@username/this-post-url\">Canonical link</a></p><p>Exported from <a href=\"https://medium.com\">Medium</a> on December 1, 2023.</p>\n"
  },
  {
    "path": "pelican/tests/content/medium_posts/2017-04-21_-medium-post--d1bf01d62ba3.html",
    "content": "<!DOCTYPE html><html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"><title>A title</title><style>\n  * {\n    font-family: Georgia, Cambria, \"Times New Roman\", Times, serif;\n  }\n  html, body {\n    margin: 0;\n    padding: 0;\n  }\n  h1 {\n    font-size: 50px;\n    margin-bottom: 17px;\n    color: #333;\n  }\n  h2 {\n    font-size: 24px;\n    line-height: 1.6;\n    margin: 30px 0 0 0;\n    margin-bottom: 18px;\n    margin-top: 33px;\n    color: #333;\n  }\n  h3 {\n    font-size: 30px;\n    margin: 10px 0 20px 0;\n    color: #333;\n  }\n  header {\n    width: 640px;\n    margin: auto;\n  }\n  section {\n    width: 640px;\n    margin: auto;\n  }\n  section p {\n    margin-bottom: 27px;\n    font-size: 20px;\n    line-height: 1.6;\n    color: #333;\n  }\n  section img {\n    max-width: 640px;\n  }\n  footer {\n    padding: 0 20px;\n    margin: 50px 0;\n    text-align: center;\n    font-size: 12px;\n  }\n  .aspectRatioPlaceholder {\n    max-width: auto !important;\n    max-height: auto !important;\n  }\n  .aspectRatioPlaceholder-fill {\n    padding-bottom: 0 !important;\n  }\n  header,\n  section[data-field=subtitle],\n  section[data-field=description] {\n    display: none;\n  }\n</style></head><body><article class=\"h-entry\">\n  <header>\n    <h1 class=\"p-name\">A name (like title)</h1>\n  </header>\n  <section data-field=\"subtitle\" class=\"p-summary\">\n    Summary (first several words of content)\n  </section>\n  <section data-field=\"body\" class=\"e-content\">\n    <section name=\"ad15\" class=\"section section--body section--first\"><div class=\"section-divider\"><hr class=\"section-divider\"></div><div class=\"section-content\"><div class=\"section-inner sectionLayout--insetColumn\"><h3 name=\"20a3\" id=\"20a3\" class=\"graf graf--h3 graf--leading graf--title\">Title header</h3><p name=\"e3d6\" id=\"e3d6\" class=\"graf graf--p graf-after--h3\">A paragraph of content.</p><p name=\"c7a8\" id=\"c7a8\" class=\"graf graf--p graf-after--p\">Paragraph number two.</p><p name=\"42aa\" id=\"42aa\" class=\"graf graf--p graf-after--p\">A list:</p><ol class=\"postList\"><li name=\"d65f\" id=\"d65f\" class=\"graf graf--li graf-after--p\">One.</li><li name=\"232b\" id=\"232b\" class=\"graf graf--li graf-after--li\">Two.</li><li name=\"ef87\" id=\"ef87\" class=\"graf graf--li graf-after--li\">Three.</li></ol><p name=\"e743\" id=\"e743\" class=\"graf graf--p graf-after--p\">A link: <a href=\"https://example.com/example\" data-href=\"https://example.com/example\" class=\"markup--anchor markup--p-anchor\" target=\"_blank\">link text</a>.</p><h3 name=\"4cfd\" id=\"4cfd\" class=\"graf graf--h3 graf-after--p\">Header 2</h3><p name=\"433c\" id=\"433c\" class=\"graf graf--p graf-after--p\">A block quote:</p><blockquote name=\"3537\" id=\"3537\" class=\"graf graf--blockquote graf-after--p\">quote words <strong class=\"markup--strong markup--blockquote-strong\">strong words</strong></blockquote><p name=\"00cc\" id=\"00cc\" class=\"graf graf--p graf-after--blockquote\">after blockquote</p><figure name=\"edb0\" id=\"edb0\" class=\"graf graf--figure graf-after--p\"><img class=\"graf-image\" data-image-id=\"image1.png\" data-width=\"739\" data-height=\"282\" src=\"https://cdn-images-1.medium.com/max/800/image1.png\"><figcaption class=\"imageCaption\">A figure caption.</figcaption></figure><p name=\"f401\" id=\"f401\" class=\"graf graf--p graf-after--p graf--trailing\">A final note: <a href=\"http://stats.stackexchange.com/\" data-href=\"http://stats.stackexchange.com/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Cross-Validated</a> has sometimes been helpful.</p></div></div></section><section name=\"09a3\" class=\"section section--body section--last\"><div class=\"section-divider\"><hr class=\"section-divider\"></div><div class=\"section-content\"><div class=\"section-inner sectionLayout--insetColumn\"><p name=\"81e8\" id=\"81e8\" class=\"graf graf--p graf--leading\"><em class=\"markup--em markup--p-em\">Next: </em><a href=\"https://medium.com/@username/post-url\" data-href=\"https://medium.com/@username/post-url\" class=\"markup--anchor markup--p-anchor\" target=\"_blank\"><em class=\"markup--em markup--p-em\">Next post</em>\n    </section>\n      <footer><p>By <a href=\"https://medium.com/@username\" class=\"p-author h-card\">User Name</a> on <a href=\"https://medium.com/p/medium-short-url\"><time class=\"dt-published\" datetime=\"2017-04-21T17:11:55.799Z\">April 21, 2017</time></a>.</p><p><a href=\"https://medium.com/@username/this-post-url\" class=\"p-canonical\">Canonical link</a></p><p>Exported from <a href=\"https://medium.com\">Medium</a> on December 1, 2023.</p></footer></article></body></html>\n"
  },
  {
    "path": "pelican/tests/content/wordpress_content_decoded",
    "content": "<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>\n<p><object width=\"425\" height=\"350\"><param name=\"movie\" value=\"http://www.youtube.com/v/XSrW-wAWZe4\"></param><param name=\"wmode\" value=\"transparent\"></param><embed src=\"http://www.youtube.com/v/XSrW-wAWZe4\" type=\"application/x-shockwave-flash\" wmode=\"transparent\" width=\"425\" height=\"350\"></embed></object></p>\n<blockquote><p>\nLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>\n<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p></blockquote>\n<ul>\n<li>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.</li>\n<li>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.</li>\n</ul>\n<pre>\n<code>\n  a = [1, 2, 3]\n  b = [4, 5, 6]\n  for i in zip(a, b):\n    print i\n</code>\n</pre>\n<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>\n"
  },
  {
    "path": "pelican/tests/content/wordpress_content_encoded",
    "content": "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n\n<object width=\"425\" height=\"350\"><param name=\"movie\" value=\"http://www.youtube.com/v/XSrW-wAWZe4\"></param><param name=\"wmode\" value=\"transparent\"></param><embed src=\"http://www.youtube.com/v/XSrW-wAWZe4\" type=\"application/x-shockwave-flash\" wmode=\"transparent\" width=\"425\" height=\"350\"></embed></object>\n\n<blockquote>\nLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n\nLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n</blockquote>\n<ul>\n<li>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.</li>\n<li>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.</li>\n</ul>\n\n<pre>\n<code>\n  a = [1, 2, 3]\n  b = [4, 5, 6]\n  for i in zip(a, b):\n    print i\n</code>\n</pre>\n\nLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n"
  },
  {
    "path": "pelican/tests/content/wordpressexport.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!-- This is a WordPress eXtended RSS file generated by WordPress as an export of your site. -->\n<!-- It contains information about your site's posts, pages, comments, categories, and other content. -->\n<!-- You may use this file to transfer that content from one site to another. -->\n<!-- This file is not intended to serve as a complete backup of your site. -->\n\n<!-- To import this information into a WordPress site follow these steps: -->\n<!-- 1. Log in to that site as an administrator. -->\n<!-- 2. Go to Tools: Import in the WordPress admin panel. -->\n<!-- 3. Install the \"WordPress\" importer from the list. -->\n<!-- 4. Activate & Run Importer. -->\n<!-- 5. Upload this file using the form provided on that page. -->\n<!-- 6. You will first be asked to map the authors in this export file to users -->\n<!--    on the site. For each author, you may choose to map to an -->\n<!--    existing user on the site or to create a new user. -->\n<!-- 7. WordPress will then import each of the posts, pages, comments, categories, etc. -->\n<!--    contained in this file into your site. -->\n\n<!-- generator=\"WordPress/3.3.1\" created=\"2012-05-13 01:13\" -->\n<rss version=\"2.0\"\n    xmlns:excerpt=\"http://wordpress.org/export/1.1/excerpt/\"\n    xmlns:content=\"http://purl.org/rss/1.0/modules/content/\"\n    xmlns:wfw=\"http://wellformedweb.org/CommentAPI/\"\n    xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n    xmlns:wp=\"http://wordpress.org/export/1.1/\"\n>\n\n<channel>\n    <title>Pelican test channel</title>\n    <link>http://thisisa.test</link>\n    <description>Not a real feed, just for test</description>\n    <pubDate>Sun, 13 May 2012 01:13:52 +0000</pubDate>\n    <language>en</language>\n    <wp:wxr_version>1.1</wp:wxr_version>\n    <wp:base_site_url>http://thisisa.test</wp:base_site_url>\n    <wp:base_blog_url>http://thisisa.test</wp:base_blog_url>\n\n    <wp:author><wp:author_id>2</wp:author_id><wp:author_login>Bob</wp:author_login><wp:author_email>bob@thisisa.test</wp:author_email><wp:author_display_name><![CDATA[Bob]]></wp:author_display_name><wp:author_first_name><![CDATA[Bob]]></wp:author_first_name><wp:author_last_name><![CDATA[]]></wp:author_last_name></wp:author>\n    <wp:author><wp:author_id>3</wp:author_id><wp:author_login>Jonh</wp:author_login><wp:author_email>jonh@thisisa.test</wp:author_email><wp:author_display_name><![CDATA[Jonh]]></wp:author_display_name><wp:author_first_name><![CDATA[Jonh]]></wp:author_first_name><wp:author_last_name><![CDATA[]]></wp:author_last_name></wp:author>\n\n    <wp:category><wp:term_id>7</wp:term_id><wp:category_nicename>categ-1</wp:category_nicename><wp:category_parent></wp:category_parent><wp:cat_name><![CDATA[Category 1]]></wp:cat_name></wp:category>\n    <wp:category><wp:term_id>11</wp:term_id><wp:category_nicename>categ-2</wp:category_nicename><wp:category_parent></wp:category_parent><wp:cat_name><![CDATA[Category 2]]></wp:cat_name></wp:category>\n    <wp:category><wp:term_id>1</wp:term_id><wp:category_nicename>uncategorized</wp:category_nicename><wp:category_parent></wp:category_parent><wp:cat_name><![CDATA[Uncategorized]]></wp:cat_name></wp:category>\n    <wp:category><wp:term_id>15</wp:term_id><wp:category_nicename>categ-3</wp:category_nicename><wp:category_parent></wp:category_parent><wp:cat_name><![CDATA[Category 3]]></wp:cat_name></wp:category>\n    <wp:tag><wp:term_id>25</wp:term_id><wp:tag_slug>tag-1</wp:tag_slug><wp:tag_name><![CDATA[tag 1]]></wp:tag_name></wp:tag>\n    <wp:tag><wp:term_id>122</wp:term_id><wp:tag_slug>tag2</wp:tag_slug><wp:tag_name><![CDATA[Tag2]]></wp:tag_name></wp:tag>\n    <wp:tag><wp:term_id>68</wp:term_id><wp:tag_slug>tag-3</wp:tag_slug><wp:tag_name><![CDATA[Tag 3]]></wp:tag_name></wp:tag>\n\n    <generator>http://wordpress.org/?v=3.3.1</generator>\n\n    <item>\n        <title>Empty post</title>\n        <link>http://thisisa.test/?attachment_id=24</link>\n        <pubDate>Sat, 04 Feb 2012 03:17:33 +0000</pubDate>\n        <dc:creator>bob</dc:creator>\n        <guid isPermaLink=\"false\">https://upload.wikimedia.org/wikipedia/commons/thumb/2/2c/Pelican_lakes_entrance02.jpg/240px-Pelican_lakes_entrance02.jpg</guid>\n        <description></description>\n        <content:encoded><![CDATA[]]></content:encoded>\n        <excerpt:encoded><![CDATA[]]></excerpt:encoded>\n        <wp:post_id>24</wp:post_id>\n        <wp:post_date>2012-02-04 03:17:33</wp:post_date>\n        <wp:post_date_gmt>2012-02-04 03:17:33</wp:post_date_gmt>\n        <wp:comment_status>open</wp:comment_status>\n        <wp:ping_status>open</wp:ping_status>\n        <wp:post_name>empty-post</wp:post_name>\n        <wp:status>inherit</wp:status>\n        <wp:post_parent>0</wp:post_parent>\n        <wp:menu_order>0</wp:menu_order>\n        <wp:post_type>attachment</wp:post_type>\n        <wp:post_password></wp:post_password>\n        <wp:is_sticky>0</wp:is_sticky>\n        <wp:attachment_url>https://upload.wikimedia.org/wikipedia/commons/thumb/2/2c/Pelican_lakes_entrance02.jpg/240px-Pelican_lakes_entrance02.jpg</wp:attachment_url>\n        <wp:postmeta>\n            <wp:meta_key>_wp_attachment_metadata</wp:meta_key>\n            <wp:meta_value><![CDATA[a:5:{s:5:\"width\";s:3:\"150\";s:6:\"height\";s:3:\"186\";s:14:\"hwstring_small\";s:22:\"height='96' width='77'\";s:4:\"file\";s:20:\"2012/02/pelican.png\";s:10:\"image_meta\";a:10:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";}}]]></wp:meta_value>\n        </wp:postmeta>\n        <wp:postmeta>\n            <wp:meta_key>_wp_attached_file</wp:meta_key>\n            <wp:meta_value><![CDATA[2012/02/stuff.png]]></wp:meta_value>\n        </wp:postmeta>\n        <wp:postmeta>\n            <wp:meta_key>_wp_attachment_image_alt</wp:meta_key>\n            <wp:meta_value><![CDATA[Stuff]]></wp:meta_value>\n        </wp:postmeta>\n    </item>\n    <item>\n        <title></title>\n        <link>http://thisisa.test/?p=168</link>\n        <pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>\n        <dc:creator>bob</dc:creator>\n        <guid isPermaLink=\"false\">http://thisisa.test/?p=168</guid>\n        <description></description>\n        <content:encoded><![CDATA[This is a draft with no title]]></content:encoded>\n        <excerpt:encoded><![CDATA[]]></excerpt:encoded>\n        <wp:post_id>168</wp:post_id>\n        <wp:post_date>2012-02-15 21:23:57</wp:post_date>\n        <wp:post_date_gmt>0000-00-00 00:00:00</wp:post_date_gmt>\n        <wp:comment_status>open</wp:comment_status>\n        <wp:ping_status>open</wp:ping_status>\n        <wp:post_name></wp:post_name>\n        <wp:status>draft</wp:status>\n        <wp:post_parent>0</wp:post_parent>\n        <wp:menu_order>0</wp:menu_order>\n        <wp:post_type>post</wp:post_type>\n        <wp:post_password></wp:post_password>\n        <wp:is_sticky>0</wp:is_sticky>\n        <category domain=\"category\" nicename=\"categ-1\"><![CDATA[Category 1]]></category>\n        <wp:postmeta>\n            <wp:meta_key>_edit_last</wp:meta_key>\n            <wp:meta_value><![CDATA[3]]></wp:meta_value>\n        </wp:postmeta>\n    </item>\n    <item>\n        <title>A normal post</title>\n        <link>http://thisisa.test/?p=174</link>\n        <pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>\n        <dc:creator>bob</dc:creator>\n        <guid isPermaLink=\"false\">http://thisisa.test/?p=174</guid>\n        <description></description>\n        <content:encoded><![CDATA[Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n\n<ul>\n    <li>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.</li>\n    <li>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.</li>\n</ul>\n\nLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.]]></content:encoded>\n        <excerpt:encoded><![CDATA[]]></excerpt:encoded>\n        <wp:post_id>174</wp:post_id>\n        <wp:post_date>2012-02-16 15:52:55</wp:post_date>\n        <wp:post_date_gmt>0000-00-00 00:00:00</wp:post_date_gmt>\n        <wp:comment_status>open</wp:comment_status>\n        <wp:ping_status>open</wp:ping_status>\n        <wp:post_name></wp:post_name>\n        <wp:status>draft</wp:status>\n        <wp:post_parent>0</wp:post_parent>\n        <wp:menu_order>0</wp:menu_order>\n        <wp:post_type>post</wp:post_type>\n        <wp:post_password></wp:post_password>\n        <wp:is_sticky>0</wp:is_sticky>\n        <category domain=\"category\" nicename=\"category-2\"><![CDATA[Category 2]]></category>\n        <wp:postmeta>\n            <wp:meta_key>_edit_last</wp:meta_key>\n            <wp:meta_value><![CDATA[3]]></wp:meta_value>\n        </wp:postmeta>\n    </item>\n    <item>\n        <title>Complete draft</title>\n        <link>http://thisisa.test/?p=176</link>\n        <pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>\n        <dc:creator>bob</dc:creator>\n        <guid isPermaLink=\"false\">http://thisisa.test/?p=176</guid>\n        <description></description>\n        <content:encoded><![CDATA[Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.]]></content:encoded>\n        <excerpt:encoded><![CDATA[]]></excerpt:encoded>\n        <wp:post_id>176</wp:post_id>\n        <wp:post_date>2012-02-17 15:11:55</wp:post_date>\n        <wp:post_date_gmt>0000-00-00 00:00:00</wp:post_date_gmt>\n        <wp:comment_status>open</wp:comment_status>\n        <wp:ping_status>open</wp:ping_status>\n        <wp:post_name></wp:post_name>\n        <wp:status>draft</wp:status>\n        <wp:post_parent>0</wp:post_parent>\n        <wp:menu_order>0</wp:menu_order>\n        <wp:post_type>post</wp:post_type>\n        <wp:post_password></wp:post_password>\n        <wp:is_sticky>0</wp:is_sticky>\n        <category domain=\"category\" nicename=\"category-3\"><![CDATA[Category 3]]></category>\n        <wp:postmeta>\n            <wp:meta_key>_edit_last</wp:meta_key>\n            <wp:meta_value><![CDATA[3]]></wp:meta_value>\n        </wp:postmeta>\n    </item>\n    <item>\n        <title>Page</title>\n        <link>http://thisisa.test/contact/</link>\n        <pubDate>Wed, 11 Apr 2012 11:38:08 +0000</pubDate>\n        <dc:creator>bob</dc:creator>\n        <guid isPermaLink=\"false\">http://thisisa.test/?page_id=334</guid>\n        <description></description>\n        <content:encoded><![CDATA[Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.]]></content:encoded>\n        <excerpt:encoded><![CDATA[]]></excerpt:encoded>\n        <wp:post_id>334</wp:post_id>\n        <wp:post_date>2012-04-11 06:38:08</wp:post_date>\n        <wp:post_date_gmt>2012-04-11 11:38:08</wp:post_date_gmt>\n        <wp:comment_status>open</wp:comment_status>\n        <wp:ping_status>open</wp:ping_status>\n        <wp:post_name>contact</wp:post_name>\n        <wp:status>publish</wp:status>\n        <wp:post_parent>0</wp:post_parent>\n        <wp:menu_order>0</wp:menu_order>\n        <wp:post_type>page</wp:post_type>\n        <wp:post_password></wp:post_password>\n        <wp:is_sticky>0</wp:is_sticky>\n        <wp:postmeta>\n            <wp:meta_key>sharing_disabled</wp:meta_key>\n            <wp:meta_value><![CDATA[1]]></wp:meta_value>\n        </wp:postmeta>\n        <wp:postmeta>\n            <wp:meta_key>_wp_page_template</wp:meta_key>\n            <wp:meta_value><![CDATA[default]]></wp:meta_value>\n        </wp:postmeta>\n        <wp:postmeta>\n            <wp:meta_key>_edit_last</wp:meta_key>\n            <wp:meta_value><![CDATA[3]]></wp:meta_value>\n        </wp:postmeta>\n    </item>\n    <item>\n        <title>Empty Page</title>\n        <link>http://thisisa.test/empty/</link>\n        <pubDate>Wed, 11 Apr 2012 11:38:08 +0000</pubDate>\n        <dc:creator>bob</dc:creator>\n        <guid isPermaLink=\"false\">http://thisisa.test/?page_id=334</guid>\n        <description></description>\n        <content:encoded><![CDATA[]]></content:encoded>\n        <excerpt:encoded><![CDATA[]]></excerpt:encoded>\n        <wp:post_id>334</wp:post_id>\n        <wp:post_date>2012-04-11 06:38:08</wp:post_date>\n        <wp:post_date_gmt>2012-04-11 11:38:08</wp:post_date_gmt>\n        <wp:comment_status>open</wp:comment_status>\n        <wp:ping_status>open</wp:ping_status>\n        <wp:post_name>empty</wp:post_name>\n        <wp:status>publish</wp:status>\n        <wp:post_parent>0</wp:post_parent>\n        <wp:menu_order>0</wp:menu_order>\n        <wp:post_type>page</wp:post_type>\n        <wp:post_password></wp:post_password>\n        <wp:is_sticky>0</wp:is_sticky>\n        <wp:postmeta>\n            <wp:meta_key>sharing_disabled</wp:meta_key>\n            <wp:meta_value><![CDATA[1]]></wp:meta_value>\n        </wp:postmeta>\n        <wp:postmeta>\n            <wp:meta_key>_wp_page_template</wp:meta_key>\n            <wp:meta_value><![CDATA[default]]></wp:meta_value>\n        </wp:postmeta>\n        <wp:postmeta>\n            <wp:meta_key>_edit_last</wp:meta_key>\n            <wp:meta_value><![CDATA[3]]></wp:meta_value>\n        </wp:postmeta>\n    </item>\n    <item>\n        <title>Special chars: l&#039;é</title>\n        <link>http://thisisa.test/?p=471</link>\n        <pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>\n        <dc:creator>bob</dc:creator>\n        <guid isPermaLink=\"false\">http://thisisa.test/?p=471</guid>\n        <description></description>\n        <content:encoded><![CDATA[l&#039;é]]></content:encoded>\n        <excerpt:encoded><![CDATA[]]></excerpt:encoded>\n        <wp:post_id>471</wp:post_id>\n        <wp:post_date>2012-04-29 09:44:27</wp:post_date>\n        <wp:post_date_gmt>0000-00-00 00:00:00</wp:post_date_gmt>\n        <wp:comment_status>open</wp:comment_status>\n        <wp:ping_status>open</wp:ping_status>\n        <wp:post_name></wp:post_name>\n        <wp:status>draft</wp:status>\n        <wp:post_parent>0</wp:post_parent>\n        <wp:menu_order>0</wp:menu_order>\n        <wp:post_type>post</wp:post_type>\n        <wp:post_password></wp:post_password>\n        <wp:is_sticky>0</wp:is_sticky>\n        <category domain=\"category\" nicename=\"category-1\"><![CDATA[Category 1]]></category>\n        <wp:postmeta>\n            <wp:meta_key>_edit_last</wp:meta_key>\n            <wp:meta_value><![CDATA[3]]></wp:meta_value>\n        </wp:postmeta>\n    </item>\n\n    <item>\n        <title>With excerpt</title>\n        <link>http://thisisa.test/with-excerpt/</link>\n        <pubDate>Sat, 04 Feb 2012 02:03:06 +0000</pubDate>\n        <dc:creator>bob</dc:creator>\n        <guid isPermaLink=\"false\">http://thisisa.test/?p=8</guid>\n        <description></description>\n        <content:encoded><![CDATA[Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n\nLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n\nLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.]]></content:encoded>\n        <excerpt:encoded><![CDATA[Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.]]></excerpt:encoded>\n        <wp:post_id>8</wp:post_id>\n        <wp:post_date>2012-02-04 02:03:06</wp:post_date>\n        <wp:post_date_gmt>2012-02-04 02:03:06</wp:post_date_gmt>\n        <wp:comment_status>open</wp:comment_status>\n        <wp:ping_status>open</wp:ping_status>\n        <wp:post_name>with-excerpt</wp:post_name>\n        <wp:status>publish</wp:status>\n        <wp:post_parent>0</wp:post_parent>\n        <wp:menu_order>0</wp:menu_order>\n        <wp:post_type>post</wp:post_type>\n        <wp:post_password></wp:post_password>\n        <wp:is_sticky>0</wp:is_sticky>\n        <category domain=\"category\" nicename=\"Category 1\"><![CDATA[Category 1]]></category>\n        <category domain=\"post_tag\" nicename=\"tag-1\"><![CDATA[tag 1]]></category>\n        <category domain=\"post_tag\" nicename=\"tag2\"><![CDATA[Tag2]]></category>\n        <wp:postmeta>\n            <wp:meta_key>_edit_last</wp:meta_key>\n            <wp:meta_value><![CDATA[3]]></wp:meta_value>\n        </wp:postmeta>\n        <wp:postmeta>\n            <wp:meta_key>et_bigpost</wp:meta_key>\n            <wp:meta_value><![CDATA[0]]></wp:meta_value>\n        </wp:postmeta>\n        <wp:postmeta>\n            <wp:meta_key>_thumbnail_id</wp:meta_key>\n            <wp:meta_value><![CDATA[32]]></wp:meta_value>\n        </wp:postmeta>\n    </item>\n    <item>\n        <title>With tags</title>\n        <link>http://thisisa.test/tags/</link>\n        <pubDate>Sat, 04 Feb 2012 21:05:25 +0000</pubDate>\n        <dc:creator>bob</dc:creator>\n        <guid isPermaLink=\"false\">http://thisisa.test/?p=25</guid>\n        <description></description>\n        <content:encoded><![CDATA[Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.]]></content:encoded>\n        <excerpt:encoded><![CDATA[]]></excerpt:encoded>\n        <wp:post_id>25</wp:post_id>\n        <wp:post_date>2012-02-04 21:05:25</wp:post_date>\n        <wp:post_date_gmt>2012-02-04 21:05:25</wp:post_date_gmt>\n        <wp:comment_status>open</wp:comment_status>\n        <wp:ping_status>open</wp:ping_status>\n        <wp:post_name>with-tags</wp:post_name>\n        <wp:status>publish</wp:status>\n        <wp:post_parent>0</wp:post_parent>\n        <wp:menu_order>0</wp:menu_order>\n        <wp:post_type>post</wp:post_type>\n        <wp:post_password></wp:post_password>\n        <wp:is_sticky>0</wp:is_sticky>\n        <category domain=\"category\" nicename=\"category-3\"><![CDATA[Category 3]]></category>\n        <category domain=\"post_tag\" nicename=\"tag-1\"><![CDATA[tag 1]]></category>\n        <category domain=\"post_tag\" nicename=\"tag-2\"><![CDATA[Tag2]]></category>\n        <category domain=\"post_tag\" nicename=\"tag-3\"><![CDATA[Tag 3]]></category>\n        <wp:postmeta>\n            <wp:meta_key>_edit_last</wp:meta_key>\n            <wp:meta_value><![CDATA[3]]></wp:meta_value>\n        </wp:postmeta>\n        <wp:postmeta>\n            <wp:meta_key>et_bigpost</wp:meta_key>\n            <wp:meta_value><![CDATA[0]]></wp:meta_value>\n        </wp:postmeta>\n        <wp:postmeta>\n            <wp:meta_key>_thumbnail_id</wp:meta_key>\n            <wp:meta_value><![CDATA[29]]></wp:meta_value>\n        </wp:postmeta>\n    </item>\n\t<item>\n        <title>With comments</title>\n        <link>http://thisisa.test/with-comments/</link>\n        <pubDate>Wed, 18 Apr 2012 08:36:26 +0000</pubDate>\n        <dc:creator>john</dc:creator>\n        <guid isPermaLink=\"false\">http://thisisa.test/?p=422</guid>\n        <description></description>\n        <content:encoded><![CDATA[Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.]]></content:encoded>\n        <excerpt:encoded><![CDATA[]]></excerpt:encoded>\n        <wp:post_id>422</wp:post_id>\n        <wp:post_date>2012-04-18 03:36:26</wp:post_date>\n        <wp:post_date_gmt>2012-04-18 08:36:26</wp:post_date_gmt>\n        <wp:comment_status>open</wp:comment_status>\n        <wp:ping_status>open</wp:ping_status>\n        <wp:post_name>with-comments</wp:post_name>\n        <wp:status>publish</wp:status>\n        <wp:post_parent>0</wp:post_parent>\n        <wp:menu_order>0</wp:menu_order>\n        <wp:post_type>post</wp:post_type>\n        <wp:post_password></wp:post_password>\n        <wp:is_sticky>0</wp:is_sticky>\n        <category domain=\"category\" nicename=\"category-1\"><![CDATA[Category 1]]></category>\n        <wp:postmeta>\n            <wp:meta_key>_edit_last</wp:meta_key>\n            <wp:meta_value><![CDATA[2]]></wp:meta_value>\n        </wp:postmeta>\n        <wp:postmeta>\n            <wp:meta_key>_thumbnail_id</wp:meta_key>\n            <wp:meta_value><![CDATA[423]]></wp:meta_value>\n        </wp:postmeta>\n        <wp:comment>\n            <wp:comment_id>116</wp:comment_id>\n            <wp:comment_author><![CDATA[User2]]></wp:comment_author>\n            <wp:comment_author_email>User2@mail.test</wp:comment_author_email>\n            <wp:comment_author_url></wp:comment_author_url>\n            <wp:comment_author_IP>127.0.0.1</wp:comment_author_IP>\n            <wp:comment_date>2012-05-06 15:46:06</wp:comment_date>\n            <wp:comment_date_gmt>2012-05-06 20:46:06</wp:comment_date_gmt>\n            <wp:comment_content><![CDATA[Comment content.]]></wp:comment_content>\n            <wp:comment_approved>1</wp:comment_approved>\n            <wp:comment_type></wp:comment_type>\n            <wp:comment_parent>0</wp:comment_parent>\n            <wp:comment_user_id>0</wp:comment_user_id>\n            <wp:commentmeta>\n                <wp:meta_key>akismet_result</wp:meta_key>\n                <wp:meta_value><![CDATA[false]]></wp:meta_value>\n            </wp:commentmeta>\n            <wp:commentmeta>\n                <wp:meta_key>akismet_history</wp:meta_key>\n                <wp:meta_value><![CDATA[a:4:{s:4:\"time\";s:15:\"1336337189.7974\";s:7:\"message\";s:28:\"Akismet cleared this comment\";s:5:\"event\";s:9:\"check-ham\";s:4:\"user\";s:0:\"\";}]]></wp:meta_value>\n            </wp:commentmeta>\n            <wp:commentmeta>\n                <wp:meta_key>akismet_as_submitted</wp:meta_key>\n                <wp:meta_value><![CDATA[a:64:{s:15:\"comment_post_ID\";s:3:\"422\";s:14:\"comment_author\";s:8:\"Baronsed\";s:20:\"comment_author_email\";s:15:\"User2@mail.test\";s:18:\"comment_author_url\";s:0:\"\";s:15:\"comment_content\";s:118:\"Dans les listes d'articles où celui-ci apparaît, l'image est trop grande et ralentit le chargement de toute la page.\";s:12:\"comment_type\";s:0:\"\";s:14:\"comment_parent\";s:1:\"0\";s:7:\"user_ID\";s:1:\"0\";s:7:\"user_ip\";s:14:\"127.0.0.1\";s:10:\"user_agent\";s:74:\"Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:12.0) Gecko/20100101 Firefox/12.0\";s:8:\"referrer\";s:0:\"\";s:4:\"blog\";s:19:\"http://thisisa.test\";s:9:\"blog_lang\";s:5:\"en_US\";s:12:\"blog_charset\";s:5:\"UTF-8\";s:9:\"permalink\";s:62:\"http://thisisa.test/htop-un-visualiseur-interactif-de-process/\";s:9:\"user_role\";s:0:\"\";s:21:\"akismet_comment_nonce\";s:6:\"passed\";s:11:\"POST_author\";s:8:\"Baronsed\";s:10:\"POST_email\";s:15:\"User2@mail.test\";s:8:\"POST_url\";s:0:\"\";s:12:\"POST_comment\";s:118:\"Dans les listes d'articles où celui-ci apparaît, l'image est trop grande et ralentit le chargement de toute la page.\";s:11:\"POST_submit\";s:14:\"Submit Comment\";s:20:\"POST_comment_post_ID\";s:3:\"422\";s:19:\"POST_comment_parent\";s:1:\"0\";s:26:\"POST_akismet_comment_nonce\";s:10:\"96b66769dc\";s:15:\"SERVER_SOFTWARE\";s:12:\"nginx/0.8.55\";s:11:\"REQUEST_URI\";s:21:\"/wp-comments-post.php\";s:4:\"TERM\";s:5:\"xterm\";s:17:\"PHP_FCGI_CHILDREN\";s:1:\"4\";s:4:\"PATH\";s:29:\"/sbin:/usr/sbin:/bin:/usr/bin\";s:1:\"_\";s:25:\"/usr/local/bin/spawn-fcgi\";s:3:\"PWD\";s:1:\"/\";s:4:\"LANG\";s:11:\"en_US.UTF-8\";s:5:\"SHLVL\";s:1:\"2\";s:21:\"PHP_FCGI_MAX_REQUESTS\";s:4:\"1000\";s:9:\"FCGI_ROLE\";s:9:\"RESPONDER\";s:12:\"QUERY_STRING\";s:0:\"\";s:14:\"REQUEST_METHOD\";s:4:\"POST\";s:12:\"CONTENT_TYPE\";s:33:\"application/x-www-form-urlencoded\";s:14:\"CONTENT_LENGTH\";s:3:\"277\";s:11:\"SCRIPT_NAME\";s:21:\"/wp-comments-post.php\";s:12:\"DOCUMENT_URI\";s:21:\"/wp-comments-post.php\";s:13:\"DOCUMENT_ROOT\";s:14:\"/home/blog\";s:15:\"SERVER_PROTOCOL\";s:8:\"HTTP/1.1\";s:17:\"GATEWAY_INTERFACE\";s:7:\"CGI/1.1\";s:11:\"REMOTE_ADDR\";s:14:\"127.0.0.1\";s:11:\"REMOTE_PORT\";s:5:\"52826\";s:11:\"SERVER_ADDR\";s:13:\"127.0.0.1\";s:11:\"SERVER_PORT\";s:2:\"80\";s:11:\"SERVER_NAME\";s:12:\"thisisa.test\";s:15:\"REDIRECT_STATUS\";s:3:\"200\";s:15:\"SCRIPT_FILENAME\";s:35:\"/home/blog/wp-comments-post.php\";s:9:\"HTTP_HOST\";s:12:\"thisisa.test\";s:15:\"HTTP_USER_AGENT\";s:74:\"Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:12.0) Gecko/20100101 Firefox/12.0\";s:11:\"HTTP_ACCEPT\";s:63:\"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\";s:20:\"HTTP_ACCEPT_LANGUAGE\";s:35:\"fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3\";s:20:\"HTTP_ACCEPT_ENCODING\";s:13:\"gzip, deflate\";s:8:\"HTTP_DNT\";s:1:\"1\";s:15:\"HTTP_CONNECTION\";s:10:\"keep-alive\";s:11:\"HTTP_COOKIE\";s:0:\"\";s:17:\"HTTP_CONTENT_TYPE\";s:33:\"application/x-www-form-urlencoded\";s:19:\"HTTP_CONTENT_LENGTH\";s:3:\"277\";s:8:\"PHP_SELF\";s:21:\"/wp-comments-post.php\";s:12:\"REQUEST_TIME\";s:10:\"1336337164\";}]]></wp:meta_value>\n            </wp:commentmeta>\n        </wp:comment>\n        <wp:comment>\n            <wp:comment_id>117</wp:comment_id>\n            <wp:comment_author><![CDATA[Bob]]></wp:comment_author>\n            <wp:comment_author_email>bob@thisisa.test</wp:comment_author_email>\n            <wp:comment_author_url></wp:comment_author_url>\n            <wp:comment_author_IP>127.0.0.1</wp:comment_author_IP>\n            <wp:comment_date>2012-05-06 17:44:06</wp:comment_date>\n            <wp:comment_date_gmt>2012-05-06 22:44:06</wp:comment_date_gmt>\n            <wp:comment_content><![CDATA[Comment content.]]></wp:comment_content>\n            <wp:comment_approved>1</wp:comment_approved>\n            <wp:comment_type></wp:comment_type>\n            <wp:comment_parent>116</wp:comment_parent>\n            <wp:comment_user_id>3</wp:comment_user_id>\n            <wp:commentmeta>\n                <wp:meta_key>akismet_result</wp:meta_key>\n                <wp:meta_value><![CDATA[false]]></wp:meta_value>\n            </wp:commentmeta>\n            <wp:commentmeta>\n                <wp:meta_key>akismet_history</wp:meta_key>\n                <wp:meta_value><![CDATA[a:4:{s:4:\"time\";s:15:\"1336344263.8658\";s:7:\"message\";s:28:\"Akismet cleared this comment\";s:5:\"event\";s:9:\"check-ham\";s:4:\"user\";s:3:\"bob\";}]]></wp:meta_value>\n            </wp:commentmeta>\n            <wp:commentmeta>\n                <wp:meta_key>akismet_as_submitted</wp:meta_key>\n                <wp:meta_value><![CDATA[a:74:{s:15:\"comment_post_ID\";s:3:\"422\";s:14:\"comment_author\";s:3:\"bob\";s:20:\"comment_author_email\";s:25:\"bob@thisisa.test\";s:18:\"comment_author_url\";s:0:\"\";s:15:\"comment_content\";s:26:\"Merci de l'avoir signalé.\";s:14:\"comment_parent\";s:3:\"116\";s:7:\"user_ID\";s:1:\"3\";s:7:\"user_ip\";s:14:\"127.0.0.1\";s:10:\"user_agent\";s:139:\"Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.19 (KHTML, like Gecko) Ubuntu/12.04 Chromium/127.0.0.1 Chrome/127.0.0.1 Safari/535.19\";s:8:\"referrer\";s:29:\"http://thisisa.test/wp-admin/\";s:4:\"blog\";s:19:\"http://thisisa.test\";s:9:\"blog_lang\";s:5:\"en_US\";s:12:\"blog_charset\";s:5:\"UTF-8\";s:9:\"permalink\";s:62:\"http://thisisa.test/htop-un-visualiseur-interactif-de-process/\";s:9:\"user_role\";s:13:\"administrator\";s:21:\"akismet_comment_nonce\";s:6:\"passed\";s:22:\"POST_newcomment_author\";s:0:\"\";s:28:\"POST_newcomment_author_email\";s:0:\"\";s:26:\"POST_newcomment_author_url\";s:0:\"\";s:12:\"POST_user_ID\";s:1:\"3\";s:11:\"POST_action\";s:15:\"replyto-comment\";s:15:\"POST_comment_ID\";s:3:\"116\";s:20:\"POST_comment_post_ID\";s:3:\"422\";s:11:\"POST_status\";s:0:\"\";s:13:\"POST_position\";s:2:\"-1\";s:13:\"POST_checkbox\";s:1:\"0\";s:9:\"POST_mode\";s:9:\"dashboard\";s:32:\"POST__ajax_nonce-replyto-comment\";s:10:\"d1ad3bd917\";s:32:\"POST__wp_unfiltered_html_comment\";s:10:\"fc11aee860\";s:12:\"POST_content\";s:26:\"Merci de l'avoir signalé.\";s:7:\"POST_id\";s:3:\"422\";s:21:\"POST_comments_listing\";s:0:\"\";s:15:\"SERVER_SOFTWARE\";s:12:\"nginx/0.8.55\";s:11:\"REQUEST_URI\";s:24:\"/wp-admin/admin-ajax.php\";s:4:\"TERM\";s:5:\"xterm\";s:17:\"PHP_FCGI_CHILDREN\";s:1:\"4\";s:4:\"PATH\";s:29:\"/sbin:/usr/sbin:/bin:/usr/bin\";s:1:\"_\";s:25:\"/usr/local/bin/spawn-fcgi\";s:3:\"PWD\";s:1:\"/\";s:4:\"LANG\";s:11:\"en_US.UTF-8\";s:5:\"SHLVL\";s:1:\"2\";s:21:\"PHP_FCGI_MAX_REQUESTS\";s:4:\"1000\";s:9:\"FCGI_ROLE\";s:9:\"RESPONDER\";s:12:\"QUERY_STRING\";s:0:\"\";s:14:\"REQUEST_METHOD\";s:4:\"POST\";s:12:\"CONTENT_TYPE\";s:33:\"application/x-www-form-urlencoded\";s:14:\"CONTENT_LENGTH\";s:3:\"322\";s:11:\"SCRIPT_NAME\";s:24:\"/wp-admin/admin-ajax.php\";s:12:\"DOCUMENT_URI\";s:24:\"/wp-admin/admin-ajax.php\";s:13:\"DOCUMENT_ROOT\";s:14:\"/home/blog\";s:15:\"SERVER_PROTOCOL\";s:8:\"HTTP/1.1\";s:17:\"GATEWAY_INTERFACE\";s:7:\"CGI/1.1\";s:11:\"REMOTE_ADDR\";s:14:\"127.0.0.1\";s:11:\"REMOTE_PORT\";s:5:\"10252\";s:11:\"SERVER_ADDR\";s:13:\"127.0.0.1\";s:11:\"SERVER_PORT\";s:2:\"80\";s:11:\"SERVER_NAME\";s:12:\"thisisa.test\";s:15:\"REDIRECT_STATUS\";s:3:\"200\";s:15:\"SCRIPT_FILENAME\";s:38:\"/home/blog/wp-admin/admin-ajax.php\";s:9:\"HTTP_HOST\";s:12:\"thisisa.test\";s:15:\"HTTP_CONNECTION\";s:10:\"keep-alive\";s:19:\"HTTP_CONTENT_LENGTH\";s:3:\"322\";s:11:\"HTTP_ORIGIN\";s:19:\"http://thisisa.test\";s:21:\"HTTP_X_REQUESTED_WITH\";s:14:\"XMLHttpRequest\";s:15:\"HTTP_USER_AGENT\";s:139:\"Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.19 (KHTML, like Gecko) Ubuntu/12.04 Chromium/127.0.0.1 Chrome/127.0.0.1 Safari/535.19\";s:17:\"HTTP_CONTENT_TYPE\";s:33:\"application/x-www-form-urlencoded\";s:11:\"HTTP_ACCEPT\";s:3:\"*/*\";s:12:\"HTTP_REFERER\";s:29:\"http://thisisa.test/wp-admin/\";s:20:\"HTTP_ACCEPT_ENCODING\";s:17:\"gzip,deflate,sdch\";s:20:\"HTTP_ACCEPT_LANGUAGE\";s:35:\"fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4\";s:19:\"HTTP_ACCEPT_CHARSET\";s:30:\"ISO-8859-1,utf-8;q=0.7,*;q=0.3\";s:11:\"HTTP_COOKIE\";s:0:\"\";s:8:\"PHP_SELF\";s:24:\"/wp-admin/admin-ajax.php\";s:12:\"REQUEST_TIME\";s:10:\"1336344246\";}]]></wp:meta_value>\n            </wp:commentmeta>\n        </wp:comment>\n        <wp:comment>\n            <wp:comment_id>156</wp:comment_id>\n            <wp:comment_author><![CDATA[Ping back comment author]]></wp:comment_author>\n            <wp:comment_author_email></wp:comment_author_email>\n            <wp:comment_author_url>http://thisisa.test/to-article-you-ping-back/</wp:comment_author_url>\n            <wp:comment_author_IP>127.0.0.1</wp:comment_author_IP>\n            <wp:comment_date>2012-05-09 19:30:19</wp:comment_date>\n            <wp:comment_date_gmt>2012-05-10 00:30:19</wp:comment_date_gmt>\n            <wp:comment_content><![CDATA[[...]this is a ping pack [...] ]]></wp:comment_content>\n            <wp:comment_approved>trash</wp:comment_approved>\n            <wp:comment_type>pingback</wp:comment_type>\n            <wp:comment_parent>0</wp:comment_parent>\n            <wp:comment_user_id>0</wp:comment_user_id>\n            <wp:commentmeta>\n                <wp:meta_key>akismet_history</wp:meta_key>\n                <wp:meta_value><![CDATA[a:4:{s:4:\"time\";s:15:\"1336610793.7343\";s:7:\"message\";s:39:\"bob changed the comment status to trash\";s:5:\"event\";s:12:\"status-trash\";s:4:\"user\";s:3:\"bob\";}]]></wp:meta_value>\n            </wp:commentmeta>\n            <wp:commentmeta>\n                <wp:meta_key>_wp_trash_meta_status</wp:meta_key>\n                <wp:meta_value><![CDATA[0]]></wp:meta_value>\n            </wp:commentmeta>\n            <wp:commentmeta>\n                <wp:meta_key>_wp_trash_meta_time</wp:meta_key>\n                <wp:meta_value><![CDATA[1336610793]]></wp:meta_value>\n            </wp:commentmeta>\n        </wp:comment>\n        <wp:comment>\n            <wp:comment_id>122</wp:comment_id>\n            <wp:comment_author><![CDATA[bob]]></wp:comment_author>\n            <wp:comment_author_email>bob@thisisa.test</wp:comment_author_email>\n            <wp:comment_author_url></wp:comment_author_url>\n            <wp:comment_author_IP>127.0.0.1</wp:comment_author_IP>\n            <wp:comment_date>2012-05-07 14:11:34</wp:comment_date>\n            <wp:comment_date_gmt>2012-05-07 19:11:34</wp:comment_date_gmt>\n            <wp:comment_content><![CDATA[Comment content.]]></wp:comment_content>\n            <wp:comment_approved>1</wp:comment_approved>\n            <wp:comment_type></wp:comment_type>\n            <wp:comment_parent>121</wp:comment_parent>\n            <wp:comment_user_id>3</wp:comment_user_id>\n            <wp:commentmeta>\n                <wp:meta_key>akismet_result</wp:meta_key>\n                <wp:meta_value><![CDATA[false]]></wp:meta_value>\n            </wp:commentmeta>\n            <wp:commentmeta>\n                <wp:meta_key>akismet_history</wp:meta_key>\n                <wp:meta_value><![CDATA[a:4:{s:4:\"time\";s:15:\"1336417895.1821\";s:7:\"message\";s:28:\"Akismet cleared this comment\";s:5:\"event\";s:9:\"check-ham\";s:4:\"user\";s:3:\"bob\";}]]></wp:meta_value>\n            </wp:commentmeta>\n            <wp:commentmeta>\n                <wp:meta_key>akismet_as_submitted</wp:meta_key>\n                <wp:meta_value><![CDATA[a:65:{s:15:\"comment_post_ID\";s:3:\"422\";s:14:\"comment_author\";s:3:\"bob\";s:20:\"comment_author_email\";s:25:\"bob@thisisa.test\";s:18:\"comment_author_url\";s:0:\"\";s:15:\"comment_content\";s:832:\"Comment content\";s:12:\"comment_type\";s:0:\"\";s:14:\"comment_parent\";s:3:\"121\";s:7:\"user_ID\";s:1:\"3\";s:7:\"user_ip\";s:14:\"127.0.0.1\";s:10:\"user_agent\";s:139:\"Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.19 (KHTML, like Gecko) Ubuntu/12.04 Chromium/127.0.0.1 Chrome/127.0.0.1 Safari/535.19\";s:8:\"referrer\";s:62:\"http://thisisa.test/htop-un-visualiseur-interactif-de-process/\";s:4:\"blog\";s:19:\"http://thisisa.test\";s:9:\"blog_lang\";s:5:\"en_US\";s:12:\"blog_charset\";s:5:\"UTF-8\";s:9:\"permalink\";s:62:\"http://thisisa.test/htop-un-visualiseur-interactif-de-process/\";s:9:\"user_role\";s:13:\"administrator\";s:21:\"akismet_comment_nonce\";s:6:\"passed\";s:12:\"POST_comment\";s:832:\"Comment content.\";s:11:\"POST_submit\";s:14:\"Submit Comment\";s:20:\"POST_comment_post_ID\";s:3:\"422\";s:19:\"POST_comment_parent\";s:3:\"121\";s:32:\"POST__wp_unfiltered_html_comment\";s:10:\"9dacc22ee8\";s:26:\"POST_akismet_comment_nonce\";s:10:\"b9cbdae553\";s:15:\"SERVER_SOFTWARE\";s:12:\"nginx/0.8.55\";s:11:\"REQUEST_URI\";s:21:\"/wp-comments-post.php\";s:4:\"TERM\";s:5:\"xterm\";s:17:\"PHP_FCGI_CHILDREN\";s:1:\"4\";s:4:\"PATH\";s:29:\"/sbin:/usr/sbin:/bin:/usr/bin\";s:1:\"_\";s:25:\"/usr/local/bin/spawn-fcgi\";s:3:\"PWD\";s:1:\"/\";s:4:\"LANG\";s:11:\"en_US.UTF-8\";s:5:\"SHLVL\";s:1:\"2\";s:21:\"PHP_FCGI_MAX_REQUESTS\";s:4:\"1000\";s:9:\"FCGI_ROLE\";s:9:\"RESPONDER\";s:12:\"QUERY_STRING\";s:0:\"\";s:14:\"REQUEST_METHOD\";s:4:\"POST\";s:12:\"CONTENT_TYPE\";s:33:\"application/x-www-form-urlencoded\";s:14:\"CONTENT_LENGTH\";s:4:\"1143\";s:11:\"SCRIPT_NAME\";s:21:\"/wp-comments-post.php\";s:12:\"DOCUMENT_URI\";s:21:\"/wp-comments-post.php\";s:13:\"DOCUMENT_ROOT\";s:14:\"/home/blog\";s:15:\"SERVER_PROTOCOL\";s:8:\"HTTP/1.1\";s:17:\"GATEWAY_INTERFACE\";s:7:\"CGI/1.1\";s:11:\"REMOTE_ADDR\";s:14:\"127.0.0.1\";s:11:\"REMOTE_PORT\";s:5:\"10834\";s:11:\"SERVER_ADDR\";s:13:\"127.0.0.1\";s:11:\"SERVER_PORT\";s:2:\"80\";s:11:\"SERVER_NAME\";s:12:\"thisisa.test\";s:15:\"REDIRECT_STATUS\";s:3:\"200\";s:15:\"SCRIPT_FILENAME\";s:35:\"/home/blog/wp-comments-post.php\";s:9:\"HTTP_HOST\";s:12:\"thisisa.test\";s:15:\"HTTP_CONNECTION\";s:10:\"keep-alive\";s:19:\"HTTP_CONTENT_LENGTH\";s:4:\"1143\";s:18:\"HTTP_CACHE_CONTROL\";s:9:\"john-age=0\";s:11:\"HTTP_ORIGIN\";s:19:\"http://thisisa.test\";s:15:\"HTTP_USER_AGENT\";s:139:\"Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.19 (KHTML, like Gecko) Ubuntu/12.04 Chromium/127.0.0.1 Chrome/127.0.0.1 Safari/535.19\";s:17:\"HTTP_CONTENT_TYPE\";s:33:\"application/x-www-form-urlencoded\";s:11:\"HTTP_ACCEPT\";s:63:\"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\";s:12:\"HTTP_REFERER\";s:62:\"http://thisisa.test/htop-un-visualiseur-interactif-de-process/\";s:20:\"HTTP_ACCEPT_ENCODING\";s:17:\"gzip,deflate,sdch\";s:20:\"HTTP_ACCEPT_LANGUAGE\";s:35:\"fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4\";s:19:\"HTTP_ACCEPT_CHARSET\";s:30:\"ISO-8859-1,utf-8;q=0.7,*;q=0.3\";s:11:\"HTTP_COOKIE\";s:0:\"\";s:8:\"PHP_SELF\";s:21:\"/wp-comments-post.php\";s:12:\"REQUEST_TIME\";s:10:\"1336417893\";}]]></wp:meta_value>\n            </wp:commentmeta>\n        </wp:comment>\n    </item>\n    <item>\n        <title>Post with raw data</title>\n        <link>http://thisisa.test/?p=173</link>\n        <pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>\n        <dc:creator>bob</dc:creator>\n        <guid isPermaLink=\"false\">http://thisisa.test/?p=173</guid>\n        <description></description>\n        <content:encoded><![CDATA[<h1>Pelicans are scary</h1>\n\nPelicans are supposed to eat fish, damn it!\n\n<iframe width=\"420\" height=\"315\" src=\"http://www.youtube.com/embed/QNNl_uWmQXE\" frameborder=\"0\" allowfullscreen></iframe>\n\nBottom line: don't mess up with birds\n\n\"That's a 'wonderful' shoe.\"\n\n“That’s a ‘magic’ sock.”]]></content:encoded>\n        <excerpt:encoded><![CDATA[]]></excerpt:encoded>\n        <wp:post_id>173</wp:post_id>\n        <wp:post_date>2012-02-16 15:52:55</wp:post_date>\n        <wp:post_date_gmt>0000-00-00 00:00:00</wp:post_date_gmt>\n        <wp:comment_status>open</wp:comment_status>\n        <wp:ping_status>open</wp:ping_status>\n        <wp:post_name>post-with-raw-data</wp:post_name>\n        <wp:status>publish</wp:status>\n        <wp:post_parent>0</wp:post_parent>\n        <wp:menu_order>0</wp:menu_order>\n        <wp:post_type>post</wp:post_type>\n        <wp:post_password></wp:post_password>\n        <wp:is_sticky>0</wp:is_sticky>\n        <category domain=\"category\" nicename=\"category-2\"><![CDATA[Category 2]]></category>\n        <wp:postmeta>\n            <wp:meta_key>_edit_last</wp:meta_key>\n            <wp:meta_value><![CDATA[3]]></wp:meta_value>\n        </wp:postmeta>\n    </item>\n    <item>\n        <title>A normal post with some &lt;html&gt; entities in the title. You can&#039;t miss them.</title>\n        <link>http://thisisa.test/?p=175</link>\n        <pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>\n        <dc:creator>bob</dc:creator>\n        <guid isPermaLink=\"false\">http://thisisa.test/?p=175</guid>\n        <description></description>\n        <content:encoded><![CDATA[Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n\n<ul>\n    <li>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.</li>\n    <li>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.</li>\n</ul>\n\nLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.]]></content:encoded>\n        <excerpt:encoded><![CDATA[]]></excerpt:encoded>\n        <wp:post_id>175</wp:post_id>\n        <wp:post_date>2012-02-16 15:52:55</wp:post_date>\n        <wp:post_date_gmt>0000-00-00 00:00:00</wp:post_date_gmt>\n        <wp:comment_status>open</wp:comment_status>\n        <wp:ping_status>open</wp:ping_status>\n        <wp:post_name>html-entity-test</wp:post_name>\n        <wp:status>publish</wp:status>\n        <wp:post_parent>0</wp:post_parent>\n        <wp:menu_order>0</wp:menu_order>\n        <wp:post_type>post</wp:post_type>\n        <wp:post_password></wp:post_password>\n        <wp:is_sticky>0</wp:is_sticky>\n        <category domain=\"category\" nicename=\"category-2\"><![CDATA[Category 2]]></category>\n        <wp:postmeta>\n            <wp:meta_key>_edit_last</wp:meta_key>\n            <wp:meta_value><![CDATA[3]]></wp:meta_value>\n        </wp:postmeta>\n    </item>\n    <item>\n        <title>Code in List</title>\n        <link>http://thisisa.test/?p=175</link>\n        <pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>\n        <dc:creator>bob</dc:creator>\n        <guid isPermaLink=\"false\">http://thisisa.test/?p=175</guid>\n        <description></description>\n        <content:encoded><![CDATA[Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n\n<ul>\n    <li>List Item One!</li>\n    <li>List Item Two!</li>\n<li>This is a code sample\n<pre>\n<code>\n  a = [1, 2, 3]\n  b = [4, 5, 6]\n  for i in zip(a, b):\n    print i\n</code>\n</pre></li>\n    <li>List Item Four!</li>\n</ul>\n\nLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.]]></content:encoded>\n        <excerpt:encoded><![CDATA[]]></excerpt:encoded>\n        <wp:post_id>175</wp:post_id>\n        <wp:post_date>2012-02-16 15:52:55</wp:post_date>\n        <wp:post_date_gmt>0000-00-00 00:00:00</wp:post_date_gmt>\n        <wp:comment_status>open</wp:comment_status>\n        <wp:ping_status>open</wp:ping_status>\n        <wp:post_name>code-in-list-test</wp:post_name>\n        <wp:status>publish</wp:status>\n        <wp:post_parent>0</wp:post_parent>\n        <wp:menu_order>0</wp:menu_order>\n        <wp:post_type>post</wp:post_type>\n        <wp:post_password></wp:post_password>\n        <wp:is_sticky>0</wp:is_sticky>\n        <category domain=\"category\" nicename=\"category-2\"><![CDATA[Category 2]]></category>\n        <wp:postmeta>\n            <wp:meta_key>_edit_last</wp:meta_key>\n            <wp:meta_value><![CDATA[3]]></wp:meta_value>\n        </wp:postmeta>\n    </item>\n    <item>\n        <title>Caption on image</title>\n        <link>http://thisisa.test/?p=176</link>\n        <pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>\n        <dc:creator>bob</dc:creator>\n        <guid isPermaLink=\"false\">http://thisisa.test/?p=176</guid>\n        <description></description>\n        <content:encoded><![CDATA[Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n\n[caption attachment_id=\"42\" align=\"aligncenter\" width=\"300\" caption=\"This is a pelican\"]<img src=\"/theme/img/xpelican.png.pagespeed.ic.Rjep0025-y.png\"/>[/caption]\n\n[caption attachment_id=\"43\" align=\"aligncenter\" width=\"300\"]<img src=\"/theme/img/xpelican-3.png.pagespeed.ic.m-NAIdRCOM.png\" width=\"300\" height=\"216\" class=\"size-medium wp-image-1055\" /> This also a pelican[/caption]\n\n[caption attachment_id=\"44\" align=\"aligncenter\" width=\"300\"]<a href=\"https://getpelican.com/\"><img src=\"/theme/img/xpelican.png.pagespeed.ic.Rjep0025-y.png\" alt=\"\"/> Yet another pelican[/caption]\n\nLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.]]></content:encoded>\n        <excerpt:encoded><![CDATA[]]></excerpt:encoded>\n        <wp:post_id>176</wp:post_id>\n        <wp:post_date>2012-02-16 15:52:55</wp:post_date>\n        <wp:post_date_gmt>0000-00-00 00:00:00</wp:post_date_gmt>\n        <wp:comment_status>open</wp:comment_status>\n        <wp:ping_status>open</wp:ping_status>\n        <wp:post_name>caption-on-image</wp:post_name>\n        <wp:status>publish</wp:status>\n        <wp:post_parent>0</wp:post_parent>\n        <wp:menu_order>0</wp:menu_order>\n        <wp:post_type>post</wp:post_type>\n        <wp:post_password></wp:post_password>\n        <wp:is_sticky>0</wp:is_sticky>\n        <category domain=\"category\" nicename=\"category-2\"><![CDATA[Category 2]]></category>\n        <wp:postmeta>\n            <wp:meta_key>_edit_last</wp:meta_key>\n            <wp:meta_value><![CDATA[3]]></wp:meta_value>\n        </wp:postmeta>\n    </item>\n    <item>\n        <title>A custom post in category 4</title>\n        <link>http://thisisa.test/?p=175</link>\n        <pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>\n        <dc:creator>bob</dc:creator>\n        <guid isPermaLink=\"false\">http://thisisa.test/?p=175</guid>\n        <description></description>\n        <content:encoded><![CDATA[Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n\n<ul>\n    <li>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.</li>\n    <li>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.</li>\n</ul>\n\nLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.]]></content:encoded>\n        <excerpt:encoded><![CDATA[]]></excerpt:encoded>\n        <wp:post_id>175</wp:post_id>\n        <wp:post_date>2012-02-16 15:52:55</wp:post_date>\n        <wp:post_date_gmt>0000-00-00 00:00:00</wp:post_date_gmt>\n        <wp:comment_status>open</wp:comment_status>\n        <wp:ping_status>open</wp:ping_status>\n        <wp:post_name>custpost1cat4</wp:post_name>\n        <wp:status>publish</wp:status>\n        <wp:post_parent>0</wp:post_parent>\n        <wp:menu_order>0</wp:menu_order>\n        <wp:post_type>custom1</wp:post_type>\n        <wp:post_password></wp:post_password>\n        <wp:is_sticky>0</wp:is_sticky>\n        <category domain=\"category\" nicename=\"category-4\"><![CDATA[Category 4]]></category>\n        <wp:postmeta>\n            <wp:meta_key>_edit_last</wp:meta_key>\n            <wp:meta_value><![CDATA[3]]></wp:meta_value>\n        </wp:postmeta>\n    </item>\n    <item>\n        <title>A custom post in category 5</title>\n        <link>http://thisisa.test/?p=176</link>\n        <pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>\n        <dc:creator>bob</dc:creator>\n        <guid isPermaLink=\"false\">http://thisisa.test/?p=176</guid>\n        <description></description>\n        <content:encoded><![CDATA[Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n\n<ul>\n    <li>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.</li>\n    <li>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.</li>\n</ul>\n\nLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.]]></content:encoded>\n        <excerpt:encoded><![CDATA[]]></excerpt:encoded>\n        <wp:post_id>176</wp:post_id>\n        <wp:post_date>2012-02-16 15:52:55</wp:post_date>\n        <wp:post_date_gmt>0000-00-00 00:00:00</wp:post_date_gmt>\n        <wp:comment_status>open</wp:comment_status>\n        <wp:ping_status>open</wp:ping_status>\n        <wp:post_name>custpost1cat5</wp:post_name>\n        <wp:status>publish</wp:status>\n        <wp:post_parent>0</wp:post_parent>\n        <wp:menu_order>0</wp:menu_order>\n        <wp:post_type>custom1</wp:post_type>\n        <wp:post_password></wp:post_password>\n        <wp:is_sticky>0</wp:is_sticky>\n        <category domain=\"category\" nicename=\"category-5\"><![CDATA[Category 5]]></category>\n        <wp:postmeta>\n            <wp:meta_key>_edit_last</wp:meta_key>\n            <wp:meta_value><![CDATA[3]]></wp:meta_value>\n        </wp:postmeta>\n        </item>\n        <item>\n        <title>A 2nd custom post type also in category 5</title>\n        <link>http://thisisa.test/?p=177</link>\n        <pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>\n        <dc:creator>bob</dc:creator>\n        <guid isPermaLink=\"false\">http://thisisa.test/?p=177</guid>\n        <description></description>\n        <content:encoded><![CDATA[Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n\n<ul>\n    <li>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.</li>\n    <li>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.</li>\n</ul>\n\nLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\nproident, sunt in culpa qui officia deserunt mollit anim id est laborum.]]></content:encoded>\n        <excerpt:encoded><![CDATA[]]></excerpt:encoded>\n        <wp:post_id>177</wp:post_id>\n        <wp:post_date>2012-02-16 15:52:55</wp:post_date>\n        <wp:post_date_gmt>0000-00-00 00:00:00</wp:post_date_gmt>\n        <wp:comment_status>open</wp:comment_status>\n        <wp:ping_status>open</wp:ping_status>\n        <wp:post_name>custpost2cat5</wp:post_name>\n        <wp:status>publish</wp:status>\n        <wp:post_parent>0</wp:post_parent>\n        <wp:menu_order>0</wp:menu_order>\n        <wp:post_type>custom2</wp:post_type>\n        <wp:post_password></wp:post_password>\n        <wp:is_sticky>0</wp:is_sticky>\n        <category domain=\"category\" nicename=\"category-5\"><![CDATA[Category 5]]></category>\n        <wp:postmeta>\n            <wp:meta_key>_edit_last</wp:meta_key>\n            <wp:meta_value><![CDATA[3]]></wp:meta_value>\n        </wp:postmeta>\n    </item>\n    <item>\n        <title>Attachment with a parent</title>\n        <link>http://thisisa.test/?attachment_id=24</link>\n        <pubDate>Sat, 04 Feb 2012 03:17:33 +0000</pubDate>\n        <dc:creator>bob</dc:creator>\n        <guid isPermaLink=\"false\">http://thisurlisinvalid.notarealdomain/not_an_image.jpg</guid>\n        <description></description>\n        <content:encoded><![CDATA[]]></content:encoded>\n        <excerpt:encoded><![CDATA[]]></excerpt:encoded>\n        <wp:post_id>25</wp:post_id>\n        <wp:post_date>2012-02-04 03:17:33</wp:post_date>\n        <wp:post_date_gmt>2012-02-04 03:17:33</wp:post_date_gmt>\n        <wp:comment_status>open</wp:comment_status>\n        <wp:ping_status>open</wp:ping_status>\n        <wp:post_name>attachment-with-a-parent</wp:post_name>\n        <wp:status>inherit</wp:status>\n        <wp:post_parent>8</wp:post_parent>\n        <wp:menu_order>0</wp:menu_order>\n        <wp:post_type>attachment</wp:post_type>\n        <wp:post_password></wp:post_password>\n        <wp:is_sticky>0</wp:is_sticky>\n        <wp:attachment_url>http://thisurlisinvalid.notarealdomain/not_an_image.jpg</wp:attachment_url>\n        <wp:postmeta>\n            <wp:meta_key>_wp_attachment_metadata</wp:meta_key>\n            <wp:meta_value><![CDATA[a:5:{s:5:\"width\";s:3:\"150\";s:6:\"height\";s:3:\"186\";s:14:\"hwstring_small\";s:22:\"height='96' width='77'\";s:4:\"file\";s:20:\"2012/02/pelican.png\";s:10:\"image_meta\";a:10:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";}}]]></wp:meta_value>\n        </wp:postmeta>\n        <wp:postmeta>\n            <wp:meta_key>_wp_attached_file</wp:meta_key>\n            <wp:meta_value><![CDATA[2012/02/stuff.png]]></wp:meta_value>\n        </wp:postmeta>\n        <wp:postmeta>\n            <wp:meta_key>_wp_attachment_image_alt</wp:meta_key>\n            <wp:meta_value><![CDATA[Stuff]]></wp:meta_value>\n        </wp:postmeta>\n    </item>\n    <item>\n        <title>2nd Attachment to same parent</title>\n        <link>http://thisisa.test/?attachment_id=25</link>\n        <pubDate>Sat, 04 Feb 2012 03:17:33 +0000</pubDate>\n        <dc:creator>bob</dc:creator>\n        <guid isPermaLink=\"false\">http://en.wikipedia.org/wiki/File:Pelikan_Walvis_Bay.jpg</guid>\n        <description></description>\n        <content:encoded><![CDATA[]]></content:encoded>\n        <excerpt:encoded><![CDATA[]]></excerpt:encoded>\n        <wp:post_id>25</wp:post_id>\n        <wp:post_date>2012-02-04 03:17:33</wp:post_date>\n        <wp:post_date_gmt>2012-02-04 03:17:33</wp:post_date_gmt>\n        <wp:comment_status>open</wp:comment_status>\n        <wp:ping_status>open</wp:ping_status>\n        <wp:post_name>2nd[attachment-to-same-parent</wp:post_name>\n        <wp:status>inherit</wp:status>\n        <wp:post_parent>8</wp:post_parent>\n        <wp:menu_order>0</wp:menu_order>\n        <wp:post_type>attachment</wp:post_type>\n        <wp:post_password></wp:post_password>\n        <wp:is_sticky>0</wp:is_sticky>\n        <wp:attachment_url>http://en.wikipedia.org/wiki/File:Pelikan_Walvis_Bay.jpg</wp:attachment_url>\n        <wp:postmeta>\n            <wp:meta_key>_wp_attachment_metadata</wp:meta_key>\n            <wp:meta_value><![CDATA[a:5:{s:5:\"width\";s:3:\"150\";s:6:\"height\";s:3:\"186\";s:14:\"hwstring_small\";s:22:\"height='96' width='77'\";s:4:\"file\";s:20:\"2012/02/pelican.png\";s:10:\"image_meta\";a:10:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";}}]]></wp:meta_value>\n        </wp:postmeta>\n        <wp:postmeta>\n            <wp:meta_key>_wp_attached_file</wp:meta_key>\n            <wp:meta_value><![CDATA[2012/02/stuff.png]]></wp:meta_value>\n        </wp:postmeta>\n        <wp:postmeta>\n            <wp:meta_key>_wp_attachment_image_alt</wp:meta_key>\n            <wp:meta_value><![CDATA[Stuff]]></wp:meta_value>\n        </wp:postmeta>\n    </item>\n    <item>\n        <title>Attachment with a different parent</title>\n        <link>http://thisisa.test/?attachment_id=26</link>\n        <pubDate>Sat, 04 Feb 2012 03:17:33 +0000</pubDate>\n        <dc:creator>bob</dc:creator>\n        <guid isPermaLink=\"false\">http://thisurlisinvalid.notarealdomain</guid>\n        <description></description>\n        <content:encoded><![CDATA[]]></content:encoded>\n        <excerpt:encoded><![CDATA[]]></excerpt:encoded>\n        <wp:post_id>25</wp:post_id>\n        <wp:post_date>2012-02-04 03:17:33</wp:post_date>\n        <wp:post_date_gmt>2012-02-04 03:17:33</wp:post_date_gmt>\n        <wp:comment_status>open</wp:comment_status>\n        <wp:ping_status>open</wp:ping_status>\n        <wp:post_name>attachment-with-a-different-parent</wp:post_name>\n        <wp:status>inherit</wp:status>\n        <wp:post_parent>25</wp:post_parent>\n        <wp:menu_order>0</wp:menu_order>\n        <wp:post_type>attachment</wp:post_type>\n        <wp:post_password></wp:post_password>\n        <wp:is_sticky>0</wp:is_sticky>\n        <wp:attachment_url>http://thisurlisinvalid.notarealdomain</wp:attachment_url>\n        <wp:postmeta>\n            <wp:meta_key>_wp_attachment_metadata</wp:meta_key>\n            <wp:meta_value><![CDATA[a:5:{s:5:\"width\";s:3:\"150\";s:6:\"height\";s:3:\"186\";s:14:\"hwstring_small\";s:22:\"height='96' width='77'\";s:4:\"file\";s:20:\"2012/02/pelican.png\";s:10:\"image_meta\";a:10:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";}}]]></wp:meta_value>\n        </wp:postmeta>\n        <wp:postmeta>\n            <wp:meta_key>_wp_attached_file</wp:meta_key>\n            <wp:meta_value><![CDATA[2012/02/stuff.png]]></wp:meta_value>\n        </wp:postmeta>\n        <wp:postmeta>\n            <wp:meta_key>_wp_attachment_image_alt</wp:meta_key>\n            <wp:meta_value><![CDATA[Stuff]]></wp:meta_value>\n        </wp:postmeta>\n    </item>\n </channel>\n</rss>\n"
  },
  {
    "path": "pelican/tests/cyclic_intersite_links/first-article.rst",
    "content": "First article\n#############\n\n:date: 2018-11-10\n:summary: Here's the `second <{filename}/second-article.rst>`_,\n    `third <{filename}/third-article.rst>`_ and a\n    `nonexistent article <{filename}/nonexistent.rst>`_.\n"
  },
  {
    "path": "pelican/tests/cyclic_intersite_links/second-article.rst",
    "content": "Second article\n##############\n\n:date: 2018-11-10\n:summary: Here's the `first <{filename}/first-article.rst>`_,\n    `third <{filename}/third-article.rst>`_ and a\n    `nonexistent article <{filename}/nonexistent.rst>`_.\n"
  },
  {
    "path": "pelican/tests/cyclic_intersite_links/third-article.rst",
    "content": "Third article\n#############\n\n:date: 2018-11-10\n:summary: Here's the `first <{filename}/first-article.rst>`_,\n    `second <{filename}/second-article.rst>`_ and a\n    `nonexistent article <{filename}/nonexistent.rst>`_.\n"
  },
  {
    "path": "pelican/tests/default_conf.py",
    "content": "AUTHOR = \"Alexis Métaireau\"\nSITENAME = \"Alexis' log\"\nSITEURL = \"http://blog.notmyidea.org\"\nTIMEZONE = \"UTC\"\n\nGITHUB_URL = \"http://github.com/ametaireau/\"\nDISQUS_SITENAME = \"blog-notmyidea\"\nPDF_GENERATOR = False\nREVERSE_CATEGORY_ORDER = True\nDEFAULT_PAGINATION = 2\n\nFEED_RSS = \"feeds/all.rss.xml\"\nCATEGORY_FEED_RSS = \"feeds/{slug}.rss.xml\"\n\nLINKS = [\n    (\"Biologeek\", \"http://biologeek.org\"),\n    (\"Filyb\", \"http://filyb.info/\"),\n    (\"Libert-fr\", \"http://www.libert-fr.com\"),\n    (\"N1k0\", \"http://prendreuncafe.com/blog/\"),\n    (\"Tarek Ziadé\", \"http://ziade.org/blog\"),\n    (\"Zubin Mithra\", \"http://zubin71.wordpress.com/\"),\n]\n\nSOCIAL = [\n    (\"twitter\", \"http://twitter.com/ametaireau\"),\n    (\"lastfm\", \"http://lastfm.com/user/akounet\"),\n    (\"github\", \"http://github.com/ametaireau\"),\n]\n\n# global metadata to all the contents\nDEFAULT_METADATA = {\"yeah\": \"it is\"}\n\n# path-specific metadata\nEXTRA_PATH_METADATA = {\n    \"extra/robots.txt\": {\"path\": \"robots.txt\"},\n}\n\n# static paths will be copied without parsing their contents\nSTATIC_PATHS = [\n    \"pictures\",\n    \"extra/robots.txt\",\n]\n\nFORMATTED_FIELDS = [\"summary\", \"custom_formatted_field\"]\n\n# foobar will not be used, because it's not in caps. All configuration keys\n# have to be in caps\nfoobar = \"barbaz\"\n"
  },
  {
    "path": "pelican/tests/dummy_plugins/namespace_plugin/pelican/plugins/ns_plugin/__init__.py",
    "content": "NAME = \"namespace plugin\"\n\n\ndef register():\n    pass\n"
  },
  {
    "path": "pelican/tests/dummy_plugins/normal_plugin/normal_plugin/__init__.py",
    "content": "from .submodule import noop  # noqa: F401\n\n\ndef register():\n    pass\n"
  },
  {
    "path": "pelican/tests/dummy_plugins/normal_plugin/normal_plugin/submodule.py",
    "content": "def noop():\n    pass\n"
  },
  {
    "path": "pelican/tests/dummy_plugins/normal_plugin/normal_submodule_plugin/__init__.py",
    "content": ""
  },
  {
    "path": "pelican/tests/dummy_plugins/normal_plugin/normal_submodule_plugin/subpackage/__init__.py",
    "content": ""
  },
  {
    "path": "pelican/tests/dummy_plugins/normal_plugin/normal_submodule_plugin/subpackage/subpackage.py",
    "content": "def register():\n    pass\n"
  },
  {
    "path": "pelican/tests/dummy_plugins/normal_plugin/normal_submodule_plugin/subplugin.py",
    "content": "def register():\n    pass\n"
  },
  {
    "path": "pelican/tests/mixed_content/short_page.md",
    "content": "Title: Short Page\n\nThis is a page with little text.\n"
  },
  {
    "path": "pelican/tests/nested_content/maindir/maindir.md",
    "content": "Title: Main Dir Page\n\nThis page lives in maindir.\n"
  },
  {
    "path": "pelican/tests/nested_content/maindir/subdir/subdir.md",
    "content": "Title: Subdir Page\n\nThis page lives in maindir/subdir.\n"
  },
  {
    "path": "pelican/tests/output/basic/a-markdown-powered-article.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>A markdown powered article</title>\n                <link rel=\"stylesheet\" href=\"/theme/css/main.css\" />\n                <link href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"A Pelican Blog Atom Feed\" />\n                <meta name=\"description\" content=\"You're mutually oblivious. a root-relative link to unbelievable a file-relative link to unbelievable\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"/\">A Pelican Blog</a></h1>\n                        <nav><ul>\n                                <li><a href=\"/tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"/override/\">Override url/save_as</a></li>\n                                <li><a href=\"/pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"/category/bar.html\">bar</a></li>\n                                <li class=\"active\"><a href=\"/category/cat1.html\">cat1</a></li>\n                                <li><a href=\"/category/misc.html\">misc</a></li>\n                                <li><a href=\"/category/yeah.html\">yeah</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"/a-markdown-powered-article.html\" rel=\"bookmark\"\n                                                   title=\"Permalink to A markdown powered article\">A markdown powered article</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2011-04-20T00:00:00+00:00\">\n                                                        Published: Wed 20 April 2011\n                                                </abbr>\n\n                                                <p>In <a href=\"/category/cat1.html\">cat1</a>.</p>\n\n                                        </footer><!-- /.post-info -->      <p>You're mutually oblivious.</p>\n                                        <p><a href=\"/unbelievable.html\">a root-relative link to unbelievable</a>\n                                                <a href=\"/unbelievable.html\">a file-relative link to unbelievable</a></p>\n                                </div><!-- /.entry-content -->\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/basic/archives.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>A Pelican Blog</title>\n                <link rel=\"stylesheet\" href=\"/theme/css/main.css\" />\n                <link href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"A Pelican Blog Atom Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"/\">A Pelican Blog</a></h1>\n                        <nav><ul>\n                                <li><a href=\"/tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"/override/\">Override url/save_as</a></li>\n                                <li><a href=\"/pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"/category/bar.html\">bar</a></li>\n                                <li><a href=\"/category/cat1.html\">cat1</a></li>\n                                <li><a href=\"/category/misc.html\">misc</a></li>\n                                <li><a href=\"/category/yeah.html\">yeah</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <h1>Archives for A Pelican Blog</h1>\n\n                        <dl>\n                                <dt>Fri 30 November 2012</dt>\n                                <dd><a href=\"/filename_metadata-example.html\">FILENAME_METADATA example</a></dd>\n                                <dt>Wed 29 February 2012</dt>\n                                <dd><a href=\"/second-article.html\">Second article</a></dd>\n                                <dt>Wed 20 April 2011</dt>\n                                <dd><a href=\"/a-markdown-powered-article.html\">A markdown powered article</a></dd>\n                                <dt>Thu 17 February 2011</dt>\n                                <dd><a href=\"/article-1.html\">Article 1</a></dd>\n                                <dt>Thu 17 February 2011</dt>\n                                <dd><a href=\"/article-2.html\">Article 2</a></dd>\n                                <dt>Thu 17 February 2011</dt>\n                                <dd><a href=\"/article-3.html\">Article 3</a></dd>\n                                <dt>Thu 02 December 2010</dt>\n                                <dd><a href=\"/this-is-a-super-article.html\">This is a super article !</a></dd>\n                                <dt>Wed 20 October 2010</dt>\n                                <dd><a href=\"/oh-yeah.html\">Oh yeah !</a></dd>\n                                <dt>Fri 15 October 2010</dt>\n                                <dd><a href=\"/unbelievable.html\">Unbelievable !</a></dd>\n                                <dt>Sun 14 March 2010</dt>\n                                <dd><a href=\"/tag/baz.html\">The baz tag</a></dd>\n                        </dl>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/basic/article-1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Article 1</title>\n                <link rel=\"stylesheet\" href=\"/theme/css/main.css\" />\n                <link href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"A Pelican Blog Atom Feed\" />\n                <meta name=\"description\" content=\"Article 1\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"/\">A Pelican Blog</a></h1>\n                        <nav><ul>\n                                <li><a href=\"/tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"/override/\">Override url/save_as</a></li>\n                                <li><a href=\"/pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"/category/bar.html\">bar</a></li>\n                                <li class=\"active\"><a href=\"/category/cat1.html\">cat1</a></li>\n                                <li><a href=\"/category/misc.html\">misc</a></li>\n                                <li><a href=\"/category/yeah.html\">yeah</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"/article-1.html\" rel=\"bookmark\"\n                                                   title=\"Permalink to Article 1\">Article 1</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2011-02-17T00:00:00+00:00\">\n                                                        Published: Thu 17 February 2011\n                                                </abbr>\n\n                                                <p>In <a href=\"/category/cat1.html\">cat1</a>.</p>\n\n                                        </footer><!-- /.post-info -->      <p>Article 1</p>\n\n                                </div><!-- /.entry-content -->\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/basic/article-2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Article 2</title>\n                <link rel=\"stylesheet\" href=\"/theme/css/main.css\" />\n                <link href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"A Pelican Blog Atom Feed\" />\n                <meta name=\"description\" content=\"Article 2\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"/\">A Pelican Blog</a></h1>\n                        <nav><ul>\n                                <li><a href=\"/tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"/override/\">Override url/save_as</a></li>\n                                <li><a href=\"/pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"/category/bar.html\">bar</a></li>\n                                <li class=\"active\"><a href=\"/category/cat1.html\">cat1</a></li>\n                                <li><a href=\"/category/misc.html\">misc</a></li>\n                                <li><a href=\"/category/yeah.html\">yeah</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"/article-2.html\" rel=\"bookmark\"\n                                                   title=\"Permalink to Article 2\">Article 2</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2011-02-17T00:00:00+00:00\">\n                                                        Published: Thu 17 February 2011\n                                                </abbr>\n\n                                                <p>In <a href=\"/category/cat1.html\">cat1</a>.</p>\n\n                                        </footer><!-- /.post-info -->      <p>Article 2</p>\n\n                                </div><!-- /.entry-content -->\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/basic/article-3.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Article 3</title>\n                <link rel=\"stylesheet\" href=\"/theme/css/main.css\" />\n                <link href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"A Pelican Blog Atom Feed\" />\n                <meta name=\"description\" content=\"Article 3\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"/\">A Pelican Blog</a></h1>\n                        <nav><ul>\n                                <li><a href=\"/tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"/override/\">Override url/save_as</a></li>\n                                <li><a href=\"/pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"/category/bar.html\">bar</a></li>\n                                <li class=\"active\"><a href=\"/category/cat1.html\">cat1</a></li>\n                                <li><a href=\"/category/misc.html\">misc</a></li>\n                                <li><a href=\"/category/yeah.html\">yeah</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"/article-3.html\" rel=\"bookmark\"\n                                                   title=\"Permalink to Article 3\">Article 3</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2011-02-17T00:00:00+00:00\">\n                                                        Published: Thu 17 February 2011\n                                                </abbr>\n\n                                                <p>In <a href=\"/category/cat1.html\">cat1</a>.</p>\n\n                                        </footer><!-- /.post-info -->      <p>Article 3</p>\n\n                                </div><!-- /.entry-content -->\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/basic/author/alexis-metaireau.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>A Pelican Blog - Alexis Métaireau</title>\n                <link rel=\"stylesheet\" href=\"/theme/css/main.css\" />\n                <link href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"A Pelican Blog Atom Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"/\">A Pelican Blog</a></h1>\n                        <nav><ul>\n                                <li><a href=\"/tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"/override/\">Override url/save_as</a></li>\n                                <li><a href=\"/pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"/category/bar.html\">bar</a></li>\n                                <li><a href=\"/category/cat1.html\">cat1</a></li>\n                                <li><a href=\"/category/misc.html\">misc</a></li>\n                                <li><a href=\"/category/yeah.html\">yeah</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <aside id=\"featured\" class=\"body\">\n                        <article>\n                                <h1 class=\"entry-title\"><a href=\"/this-is-a-super-article.html\">This is a super article !</a></h1>\n                                <footer class=\"post-info\">\n                                        <abbr class=\"published\" title=\"2010-12-02T10:14:00+00:00\">\n                                                Published: Thu 02 December 2010\n                                        </abbr>\n                                        <br />\n                                        <abbr class=\"modified\" title=\"2013-11-17T23:29:00+00:00\">\n                                                Updated: Sun 17 November 2013\n                                        </abbr>\n\n                                        <address class=\"vcard author\">\n                                                By                         <a class=\"url fn\" href=\"/author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                        </address>\n                                        <p>In <a href=\"/category/yeah.html\">yeah</a>.</p>\n                                        <p>tags: <a href=\"/tag/foo.html\">foo</a> <a href=\"/tag/bar.html\">bar</a> <a href=\"/tag/foobar.html\">foobar</a> </p>\n                                </footer><!-- /.post-info --><p>Some content here !</p>\n                                <div class=\"section\" id=\"this-is-a-simple-title\">\n                                        <h2>This is a simple title</h2>\n                                        <p>And here comes the cool <a class=\"reference external\" href=\"http://books.couchdb.org/relax/design-documents/views\">stuff</a>.</p>\n                                        <img alt=\"alternate text\" src=\"/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" />\n                                        <img alt=\"alternate text\" src=\"/pictures/Sushi_Macro.jpg\" style=\"width: 600px; height: 450px;\" />\n<pre class=\"literal-block\">\n&gt;&gt;&gt; from ipdb import set_trace\n&gt;&gt;&gt; set_trace()\n</pre>\n                                        <p>→ And now try with some utf8 hell: ééé</p>\n                                </div>\n                        </article>\n                </aside><!-- /#featured -->\n                <section id=\"content\" class=\"body\">\n                        <h1>Other articles</h1>\n                        <hr />\n                        <ol id=\"posts-list\" class=\"hfeed\">\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"/oh-yeah.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to Oh yeah !\">Oh yeah !</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2010-10-20T10:14:00+00:00\">\n                                                                Published: Wed 20 October 2010\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"/author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"/category/bar.html\">bar</a>.</p>\n                                                        <p>tags: <a href=\"/tag/oh.html\">oh</a> <a href=\"/tag/bar.html\">bar</a> <a href=\"/tag/yeah.html\">yeah</a> </p>Translations:\n                                                        <a href=\"/oh-yeah-fr.html\" hreflang=\"fr\">fr</a>\n\n                                                </footer><!-- /.post-info -->                <div class=\"section\" id=\"why-not\">\n                                                        <h2>Why not ?</h2>\n                                                        <p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\n                                                                YEAH !</p>\n                                                        <img alt=\"alternate text\" src=\"/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" />\n                                                </div>\n\n                                                <a class=\"readmore\" href=\"/oh-yeah.html\">read more</a>\n                                        </div><!-- /.entry-content -->\n                                </article></li>\n                        </ol><!-- /#posts-list -->\n                </section><!-- /#content -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/basic/authors.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>A Pelican Blog - Authors</title>\n                <link rel=\"stylesheet\" href=\"/theme/css/main.css\" />\n                <link href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"A Pelican Blog Atom Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"/\">A Pelican Blog</a></h1>\n                        <nav><ul>\n                                <li><a href=\"/tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"/override/\">Override url/save_as</a></li>\n                                <li><a href=\"/pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"/category/bar.html\">bar</a></li>\n                                <li><a href=\"/category/cat1.html\">cat1</a></li>\n                                <li><a href=\"/category/misc.html\">misc</a></li>\n                                <li><a href=\"/category/yeah.html\">yeah</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <section id=\"content\" class=\"body\">\n                        <h1>Authors on A Pelican Blog</h1>\n                        <ul>\n                                <li><a href=\"/author/alexis-metaireau.html\">Alexis Métaireau</a> (2)</li>\n                        </ul>\n                </section>\n\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/basic/categories.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>A Pelican Blog - Categories</title>\n                <link rel=\"stylesheet\" href=\"/theme/css/main.css\" />\n                <link href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"A Pelican Blog Atom Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"/\">A Pelican Blog</a></h1>\n                        <nav><ul>\n                                <li><a href=\"/tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"/override/\">Override url/save_as</a></li>\n                                <li><a href=\"/pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"/category/bar.html\">bar</a></li>\n                                <li><a href=\"/category/cat1.html\">cat1</a></li>\n                                <li><a href=\"/category/misc.html\">misc</a></li>\n                                <li><a href=\"/category/yeah.html\">yeah</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <section id=\"content\" class=\"body\">\n                        <h1>Categories for A Pelican Blog</h1>\n                        <ul>\n                                <li><a href=\"/category/bar.html\">bar</a> (1)</li>\n                                <li><a href=\"/category/cat1.html\">cat1</a> (4)</li>\n                                <li><a href=\"/category/misc.html\">misc</a> (4)</li>\n                                <li><a href=\"/category/yeah.html\">yeah</a> (1)</li>\n                        </ul>\n                </section>\n\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/basic/category/bar.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>A Pelican Blog - bar</title>\n                <link rel=\"stylesheet\" href=\"/theme/css/main.css\" />\n                <link href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"A Pelican Blog Atom Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"/\">A Pelican Blog</a></h1>\n                        <nav><ul>\n                                <li><a href=\"/tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"/override/\">Override url/save_as</a></li>\n                                <li><a href=\"/pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li class=\"active\"><a href=\"/category/bar.html\">bar</a></li>\n                                <li><a href=\"/category/cat1.html\">cat1</a></li>\n                                <li><a href=\"/category/misc.html\">misc</a></li>\n                                <li><a href=\"/category/yeah.html\">yeah</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <aside id=\"featured\" class=\"body\">\n                        <article>\n                                <h1 class=\"entry-title\"><a href=\"/oh-yeah.html\">Oh yeah !</a></h1>\n                                <footer class=\"post-info\">\n                                        <abbr class=\"published\" title=\"2010-10-20T10:14:00+00:00\">\n                                                Published: Wed 20 October 2010\n                                        </abbr>\n\n                                        <address class=\"vcard author\">\n                                                By                         <a class=\"url fn\" href=\"/author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                        </address>\n                                        <p>In <a href=\"/category/bar.html\">bar</a>.</p>\n                                        <p>tags: <a href=\"/tag/oh.html\">oh</a> <a href=\"/tag/bar.html\">bar</a> <a href=\"/tag/yeah.html\">yeah</a> </p>Translations:\n                                        <a href=\"/oh-yeah-fr.html\" hreflang=\"fr\">fr</a>\n\n                                </footer><!-- /.post-info --><div class=\"section\" id=\"why-not\">\n                                        <h2>Why not ?</h2>\n                                        <p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\n                                                YEAH !</p>\n                                        <img alt=\"alternate text\" src=\"/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" />\n                                </div>\n                        </article>\n                </aside><!-- /#featured -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/basic/category/cat1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>A Pelican Blog - cat1</title>\n                <link rel=\"stylesheet\" href=\"/theme/css/main.css\" />\n                <link href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"A Pelican Blog Atom Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"/\">A Pelican Blog</a></h1>\n                        <nav><ul>\n                                <li><a href=\"/tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"/override/\">Override url/save_as</a></li>\n                                <li><a href=\"/pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"/category/bar.html\">bar</a></li>\n                                <li class=\"active\"><a href=\"/category/cat1.html\">cat1</a></li>\n                                <li><a href=\"/category/misc.html\">misc</a></li>\n                                <li><a href=\"/category/yeah.html\">yeah</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <aside id=\"featured\" class=\"body\">\n                        <article>\n                                <h1 class=\"entry-title\"><a href=\"/a-markdown-powered-article.html\">A markdown powered article</a></h1>\n                                <footer class=\"post-info\">\n                                        <abbr class=\"published\" title=\"2011-04-20T00:00:00+00:00\">\n                                                Published: Wed 20 April 2011\n                                        </abbr>\n\n                                        <p>In <a href=\"/category/cat1.html\">cat1</a>.</p>\n\n                                </footer><!-- /.post-info --><p>You're mutually oblivious.</p>\n                                <p><a href=\"/unbelievable.html\">a root-relative link to unbelievable</a>\n                                        <a href=\"/unbelievable.html\">a file-relative link to unbelievable</a></p>                </article>\n                </aside><!-- /#featured -->\n                <section id=\"content\" class=\"body\">\n                        <h1>Other articles</h1>\n                        <hr />\n                        <ol id=\"posts-list\" class=\"hfeed\">\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"/article-1.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to Article 1\">Article 1</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2011-02-17T00:00:00+00:00\">\n                                                                Published: Thu 17 February 2011\n                                                        </abbr>\n\n                                                        <p>In <a href=\"/category/cat1.html\">cat1</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>Article 1</p>\n\n                                                <a class=\"readmore\" href=\"/article-1.html\">read more</a>\n                                        </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"/article-2.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to Article 2\">Article 2</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2011-02-17T00:00:00+00:00\">\n                                                                Published: Thu 17 February 2011\n                                                        </abbr>\n\n                                                        <p>In <a href=\"/category/cat1.html\">cat1</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>Article 2</p>\n\n                                                <a class=\"readmore\" href=\"/article-2.html\">read more</a>\n                                        </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"/article-3.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to Article 3\">Article 3</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2011-02-17T00:00:00+00:00\">\n                                                                Published: Thu 17 February 2011\n                                                        </abbr>\n\n                                                        <p>In <a href=\"/category/cat1.html\">cat1</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>Article 3</p>\n\n                                                <a class=\"readmore\" href=\"/article-3.html\">read more</a>\n                                        </div><!-- /.entry-content -->\n                                </article></li>\n                        </ol><!-- /#posts-list -->\n                </section><!-- /#content -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/basic/category/misc.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>A Pelican Blog - misc</title>\n                <link rel=\"stylesheet\" href=\"/theme/css/main.css\" />\n                <link href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"A Pelican Blog Atom Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"/\">A Pelican Blog</a></h1>\n                        <nav><ul>\n                                <li><a href=\"/tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"/override/\">Override url/save_as</a></li>\n                                <li><a href=\"/pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"/category/bar.html\">bar</a></li>\n                                <li><a href=\"/category/cat1.html\">cat1</a></li>\n                                <li class=\"active\"><a href=\"/category/misc.html\">misc</a></li>\n                                <li><a href=\"/category/yeah.html\">yeah</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <aside id=\"featured\" class=\"body\">\n                        <article>\n                                <h1 class=\"entry-title\"><a href=\"/filename_metadata-example.html\">FILENAME_METADATA example</a></h1>\n                                <footer class=\"post-info\">\n                                        <abbr class=\"published\" title=\"2012-11-30T00:00:00+00:00\">\n                                                Published: Fri 30 November 2012\n                                        </abbr>\n\n                                        <p>In <a href=\"/category/misc.html\">misc</a>.</p>\n\n                                </footer><!-- /.post-info --><p>Some cool stuff!</p>\n                        </article>\n                </aside><!-- /#featured -->\n                <section id=\"content\" class=\"body\">\n                        <h1>Other articles</h1>\n                        <hr />\n                        <ol id=\"posts-list\" class=\"hfeed\">\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"/second-article.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to Second article\">Second article</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2012-02-29T00:00:00+00:00\">\n                                                                Published: Wed 29 February 2012\n                                                        </abbr>\n\n                                                        <p>In <a href=\"/category/misc.html\">misc</a>.</p>\n                                                        <p>tags: <a href=\"/tag/foo.html\">foo</a> <a href=\"/tag/bar.html\">bar</a> <a href=\"/tag/baz.html\">baz</a> </p>Translations:\n                                                        <a href=\"/second-article-fr.html\" hreflang=\"fr\">fr</a>\n\n                                                </footer><!-- /.post-info -->                <p>This is some article, in english</p>\n\n                                                <a class=\"readmore\" href=\"/second-article.html\">read more</a>\n                                        </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"/unbelievable.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to Unbelievable !\">Unbelievable !</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2010-10-15T20:30:00+00:00\">\n                                                                Published: Fri 15 October 2010\n                                                        </abbr>\n\n                                                        <p>In <a href=\"/category/misc.html\">misc</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>Or completely awesome. Depends the needs.</p>\n                                                <p><a class=\"reference external\" href=\"/a-markdown-powered-article.html\">a root-relative link to markdown-article</a>\n                                                        <a class=\"reference external\" href=\"/a-markdown-powered-article.html\">a file-relative link to markdown-article</a></p>\n                                                <div class=\"section\" id=\"testing-sourcecode-directive\">\n                                                        <h2>Testing sourcecode directive</h2>\n                                                        <div class=\"highlight\"><table class=\"highlighttable\"><tr><td class=\"linenos\"><div class=\"linenodiv\"><pre><span class=\"normal\">1</span></pre></div></td><td class=\"code\"><div><pre><span></span><span class=\"n\">formatter</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span> <span class=\"ow\">and</span> <span class=\"n\">VARIANTS</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]]</span>\n</pre></div></td></tr></table></div>\n                                                </div>\n                                                <div class=\"section\" id=\"testing-another-case\">\n                                                        <h2>Testing another case</h2>\n                                                        <p>This will now have a line number in 'custom' since it's the default in\n                                                                pelican.conf, it will …</p></div>\n                                                <a class=\"readmore\" href=\"/unbelievable.html\">read more</a>\n                                        </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"/tag/baz.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to The baz tag\">The baz tag</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2010-03-14T00:00:00+00:00\">\n                                                                Published: Sun 14 March 2010\n                                                        </abbr>\n\n                                                        <p>In <a href=\"/category/misc.html\">misc</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>This article overrides the listening of the articles under the <em>baz</em> tag.</p>\n\n                                                <a class=\"readmore\" href=\"/tag/baz.html\">read more</a>\n                                        </div><!-- /.entry-content -->\n                                </article></li>\n                        </ol><!-- /#posts-list -->\n                </section><!-- /#content -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/basic/category/yeah.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>A Pelican Blog - yeah</title>\n                <link rel=\"stylesheet\" href=\"/theme/css/main.css\" />\n                <link href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"A Pelican Blog Atom Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"/\">A Pelican Blog</a></h1>\n                        <nav><ul>\n                                <li><a href=\"/tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"/override/\">Override url/save_as</a></li>\n                                <li><a href=\"/pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"/category/bar.html\">bar</a></li>\n                                <li><a href=\"/category/cat1.html\">cat1</a></li>\n                                <li><a href=\"/category/misc.html\">misc</a></li>\n                                <li class=\"active\"><a href=\"/category/yeah.html\">yeah</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <aside id=\"featured\" class=\"body\">\n                        <article>\n                                <h1 class=\"entry-title\"><a href=\"/this-is-a-super-article.html\">This is a super article !</a></h1>\n                                <footer class=\"post-info\">\n                                        <abbr class=\"published\" title=\"2010-12-02T10:14:00+00:00\">\n                                                Published: Thu 02 December 2010\n                                        </abbr>\n                                        <br />\n                                        <abbr class=\"modified\" title=\"2013-11-17T23:29:00+00:00\">\n                                                Updated: Sun 17 November 2013\n                                        </abbr>\n\n                                        <address class=\"vcard author\">\n                                                By                         <a class=\"url fn\" href=\"/author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                        </address>\n                                        <p>In <a href=\"/category/yeah.html\">yeah</a>.</p>\n                                        <p>tags: <a href=\"/tag/foo.html\">foo</a> <a href=\"/tag/bar.html\">bar</a> <a href=\"/tag/foobar.html\">foobar</a> </p>\n                                </footer><!-- /.post-info --><p>Some content here !</p>\n                                <div class=\"section\" id=\"this-is-a-simple-title\">\n                                        <h2>This is a simple title</h2>\n                                        <p>And here comes the cool <a class=\"reference external\" href=\"http://books.couchdb.org/relax/design-documents/views\">stuff</a>.</p>\n                                        <img alt=\"alternate text\" src=\"/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" />\n                                        <img alt=\"alternate text\" src=\"/pictures/Sushi_Macro.jpg\" style=\"width: 600px; height: 450px;\" />\n<pre class=\"literal-block\">\n&gt;&gt;&gt; from ipdb import set_trace\n&gt;&gt;&gt; set_trace()\n</pre>\n                                        <p>→ And now try with some utf8 hell: ééé</p>\n                                </div>\n                        </article>\n                </aside><!-- /#featured -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/basic/drafts/a-draft-article-without-date.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>A draft article without date</title>\n                <link rel=\"stylesheet\" href=\"/theme/css/main.css\" />\n                <link href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"A Pelican Blog Atom Feed\" />\n                <meta name=\"description\" content=\"This is a draft article, it should live under the /drafts/ folder and not be listed anywhere else.\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"/\">A Pelican Blog</a></h1>\n                        <nav><ul>\n                                <li><a href=\"/tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"/override/\">Override url/save_as</a></li>\n                                <li><a href=\"/pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"/category/bar.html\">bar</a></li>\n                                <li><a href=\"/category/cat1.html\">cat1</a></li>\n                                <li class=\"active\"><a href=\"/category/misc.html\">misc</a></li>\n                                <li><a href=\"/category/yeah.html\">yeah</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"/drafts/a-draft-article-without-date.html\" rel=\"bookmark\"\n                                                   title=\"Permalink to A draft article without date\">A draft article without date</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"9999-12-31T23:59:59.999999+00:00\">\n                                                        Published:\n                                                </abbr>\n\n                                                <p>In <a href=\"/category/misc.html\">misc</a>.</p>\n\n                                        </footer><!-- /.post-info -->      <p>This is a draft article, it should live under the /drafts/ folder and not be\n                                                listed anywhere else.</p>\n\n                                </div><!-- /.entry-content -->\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/basic/drafts/a-draft-article.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>A draft article</title>\n                <link rel=\"stylesheet\" href=\"/theme/css/main.css\" />\n                <link href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"A Pelican Blog Atom Feed\" />\n                <meta name=\"description\" content=\"This is a draft article, it should live under the /drafts/ folder and not be listed anywhere else.\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"/\">A Pelican Blog</a></h1>\n                        <nav><ul>\n                                <li><a href=\"/tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"/override/\">Override url/save_as</a></li>\n                                <li><a href=\"/pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"/category/bar.html\">bar</a></li>\n                                <li><a href=\"/category/cat1.html\">cat1</a></li>\n                                <li class=\"active\"><a href=\"/category/misc.html\">misc</a></li>\n                                <li><a href=\"/category/yeah.html\">yeah</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"/drafts/a-draft-article.html\" rel=\"bookmark\"\n                                                   title=\"Permalink to A draft article\">A draft article</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2011-05-08T15:58:00+00:00\">\n                                                        Published: Sun 08 May 2011\n                                                </abbr>\n\n                                                <p>In <a href=\"/category/misc.html\">misc</a>.</p>\n\n                                        </footer><!-- /.post-info -->      <p>This is a draft article, it should live under the /drafts/ folder and not be\n                                                listed anywhere else.</p>\n\n                                </div><!-- /.entry-content -->\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/basic/feeds/alexis-metaireau.atom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<feed xmlns=\"http://www.w3.org/2005/Atom\"><title>A Pelican Blog - Alexis Métaireau</title><link href=\"/\" rel=\"alternate\"/><link href=\"/feeds/alexis-metaireau.atom.xml\" rel=\"self\"/><id>/</id><updated>2013-11-17T23:29:00+00:00</updated><entry><title>This is a super article !</title><link href=\"/this-is-a-super-article.html\" rel=\"alternate\"/><published>2010-12-02T10:14:00+00:00</published><updated>2013-11-17T23:29:00+00:00</updated><author><name>Alexis Métaireau</name></author><id>tag:None,2010-12-02:/this-is-a-super-article.html</id><summary type=\"html\">&lt;p class=\"first last\"&gt;Multi-line metadata should be supported\nas well as &lt;strong&gt;inline markup&lt;/strong&gt;.&lt;/p&gt;\n</summary><content type=\"html\">&lt;p&gt;Some content here !&lt;/p&gt;\n&lt;div class=\"section\" id=\"this-is-a-simple-title\"&gt;\n&lt;h2&gt;This is a simple title&lt;/h2&gt;\n&lt;p&gt;And here comes the cool &lt;a class=\"reference external\" href=\"http://books.couchdb.org/relax/design-documents/views\"&gt;stuff&lt;/a&gt;.&lt;/p&gt;\n&lt;img alt=\"alternate text\" src=\"/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;img alt=\"alternate text\" src=\"/pictures/Sushi_Macro.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;pre class=\"literal-block\"&gt;\n&amp;gt;&amp;gt;&amp;gt; from ipdb import set_trace\n&amp;gt;&amp;gt;&amp;gt; set_trace()\n&lt;/pre&gt;\n&lt;p&gt;→ And now try with some utf8 hell: ééé&lt;/p&gt;\n&lt;/div&gt;\n</content><category term=\"yeah\"/><category term=\"foo\"/><category term=\"bar\"/><category term=\"foobar\"/></entry><entry><title>Oh yeah !</title><link href=\"/oh-yeah.html\" rel=\"alternate\"/><published>2010-10-20T10:14:00+00:00</published><updated>2010-10-20T10:14:00+00:00</updated><author><name>Alexis Métaireau</name></author><id>tag:None,2010-10-20:/oh-yeah.html</id><content type=\"html\">&lt;div class=\"section\" id=\"why-not\"&gt;\n&lt;h2&gt;Why not ?&lt;/h2&gt;\n&lt;p&gt;After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\nYEAH !&lt;/p&gt;\n&lt;img alt=\"alternate text\" src=\"/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;/div&gt;\n</content><category term=\"bar\"/><category term=\"oh\"/><category term=\"bar\"/><category term=\"yeah\"/></entry></feed>\n"
  },
  {
    "path": "pelican/tests/output/basic/feeds/alexis-metaireau.rss.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<rss version=\"2.0\" xmlns:atom=\"http://www.w3.org/2005/Atom\"><channel><title>A Pelican Blog - Alexis Métaireau</title><link>/</link><description/><atom:link href=\"/feeds/alexis-metaireau.rss.xml\" rel=\"self\"/><lastBuildDate>Sun, 17 Nov 2013 23:29:00 +0000</lastBuildDate><item><title>This is a super article !</title><link>/this-is-a-super-article.html</link><description>&lt;p class=\"first last\"&gt;Multi-line metadata should be supported\nas well as &lt;strong&gt;inline markup&lt;/strong&gt;.&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Thu, 02 Dec 2010 10:14:00 +0000</pubDate><guid>tag:None,2010-12-02:/this-is-a-super-article.html</guid><category>yeah</category><category>foo</category><category>bar</category><category>foobar</category></item><item><title>Oh yeah !</title><link>/oh-yeah.html</link><description>&lt;div class=\"section\" id=\"why-not\"&gt;\n&lt;h2&gt;Why not ?&lt;/h2&gt;\n&lt;p&gt;After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\nYEAH !&lt;/p&gt;\n&lt;img alt=\"alternate text\" src=\"/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;/div&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Wed, 20 Oct 2010 10:14:00 +0000</pubDate><guid>tag:None,2010-10-20:/oh-yeah.html</guid><category>bar</category><category>oh</category><category>bar</category><category>yeah</category></item></channel></rss>\n"
  },
  {
    "path": "pelican/tests/output/basic/feeds/all-en.atom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<feed xmlns=\"http://www.w3.org/2005/Atom\"><title>A Pelican Blog</title><link href=\"/\" rel=\"alternate\"/><link href=\"/feeds/all-en.atom.xml\" rel=\"self\"/><id>/</id><updated>2013-11-17T23:29:00+00:00</updated><entry><title>FILENAME_METADATA example</title><link href=\"/filename_metadata-example.html\" rel=\"alternate\"/><published>2012-11-30T00:00:00+00:00</published><updated>2012-11-30T00:00:00+00:00</updated><author><name/></author><id>tag:None,2012-11-30:/filename_metadata-example.html</id><content type=\"html\">&lt;p&gt;Some cool stuff!&lt;/p&gt;\n</content><category term=\"misc\"/></entry><entry><title>Second article</title><link href=\"/second-article.html\" rel=\"alternate\"/><published>2012-02-29T00:00:00+00:00</published><updated>2012-02-29T00:00:00+00:00</updated><author><name/></author><id>tag:None,2012-02-29:/second-article.html</id><content type=\"html\">&lt;p&gt;This is some article, in english&lt;/p&gt;\n</content><category term=\"misc\"/><category term=\"foo\"/><category term=\"bar\"/><category term=\"baz\"/></entry><entry><title>A markdown powered article</title><link href=\"/a-markdown-powered-article.html\" rel=\"alternate\"/><published>2011-04-20T00:00:00+00:00</published><updated>2011-04-20T00:00:00+00:00</updated><author><name/></author><id>tag:None,2011-04-20:/a-markdown-powered-article.html</id><content type=\"html\">&lt;p&gt;You're mutually oblivious.&lt;/p&gt;\n&lt;p&gt;&lt;a href=\"/unbelievable.html\"&gt;a root-relative link to unbelievable&lt;/a&gt;\n&lt;a href=\"/unbelievable.html\"&gt;a file-relative link to unbelievable&lt;/a&gt;&lt;/p&gt;</content><category term=\"cat1\"/></entry><entry><title>Article 1</title><link href=\"/article-1.html\" rel=\"alternate\"/><published>2011-02-17T00:00:00+00:00</published><updated>2011-02-17T00:00:00+00:00</updated><author><name/></author><id>tag:None,2011-02-17:/article-1.html</id><content type=\"html\">&lt;p&gt;Article 1&lt;/p&gt;\n</content><category term=\"cat1\"/></entry><entry><title>Article 2</title><link href=\"/article-2.html\" rel=\"alternate\"/><published>2011-02-17T00:00:00+00:00</published><updated>2011-02-17T00:00:00+00:00</updated><author><name/></author><id>tag:None,2011-02-17:/article-2.html</id><content type=\"html\">&lt;p&gt;Article 2&lt;/p&gt;\n</content><category term=\"cat1\"/></entry><entry><title>Article 3</title><link href=\"/article-3.html\" rel=\"alternate\"/><published>2011-02-17T00:00:00+00:00</published><updated>2011-02-17T00:00:00+00:00</updated><author><name/></author><id>tag:None,2011-02-17:/article-3.html</id><content type=\"html\">&lt;p&gt;Article 3&lt;/p&gt;\n</content><category term=\"cat1\"/></entry><entry><title>This is a super article !</title><link href=\"/this-is-a-super-article.html\" rel=\"alternate\"/><published>2010-12-02T10:14:00+00:00</published><updated>2013-11-17T23:29:00+00:00</updated><author><name>Alexis Métaireau</name></author><id>tag:None,2010-12-02:/this-is-a-super-article.html</id><summary type=\"html\">&lt;p class=\"first last\"&gt;Multi-line metadata should be supported\nas well as &lt;strong&gt;inline markup&lt;/strong&gt;.&lt;/p&gt;\n</summary><content type=\"html\">&lt;p&gt;Some content here !&lt;/p&gt;\n&lt;div class=\"section\" id=\"this-is-a-simple-title\"&gt;\n&lt;h2&gt;This is a simple title&lt;/h2&gt;\n&lt;p&gt;And here comes the cool &lt;a class=\"reference external\" href=\"http://books.couchdb.org/relax/design-documents/views\"&gt;stuff&lt;/a&gt;.&lt;/p&gt;\n&lt;img alt=\"alternate text\" src=\"/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;img alt=\"alternate text\" src=\"/pictures/Sushi_Macro.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;pre class=\"literal-block\"&gt;\n&amp;gt;&amp;gt;&amp;gt; from ipdb import set_trace\n&amp;gt;&amp;gt;&amp;gt; set_trace()\n&lt;/pre&gt;\n&lt;p&gt;→ And now try with some utf8 hell: ééé&lt;/p&gt;\n&lt;/div&gt;\n</content><category term=\"yeah\"/><category term=\"foo\"/><category term=\"bar\"/><category term=\"foobar\"/></entry><entry><title>Oh yeah !</title><link href=\"/oh-yeah.html\" rel=\"alternate\"/><published>2010-10-20T10:14:00+00:00</published><updated>2010-10-20T10:14:00+00:00</updated><author><name>Alexis Métaireau</name></author><id>tag:None,2010-10-20:/oh-yeah.html</id><content type=\"html\">&lt;div class=\"section\" id=\"why-not\"&gt;\n&lt;h2&gt;Why not ?&lt;/h2&gt;\n&lt;p&gt;After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\nYEAH !&lt;/p&gt;\n&lt;img alt=\"alternate text\" src=\"/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;/div&gt;\n</content><category term=\"bar\"/><category term=\"oh\"/><category term=\"bar\"/><category term=\"yeah\"/></entry><entry><title>Unbelievable !</title><link href=\"/unbelievable.html\" rel=\"alternate\"/><published>2010-10-15T20:30:00+00:00</published><updated>2010-10-15T20:30:00+00:00</updated><author><name/></author><id>tag:None,2010-10-15:/unbelievable.html</id><summary type=\"html\">&lt;p&gt;Or completely awesome. Depends the needs.&lt;/p&gt;\n&lt;p&gt;&lt;a class=\"reference external\" href=\"/a-markdown-powered-article.html\"&gt;a root-relative link to markdown-article&lt;/a&gt;\n&lt;a class=\"reference external\" href=\"/a-markdown-powered-article.html\"&gt;a file-relative link to markdown-article&lt;/a&gt;&lt;/p&gt;\n&lt;div class=\"section\" id=\"testing-sourcecode-directive\"&gt;\n&lt;h2&gt;Testing sourcecode directive&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;table class=\"highlighttable\"&gt;&lt;tr&gt;&lt;td class=\"linenos\"&gt;&lt;div class=\"linenodiv\"&gt;&lt;pre&gt;&lt;span class=\"normal\"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=\"code\"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-another-case\"&gt;\n&lt;h2&gt;Testing another case&lt;/h2&gt;\n&lt;p&gt;This will now have a line number in 'custom' since it's the default in\npelican.conf, it will …&lt;/p&gt;&lt;/div&gt;</summary><content type=\"html\">&lt;p&gt;Or completely awesome. Depends the needs.&lt;/p&gt;\n&lt;p&gt;&lt;a class=\"reference external\" href=\"/a-markdown-powered-article.html\"&gt;a root-relative link to markdown-article&lt;/a&gt;\n&lt;a class=\"reference external\" href=\"/a-markdown-powered-article.html\"&gt;a file-relative link to markdown-article&lt;/a&gt;&lt;/p&gt;\n&lt;div class=\"section\" id=\"testing-sourcecode-directive\"&gt;\n&lt;h2&gt;Testing sourcecode directive&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;table class=\"highlighttable\"&gt;&lt;tr&gt;&lt;td class=\"linenos\"&gt;&lt;div class=\"linenodiv\"&gt;&lt;pre&gt;&lt;span class=\"normal\"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=\"code\"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-another-case\"&gt;\n&lt;h2&gt;Testing another case&lt;/h2&gt;\n&lt;p&gt;This will now have a line number in 'custom' since it's the default in\npelican.conf, it will have nothing in default.&lt;/p&gt;\n&lt;div class=\"highlight\"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-more-sourcecode-directives\"&gt;\n&lt;h2&gt;Testing more sourcecode directives&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id=\"foo-8\"&gt;&lt;a id=\"foo-8\" name=\"foo-8\"&gt;&lt;/a&gt;&lt;a href=\"#foo-8\"&gt;&lt;span class=\"linenos special\"&gt; 8&lt;/span&gt;&lt;/a&gt;&lt;span class=\"testingk\"&gt;def&lt;/span&gt;&lt;span class=\"testingw\"&gt; &lt;/span&gt;&lt;span class=\"testingnf\"&gt;run&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingp\"&gt;):&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-9\"&gt;&lt;a id=\"foo-9\" name=\"foo-9\"&gt;&lt;/a&gt;&lt;a href=\"#foo-9\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;assert_has_content&lt;/span&gt;&lt;span class=\"testingp\"&gt;()&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-10\"&gt;&lt;a id=\"foo-10\" name=\"foo-10\"&gt;&lt;/a&gt;&lt;a href=\"#foo-10\"&gt;&lt;span class=\"linenos special\"&gt;10&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;try&lt;/span&gt;&lt;span class=\"testingp\"&gt;:&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-11\"&gt;&lt;a id=\"foo-11\" name=\"foo-11\"&gt;&lt;/a&gt;&lt;a href=\"#foo-11\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingn\"&gt;lexer&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;get_lexer_by_name&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;arguments&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testingmi\"&gt;0&lt;/span&gt;&lt;span class=\"testingp\"&gt;])&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-12\"&gt;&lt;a id=\"foo-12\" name=\"foo-12\"&gt;&lt;/a&gt;&lt;a href=\"#foo-12\"&gt;&lt;span class=\"linenos special\"&gt;12&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;except&lt;/span&gt; &lt;span class=\"testingne\"&gt;ValueError&lt;/span&gt;&lt;span class=\"testingp\"&gt;:&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-13\"&gt;&lt;a id=\"foo-13\" name=\"foo-13\"&gt;&lt;/a&gt;&lt;a href=\"#foo-13\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingc1\"&gt;# no lexer found - use the text one instead of an exception&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-14\"&gt;&lt;a id=\"foo-14\" name=\"foo-14\"&gt;&lt;/a&gt;&lt;a href=\"#foo-14\"&gt;&lt;span class=\"linenos special\"&gt;14&lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingn\"&gt;lexer&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;TextLexer&lt;/span&gt;&lt;span class=\"testingp\"&gt;()&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-15\"&gt;&lt;a id=\"foo-15\" name=\"foo-15\"&gt;&lt;/a&gt;&lt;a href=\"#foo-15\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-16\"&gt;&lt;a id=\"foo-16\" name=\"foo-16\"&gt;&lt;/a&gt;&lt;a href=\"#foo-16\"&gt;&lt;span class=\"linenos special\"&gt;16&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;if&lt;/span&gt; &lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;linenos&amp;#39;&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt; &lt;span class=\"testingow\"&gt;and&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-17\"&gt;&lt;a id=\"foo-17\" name=\"foo-17\"&gt;&lt;/a&gt;&lt;a href=\"#foo-17\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;            &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;linenos&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;]&lt;/span&gt; &lt;span class=\"testingow\"&gt;not&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;table&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;inline&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;)):&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-18\"&gt;&lt;a id=\"foo-18\" name=\"foo-18\"&gt;&lt;/a&gt;&lt;a href=\"#foo-18\"&gt;&lt;span class=\"linenos special\"&gt;18&lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;linenos&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;]&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;table&amp;#39;&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-19\"&gt;&lt;a id=\"foo-19\" name=\"foo-19\"&gt;&lt;/a&gt;&lt;a href=\"#foo-19\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-20\"&gt;&lt;a id=\"foo-20\" name=\"foo-20\"&gt;&lt;/a&gt;&lt;a href=\"#foo-20\"&gt;&lt;span class=\"linenos special\"&gt;20&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;for&lt;/span&gt; &lt;span class=\"testingn\"&gt;flag&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;nowrap&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;nobackground&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;anchorlinenos&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;):&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-21\"&gt;&lt;a id=\"foo-21\" name=\"foo-21\"&gt;&lt;/a&gt;&lt;a href=\"#foo-21\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingk\"&gt;if&lt;/span&gt; &lt;span class=\"testingn\"&gt;flag&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;:&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-22\"&gt;&lt;a id=\"foo-22\" name=\"foo-22\"&gt;&lt;/a&gt;&lt;a href=\"#foo-22\"&gt;&lt;span class=\"linenos special\"&gt;22&lt;/span&gt;&lt;/a&gt;            &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testingn\"&gt;flag&lt;/span&gt;&lt;span class=\"testingp\"&gt;]&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingkc\"&gt;True&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-23\"&gt;&lt;a id=\"foo-23\" name=\"foo-23\"&gt;&lt;/a&gt;&lt;a href=\"#foo-23\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-24\"&gt;&lt;a id=\"foo-24\" name=\"foo-24\"&gt;&lt;/a&gt;&lt;a href=\"#foo-24\"&gt;&lt;span class=\"linenos special\"&gt;24&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingc1\"&gt;# noclasses should already default to False, but just in case...&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-25\"&gt;&lt;a id=\"foo-25\" name=\"foo-25\"&gt;&lt;/a&gt;&lt;a href=\"#foo-25\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingn\"&gt;formatter&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;HtmlFormatter&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingn\"&gt;noclasses&lt;/span&gt;&lt;span class=\"testingo\"&gt;=&lt;/span&gt;&lt;span class=\"testingkc\"&gt;False&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingo\"&gt;**&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;)&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-26\"&gt;&lt;a id=\"foo-26\" name=\"foo-26\"&gt;&lt;/a&gt;&lt;a href=\"#foo-26\"&gt;&lt;span class=\"linenos special\"&gt;26&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingn\"&gt;parsed&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;highlight&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;&lt;/span&gt;&lt;span class=\"testingse\"&gt;\\n&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;join&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;content&lt;/span&gt;&lt;span class=\"testingp\"&gt;),&lt;/span&gt; &lt;span class=\"testingn\"&gt;lexer&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingn\"&gt;formatter&lt;/span&gt;&lt;span class=\"testingp\"&gt;)&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-27\"&gt;&lt;a id=\"foo-27\" name=\"foo-27\"&gt;&lt;/a&gt;&lt;a href=\"#foo-27\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;return&lt;/span&gt; &lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testingn\"&gt;nodes&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;raw&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingn\"&gt;parsed&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingnb\"&gt;format&lt;/span&gt;&lt;span class=\"testingo\"&gt;=&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;html&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;)]&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-even-more-sourcecode-directives\"&gt;\n&lt;h2&gt;Testing even more sourcecode directives&lt;/h2&gt;\n&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-overriding-config-defaults\"&gt;\n&lt;h2&gt;Testing overriding config defaults&lt;/h2&gt;\n&lt;p&gt;Even if the default is line numbers, we can override it here&lt;/p&gt;\n&lt;div class=\"highlight\"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n</content><category term=\"misc\"/></entry><entry><title>The baz tag</title><link href=\"/tag/baz.html\" rel=\"alternate\"/><published>2010-03-14T00:00:00+00:00</published><updated>2010-03-14T00:00:00+00:00</updated><author><name/></author><id>tag:None,2010-03-14:/tag/baz.html</id><content type=\"html\">&lt;p&gt;This article overrides the listening of the articles under the &lt;em&gt;baz&lt;/em&gt; tag.&lt;/p&gt;\n</content><category term=\"misc\"/></entry></feed>\n"
  },
  {
    "path": "pelican/tests/output/basic/feeds/all-fr.atom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<feed xmlns=\"http://www.w3.org/2005/Atom\"><title>A Pelican Blog</title><link href=\"/\" rel=\"alternate\"/><link href=\"/feeds/all-fr.atom.xml\" rel=\"self\"/><id>/</id><updated>2012-02-29T00:00:00+00:00</updated><entry><title>Deuxième article</title><link href=\"/second-article-fr.html\" rel=\"alternate\"/><published>2012-02-29T00:00:00+00:00</published><updated>2012-02-29T00:00:00+00:00</updated><author><name/></author><id>tag:None,2012-02-29:/second-article-fr.html</id><content type=\"html\">&lt;p&gt;Ceci est un article, en français.&lt;/p&gt;\n</content><category term=\"misc\"/><category term=\"foo\"/><category term=\"bar\"/><category term=\"baz\"/></entry><entry><title>Trop bien !</title><link href=\"/oh-yeah-fr.html\" rel=\"alternate\"/><published>2010-10-20T10:14:00+00:00</published><updated>2010-10-20T10:14:00+00:00</updated><author><name/></author><id>tag:None,2010-10-20:/oh-yeah-fr.html</id><content type=\"html\">&lt;p&gt;Et voila du contenu en français&lt;/p&gt;\n</content><category term=\"misc\"/></entry></feed>\n"
  },
  {
    "path": "pelican/tests/output/basic/feeds/all.atom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<feed xmlns=\"http://www.w3.org/2005/Atom\"><title>A Pelican Blog</title><link href=\"/\" rel=\"alternate\"/><link href=\"/feeds/all.atom.xml\" rel=\"self\"/><id>/</id><updated>2013-11-17T23:29:00+00:00</updated><entry><title>FILENAME_METADATA example</title><link href=\"/filename_metadata-example.html\" rel=\"alternate\"/><published>2012-11-30T00:00:00+00:00</published><updated>2012-11-30T00:00:00+00:00</updated><author><name/></author><id>tag:None,2012-11-30:/filename_metadata-example.html</id><content type=\"html\">&lt;p&gt;Some cool stuff!&lt;/p&gt;\n</content><category term=\"misc\"/></entry><entry><title>Second article</title><link href=\"/second-article.html\" rel=\"alternate\"/><published>2012-02-29T00:00:00+00:00</published><updated>2012-02-29T00:00:00+00:00</updated><author><name/></author><id>tag:None,2012-02-29:/second-article.html</id><content type=\"html\">&lt;p&gt;This is some article, in english&lt;/p&gt;\n</content><category term=\"misc\"/><category term=\"foo\"/><category term=\"bar\"/><category term=\"baz\"/></entry><entry><title>Deuxième article</title><link href=\"/second-article-fr.html\" rel=\"alternate\"/><published>2012-02-29T00:00:00+00:00</published><updated>2012-02-29T00:00:00+00:00</updated><author><name/></author><id>tag:None,2012-02-29:/second-article-fr.html</id><content type=\"html\">&lt;p&gt;Ceci est un article, en français.&lt;/p&gt;\n</content><category term=\"misc\"/><category term=\"foo\"/><category term=\"bar\"/><category term=\"baz\"/></entry><entry><title>A markdown powered article</title><link href=\"/a-markdown-powered-article.html\" rel=\"alternate\"/><published>2011-04-20T00:00:00+00:00</published><updated>2011-04-20T00:00:00+00:00</updated><author><name/></author><id>tag:None,2011-04-20:/a-markdown-powered-article.html</id><content type=\"html\">&lt;p&gt;You're mutually oblivious.&lt;/p&gt;\n&lt;p&gt;&lt;a href=\"/unbelievable.html\"&gt;a root-relative link to unbelievable&lt;/a&gt;\n&lt;a href=\"/unbelievable.html\"&gt;a file-relative link to unbelievable&lt;/a&gt;&lt;/p&gt;</content><category term=\"cat1\"/></entry><entry><title>Article 1</title><link href=\"/article-1.html\" rel=\"alternate\"/><published>2011-02-17T00:00:00+00:00</published><updated>2011-02-17T00:00:00+00:00</updated><author><name/></author><id>tag:None,2011-02-17:/article-1.html</id><content type=\"html\">&lt;p&gt;Article 1&lt;/p&gt;\n</content><category term=\"cat1\"/></entry><entry><title>Article 2</title><link href=\"/article-2.html\" rel=\"alternate\"/><published>2011-02-17T00:00:00+00:00</published><updated>2011-02-17T00:00:00+00:00</updated><author><name/></author><id>tag:None,2011-02-17:/article-2.html</id><content type=\"html\">&lt;p&gt;Article 2&lt;/p&gt;\n</content><category term=\"cat1\"/></entry><entry><title>Article 3</title><link href=\"/article-3.html\" rel=\"alternate\"/><published>2011-02-17T00:00:00+00:00</published><updated>2011-02-17T00:00:00+00:00</updated><author><name/></author><id>tag:None,2011-02-17:/article-3.html</id><content type=\"html\">&lt;p&gt;Article 3&lt;/p&gt;\n</content><category term=\"cat1\"/></entry><entry><title>This is a super article !</title><link href=\"/this-is-a-super-article.html\" rel=\"alternate\"/><published>2010-12-02T10:14:00+00:00</published><updated>2013-11-17T23:29:00+00:00</updated><author><name>Alexis Métaireau</name></author><id>tag:None,2010-12-02:/this-is-a-super-article.html</id><summary type=\"html\">&lt;p class=\"first last\"&gt;Multi-line metadata should be supported\nas well as &lt;strong&gt;inline markup&lt;/strong&gt;.&lt;/p&gt;\n</summary><content type=\"html\">&lt;p&gt;Some content here !&lt;/p&gt;\n&lt;div class=\"section\" id=\"this-is-a-simple-title\"&gt;\n&lt;h2&gt;This is a simple title&lt;/h2&gt;\n&lt;p&gt;And here comes the cool &lt;a class=\"reference external\" href=\"http://books.couchdb.org/relax/design-documents/views\"&gt;stuff&lt;/a&gt;.&lt;/p&gt;\n&lt;img alt=\"alternate text\" src=\"/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;img alt=\"alternate text\" src=\"/pictures/Sushi_Macro.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;pre class=\"literal-block\"&gt;\n&amp;gt;&amp;gt;&amp;gt; from ipdb import set_trace\n&amp;gt;&amp;gt;&amp;gt; set_trace()\n&lt;/pre&gt;\n&lt;p&gt;→ And now try with some utf8 hell: ééé&lt;/p&gt;\n&lt;/div&gt;\n</content><category term=\"yeah\"/><category term=\"foo\"/><category term=\"bar\"/><category term=\"foobar\"/></entry><entry><title>Oh yeah !</title><link href=\"/oh-yeah.html\" rel=\"alternate\"/><published>2010-10-20T10:14:00+00:00</published><updated>2010-10-20T10:14:00+00:00</updated><author><name>Alexis Métaireau</name></author><id>tag:None,2010-10-20:/oh-yeah.html</id><content type=\"html\">&lt;div class=\"section\" id=\"why-not\"&gt;\n&lt;h2&gt;Why not ?&lt;/h2&gt;\n&lt;p&gt;After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\nYEAH !&lt;/p&gt;\n&lt;img alt=\"alternate text\" src=\"/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;/div&gt;\n</content><category term=\"bar\"/><category term=\"oh\"/><category term=\"bar\"/><category term=\"yeah\"/></entry><entry><title>Trop bien !</title><link href=\"/oh-yeah-fr.html\" rel=\"alternate\"/><published>2010-10-20T10:14:00+00:00</published><updated>2010-10-20T10:14:00+00:00</updated><author><name/></author><id>tag:None,2010-10-20:/oh-yeah-fr.html</id><content type=\"html\">&lt;p&gt;Et voila du contenu en français&lt;/p&gt;\n</content><category term=\"misc\"/></entry><entry><title>Unbelievable !</title><link href=\"/unbelievable.html\" rel=\"alternate\"/><published>2010-10-15T20:30:00+00:00</published><updated>2010-10-15T20:30:00+00:00</updated><author><name/></author><id>tag:None,2010-10-15:/unbelievable.html</id><summary type=\"html\">&lt;p&gt;Or completely awesome. Depends the needs.&lt;/p&gt;\n&lt;p&gt;&lt;a class=\"reference external\" href=\"/a-markdown-powered-article.html\"&gt;a root-relative link to markdown-article&lt;/a&gt;\n&lt;a class=\"reference external\" href=\"/a-markdown-powered-article.html\"&gt;a file-relative link to markdown-article&lt;/a&gt;&lt;/p&gt;\n&lt;div class=\"section\" id=\"testing-sourcecode-directive\"&gt;\n&lt;h2&gt;Testing sourcecode directive&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;table class=\"highlighttable\"&gt;&lt;tr&gt;&lt;td class=\"linenos\"&gt;&lt;div class=\"linenodiv\"&gt;&lt;pre&gt;&lt;span class=\"normal\"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=\"code\"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-another-case\"&gt;\n&lt;h2&gt;Testing another case&lt;/h2&gt;\n&lt;p&gt;This will now have a line number in 'custom' since it's the default in\npelican.conf, it will …&lt;/p&gt;&lt;/div&gt;</summary><content type=\"html\">&lt;p&gt;Or completely awesome. Depends the needs.&lt;/p&gt;\n&lt;p&gt;&lt;a class=\"reference external\" href=\"/a-markdown-powered-article.html\"&gt;a root-relative link to markdown-article&lt;/a&gt;\n&lt;a class=\"reference external\" href=\"/a-markdown-powered-article.html\"&gt;a file-relative link to markdown-article&lt;/a&gt;&lt;/p&gt;\n&lt;div class=\"section\" id=\"testing-sourcecode-directive\"&gt;\n&lt;h2&gt;Testing sourcecode directive&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;table class=\"highlighttable\"&gt;&lt;tr&gt;&lt;td class=\"linenos\"&gt;&lt;div class=\"linenodiv\"&gt;&lt;pre&gt;&lt;span class=\"normal\"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=\"code\"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-another-case\"&gt;\n&lt;h2&gt;Testing another case&lt;/h2&gt;\n&lt;p&gt;This will now have a line number in 'custom' since it's the default in\npelican.conf, it will have nothing in default.&lt;/p&gt;\n&lt;div class=\"highlight\"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-more-sourcecode-directives\"&gt;\n&lt;h2&gt;Testing more sourcecode directives&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id=\"foo-8\"&gt;&lt;a id=\"foo-8\" name=\"foo-8\"&gt;&lt;/a&gt;&lt;a href=\"#foo-8\"&gt;&lt;span class=\"linenos special\"&gt; 8&lt;/span&gt;&lt;/a&gt;&lt;span class=\"testingk\"&gt;def&lt;/span&gt;&lt;span class=\"testingw\"&gt; &lt;/span&gt;&lt;span class=\"testingnf\"&gt;run&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingp\"&gt;):&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-9\"&gt;&lt;a id=\"foo-9\" name=\"foo-9\"&gt;&lt;/a&gt;&lt;a href=\"#foo-9\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;assert_has_content&lt;/span&gt;&lt;span class=\"testingp\"&gt;()&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-10\"&gt;&lt;a id=\"foo-10\" name=\"foo-10\"&gt;&lt;/a&gt;&lt;a href=\"#foo-10\"&gt;&lt;span class=\"linenos special\"&gt;10&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;try&lt;/span&gt;&lt;span class=\"testingp\"&gt;:&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-11\"&gt;&lt;a id=\"foo-11\" name=\"foo-11\"&gt;&lt;/a&gt;&lt;a href=\"#foo-11\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingn\"&gt;lexer&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;get_lexer_by_name&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;arguments&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testingmi\"&gt;0&lt;/span&gt;&lt;span class=\"testingp\"&gt;])&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-12\"&gt;&lt;a id=\"foo-12\" name=\"foo-12\"&gt;&lt;/a&gt;&lt;a href=\"#foo-12\"&gt;&lt;span class=\"linenos special\"&gt;12&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;except&lt;/span&gt; &lt;span class=\"testingne\"&gt;ValueError&lt;/span&gt;&lt;span class=\"testingp\"&gt;:&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-13\"&gt;&lt;a id=\"foo-13\" name=\"foo-13\"&gt;&lt;/a&gt;&lt;a href=\"#foo-13\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingc1\"&gt;# no lexer found - use the text one instead of an exception&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-14\"&gt;&lt;a id=\"foo-14\" name=\"foo-14\"&gt;&lt;/a&gt;&lt;a href=\"#foo-14\"&gt;&lt;span class=\"linenos special\"&gt;14&lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingn\"&gt;lexer&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;TextLexer&lt;/span&gt;&lt;span class=\"testingp\"&gt;()&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-15\"&gt;&lt;a id=\"foo-15\" name=\"foo-15\"&gt;&lt;/a&gt;&lt;a href=\"#foo-15\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-16\"&gt;&lt;a id=\"foo-16\" name=\"foo-16\"&gt;&lt;/a&gt;&lt;a href=\"#foo-16\"&gt;&lt;span class=\"linenos special\"&gt;16&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;if&lt;/span&gt; &lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;linenos&amp;#39;&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt; &lt;span class=\"testingow\"&gt;and&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-17\"&gt;&lt;a id=\"foo-17\" name=\"foo-17\"&gt;&lt;/a&gt;&lt;a href=\"#foo-17\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;            &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;linenos&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;]&lt;/span&gt; &lt;span class=\"testingow\"&gt;not&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;table&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;inline&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;)):&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-18\"&gt;&lt;a id=\"foo-18\" name=\"foo-18\"&gt;&lt;/a&gt;&lt;a href=\"#foo-18\"&gt;&lt;span class=\"linenos special\"&gt;18&lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;linenos&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;]&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;table&amp;#39;&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-19\"&gt;&lt;a id=\"foo-19\" name=\"foo-19\"&gt;&lt;/a&gt;&lt;a href=\"#foo-19\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-20\"&gt;&lt;a id=\"foo-20\" name=\"foo-20\"&gt;&lt;/a&gt;&lt;a href=\"#foo-20\"&gt;&lt;span class=\"linenos special\"&gt;20&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;for&lt;/span&gt; &lt;span class=\"testingn\"&gt;flag&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;nowrap&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;nobackground&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;anchorlinenos&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;):&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-21\"&gt;&lt;a id=\"foo-21\" name=\"foo-21\"&gt;&lt;/a&gt;&lt;a href=\"#foo-21\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingk\"&gt;if&lt;/span&gt; &lt;span class=\"testingn\"&gt;flag&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;:&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-22\"&gt;&lt;a id=\"foo-22\" name=\"foo-22\"&gt;&lt;/a&gt;&lt;a href=\"#foo-22\"&gt;&lt;span class=\"linenos special\"&gt;22&lt;/span&gt;&lt;/a&gt;            &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testingn\"&gt;flag&lt;/span&gt;&lt;span class=\"testingp\"&gt;]&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingkc\"&gt;True&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-23\"&gt;&lt;a id=\"foo-23\" name=\"foo-23\"&gt;&lt;/a&gt;&lt;a href=\"#foo-23\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-24\"&gt;&lt;a id=\"foo-24\" name=\"foo-24\"&gt;&lt;/a&gt;&lt;a href=\"#foo-24\"&gt;&lt;span class=\"linenos special\"&gt;24&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingc1\"&gt;# noclasses should already default to False, but just in case...&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-25\"&gt;&lt;a id=\"foo-25\" name=\"foo-25\"&gt;&lt;/a&gt;&lt;a href=\"#foo-25\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingn\"&gt;formatter&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;HtmlFormatter&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingn\"&gt;noclasses&lt;/span&gt;&lt;span class=\"testingo\"&gt;=&lt;/span&gt;&lt;span class=\"testingkc\"&gt;False&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingo\"&gt;**&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;)&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-26\"&gt;&lt;a id=\"foo-26\" name=\"foo-26\"&gt;&lt;/a&gt;&lt;a href=\"#foo-26\"&gt;&lt;span class=\"linenos special\"&gt;26&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingn\"&gt;parsed&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;highlight&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;&lt;/span&gt;&lt;span class=\"testingse\"&gt;\\n&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;join&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;content&lt;/span&gt;&lt;span class=\"testingp\"&gt;),&lt;/span&gt; &lt;span class=\"testingn\"&gt;lexer&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingn\"&gt;formatter&lt;/span&gt;&lt;span class=\"testingp\"&gt;)&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-27\"&gt;&lt;a id=\"foo-27\" name=\"foo-27\"&gt;&lt;/a&gt;&lt;a href=\"#foo-27\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;return&lt;/span&gt; &lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testingn\"&gt;nodes&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;raw&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingn\"&gt;parsed&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingnb\"&gt;format&lt;/span&gt;&lt;span class=\"testingo\"&gt;=&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;html&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;)]&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-even-more-sourcecode-directives\"&gt;\n&lt;h2&gt;Testing even more sourcecode directives&lt;/h2&gt;\n&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-overriding-config-defaults\"&gt;\n&lt;h2&gt;Testing overriding config defaults&lt;/h2&gt;\n&lt;p&gt;Even if the default is line numbers, we can override it here&lt;/p&gt;\n&lt;div class=\"highlight\"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n</content><category term=\"misc\"/></entry><entry><title>The baz tag</title><link href=\"/tag/baz.html\" rel=\"alternate\"/><published>2010-03-14T00:00:00+00:00</published><updated>2010-03-14T00:00:00+00:00</updated><author><name/></author><id>tag:None,2010-03-14:/tag/baz.html</id><content type=\"html\">&lt;p&gt;This article overrides the listening of the articles under the &lt;em&gt;baz&lt;/em&gt; tag.&lt;/p&gt;\n</content><category term=\"misc\"/></entry></feed>\n"
  },
  {
    "path": "pelican/tests/output/basic/feeds/bar.atom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<feed xmlns=\"http://www.w3.org/2005/Atom\"><title>A Pelican Blog - bar</title><link href=\"/\" rel=\"alternate\"/><link href=\"/feeds/bar.atom.xml\" rel=\"self\"/><id>/</id><updated>2010-10-20T10:14:00+00:00</updated><entry><title>Oh yeah !</title><link href=\"/oh-yeah.html\" rel=\"alternate\"/><published>2010-10-20T10:14:00+00:00</published><updated>2010-10-20T10:14:00+00:00</updated><author><name>Alexis Métaireau</name></author><id>tag:None,2010-10-20:/oh-yeah.html</id><content type=\"html\">&lt;div class=\"section\" id=\"why-not\"&gt;\n&lt;h2&gt;Why not ?&lt;/h2&gt;\n&lt;p&gt;After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\nYEAH !&lt;/p&gt;\n&lt;img alt=\"alternate text\" src=\"/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;/div&gt;\n</content><category term=\"bar\"/><category term=\"oh\"/><category term=\"bar\"/><category term=\"yeah\"/></entry></feed>\n"
  },
  {
    "path": "pelican/tests/output/basic/feeds/cat1.atom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<feed xmlns=\"http://www.w3.org/2005/Atom\"><title>A Pelican Blog - cat1</title><link href=\"/\" rel=\"alternate\"/><link href=\"/feeds/cat1.atom.xml\" rel=\"self\"/><id>/</id><updated>2011-04-20T00:00:00+00:00</updated><entry><title>A markdown powered article</title><link href=\"/a-markdown-powered-article.html\" rel=\"alternate\"/><published>2011-04-20T00:00:00+00:00</published><updated>2011-04-20T00:00:00+00:00</updated><author><name/></author><id>tag:None,2011-04-20:/a-markdown-powered-article.html</id><content type=\"html\">&lt;p&gt;You're mutually oblivious.&lt;/p&gt;\n&lt;p&gt;&lt;a href=\"/unbelievable.html\"&gt;a root-relative link to unbelievable&lt;/a&gt;\n&lt;a href=\"/unbelievable.html\"&gt;a file-relative link to unbelievable&lt;/a&gt;&lt;/p&gt;</content><category term=\"cat1\"/></entry><entry><title>Article 1</title><link href=\"/article-1.html\" rel=\"alternate\"/><published>2011-02-17T00:00:00+00:00</published><updated>2011-02-17T00:00:00+00:00</updated><author><name/></author><id>tag:None,2011-02-17:/article-1.html</id><content type=\"html\">&lt;p&gt;Article 1&lt;/p&gt;\n</content><category term=\"cat1\"/></entry><entry><title>Article 2</title><link href=\"/article-2.html\" rel=\"alternate\"/><published>2011-02-17T00:00:00+00:00</published><updated>2011-02-17T00:00:00+00:00</updated><author><name/></author><id>tag:None,2011-02-17:/article-2.html</id><content type=\"html\">&lt;p&gt;Article 2&lt;/p&gt;\n</content><category term=\"cat1\"/></entry><entry><title>Article 3</title><link href=\"/article-3.html\" rel=\"alternate\"/><published>2011-02-17T00:00:00+00:00</published><updated>2011-02-17T00:00:00+00:00</updated><author><name/></author><id>tag:None,2011-02-17:/article-3.html</id><content type=\"html\">&lt;p&gt;Article 3&lt;/p&gt;\n</content><category term=\"cat1\"/></entry></feed>\n"
  },
  {
    "path": "pelican/tests/output/basic/feeds/misc.atom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<feed xmlns=\"http://www.w3.org/2005/Atom\"><title>A Pelican Blog - misc</title><link href=\"/\" rel=\"alternate\"/><link href=\"/feeds/misc.atom.xml\" rel=\"self\"/><id>/</id><updated>2012-11-30T00:00:00+00:00</updated><entry><title>FILENAME_METADATA example</title><link href=\"/filename_metadata-example.html\" rel=\"alternate\"/><published>2012-11-30T00:00:00+00:00</published><updated>2012-11-30T00:00:00+00:00</updated><author><name/></author><id>tag:None,2012-11-30:/filename_metadata-example.html</id><content type=\"html\">&lt;p&gt;Some cool stuff!&lt;/p&gt;\n</content><category term=\"misc\"/></entry><entry><title>Second article</title><link href=\"/second-article.html\" rel=\"alternate\"/><published>2012-02-29T00:00:00+00:00</published><updated>2012-02-29T00:00:00+00:00</updated><author><name/></author><id>tag:None,2012-02-29:/second-article.html</id><content type=\"html\">&lt;p&gt;This is some article, in english&lt;/p&gt;\n</content><category term=\"misc\"/><category term=\"foo\"/><category term=\"bar\"/><category term=\"baz\"/></entry><entry><title>Unbelievable !</title><link href=\"/unbelievable.html\" rel=\"alternate\"/><published>2010-10-15T20:30:00+00:00</published><updated>2010-10-15T20:30:00+00:00</updated><author><name/></author><id>tag:None,2010-10-15:/unbelievable.html</id><summary type=\"html\">&lt;p&gt;Or completely awesome. Depends the needs.&lt;/p&gt;\n&lt;p&gt;&lt;a class=\"reference external\" href=\"/a-markdown-powered-article.html\"&gt;a root-relative link to markdown-article&lt;/a&gt;\n&lt;a class=\"reference external\" href=\"/a-markdown-powered-article.html\"&gt;a file-relative link to markdown-article&lt;/a&gt;&lt;/p&gt;\n&lt;div class=\"section\" id=\"testing-sourcecode-directive\"&gt;\n&lt;h2&gt;Testing sourcecode directive&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;table class=\"highlighttable\"&gt;&lt;tr&gt;&lt;td class=\"linenos\"&gt;&lt;div class=\"linenodiv\"&gt;&lt;pre&gt;&lt;span class=\"normal\"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=\"code\"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-another-case\"&gt;\n&lt;h2&gt;Testing another case&lt;/h2&gt;\n&lt;p&gt;This will now have a line number in 'custom' since it's the default in\npelican.conf, it will …&lt;/p&gt;&lt;/div&gt;</summary><content type=\"html\">&lt;p&gt;Or completely awesome. Depends the needs.&lt;/p&gt;\n&lt;p&gt;&lt;a class=\"reference external\" href=\"/a-markdown-powered-article.html\"&gt;a root-relative link to markdown-article&lt;/a&gt;\n&lt;a class=\"reference external\" href=\"/a-markdown-powered-article.html\"&gt;a file-relative link to markdown-article&lt;/a&gt;&lt;/p&gt;\n&lt;div class=\"section\" id=\"testing-sourcecode-directive\"&gt;\n&lt;h2&gt;Testing sourcecode directive&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;table class=\"highlighttable\"&gt;&lt;tr&gt;&lt;td class=\"linenos\"&gt;&lt;div class=\"linenodiv\"&gt;&lt;pre&gt;&lt;span class=\"normal\"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=\"code\"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-another-case\"&gt;\n&lt;h2&gt;Testing another case&lt;/h2&gt;\n&lt;p&gt;This will now have a line number in 'custom' since it's the default in\npelican.conf, it will have nothing in default.&lt;/p&gt;\n&lt;div class=\"highlight\"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-more-sourcecode-directives\"&gt;\n&lt;h2&gt;Testing more sourcecode directives&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id=\"foo-8\"&gt;&lt;a id=\"foo-8\" name=\"foo-8\"&gt;&lt;/a&gt;&lt;a href=\"#foo-8\"&gt;&lt;span class=\"linenos special\"&gt; 8&lt;/span&gt;&lt;/a&gt;&lt;span class=\"testingk\"&gt;def&lt;/span&gt;&lt;span class=\"testingw\"&gt; &lt;/span&gt;&lt;span class=\"testingnf\"&gt;run&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingp\"&gt;):&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-9\"&gt;&lt;a id=\"foo-9\" name=\"foo-9\"&gt;&lt;/a&gt;&lt;a href=\"#foo-9\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;assert_has_content&lt;/span&gt;&lt;span class=\"testingp\"&gt;()&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-10\"&gt;&lt;a id=\"foo-10\" name=\"foo-10\"&gt;&lt;/a&gt;&lt;a href=\"#foo-10\"&gt;&lt;span class=\"linenos special\"&gt;10&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;try&lt;/span&gt;&lt;span class=\"testingp\"&gt;:&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-11\"&gt;&lt;a id=\"foo-11\" name=\"foo-11\"&gt;&lt;/a&gt;&lt;a href=\"#foo-11\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingn\"&gt;lexer&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;get_lexer_by_name&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;arguments&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testingmi\"&gt;0&lt;/span&gt;&lt;span class=\"testingp\"&gt;])&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-12\"&gt;&lt;a id=\"foo-12\" name=\"foo-12\"&gt;&lt;/a&gt;&lt;a href=\"#foo-12\"&gt;&lt;span class=\"linenos special\"&gt;12&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;except&lt;/span&gt; &lt;span class=\"testingne\"&gt;ValueError&lt;/span&gt;&lt;span class=\"testingp\"&gt;:&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-13\"&gt;&lt;a id=\"foo-13\" name=\"foo-13\"&gt;&lt;/a&gt;&lt;a href=\"#foo-13\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingc1\"&gt;# no lexer found - use the text one instead of an exception&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-14\"&gt;&lt;a id=\"foo-14\" name=\"foo-14\"&gt;&lt;/a&gt;&lt;a href=\"#foo-14\"&gt;&lt;span class=\"linenos special\"&gt;14&lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingn\"&gt;lexer&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;TextLexer&lt;/span&gt;&lt;span class=\"testingp\"&gt;()&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-15\"&gt;&lt;a id=\"foo-15\" name=\"foo-15\"&gt;&lt;/a&gt;&lt;a href=\"#foo-15\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-16\"&gt;&lt;a id=\"foo-16\" name=\"foo-16\"&gt;&lt;/a&gt;&lt;a href=\"#foo-16\"&gt;&lt;span class=\"linenos special\"&gt;16&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;if&lt;/span&gt; &lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;linenos&amp;#39;&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt; &lt;span class=\"testingow\"&gt;and&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-17\"&gt;&lt;a id=\"foo-17\" name=\"foo-17\"&gt;&lt;/a&gt;&lt;a href=\"#foo-17\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;            &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;linenos&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;]&lt;/span&gt; &lt;span class=\"testingow\"&gt;not&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;table&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;inline&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;)):&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-18\"&gt;&lt;a id=\"foo-18\" name=\"foo-18\"&gt;&lt;/a&gt;&lt;a href=\"#foo-18\"&gt;&lt;span class=\"linenos special\"&gt;18&lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;linenos&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;]&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;table&amp;#39;&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-19\"&gt;&lt;a id=\"foo-19\" name=\"foo-19\"&gt;&lt;/a&gt;&lt;a href=\"#foo-19\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-20\"&gt;&lt;a id=\"foo-20\" name=\"foo-20\"&gt;&lt;/a&gt;&lt;a href=\"#foo-20\"&gt;&lt;span class=\"linenos special\"&gt;20&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;for&lt;/span&gt; &lt;span class=\"testingn\"&gt;flag&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;nowrap&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;nobackground&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;anchorlinenos&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;):&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-21\"&gt;&lt;a id=\"foo-21\" name=\"foo-21\"&gt;&lt;/a&gt;&lt;a href=\"#foo-21\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingk\"&gt;if&lt;/span&gt; &lt;span class=\"testingn\"&gt;flag&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;:&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-22\"&gt;&lt;a id=\"foo-22\" name=\"foo-22\"&gt;&lt;/a&gt;&lt;a href=\"#foo-22\"&gt;&lt;span class=\"linenos special\"&gt;22&lt;/span&gt;&lt;/a&gt;            &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testingn\"&gt;flag&lt;/span&gt;&lt;span class=\"testingp\"&gt;]&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingkc\"&gt;True&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-23\"&gt;&lt;a id=\"foo-23\" name=\"foo-23\"&gt;&lt;/a&gt;&lt;a href=\"#foo-23\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-24\"&gt;&lt;a id=\"foo-24\" name=\"foo-24\"&gt;&lt;/a&gt;&lt;a href=\"#foo-24\"&gt;&lt;span class=\"linenos special\"&gt;24&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingc1\"&gt;# noclasses should already default to False, but just in case...&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-25\"&gt;&lt;a id=\"foo-25\" name=\"foo-25\"&gt;&lt;/a&gt;&lt;a href=\"#foo-25\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingn\"&gt;formatter&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;HtmlFormatter&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingn\"&gt;noclasses&lt;/span&gt;&lt;span class=\"testingo\"&gt;=&lt;/span&gt;&lt;span class=\"testingkc\"&gt;False&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingo\"&gt;**&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;)&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-26\"&gt;&lt;a id=\"foo-26\" name=\"foo-26\"&gt;&lt;/a&gt;&lt;a href=\"#foo-26\"&gt;&lt;span class=\"linenos special\"&gt;26&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingn\"&gt;parsed&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;highlight&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;&lt;/span&gt;&lt;span class=\"testingse\"&gt;\\n&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;join&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;content&lt;/span&gt;&lt;span class=\"testingp\"&gt;),&lt;/span&gt; &lt;span class=\"testingn\"&gt;lexer&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingn\"&gt;formatter&lt;/span&gt;&lt;span class=\"testingp\"&gt;)&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-27\"&gt;&lt;a id=\"foo-27\" name=\"foo-27\"&gt;&lt;/a&gt;&lt;a href=\"#foo-27\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;return&lt;/span&gt; &lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testingn\"&gt;nodes&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;raw&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingn\"&gt;parsed&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingnb\"&gt;format&lt;/span&gt;&lt;span class=\"testingo\"&gt;=&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;html&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;)]&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-even-more-sourcecode-directives\"&gt;\n&lt;h2&gt;Testing even more sourcecode directives&lt;/h2&gt;\n&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-overriding-config-defaults\"&gt;\n&lt;h2&gt;Testing overriding config defaults&lt;/h2&gt;\n&lt;p&gt;Even if the default is line numbers, we can override it here&lt;/p&gt;\n&lt;div class=\"highlight\"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n</content><category term=\"misc\"/></entry><entry><title>The baz tag</title><link href=\"/tag/baz.html\" rel=\"alternate\"/><published>2010-03-14T00:00:00+00:00</published><updated>2010-03-14T00:00:00+00:00</updated><author><name/></author><id>tag:None,2010-03-14:/tag/baz.html</id><content type=\"html\">&lt;p&gt;This article overrides the listening of the articles under the &lt;em&gt;baz&lt;/em&gt; tag.&lt;/p&gt;\n</content><category term=\"misc\"/></entry></feed>\n"
  },
  {
    "path": "pelican/tests/output/basic/feeds/yeah.atom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<feed xmlns=\"http://www.w3.org/2005/Atom\"><title>A Pelican Blog - yeah</title><link href=\"/\" rel=\"alternate\"/><link href=\"/feeds/yeah.atom.xml\" rel=\"self\"/><id>/</id><updated>2013-11-17T23:29:00+00:00</updated><entry><title>This is a super article !</title><link href=\"/this-is-a-super-article.html\" rel=\"alternate\"/><published>2010-12-02T10:14:00+00:00</published><updated>2013-11-17T23:29:00+00:00</updated><author><name>Alexis Métaireau</name></author><id>tag:None,2010-12-02:/this-is-a-super-article.html</id><summary type=\"html\">&lt;p class=\"first last\"&gt;Multi-line metadata should be supported\nas well as &lt;strong&gt;inline markup&lt;/strong&gt;.&lt;/p&gt;\n</summary><content type=\"html\">&lt;p&gt;Some content here !&lt;/p&gt;\n&lt;div class=\"section\" id=\"this-is-a-simple-title\"&gt;\n&lt;h2&gt;This is a simple title&lt;/h2&gt;\n&lt;p&gt;And here comes the cool &lt;a class=\"reference external\" href=\"http://books.couchdb.org/relax/design-documents/views\"&gt;stuff&lt;/a&gt;.&lt;/p&gt;\n&lt;img alt=\"alternate text\" src=\"/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;img alt=\"alternate text\" src=\"/pictures/Sushi_Macro.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;pre class=\"literal-block\"&gt;\n&amp;gt;&amp;gt;&amp;gt; from ipdb import set_trace\n&amp;gt;&amp;gt;&amp;gt; set_trace()\n&lt;/pre&gt;\n&lt;p&gt;→ And now try with some utf8 hell: ééé&lt;/p&gt;\n&lt;/div&gt;\n</content><category term=\"yeah\"/><category term=\"foo\"/><category term=\"bar\"/><category term=\"foobar\"/></entry></feed>\n"
  },
  {
    "path": "pelican/tests/output/basic/filename_metadata-example.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>FILENAME_METADATA example</title>\n                <link rel=\"stylesheet\" href=\"/theme/css/main.css\" />\n                <link href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"A Pelican Blog Atom Feed\" />\n                <meta name=\"description\" content=\"Some cool stuff!\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"/\">A Pelican Blog</a></h1>\n                        <nav><ul>\n                                <li><a href=\"/tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"/override/\">Override url/save_as</a></li>\n                                <li><a href=\"/pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"/category/bar.html\">bar</a></li>\n                                <li><a href=\"/category/cat1.html\">cat1</a></li>\n                                <li class=\"active\"><a href=\"/category/misc.html\">misc</a></li>\n                                <li><a href=\"/category/yeah.html\">yeah</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"/filename_metadata-example.html\" rel=\"bookmark\"\n                                                   title=\"Permalink to FILENAME_METADATA example\">FILENAME_METADATA example</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2012-11-30T00:00:00+00:00\">\n                                                        Published: Fri 30 November 2012\n                                                </abbr>\n\n                                                <p>In <a href=\"/category/misc.html\">misc</a>.</p>\n\n                                        </footer><!-- /.post-info -->      <p>Some cool stuff!</p>\n\n                                </div><!-- /.entry-content -->\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/basic/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>A Pelican Blog</title>\n                <link rel=\"stylesheet\" href=\"/theme/css/main.css\" />\n                <link href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"A Pelican Blog Atom Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"/\">A Pelican Blog</a></h1>\n                        <nav><ul>\n                                <li><a href=\"/tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"/override/\">Override url/save_as</a></li>\n                                <li><a href=\"/pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"/category/bar.html\">bar</a></li>\n                                <li><a href=\"/category/cat1.html\">cat1</a></li>\n                                <li><a href=\"/category/misc.html\">misc</a></li>\n                                <li><a href=\"/category/yeah.html\">yeah</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <aside id=\"featured\" class=\"body\">\n                        <article>\n                                <h1 class=\"entry-title\"><a href=\"/filename_metadata-example.html\">FILENAME_METADATA example</a></h1>\n                                <footer class=\"post-info\">\n                                        <abbr class=\"published\" title=\"2012-11-30T00:00:00+00:00\">\n                                                Published: Fri 30 November 2012\n                                        </abbr>\n\n                                        <p>In <a href=\"/category/misc.html\">misc</a>.</p>\n\n                                </footer><!-- /.post-info --><p>Some cool stuff!</p>\n                        </article>\n                </aside><!-- /#featured -->\n                <section id=\"content\" class=\"body\">\n                        <h1>Other articles</h1>\n                        <hr />\n                        <ol id=\"posts-list\" class=\"hfeed\">\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"/second-article.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to Second article\">Second article</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2012-02-29T00:00:00+00:00\">\n                                                                Published: Wed 29 February 2012\n                                                        </abbr>\n\n                                                        <p>In <a href=\"/category/misc.html\">misc</a>.</p>\n                                                        <p>tags: <a href=\"/tag/foo.html\">foo</a> <a href=\"/tag/bar.html\">bar</a> <a href=\"/tag/baz.html\">baz</a> </p>Translations:\n                                                        <a href=\"/second-article-fr.html\" hreflang=\"fr\">fr</a>\n\n                                                </footer><!-- /.post-info -->                <p>This is some article, in english</p>\n\n                                                <a class=\"readmore\" href=\"/second-article.html\">read more</a>\n                                        </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"/a-markdown-powered-article.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to A markdown powered article\">A markdown powered article</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2011-04-20T00:00:00+00:00\">\n                                                                Published: Wed 20 April 2011\n                                                        </abbr>\n\n                                                        <p>In <a href=\"/category/cat1.html\">cat1</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>You're mutually oblivious.</p>\n                                                <p><a href=\"/unbelievable.html\">a root-relative link to unbelievable</a>\n                                                        <a href=\"/unbelievable.html\">a file-relative link to unbelievable</a></p>\n                                                <a class=\"readmore\" href=\"/a-markdown-powered-article.html\">read more</a>\n                                        </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"/article-1.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to Article 1\">Article 1</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2011-02-17T00:00:00+00:00\">\n                                                                Published: Thu 17 February 2011\n                                                        </abbr>\n\n                                                        <p>In <a href=\"/category/cat1.html\">cat1</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>Article 1</p>\n\n                                                <a class=\"readmore\" href=\"/article-1.html\">read more</a>\n                                        </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"/article-2.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to Article 2\">Article 2</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2011-02-17T00:00:00+00:00\">\n                                                                Published: Thu 17 February 2011\n                                                        </abbr>\n\n                                                        <p>In <a href=\"/category/cat1.html\">cat1</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>Article 2</p>\n\n                                                <a class=\"readmore\" href=\"/article-2.html\">read more</a>\n                                        </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"/article-3.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to Article 3\">Article 3</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2011-02-17T00:00:00+00:00\">\n                                                                Published: Thu 17 February 2011\n                                                        </abbr>\n\n                                                        <p>In <a href=\"/category/cat1.html\">cat1</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>Article 3</p>\n\n                                                <a class=\"readmore\" href=\"/article-3.html\">read more</a>\n                                        </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"/this-is-a-super-article.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to This is a super article !\">This is a super article !</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2010-12-02T10:14:00+00:00\">\n                                                                Published: Thu 02 December 2010\n                                                        </abbr>\n                                                        <br />\n                                                        <abbr class=\"modified\" title=\"2013-11-17T23:29:00+00:00\">\n                                                                Updated: Sun 17 November 2013\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"/author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"/category/yeah.html\">yeah</a>.</p>\n                                                        <p>tags: <a href=\"/tag/foo.html\">foo</a> <a href=\"/tag/bar.html\">bar</a> <a href=\"/tag/foobar.html\">foobar</a> </p>\n                                                </footer><!-- /.post-info -->                <p class=\"first last\">Multi-line metadata should be supported\n                                                        as well as <strong>inline markup</strong>.</p>\n\n                                                <a class=\"readmore\" href=\"/this-is-a-super-article.html\">read more</a>\n                                        </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"/oh-yeah.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to Oh yeah !\">Oh yeah !</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2010-10-20T10:14:00+00:00\">\n                                                                Published: Wed 20 October 2010\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"/author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"/category/bar.html\">bar</a>.</p>\n                                                        <p>tags: <a href=\"/tag/oh.html\">oh</a> <a href=\"/tag/bar.html\">bar</a> <a href=\"/tag/yeah.html\">yeah</a> </p>Translations:\n                                                        <a href=\"/oh-yeah-fr.html\" hreflang=\"fr\">fr</a>\n\n                                                </footer><!-- /.post-info -->                <div class=\"section\" id=\"why-not\">\n                                                        <h2>Why not ?</h2>\n                                                        <p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\n                                                                YEAH !</p>\n                                                        <img alt=\"alternate text\" src=\"/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" />\n                                                </div>\n\n                                                <a class=\"readmore\" href=\"/oh-yeah.html\">read more</a>\n                                        </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"/unbelievable.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to Unbelievable !\">Unbelievable !</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2010-10-15T20:30:00+00:00\">\n                                                                Published: Fri 15 October 2010\n                                                        </abbr>\n\n                                                        <p>In <a href=\"/category/misc.html\">misc</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>Or completely awesome. Depends the needs.</p>\n                                                <p><a class=\"reference external\" href=\"/a-markdown-powered-article.html\">a root-relative link to markdown-article</a>\n                                                        <a class=\"reference external\" href=\"/a-markdown-powered-article.html\">a file-relative link to markdown-article</a></p>\n                                                <div class=\"section\" id=\"testing-sourcecode-directive\">\n                                                        <h2>Testing sourcecode directive</h2>\n                                                        <div class=\"highlight\"><table class=\"highlighttable\"><tr><td class=\"linenos\"><div class=\"linenodiv\"><pre><span class=\"normal\">1</span></pre></div></td><td class=\"code\"><div><pre><span></span><span class=\"n\">formatter</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span> <span class=\"ow\">and</span> <span class=\"n\">VARIANTS</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]]</span>\n</pre></div></td></tr></table></div>\n                                                </div>\n                                                <div class=\"section\" id=\"testing-another-case\">\n                                                        <h2>Testing another case</h2>\n                                                        <p>This will now have a line number in 'custom' since it's the default in\n                                                                pelican.conf, it will …</p></div>\n                                                <a class=\"readmore\" href=\"/unbelievable.html\">read more</a>\n                                        </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"/tag/baz.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to The baz tag\">The baz tag</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2010-03-14T00:00:00+00:00\">\n                                                                Published: Sun 14 March 2010\n                                                        </abbr>\n\n                                                        <p>In <a href=\"/category/misc.html\">misc</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>This article overrides the listening of the articles under the <em>baz</em> tag.</p>\n\n                                                <a class=\"readmore\" href=\"/tag/baz.html\">read more</a>\n                                        </div><!-- /.entry-content -->\n                                </article></li>\n                        </ol><!-- /#posts-list -->\n                </section><!-- /#content -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/basic/oh-yeah-fr.html",
    "content": "<!DOCTYPE html>\n<html lang=\"fr\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Trop bien !</title>\n                <link rel=\"stylesheet\" href=\"/theme/css/main.css\" />\n                <link href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"A Pelican Blog Atom Feed\" />\n                <link rel=\"alternate\" hreflang=\"en\" href=\"/oh-yeah.html\">\n\n                <meta name=\"description\" content=\"Et voila du contenu en français\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"/\">A Pelican Blog</a></h1>\n                        <nav><ul>\n                                <li><a href=\"/tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"/override/\">Override url/save_as</a></li>\n                                <li><a href=\"/pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"/category/bar.html\">bar</a></li>\n                                <li><a href=\"/category/cat1.html\">cat1</a></li>\n                                <li class=\"active\"><a href=\"/category/misc.html\">misc</a></li>\n                                <li><a href=\"/category/yeah.html\">yeah</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"/oh-yeah-fr.html\" rel=\"bookmark\"\n                                                   title=\"Permalink to Trop bien !\">Trop bien !</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2010-10-20T10:14:00+00:00\">\n                                                        Published: Wed 20 October 2010\n                                                </abbr>\n\n                                                <p>In <a href=\"/category/misc.html\">misc</a>.</p>\n                                                Translations:\n                                                <a href=\"/oh-yeah.html\" hreflang=\"en\">en</a>\n\n                                        </footer><!-- /.post-info -->      <p>Et voila du contenu en français</p>\n\n                                </div><!-- /.entry-content -->\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/basic/oh-yeah.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Oh yeah !</title>\n                <link rel=\"stylesheet\" href=\"/theme/css/main.css\" />\n                <link href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"A Pelican Blog Atom Feed\" />\n                <link rel=\"alternate\" hreflang=\"fr\" href=\"/oh-yeah-fr.html\">\n\n                <meta name=\"description\" content=\"Why not ? After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst ! YEAH !\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"/\">A Pelican Blog</a></h1>\n                        <nav><ul>\n                                <li><a href=\"/tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"/override/\">Override url/save_as</a></li>\n                                <li><a href=\"/pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li class=\"active\"><a href=\"/category/bar.html\">bar</a></li>\n                                <li><a href=\"/category/cat1.html\">cat1</a></li>\n                                <li><a href=\"/category/misc.html\">misc</a></li>\n                                <li><a href=\"/category/yeah.html\">yeah</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"/oh-yeah.html\" rel=\"bookmark\"\n                                                   title=\"Permalink to Oh yeah !\">Oh yeah !</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2010-10-20T10:14:00+00:00\">\n                                                        Published: Wed 20 October 2010\n                                                </abbr>\n\n                                                <address class=\"vcard author\">\n                                                        By                         <a class=\"url fn\" href=\"/author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                </address>\n                                                <p>In <a href=\"/category/bar.html\">bar</a>.</p>\n                                                <p>tags: <a href=\"/tag/oh.html\">oh</a> <a href=\"/tag/bar.html\">bar</a> <a href=\"/tag/yeah.html\">yeah</a> </p>Translations:\n                                                <a href=\"/oh-yeah-fr.html\" hreflang=\"fr\">fr</a>\n\n                                        </footer><!-- /.post-info -->      <div class=\"section\" id=\"why-not\">\n                                                <h2>Why not ?</h2>\n                                                <p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\n                                                        YEAH !</p>\n                                                <img alt=\"alternate text\" src=\"/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" />\n                                        </div>\n\n                                </div><!-- /.entry-content -->\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/basic/override/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Override url/save_as</title>\n                <link rel=\"stylesheet\" href=\"/theme/css/main.css\" />\n                <link href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"A Pelican Blog Atom Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"/\">A Pelican Blog</a></h1>\n                        <nav><ul>\n                                <li><a href=\"/tag/oh.html\">Oh Oh Oh</a></li>\n                                <li class=\"active\"><a href=\"/override/\">Override url/save_as</a></li>\n                                <li><a href=\"/pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"/category/bar.html\">bar</a></li>\n                                <li><a href=\"/category/cat1.html\">cat1</a></li>\n                                <li><a href=\"/category/misc.html\">misc</a></li>\n                                <li><a href=\"/category/yeah.html\">yeah</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <h1 class=\"entry-title\">Override url/save_as</h1>\n\n                        <p>Test page which overrides save_as and url so that this page will be generated\n                                at a custom location.</p>\n\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/basic/pages/this-is-a-test-hidden-page.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>This is a test hidden page</title>\n                <link rel=\"stylesheet\" href=\"/theme/css/main.css\" />\n                <link href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"A Pelican Blog Atom Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"/\">A Pelican Blog</a></h1>\n                        <nav><ul>\n                                <li><a href=\"/tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"/override/\">Override url/save_as</a></li>\n                                <li><a href=\"/pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"/category/bar.html\">bar</a></li>\n                                <li><a href=\"/category/cat1.html\">cat1</a></li>\n                                <li><a href=\"/category/misc.html\">misc</a></li>\n                                <li><a href=\"/category/yeah.html\">yeah</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <h1 class=\"entry-title\">This is a test hidden page</h1>\n\n                        <p>This is great for things like error(404) pages\n                                Anyone can see this page but it's not linked to anywhere!</p>\n\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/basic/pages/this-is-a-test-page.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>This is a test page</title>\n                <link rel=\"stylesheet\" href=\"/theme/css/main.css\" />\n                <link href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"A Pelican Blog Atom Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"/\">A Pelican Blog</a></h1>\n                        <nav><ul>\n                                <li><a href=\"/tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"/override/\">Override url/save_as</a></li>\n                                <li class=\"active\"><a href=\"/pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"/category/bar.html\">bar</a></li>\n                                <li><a href=\"/category/cat1.html\">cat1</a></li>\n                                <li><a href=\"/category/misc.html\">misc</a></li>\n                                <li><a href=\"/category/yeah.html\">yeah</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <h1 class=\"entry-title\">This is a test page</h1>\n\n                        <p>Just an image.</p>\n                        <img alt=\"alternate text\" src=\"/pictures/Fat_Cat.jpg\" style=\"width: 600px; height: 450px;\" />\n                        <img alt=\"wrong path since 'images' folder does not exist\" src=\"|filename|/images/Fat_Cat.jpg\" style=\"width: 600px; height: 450px;\" />\n\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/basic/second-article-fr.html",
    "content": "<!DOCTYPE html>\n<html lang=\"fr\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Deuxième article</title>\n                <link rel=\"stylesheet\" href=\"/theme/css/main.css\" />\n                <link href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"A Pelican Blog Atom Feed\" />\n                <link rel=\"alternate\" hreflang=\"en\" href=\"/second-article.html\">\n\n                <meta name=\"description\" content=\"Ceci est un article, en français.\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"/\">A Pelican Blog</a></h1>\n                        <nav><ul>\n                                <li><a href=\"/tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"/override/\">Override url/save_as</a></li>\n                                <li><a href=\"/pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"/category/bar.html\">bar</a></li>\n                                <li><a href=\"/category/cat1.html\">cat1</a></li>\n                                <li class=\"active\"><a href=\"/category/misc.html\">misc</a></li>\n                                <li><a href=\"/category/yeah.html\">yeah</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"/second-article-fr.html\" rel=\"bookmark\"\n                                                   title=\"Permalink to Deuxième article\">Deuxième article</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2012-02-29T00:00:00+00:00\">\n                                                        Published: Wed 29 February 2012\n                                                </abbr>\n\n                                                <p>In <a href=\"/category/misc.html\">misc</a>.</p>\n                                                <p>tags: <a href=\"/tag/foo.html\">foo</a> <a href=\"/tag/bar.html\">bar</a> <a href=\"/tag/baz.html\">baz</a> </p>Translations:\n                                                <a href=\"/second-article.html\" hreflang=\"en\">en</a>\n\n                                        </footer><!-- /.post-info -->      <p>Ceci est un article, en français.</p>\n\n                                </div><!-- /.entry-content -->\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/basic/second-article.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Second article</title>\n                <link rel=\"stylesheet\" href=\"/theme/css/main.css\" />\n                <link href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"A Pelican Blog Atom Feed\" />\n                <link rel=\"alternate\" hreflang=\"fr\" href=\"/second-article-fr.html\">\n\n                <meta name=\"description\" content=\"This is some article, in english\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"/\">A Pelican Blog</a></h1>\n                        <nav><ul>\n                                <li><a href=\"/tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"/override/\">Override url/save_as</a></li>\n                                <li><a href=\"/pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"/category/bar.html\">bar</a></li>\n                                <li><a href=\"/category/cat1.html\">cat1</a></li>\n                                <li class=\"active\"><a href=\"/category/misc.html\">misc</a></li>\n                                <li><a href=\"/category/yeah.html\">yeah</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"/second-article.html\" rel=\"bookmark\"\n                                                   title=\"Permalink to Second article\">Second article</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2012-02-29T00:00:00+00:00\">\n                                                        Published: Wed 29 February 2012\n                                                </abbr>\n\n                                                <p>In <a href=\"/category/misc.html\">misc</a>.</p>\n                                                <p>tags: <a href=\"/tag/foo.html\">foo</a> <a href=\"/tag/bar.html\">bar</a> <a href=\"/tag/baz.html\">baz</a> </p>Translations:\n                                                <a href=\"/second-article-fr.html\" hreflang=\"fr\">fr</a>\n\n                                        </footer><!-- /.post-info -->      <p>This is some article, in english</p>\n\n                                </div><!-- /.entry-content -->\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/basic/tag/bar.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>A Pelican Blog - bar</title>\n                <link rel=\"stylesheet\" href=\"/theme/css/main.css\" />\n                <link href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"A Pelican Blog Atom Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"/\">A Pelican Blog</a></h1>\n                        <nav><ul>\n                                <li><a href=\"/tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"/override/\">Override url/save_as</a></li>\n                                <li><a href=\"/pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"/category/bar.html\">bar</a></li>\n                                <li><a href=\"/category/cat1.html\">cat1</a></li>\n                                <li><a href=\"/category/misc.html\">misc</a></li>\n                                <li><a href=\"/category/yeah.html\">yeah</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <aside id=\"featured\" class=\"body\">\n                        <article>\n                                <h1 class=\"entry-title\"><a href=\"/second-article.html\">Second article</a></h1>\n                                <footer class=\"post-info\">\n                                        <abbr class=\"published\" title=\"2012-02-29T00:00:00+00:00\">\n                                                Published: Wed 29 February 2012\n                                        </abbr>\n\n                                        <p>In <a href=\"/category/misc.html\">misc</a>.</p>\n                                        <p>tags: <a href=\"/tag/foo.html\">foo</a> <a href=\"/tag/bar.html\">bar</a> <a href=\"/tag/baz.html\">baz</a> </p>Translations:\n                                        <a href=\"/second-article-fr.html\" hreflang=\"fr\">fr</a>\n\n                                </footer><!-- /.post-info --><p>This is some article, in english</p>\n                        </article>\n                </aside><!-- /#featured -->\n                <section id=\"content\" class=\"body\">\n                        <h1>Other articles</h1>\n                        <hr />\n                        <ol id=\"posts-list\" class=\"hfeed\">\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"/this-is-a-super-article.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to This is a super article !\">This is a super article !</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2010-12-02T10:14:00+00:00\">\n                                                                Published: Thu 02 December 2010\n                                                        </abbr>\n                                                        <br />\n                                                        <abbr class=\"modified\" title=\"2013-11-17T23:29:00+00:00\">\n                                                                Updated: Sun 17 November 2013\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"/author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"/category/yeah.html\">yeah</a>.</p>\n                                                        <p>tags: <a href=\"/tag/foo.html\">foo</a> <a href=\"/tag/bar.html\">bar</a> <a href=\"/tag/foobar.html\">foobar</a> </p>\n                                                </footer><!-- /.post-info -->                <p class=\"first last\">Multi-line metadata should be supported\n                                                        as well as <strong>inline markup</strong>.</p>\n\n                                                <a class=\"readmore\" href=\"/this-is-a-super-article.html\">read more</a>\n                                        </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"/oh-yeah.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to Oh yeah !\">Oh yeah !</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2010-10-20T10:14:00+00:00\">\n                                                                Published: Wed 20 October 2010\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"/author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"/category/bar.html\">bar</a>.</p>\n                                                        <p>tags: <a href=\"/tag/oh.html\">oh</a> <a href=\"/tag/bar.html\">bar</a> <a href=\"/tag/yeah.html\">yeah</a> </p>Translations:\n                                                        <a href=\"/oh-yeah-fr.html\" hreflang=\"fr\">fr</a>\n\n                                                </footer><!-- /.post-info -->                <div class=\"section\" id=\"why-not\">\n                                                        <h2>Why not ?</h2>\n                                                        <p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\n                                                                YEAH !</p>\n                                                        <img alt=\"alternate text\" src=\"/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" />\n                                                </div>\n\n                                                <a class=\"readmore\" href=\"/oh-yeah.html\">read more</a>\n                                        </div><!-- /.entry-content -->\n                                </article></li>\n                        </ol><!-- /#posts-list -->\n                </section><!-- /#content -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/basic/tag/baz.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>The baz tag</title>\n                <link rel=\"stylesheet\" href=\"/theme/css/main.css\" />\n                <link href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"A Pelican Blog Atom Feed\" />\n                <meta name=\"description\" content=\"This article overrides the listening of the articles under the baz tag.\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"/\">A Pelican Blog</a></h1>\n                        <nav><ul>\n                                <li><a href=\"/tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"/override/\">Override url/save_as</a></li>\n                                <li><a href=\"/pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"/category/bar.html\">bar</a></li>\n                                <li><a href=\"/category/cat1.html\">cat1</a></li>\n                                <li class=\"active\"><a href=\"/category/misc.html\">misc</a></li>\n                                <li><a href=\"/category/yeah.html\">yeah</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"/tag/baz.html\" rel=\"bookmark\"\n                                                   title=\"Permalink to The baz tag\">The baz tag</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2010-03-14T00:00:00+00:00\">\n                                                        Published: Sun 14 March 2010\n                                                </abbr>\n\n                                                <p>In <a href=\"/category/misc.html\">misc</a>.</p>\n\n                                        </footer><!-- /.post-info -->      <p>This article overrides the listening of the articles under the <em>baz</em> tag.</p>\n\n                                </div><!-- /.entry-content -->\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/basic/tag/foo.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>A Pelican Blog - foo</title>\n                <link rel=\"stylesheet\" href=\"/theme/css/main.css\" />\n                <link href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"A Pelican Blog Atom Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"/\">A Pelican Blog</a></h1>\n                        <nav><ul>\n                                <li><a href=\"/tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"/override/\">Override url/save_as</a></li>\n                                <li><a href=\"/pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"/category/bar.html\">bar</a></li>\n                                <li><a href=\"/category/cat1.html\">cat1</a></li>\n                                <li><a href=\"/category/misc.html\">misc</a></li>\n                                <li><a href=\"/category/yeah.html\">yeah</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <aside id=\"featured\" class=\"body\">\n                        <article>\n                                <h1 class=\"entry-title\"><a href=\"/second-article.html\">Second article</a></h1>\n                                <footer class=\"post-info\">\n                                        <abbr class=\"published\" title=\"2012-02-29T00:00:00+00:00\">\n                                                Published: Wed 29 February 2012\n                                        </abbr>\n\n                                        <p>In <a href=\"/category/misc.html\">misc</a>.</p>\n                                        <p>tags: <a href=\"/tag/foo.html\">foo</a> <a href=\"/tag/bar.html\">bar</a> <a href=\"/tag/baz.html\">baz</a> </p>Translations:\n                                        <a href=\"/second-article-fr.html\" hreflang=\"fr\">fr</a>\n\n                                </footer><!-- /.post-info --><p>This is some article, in english</p>\n                        </article>\n                </aside><!-- /#featured -->\n                <section id=\"content\" class=\"body\">\n                        <h1>Other articles</h1>\n                        <hr />\n                        <ol id=\"posts-list\" class=\"hfeed\">\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"/this-is-a-super-article.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to This is a super article !\">This is a super article !</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2010-12-02T10:14:00+00:00\">\n                                                                Published: Thu 02 December 2010\n                                                        </abbr>\n                                                        <br />\n                                                        <abbr class=\"modified\" title=\"2013-11-17T23:29:00+00:00\">\n                                                                Updated: Sun 17 November 2013\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"/author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"/category/yeah.html\">yeah</a>.</p>\n                                                        <p>tags: <a href=\"/tag/foo.html\">foo</a> <a href=\"/tag/bar.html\">bar</a> <a href=\"/tag/foobar.html\">foobar</a> </p>\n                                                </footer><!-- /.post-info -->                <p class=\"first last\">Multi-line metadata should be supported\n                                                        as well as <strong>inline markup</strong>.</p>\n\n                                                <a class=\"readmore\" href=\"/this-is-a-super-article.html\">read more</a>\n                                        </div><!-- /.entry-content -->\n                                </article></li>\n                        </ol><!-- /#posts-list -->\n                </section><!-- /#content -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/basic/tag/foobar.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>A Pelican Blog - foobar</title>\n                <link rel=\"stylesheet\" href=\"/theme/css/main.css\" />\n                <link href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"A Pelican Blog Atom Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"/\">A Pelican Blog</a></h1>\n                        <nav><ul>\n                                <li><a href=\"/tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"/override/\">Override url/save_as</a></li>\n                                <li><a href=\"/pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"/category/bar.html\">bar</a></li>\n                                <li><a href=\"/category/cat1.html\">cat1</a></li>\n                                <li><a href=\"/category/misc.html\">misc</a></li>\n                                <li><a href=\"/category/yeah.html\">yeah</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <aside id=\"featured\" class=\"body\">\n                        <article>\n                                <h1 class=\"entry-title\"><a href=\"/this-is-a-super-article.html\">This is a super article !</a></h1>\n                                <footer class=\"post-info\">\n                                        <abbr class=\"published\" title=\"2010-12-02T10:14:00+00:00\">\n                                                Published: Thu 02 December 2010\n                                        </abbr>\n                                        <br />\n                                        <abbr class=\"modified\" title=\"2013-11-17T23:29:00+00:00\">\n                                                Updated: Sun 17 November 2013\n                                        </abbr>\n\n                                        <address class=\"vcard author\">\n                                                By                         <a class=\"url fn\" href=\"/author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                        </address>\n                                        <p>In <a href=\"/category/yeah.html\">yeah</a>.</p>\n                                        <p>tags: <a href=\"/tag/foo.html\">foo</a> <a href=\"/tag/bar.html\">bar</a> <a href=\"/tag/foobar.html\">foobar</a> </p>\n                                </footer><!-- /.post-info --><p>Some content here !</p>\n                                <div class=\"section\" id=\"this-is-a-simple-title\">\n                                        <h2>This is a simple title</h2>\n                                        <p>And here comes the cool <a class=\"reference external\" href=\"http://books.couchdb.org/relax/design-documents/views\">stuff</a>.</p>\n                                        <img alt=\"alternate text\" src=\"/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" />\n                                        <img alt=\"alternate text\" src=\"/pictures/Sushi_Macro.jpg\" style=\"width: 600px; height: 450px;\" />\n<pre class=\"literal-block\">\n&gt;&gt;&gt; from ipdb import set_trace\n&gt;&gt;&gt; set_trace()\n</pre>\n                                        <p>→ And now try with some utf8 hell: ééé</p>\n                                </div>\n                        </article>\n                </aside><!-- /#featured -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/basic/tag/oh.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Oh Oh Oh</title>\n                <link rel=\"stylesheet\" href=\"/theme/css/main.css\" />\n                <link href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"A Pelican Blog Atom Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"/\">A Pelican Blog</a></h1>\n                        <nav><ul>\n                                <li class=\"active\"><a href=\"/tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"/override/\">Override url/save_as</a></li>\n                                <li><a href=\"/pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"/category/bar.html\">bar</a></li>\n                                <li><a href=\"/category/cat1.html\">cat1</a></li>\n                                <li><a href=\"/category/misc.html\">misc</a></li>\n                                <li><a href=\"/category/yeah.html\">yeah</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <h1 class=\"entry-title\">Oh Oh Oh</h1>\n\n                        <p>This page overrides the listening of the articles under the <em>oh</em> tag.</p>\n\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/basic/tag/yeah.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>A Pelican Blog - yeah</title>\n                <link rel=\"stylesheet\" href=\"/theme/css/main.css\" />\n                <link href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"A Pelican Blog Atom Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"/\">A Pelican Blog</a></h1>\n                        <nav><ul>\n                                <li><a href=\"/tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"/override/\">Override url/save_as</a></li>\n                                <li><a href=\"/pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"/category/bar.html\">bar</a></li>\n                                <li><a href=\"/category/cat1.html\">cat1</a></li>\n                                <li><a href=\"/category/misc.html\">misc</a></li>\n                                <li><a href=\"/category/yeah.html\">yeah</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <aside id=\"featured\" class=\"body\">\n                        <article>\n                                <h1 class=\"entry-title\"><a href=\"/oh-yeah.html\">Oh yeah !</a></h1>\n                                <footer class=\"post-info\">\n                                        <abbr class=\"published\" title=\"2010-10-20T10:14:00+00:00\">\n                                                Published: Wed 20 October 2010\n                                        </abbr>\n\n                                        <address class=\"vcard author\">\n                                                By                         <a class=\"url fn\" href=\"/author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                        </address>\n                                        <p>In <a href=\"/category/bar.html\">bar</a>.</p>\n                                        <p>tags: <a href=\"/tag/oh.html\">oh</a> <a href=\"/tag/bar.html\">bar</a> <a href=\"/tag/yeah.html\">yeah</a> </p>Translations:\n                                        <a href=\"/oh-yeah-fr.html\" hreflang=\"fr\">fr</a>\n\n                                </footer><!-- /.post-info --><div class=\"section\" id=\"why-not\">\n                                        <h2>Why not ?</h2>\n                                        <p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\n                                                YEAH !</p>\n                                        <img alt=\"alternate text\" src=\"/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" />\n                                </div>\n                        </article>\n                </aside><!-- /#featured -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/basic/tags.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>A Pelican Blog - Tags</title>\n                <link rel=\"stylesheet\" href=\"/theme/css/main.css\" />\n                <link href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"A Pelican Blog Atom Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"/\">A Pelican Blog</a></h1>\n                        <nav><ul>\n                                <li><a href=\"/tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"/override/\">Override url/save_as</a></li>\n                                <li><a href=\"/pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"/category/bar.html\">bar</a></li>\n                                <li><a href=\"/category/cat1.html\">cat1</a></li>\n                                <li><a href=\"/category/misc.html\">misc</a></li>\n                                <li><a href=\"/category/yeah.html\">yeah</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <section id=\"content\" class=\"body\">\n                        <h1>Tags for A Pelican Blog</h1>\n                        <ul>\n                                <li><a href=\"/tag/bar.html\">bar</a> (3)</li>\n                                <li><a href=\"/tag/baz.html\">baz</a> (1)</li>\n                                <li><a href=\"/tag/foo.html\">foo</a> (2)</li>\n                                <li><a href=\"/tag/foobar.html\">foobar</a> (1)</li>\n                                <li><a href=\"/tag/oh.html\">oh</a> (1)</li>\n                                <li><a href=\"/tag/yeah.html\">yeah</a> (1)</li>\n                        </ul>\n                </section>\n\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/basic/theme/css/fonts.css",
    "content": "@font-face {\n    font-family: 'Yanone Kaffeesatz';\n    font-style: normal;\n    font-weight: 400;\n    src:\n    local('Yanone Kaffeesatz Regular'),\n    local('YanoneKaffeesatz-Regular'),\n\t\t/* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLRTHiN2BPBirwIkMLKUspj4.woff */\n    url('../fonts/Yanone_Kaffeesatz_400.woff') format('woff'),\n\t\t/* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLfGwxTS8d1Q9KiDNCMKLFUM.woff2 */\n    url('../fonts/Yanone_Kaffeesatz_400.woff2') format('woff2');\n}\n"
  },
  {
    "path": "pelican/tests/output/basic/theme/css/main.css",
    "content": "/*\n\tName: Smashing HTML5\n\tDate: July 2009\n\tDescription: Sample layout for HTML5 and CSS3 goodness.\n\tVersion: 1.0\n\tLicense: MIT <https://opensource.org/licenses/MIT>\n\tLicensed by: Smashing Media GmbH <https://www.smashingmagazine.com/>\n\tOriginal author: Enrique Ramírez <http://enrique-ramirez.com/>\n*/\n\n/* Imports */\n@import url(\"reset.css\");\n@import url(\"pygment.css\");\n@import url(\"typogrify.css\");\n@import url(\"fonts.css\");\n\n/***** Global *****/\n/* Body */\nbody {\n    background: #F5F4EF;\n    color: #000305;\n    font-size: 87.5%; /* Base font size: 14px */\n    font-family: 'Trebuchet MS', Trebuchet, 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif;\n    line-height: 1.429;\n    margin: 0;\n    padding: 0;\n    text-align: left;\n}\n\n@media (prefers-color-scheme: dark) {\n    body {\n        background: #070808;\n        color: #FFFEFE;\n    }\n}\n\n/* Headings */\nh1 {font-size: 2em }\nh2 {font-size: 1.571em}\t/* 22px */\nh3 {font-size: 1.429em}\t/* 20px */\nh4 {font-size: 1.286em}\t/* 18px */\nh5 {font-size: 1.143em}\t/* 16px */\nh6 {font-size: 1em}\t\t/* 14px */\n\nh1, h2, h3, h4, h5, h6 {\n    font-weight: 400;\n    line-height: 1.1;\n    margin-bottom: .8em;\n    font-family: 'Yanone Kaffeesatz', arial, serif;\n}\n\nh3, h4, h5, h6 { margin-top: .8em; }\n\nhr { border: 2px solid #EEEEEE; }\n\n/* Anchors */\na {outline: 0;}\na img {border: 0px; text-decoration: none;}\na:link, a:visited {\n    color: #C74350;\n    padding: 0 1px;\n    text-decoration: underline;\n}\na:hover, a:active {\n    background-color: #C74350;\n    color: #fff;\n    text-decoration: none;\n    text-shadow: 1px 1px 1px #333;\n}\n\nh1 a:hover {\n    background-color: inherit\n}\n\n/* Paragraphs */\ndiv.line-block,\np { margin-top: 1em;\n    margin-bottom: 1em;}\n\nstrong, b {font-weight: bold;}\nem, i {font-style: italic;}\n\n/* Lists */\nul {\n    list-style: outside disc;\n    margin: 0em 0 0 1.5em;\n}\n\nol {\n    list-style: outside decimal;\n    margin: 0em 0 0 1.5em;\n}\n\nli { margin-top: 0.5em;\n    margin-bottom: 1em; }\n\n.post-info {\n    float:right;\n    margin:10px;\n    padding:5px;\n}\n\n.post-info p{\n    margin-top: 1px;\n    margin-bottom: 1px;\n}\n\n.readmore { float: right }\n\ndl {margin: 0 0 1.5em 0;}\ndt {font-weight: bold;}\ndd {margin-left: 1.5em;}\n\npre{background-color:  rgb(238, 238, 238); padding: 10px; margin: 10px; overflow: auto;}\n\n@media (prefers-color-scheme: dark) {\n    pre {\n        background: rgb(38, 38, 38);\n    }\n}\n\n/* Quotes */\nblockquote {\n    margin: 20px;\n    font-style: italic;\n}\ncite {}\n\nq {}\n\ndiv.note {\n    float: right;\n    margin: 5px;\n    font-size: 85%;\n    max-width: 300px;\n}\n\n/* Tables */\ntable {margin: .5em auto 1.5em auto; width: 98%;}\n\n\t/* Thead */\nthead th {padding: .5em .4em; text-align: left;}\nthead td {}\n\n\t/* Tbody */\ntbody td {padding: .5em .4em;}\ntbody th {}\n\ntbody .alt td {}\ntbody .alt th {}\n\n\t/* Tfoot */\ntfoot th {}\ntfoot td {}\n\n/* HTML5 tags */\nheader, section, footer,\naside, nav, article, figure {\n    display: block;\n}\n\n/***** Layout *****/\n.body {clear: both; margin: 0 auto; max-width: 800px;}\nimg { max-width: 100%; }\nimg.right, figure.right, div.figure.align-right {\n    float: right;\n    margin: 0 0 2em 2em;\n}\nimg.left, figure.left, div.figure.align-left {\n    float: left;\n    margin: 0 2em 2em 0;\n}\n\n/* .rst support */\ndiv.figure img, figure img {  /* to fill figure exactly */\n    max-width: 100%;\n}\ndiv.figure p.caption, figure p.caption { /* margin provided by figure */\n    margin-top: 0;\n    margin-bottom: 0;\n}\n\n/*\n\tHeader\n*****************/\n#banner {\n    margin: 0 auto;\n    padding: 0.8em 0 0 0;\n}\n\n\t/* Banner */\n#banner h1 {\n    font-size: 3.571em;\n    line-height: 1.0;\n    margin-bottom: .3em;\n}\n\n#banner h1 a:link, #banner h1 a:visited {\n    color: #000305;\n    display: block;\n    font-weight: bold;\n    margin: 0 0 0 .2em;\n    text-decoration: none;\n}\n#banner h1 a:hover, #banner h1 a:active {\n    background: none;\n    color: #C74350;\n    text-shadow: none;\n}\n\n#banner h1 strong {font-size: 0.36em; font-weight: normal;}\n\n@media (prefers-color-scheme: dark) {\n    #banner h1 a:link, #banner h1 a:visited {\n        color: #FFFAF8;\n    }\n}\n\n\t/* Main Nav */\n#banner nav {\n    background: #000305;\n    font-size: 1.143em;\n    overflow: auto;\n    line-height: 30px;\n    margin: 0 auto 2em auto;\n    padding: 0;\n    text-align: center;\n    max-width: 800px;\n\n    border-radius: 5px;\n    -moz-border-radius: 5px;\n    -webkit-border-radius: 5px;\n}\n\n@media (prefers-color-scheme: dark) {\n    #banner nav {\n        background: #121518;\n    }\n}\n\n#banner nav ul {list-style: none; margin: 0 auto; max-width: 800px;}\n#banner nav li {float: left; display: inline; margin: 0;}\n\n#banner nav a:link, #banner nav a:visited {\n    color: #fff;\n    display: inline-block;\n    height: 30px;\n    padding: 5px 1.5em;\n    text-decoration: none;\n}\n#banner nav a:hover, #banner nav a:active,\n#banner nav .active a:link, #banner nav .active a:visited {\n    background: #C74451;\n    color: #fff;\n    text-shadow: none !important;\n}\n\n#banner nav li:first-child a {\n    border-top-left-radius: 5px;\n    -moz-border-radius-topleft: 5px;\n    -webkit-border-top-left-radius: 5px;\n\n    border-bottom-left-radius: 5px;\n    -moz-border-radius-bottomleft: 5px;\n    -webkit-border-bottom-left-radius: 5px;\n}\n\n/*\n\tFeatured\n*****************/\n#featured {\n    background: #fff;\n    margin-bottom: 2em;\n    overflow: hidden;\n    padding: 20px;\n    max-width: 760px;\n\n    border-radius: 10px;\n    -moz-border-radius: 10px;\n    -webkit-border-radius: 10px;\n}\n\n@media (prefers-color-scheme: dark) {\n    #featured {\n        background: #151617;\n    }\n}\n\n#featured figure {\n    border: 2px solid #eee;\n    float: right;\n    margin: 0.786em 2em 0 5em;\n    max-width: 248px;\n}\n#featured figure img {display: block; float: right;}\n\n#featured h2 {color: #C74451; font-size: 1.714em; margin-bottom: 0.333em;}\n#featured h3 {font-size: 1.429em; margin-bottom: .5em;}\n\n#featured h3 a:link, #featured h3 a:visited {color: #000305; text-decoration: none;}\n#featured h3 a:hover, #featured h3 a:active {color: #fff;}\n\n/*\n\tBody\n*****************/\n#content {\n    background: #fff;\n    margin-bottom: 2em;\n    overflow: hidden;\n    padding: 20px 20px;\n    max-width: 760px;\n\n    border-radius: 10px;\n    -moz-border-radius: 10px;\n    -webkit-border-radius: 10px;\n}\n\n@media (prefers-color-scheme: dark) {\n    #content {\n        background: #111;\n    }\n}\n\n/*\n\tExtras\n*****************/\n#extras {margin: 0 auto 3em auto; overflow: hidden;}\n\n#extras ul {list-style: none; margin: 0;}\n#extras li {border-bottom: 1px solid #fff;}\n#extras h2 {\n    color: #C74350;\n    font-size: 1.429em;\n    margin-bottom: .25em;\n    padding: 0 3px;\n}\n\n#extras a:link, #extras a:visited {\n    color: #444;\n    display: block;\n    border-bottom: 1px solid #F4E3E3;\n    text-decoration: none;\n    padding: .3em .25em;\n}\n\n@media (prefers-color-scheme: dark) {\n    #extras a:link, #extras a:visited {\n        color: #888;\n    }\n}\n\n#extras a:hover, #extras a:active {color: #fff;}\n\n\t/* Blogroll */\n#extras .blogroll {\n    float: left;\n    max-width: 615px;\n}\n\n#extras .blogroll li {float: left; margin: 0 20px 0 0; max-width: 185px;}\n\n\t/* Social */\n#extras .social {\n    float: right;\n    max-width: 175px;\n}\n\n/*\n\tAbout\n*****************/\n#about {\n    background: #fff;\n    font-style: normal;\n    margin-bottom: 2em;\n    overflow: hidden;\n    padding: 20px;\n    text-align: left;\n    max-width: 760px;\n\n    border-radius: 10px;\n    -moz-border-radius: 10px;\n    -webkit-border-radius: 10px;\n}\n\n@media (prefers-color-scheme: dark) {\n    #about {\n        background: #222;\n    }\n}\n\n#about .primary {float: left; max-width: 165px;}\n#about .primary strong {color: #C64350; display: block; font-size: 1.286em;}\n#about .photo {float: left; margin: 5px 20px;}\n\n#about .url:link, #about .url:visited {text-decoration: none;}\n\n#about .bio {float: right; max-width: 500px;}\n\n/*\n\tFooter\n*****************/\n#contentinfo {padding-bottom: 2em; text-align: right;}\n\n/***** Sections *****/\n/* Blog */\n.hentry {\n    display: block;\n    clear: both;\n    border-top: 1px solid #eee;\n    padding: 1.5em 0;\n}\nli:first-child .hentry, #content > .hentry {border: 0; margin: 0;}\n#content > .hentry {padding: 1em 0;}\n.hentry img{display : none ;}\n.entry-title {font-size: 3em; margin-bottom: 10px; margin-top: 0;}\n.entry-title a:link, .entry-title a:visited {text-decoration: none; color: #333;}\n.entry-title a:visited {background-color: #fff;}\n\n@media (prefers-color-scheme: dark) {\n    .entry-title a:link, .entry-title a:visited {\n        color: #C74350;\n    }\n}\n\n.hentry .post-info * {font-style: normal;}\n\n\t/* Content */\n.hentry footer {margin-bottom: 2em;}\n.hentry footer address {display: inline;}\n#posts-list footer address {display: block;}\n\n\t/* Blog Index */\n#posts-list {list-style: none; margin: 0;}\n#posts-list .hentry {padding-left: 10px; position: relative;}\n\n#posts-list footer {\n    left: 10px;\n    position: relative;\n    float: left;\n    top: 0.5em;\n    max-width: 190px;\n}\n\n\t/* About the Author */\n#about-author {\n    background: #f9f9f9;\n    clear: both;\n    font-style: normal;\n    margin: 2em 0;\n    padding: 10px 20px 15px 20px;\n\n    border-radius: 5px;\n    -moz-border-radius: 5px;\n    -webkit-border-radius: 5px;\n}\n\n#about-author strong {\n    color: #C64350;\n    clear: both;\n    display: block;\n    font-size: 1.429em;\n}\n\n#about-author .photo {border: 1px solid #ddd; float: left; margin: 5px 1em 0 0;}\n\n\t/* Comments */\n#comments-list {list-style: none; margin: 0 1em;}\n#comments-list blockquote {\n    background: #f8f8f8;\n    clear: both;\n    font-style: normal;\n    margin: 0;\n    padding: 15px 20px;\n\n    border-radius: 5px;\n    -moz-border-radius: 5px;\n    -webkit-border-radius: 5px;\n}\n#comments-list footer {color: #888; padding: .5em 1em 0 0; text-align: right;}\n\n#comments-list li:nth-child(2n) blockquote {background: #F5f5f5;}\n\n\t/* Add a Comment */\n#add-comment label {clear: left; float: left; text-align: left; max-width: 150px;}\n#add-comment input[type='text'],\n#add-comment input[type='email'],\n#add-comment input[type='url'] {float: left; max-width: 200px;}\n\n#add-comment textarea {float: left; height: 150px; max-width: 495px;}\n\n#add-comment p.req {clear: both; margin: 0 .5em 1em 0; text-align: right;}\n\n#add-comment input[type='submit'] {float: right; margin: 0 .5em;}\n#add-comment * {margin-bottom: .5em;}\n"
  },
  {
    "path": "pelican/tests/output/basic/theme/css/pygment.css",
    "content": ".hll {\n    background-color:#eee;\n}\n.c {\n    color:#408090;\n    font-style:italic;\n}\n.err {\n    border:1px solid #FF0000;\n}\n.k {\n    color:#007020;\n    font-weight:bold;\n}\n.o {\n    color:#666666;\n}\n.cm {\n    color:#408090;\n    font-style:italic;\n}\n.cp {\n    color:#007020;\n}\n.c1 {\n    color:#408090;\n    font-style:italic;\n}\n.cs {\n    background-color:#FFF0F0;\n    color:#408090;\n}\n.gd {\n    color:#A00000;\n}\n.ge {\n    font-style:italic;\n}\n.gr {\n    color:#FF0000;\n}\n.gh {\n    color:#000080;\n    font-weight:bold;\n}\n.gi {\n    color:#00A000;\n}\n.go {\n    color:#303030;\n}\n.gp {\n    color:#C65D09;\n    font-weight:bold;\n}\n.gs {\n    font-weight:bold;\n}\n.gu {\n    color:#800080;\n    font-weight:bold;\n}\n.gt {\n    color:#0040D0;\n}\n.kc {\n    color:#007020;\n    font-weight:bold;\n}\n.kd {\n    color:#007020;\n    font-weight:bold;\n}\n.kn {\n    color:#007020;\n    font-weight:bold;\n}\n.kp {\n    color:#007020;\n}\n.kr {\n    color:#007020;\n    font-weight:bold;\n}\n.kt {\n    color:#902000;\n}\n.m {\n    color:#208050;\n}\n.s {\n    color:#4070A0;\n}\n.na {\n    color:#4070A0;\n}\n.nb {\n    color:#007020;\n}\n.nc {\n    color:#0E84B5;\n    font-weight:bold;\n}\n.no {\n    color:#60ADD5;\n}\n.nd {\n    color:#555555;\n    font-weight:bold;\n}\n.ni {\n    color:#D55537;\n    font-weight:bold;\n}\n.ne {\n    color:#007020;\n}\n.nf {\n    color:#06287E;\n}\n.nl {\n    color:#002070;\n    font-weight:bold;\n}\n.nn {\n    color:#0E84B5;\n    font-weight:bold;\n}\n.nt {\n    color:#062873;\n    font-weight:bold;\n}\n.nv {\n    color:#BB60D5;\n}\n.ow {\n    color:#007020;\n    font-weight:bold;\n}\n.w {\n    color:#BBBBBB;\n}\n.mf {\n    color:#208050;\n}\n.mh {\n    color:#208050;\n}\n.mi {\n    color:#208050;\n}\n.mo {\n    color:#208050;\n}\n.sb {\n    color:#4070A0;\n}\n.sc {\n    color:#4070A0;\n}\n.sd {\n    color:#4070A0;\n    font-style:italic;\n}\n.s2 {\n    color:#4070A0;\n}\n.se {\n    color:#4070A0;\n    font-weight:bold;\n}\n.sh {\n    color:#4070A0;\n}\n.si {\n    color:#70A0D0;\n    font-style:italic;\n}\n.sx {\n    color:#C65D09;\n}\n.sr {\n    color:#235388;\n}\n.s1 {\n    color:#4070A0;\n}\n.ss {\n    color:#517918;\n}\n.bp {\n    color:#007020;\n}\n.vc {\n    color:#BB60D5;\n}\n.vg {\n    color:#BB60D5;\n}\n.vi {\n    color:#BB60D5;\n}\n.il {\n    color:#208050;\n}\n"
  },
  {
    "path": "pelican/tests/output/basic/theme/css/reset.css",
    "content": "/*\n\tName: Reset Stylesheet\n\tDescription: Resets browser's default CSS\n\tAuthor: Eric Meyer\n\tAuthor URI: https://meyerweb.com/eric/tools/css/reset/\n*/\n\n/* v1.0 | 20080212 */\nhtml, body, div, span, applet, object, iframe,\nh1, h2, h3, h4, h5, h6, p, blockquote, pre,\na, abbr, acronym, address, big, cite, code,\ndel, dfn, em, font, img, ins, kbd, q, s, samp,\nsmall, strike, strong, sub, sup, tt, var,\nb, u, i, center,\ndl, dt, dd, ol, ul, li,\nfieldset, form, label, legend,\ntable, caption, tbody, tfoot, thead, tr, th, td {\n    background: transparent;\n    border: 0;\n    font-size: 100%;\n    margin: 0;\n    outline: 0;\n    padding: 0;\n    vertical-align: baseline;\n}\n\nbody {line-height: 1;}\n\nol, ul {list-style: none;}\n\nblockquote, q {quotes: none;}\n\nblockquote:before, blockquote:after,\nq:before, q:after {\n    content: '';\n    content: none;\n}\n\n/* remember to define focus styles! */\n:focus {\n    outline: 0;\n}\n\n/* remember to highlight inserts somehow! */\nins {text-decoration: none;}\ndel {text-decoration: line-through;}\n\n/* tables still need 'cellspacing=\"0\"' in the markup */\ntable {\n    border-collapse: collapse;\n    border-spacing: 0;\n}\n"
  },
  {
    "path": "pelican/tests/output/basic/theme/css/typogrify.css",
    "content": ".caps {font-size:.92em;}\n.amp {color:#666; font-size:1.05em;font-family:\"Warnock Pro\", \"Goudy Old Style\",\"Palatino\",\"Book Antiqua\",serif; font-style:italic;}\n.dquo {margin-left:-.38em;}\n"
  },
  {
    "path": "pelican/tests/output/basic/theme/css/wide.css",
    "content": "@import url(\"main.css\");\n\nbody {\n    font:1.3em/1.3 \"Hoefler Text\",\"Georgia\",Georgia,serif,sans-serif;\n}\n\n.post-info{\n    display: none;\n}\n\n#banner nav {\n    display: none;\n    -moz-border-radius: 0px;\n    margin-bottom: 20px;\n    overflow: hidden;\n    font-size: 1em;\n    background: #F5F4EF;\n}\n\n#banner nav ul{\n    padding-right: 50px;\n}\n\n#banner nav li{\n    float: right;\n    color: #000;\n}\n\n#banner nav li a {\n    color: #000;\n}\n\n#banner h1 {\n    margin-bottom: -18px;\n}\n\n#featured, #extras {\n    padding: 50px;\n}\n\n#featured {\n    padding-top: 20px;\n}\n\n#extras {\n    padding-top: 0px;\n    padding-bottom: 0px;\n}\n"
  },
  {
    "path": "pelican/tests/output/basic/theme/fonts/Yanone_Kaffeesatz_LICENSE.txt",
    "content": "Copyright 2010 The Yanone Kaffeesatz Project Authors (https://github.com/alexeiva/yanone-kaffeesatz)\n\nThis Font Software is licensed under the SIL Open Font License, Version 1.1.\nThis license is copied below, and is also available with a FAQ at:\nhttp://scripts.sil.org/OFL\n\n\n-----------------------------------------------------------\nSIL OPEN FONT LICENSE Version 1.1 - 26 February 2007\n-----------------------------------------------------------\n\nPREAMBLE\nThe goals of the Open Font License (OFL) are to stimulate worldwide\ndevelopment of collaborative font projects, to support the font creation\nefforts of academic and linguistic communities, and to provide a free and\nopen framework in which fonts may be shared and improved in partnership\nwith others.\n\nThe OFL allows the licensed fonts to be used, studied, modified and\nredistributed freely as long as they are not sold by themselves. The\nfonts, including any derivative works, can be bundled, embedded,\nredistributed and/or sold with any software provided that any reserved\nnames are not used by derivative works. The fonts and derivatives,\nhowever, cannot be released under any other type of license. The\nrequirement for fonts to remain under this license does not apply\nto any document created using the fonts or their derivatives.\n\nDEFINITIONS\n\"Font Software\" refers to the set of files released by the Copyright\nHolder(s) under this license and clearly marked as such. This may\ninclude source files, build scripts and documentation.\n\n\"Reserved Font Name\" refers to any names specified as such after the\ncopyright statement(s).\n\n\"Original Version\" refers to the collection of Font Software components as\ndistributed by the Copyright Holder(s).\n\n\"Modified Version\" refers to any derivative made by adding to, deleting,\nor substituting -- in part or in whole -- any of the components of the\nOriginal Version, by changing formats or by porting the Font Software to a\nnew environment.\n\n\"Author\" refers to any designer, engineer, programmer, technical\nwriter or other person who contributed to the Font Software.\n\nPERMISSION & CONDITIONS\nPermission is hereby granted, free of charge, to any person obtaining\na copy of the Font Software, to use, study, copy, merge, embed, modify,\nredistribute, and sell modified and unmodified copies of the Font\nSoftware, subject to the following conditions:\n\n1) Neither the Font Software nor any of its individual components,\nin Original or Modified Versions, may be sold by itself.\n\n2) Original or Modified Versions of the Font Software may be bundled,\nredistributed and/or sold with any software, provided that each copy\ncontains the above copyright notice and this license. These can be\nincluded either as stand-alone text files, human-readable headers or\nin the appropriate machine-readable metadata fields within text or\nbinary files as long as those fields can be easily viewed by the user.\n\n3) No Modified Version of the Font Software may use the Reserved Font\nName(s) unless explicit written permission is granted by the corresponding\nCopyright Holder. This restriction only applies to the primary font name as\npresented to the users.\n\n4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font\nSoftware shall not be used to promote, endorse or advertise any\nModified Version, except to acknowledge the contribution(s) of the\nCopyright Holder(s) and the Author(s) or with their explicit written\npermission.\n\n5) The Font Software, modified or unmodified, in part or in whole,\nmust be distributed entirely under this license, and must not be\ndistributed under any other license. The requirement for fonts to\nremain under this license does not apply to any document created\nusing the Font Software.\n\nTERMINATION\nThis license becomes null and void if any of the above conditions are\nnot met.\n\nDISCLAIMER\nTHE FONT SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT\nOF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE\nCOPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nINCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL\nDAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM\nOTHER DEALINGS IN THE FONT SOFTWARE.\n"
  },
  {
    "path": "pelican/tests/output/basic/theme/fonts/font.css",
    "content": "@font-face {\n    font-family: 'Yanone Kaffeesatz';\n    font-style: normal;\n    font-weight: 400;\n    src:\n    local('Yanone Kaffeesatz Regular'),\n    local('YanoneKaffeesatz-Regular'),\n\t\t/* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLRTHiN2BPBirwIkMLKUspj4.woff */\n    url('Yanone_Kaffeesatz_400.woff') format('woff'),\n\t\t/* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLfGwxTS8d1Q9KiDNCMKLFUM.woff2 */\n    url('Yanone_Kaffeesatz_400.woff2') format('woff2');\n}\n"
  },
  {
    "path": "pelican/tests/output/basic/this-is-a-super-article.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>This is a super article !</title>\n                <link rel=\"stylesheet\" href=\"/theme/css/main.css\" />\n                <link href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"A Pelican Blog Atom Feed\" />\n                <meta name=\"description\" content=\"Multi-line metadata should be supported as well as inline markup.\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"/\">A Pelican Blog</a></h1>\n                        <nav><ul>\n                                <li><a href=\"/tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"/override/\">Override url/save_as</a></li>\n                                <li><a href=\"/pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"/category/bar.html\">bar</a></li>\n                                <li><a href=\"/category/cat1.html\">cat1</a></li>\n                                <li><a href=\"/category/misc.html\">misc</a></li>\n                                <li class=\"active\"><a href=\"/category/yeah.html\">yeah</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"/this-is-a-super-article.html\" rel=\"bookmark\"\n                                                   title=\"Permalink to This is a super article !\">This is a super article !</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2010-12-02T10:14:00+00:00\">\n                                                        Published: Thu 02 December 2010\n                                                </abbr>\n                                                <br />\n                                                <abbr class=\"modified\" title=\"2013-11-17T23:29:00+00:00\">\n                                                        Updated: Sun 17 November 2013\n                                                </abbr>\n\n                                                <address class=\"vcard author\">\n                                                        By                         <a class=\"url fn\" href=\"/author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                </address>\n                                                <p>In <a href=\"/category/yeah.html\">yeah</a>.</p>\n                                                <p>tags: <a href=\"/tag/foo.html\">foo</a> <a href=\"/tag/bar.html\">bar</a> <a href=\"/tag/foobar.html\">foobar</a> </p>\n                                        </footer><!-- /.post-info -->      <p>Some content here !</p>\n                                        <div class=\"section\" id=\"this-is-a-simple-title\">\n                                                <h2>This is a simple title</h2>\n                                                <p>And here comes the cool <a class=\"reference external\" href=\"http://books.couchdb.org/relax/design-documents/views\">stuff</a>.</p>\n                                                <img alt=\"alternate text\" src=\"/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" />\n                                                <img alt=\"alternate text\" src=\"/pictures/Sushi_Macro.jpg\" style=\"width: 600px; height: 450px;\" />\n<pre class=\"literal-block\">\n&gt;&gt;&gt; from ipdb import set_trace\n&gt;&gt;&gt; set_trace()\n</pre>\n                                                <p>→ And now try with some utf8 hell: ééé</p>\n                                        </div>\n\n                                </div><!-- /.entry-content -->\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/basic/unbelievable.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Unbelievable !</title>\n                <link rel=\"stylesheet\" href=\"/theme/css/main.css\" />\n                <link href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"A Pelican Blog Atom Feed\" />\n                <meta name=\"description\" content=\"Or completely awesome. Depends the needs. a root-relative link to markdown-article a file-relative link to markdown-article Testing sourcecode...\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"/\">A Pelican Blog</a></h1>\n                        <nav><ul>\n                                <li><a href=\"/tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"/override/\">Override url/save_as</a></li>\n                                <li><a href=\"/pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"/category/bar.html\">bar</a></li>\n                                <li><a href=\"/category/cat1.html\">cat1</a></li>\n                                <li class=\"active\"><a href=\"/category/misc.html\">misc</a></li>\n                                <li><a href=\"/category/yeah.html\">yeah</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"/unbelievable.html\" rel=\"bookmark\"\n                                                   title=\"Permalink to Unbelievable !\">Unbelievable !</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2010-10-15T20:30:00+00:00\">\n                                                        Published: Fri 15 October 2010\n                                                </abbr>\n\n                                                <p>In <a href=\"/category/misc.html\">misc</a>.</p>\n\n                                        </footer><!-- /.post-info -->      <p>Or completely awesome. Depends the needs.</p>\n                                        <p><a class=\"reference external\" href=\"/a-markdown-powered-article.html\">a root-relative link to markdown-article</a>\n                                                <a class=\"reference external\" href=\"/a-markdown-powered-article.html\">a file-relative link to markdown-article</a></p>\n                                        <div class=\"section\" id=\"testing-sourcecode-directive\">\n                                                <h2>Testing sourcecode directive</h2>\n                                                <div class=\"highlight\"><table class=\"highlighttable\"><tr><td class=\"linenos\"><div class=\"linenodiv\"><pre><span class=\"normal\">1</span></pre></div></td><td class=\"code\"><div><pre><span></span><span class=\"n\">formatter</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span> <span class=\"ow\">and</span> <span class=\"n\">VARIANTS</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]]</span>\n</pre></div></td></tr></table></div>\n                                        </div>\n                                        <div class=\"section\" id=\"testing-another-case\">\n                                                <h2>Testing another case</h2>\n                                                <p>This will now have a line number in 'custom' since it's the default in\n                                                        pelican.conf, it will have nothing in default.</p>\n                                                <div class=\"highlight\"><pre><span></span><span class=\"n\">formatter</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span> <span class=\"ow\">and</span> <span class=\"n\">VARIANTS</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]]</span>\n</pre></div>\n                                                <p>Lovely.</p>\n                                        </div>\n                                        <div class=\"section\" id=\"testing-more-sourcecode-directives\">\n                                                <h2>Testing more sourcecode directives</h2>\n                                                <div class=\"highlight\"><pre><span></span><span id=\"foo-8\"><a id=\"foo-8\" name=\"foo-8\"></a><a href=\"#foo-8\"><span class=\"linenos special\"> 8</span></a><span class=\"testingk\">def</span><span class=\"testingw\"> </span><span class=\"testingnf\">run</span><span class=\"testingp\">(</span><span class=\"testingbp\">self</span><span class=\"testingp\">):</span><br></span><span id=\"foo-9\"><a id=\"foo-9\" name=\"foo-9\"></a><a href=\"#foo-9\"><span class=\"linenos\">  </span></a>    <span class=\"testingbp\">self</span><span class=\"testingo\">.</span><span class=\"testingn\">assert_has_content</span><span class=\"testingp\">()</span><br></span><span id=\"foo-10\"><a id=\"foo-10\" name=\"foo-10\"></a><a href=\"#foo-10\"><span class=\"linenos special\">10</span></a>    <span class=\"testingk\">try</span><span class=\"testingp\">:</span><br></span><span id=\"foo-11\"><a id=\"foo-11\" name=\"foo-11\"></a><a href=\"#foo-11\"><span class=\"linenos\">  </span></a>        <span class=\"testingn\">lexer</span> <span class=\"testingo\">=</span> <span class=\"testingn\">get_lexer_by_name</span><span class=\"testingp\">(</span><span class=\"testingbp\">self</span><span class=\"testingo\">.</span><span class=\"testingn\">arguments</span><span class=\"testingp\">[</span><span class=\"testingmi\">0</span><span class=\"testingp\">])</span><br></span><span id=\"foo-12\"><a id=\"foo-12\" name=\"foo-12\"></a><a href=\"#foo-12\"><span class=\"linenos special\">12</span></a>    <span class=\"testingk\">except</span> <span class=\"testingne\">ValueError</span><span class=\"testingp\">:</span><br></span><span id=\"foo-13\"><a id=\"foo-13\" name=\"foo-13\"></a><a href=\"#foo-13\"><span class=\"linenos\">  </span></a>        <span class=\"testingc1\"># no lexer found - use the text one instead of an exception</span><br></span><span id=\"foo-14\"><a id=\"foo-14\" name=\"foo-14\"></a><a href=\"#foo-14\"><span class=\"linenos special\">14</span></a>        <span class=\"testingn\">lexer</span> <span class=\"testingo\">=</span> <span class=\"testingn\">TextLexer</span><span class=\"testingp\">()</span><br></span><span id=\"foo-15\"><a id=\"foo-15\" name=\"foo-15\"></a><a href=\"#foo-15\"><span class=\"linenos\">  </span></a><br></span><span id=\"foo-16\"><a id=\"foo-16\" name=\"foo-16\"></a><a href=\"#foo-16\"><span class=\"linenos special\">16</span></a>    <span class=\"testingk\">if</span> <span class=\"testingp\">(</span><span class=\"testings1\">&#39;linenos&#39;</span> <span class=\"testingow\">in</span> <span class=\"testingbp\">self</span><span class=\"testingo\">.</span><span class=\"testingn\">options</span> <span class=\"testingow\">and</span><br></span><span id=\"foo-17\"><a id=\"foo-17\" name=\"foo-17\"></a><a href=\"#foo-17\"><span class=\"linenos\">  </span></a>            <span class=\"testingbp\">self</span><span class=\"testingo\">.</span><span class=\"testingn\">options</span><span class=\"testingp\">[</span><span class=\"testings1\">&#39;linenos&#39;</span><span class=\"testingp\">]</span> <span class=\"testingow\">not</span> <span class=\"testingow\">in</span> <span class=\"testingp\">(</span><span class=\"testings1\">&#39;table&#39;</span><span class=\"testingp\">,</span> <span class=\"testings1\">&#39;inline&#39;</span><span class=\"testingp\">)):</span><br></span><span id=\"foo-18\"><a id=\"foo-18\" name=\"foo-18\"></a><a href=\"#foo-18\"><span class=\"linenos special\">18</span></a>        <span class=\"testingbp\">self</span><span class=\"testingo\">.</span><span class=\"testingn\">options</span><span class=\"testingp\">[</span><span class=\"testings1\">&#39;linenos&#39;</span><span class=\"testingp\">]</span> <span class=\"testingo\">=</span> <span class=\"testings1\">&#39;table&#39;</span><br></span><span id=\"foo-19\"><a id=\"foo-19\" name=\"foo-19\"></a><a href=\"#foo-19\"><span class=\"linenos\">  </span></a><br></span><span id=\"foo-20\"><a id=\"foo-20\" name=\"foo-20\"></a><a href=\"#foo-20\"><span class=\"linenos special\">20</span></a>    <span class=\"testingk\">for</span> <span class=\"testingn\">flag</span> <span class=\"testingow\">in</span> <span class=\"testingp\">(</span><span class=\"testings1\">&#39;nowrap&#39;</span><span class=\"testingp\">,</span> <span class=\"testings1\">&#39;nobackground&#39;</span><span class=\"testingp\">,</span> <span class=\"testings1\">&#39;anchorlinenos&#39;</span><span class=\"testingp\">):</span><br></span><span id=\"foo-21\"><a id=\"foo-21\" name=\"foo-21\"></a><a href=\"#foo-21\"><span class=\"linenos\">  </span></a>        <span class=\"testingk\">if</span> <span class=\"testingn\">flag</span> <span class=\"testingow\">in</span> <span class=\"testingbp\">self</span><span class=\"testingo\">.</span><span class=\"testingn\">options</span><span class=\"testingp\">:</span><br></span><span id=\"foo-22\"><a id=\"foo-22\" name=\"foo-22\"></a><a href=\"#foo-22\"><span class=\"linenos special\">22</span></a>            <span class=\"testingbp\">self</span><span class=\"testingo\">.</span><span class=\"testingn\">options</span><span class=\"testingp\">[</span><span class=\"testingn\">flag</span><span class=\"testingp\">]</span> <span class=\"testingo\">=</span> <span class=\"testingkc\">True</span><br></span><span id=\"foo-23\"><a id=\"foo-23\" name=\"foo-23\"></a><a href=\"#foo-23\"><span class=\"linenos\">  </span></a><br></span><span id=\"foo-24\"><a id=\"foo-24\" name=\"foo-24\"></a><a href=\"#foo-24\"><span class=\"linenos special\">24</span></a>    <span class=\"testingc1\"># noclasses should already default to False, but just in case...</span><br></span><span id=\"foo-25\"><a id=\"foo-25\" name=\"foo-25\"></a><a href=\"#foo-25\"><span class=\"linenos\">  </span></a>    <span class=\"testingn\">formatter</span> <span class=\"testingo\">=</span> <span class=\"testingn\">HtmlFormatter</span><span class=\"testingp\">(</span><span class=\"testingn\">noclasses</span><span class=\"testingo\">=</span><span class=\"testingkc\">False</span><span class=\"testingp\">,</span> <span class=\"testingo\">**</span><span class=\"testingbp\">self</span><span class=\"testingo\">.</span><span class=\"testingn\">options</span><span class=\"testingp\">)</span><br></span><span id=\"foo-26\"><a id=\"foo-26\" name=\"foo-26\"></a><a href=\"#foo-26\"><span class=\"linenos special\">26</span></a>    <span class=\"testingn\">parsed</span> <span class=\"testingo\">=</span> <span class=\"testingn\">highlight</span><span class=\"testingp\">(</span><span class=\"testings1\">&#39;</span><span class=\"testingse\">\\n</span><span class=\"testings1\">&#39;</span><span class=\"testingo\">.</span><span class=\"testingn\">join</span><span class=\"testingp\">(</span><span class=\"testingbp\">self</span><span class=\"testingo\">.</span><span class=\"testingn\">content</span><span class=\"testingp\">),</span> <span class=\"testingn\">lexer</span><span class=\"testingp\">,</span> <span class=\"testingn\">formatter</span><span class=\"testingp\">)</span><br></span><span id=\"foo-27\"><a id=\"foo-27\" name=\"foo-27\"></a><a href=\"#foo-27\"><span class=\"linenos\">  </span></a>    <span class=\"testingk\">return</span> <span class=\"testingp\">[</span><span class=\"testingn\">nodes</span><span class=\"testingo\">.</span><span class=\"testingn\">raw</span><span class=\"testingp\">(</span><span class=\"testings1\">&#39;&#39;</span><span class=\"testingp\">,</span> <span class=\"testingn\">parsed</span><span class=\"testingp\">,</span> <span class=\"testingnb\">format</span><span class=\"testingo\">=</span><span class=\"testings1\">&#39;html&#39;</span><span class=\"testingp\">)]</span><br></span></pre></div>\n                                                <p>Lovely.</p>\n                                        </div>\n                                        <div class=\"section\" id=\"testing-even-more-sourcecode-directives\">\n                                                <h2>Testing even more sourcecode directives</h2>\n                                                <span class=\"n\">formatter</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span> <span class=\"ow\">and</span> <span class=\"n\">VARIANTS</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]]</span>\n                                                <p>Lovely.</p>\n                                        </div>\n                                        <div class=\"section\" id=\"testing-overriding-config-defaults\">\n                                                <h2>Testing overriding config defaults</h2>\n                                                <p>Even if the default is line numbers, we can override it here</p>\n                                                <div class=\"highlight\"><pre><span></span><span class=\"n\">formatter</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span> <span class=\"ow\">and</span> <span class=\"n\">VARIANTS</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]]</span>\n</pre></div>\n                                                <p>Lovely.</p>\n                                        </div>\n\n                                </div><!-- /.entry-content -->\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/a-markdown-powered-article.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>A markdown powered article</title>\n                <link rel=\"stylesheet\" href=\"./theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n                <meta name=\"description\" content=\"You're mutually oblivious. a root-relative link to unbelievable a file-relative link to unbelievable\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"./\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li><a href=\"./tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"./override/\">Override url/save_as</a></li>\n                                <li><a href=\"./pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"./category/yeah.html\">yeah</a></li>\n                                <li><a href=\"./category/misc.html\">misc</a></li>\n                                <li class=\"active\"><a href=\"./category/cat1.html\">cat1</a></li>\n                                <li><a href=\"./category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"./a-markdown-powered-article.html\" rel=\"bookmark\"\n                                                   title=\"Permalink to A markdown powered article\">A markdown powered article</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2011-04-20T00:00:00+02:00\">\n                                                        Published: Wed 20 April 2011\n                                                </abbr>\n\n                                                <address class=\"vcard author\">\n                                                        By                         <a class=\"url fn\" href=\"./author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                </address>\n                                                <p>In <a href=\"./category/cat1.html\">cat1</a>.</p>\n\n                                        </footer><!-- /.post-info -->      <p>You're mutually oblivious.</p>\n                                        <p><a href=\"./unbelievable.html\">a root-relative link to unbelievable</a>\n                                                <a href=\"./unbelievable.html\">a file-relative link to unbelievable</a></p>\n                                </div><!-- /.entry-content -->\n                                <div class=\"comments\">\n                                        <h2>Comments !</h2>\n                                        <div id=\"disqus_thread\"></div>\n                                        <script type=\"text/javascript\">\n                                                var disqus_shortname = 'blog-notmyidea';\n                                                var disqus_identifier = 'a-markdown-powered-article.html';\n                                                var disqus_url = './a-markdown-powered-article.html';\n                                                (function() {\n                                                        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;\n                                                        dsq.src = '//blog-notmyidea.disqus.com/embed.js';\n                                                        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);\n                                                })();\n                                        </script>\n                                        <noscript>Please enable JavaScript to view the comments.</noscript>\n                                </div>\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/archives.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log</title>\n                <link rel=\"stylesheet\" href=\"./theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"./\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li><a href=\"./tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"./override/\">Override url/save_as</a></li>\n                                <li><a href=\"./pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"./category/yeah.html\">yeah</a></li>\n                                <li><a href=\"./category/misc.html\">misc</a></li>\n                                <li><a href=\"./category/cat1.html\">cat1</a></li>\n                                <li><a href=\"./category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <h1>Archives for Alexis' log</h1>\n\n                        <dl>\n                                <dt>Fri 30 November 2012</dt>\n                                <dd><a href=\"./filename_metadata-example.html\">FILENAME_METADATA example</a></dd>\n                                <dt>Wed 29 February 2012</dt>\n                                <dd><a href=\"./second-article.html\">Second article</a></dd>\n                                <dt>Wed 20 April 2011</dt>\n                                <dd><a href=\"./a-markdown-powered-article.html\">A markdown powered article</a></dd>\n                                <dt>Thu 17 February 2011</dt>\n                                <dd><a href=\"./article-1.html\">Article 1</a></dd>\n                                <dt>Thu 17 February 2011</dt>\n                                <dd><a href=\"./article-2.html\">Article 2</a></dd>\n                                <dt>Thu 17 February 2011</dt>\n                                <dd><a href=\"./article-3.html\">Article 3</a></dd>\n                                <dt>Thu 02 December 2010</dt>\n                                <dd><a href=\"./this-is-a-super-article.html\">This is a super article !</a></dd>\n                                <dt>Wed 20 October 2010</dt>\n                                <dd><a href=\"./oh-yeah.html\">Oh yeah !</a></dd>\n                                <dt>Fri 15 October 2010</dt>\n                                <dd><a href=\"./unbelievable.html\">Unbelievable !</a></dd>\n                                <dt>Sun 14 March 2010</dt>\n                                <dd><a href=\"./tag/baz.html\">The baz tag</a></dd>\n                        </dl>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/article-1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Article 1</title>\n                <link rel=\"stylesheet\" href=\"./theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n                <meta name=\"description\" content=\"Article 1\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"./\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li><a href=\"./tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"./override/\">Override url/save_as</a></li>\n                                <li><a href=\"./pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"./category/yeah.html\">yeah</a></li>\n                                <li><a href=\"./category/misc.html\">misc</a></li>\n                                <li class=\"active\"><a href=\"./category/cat1.html\">cat1</a></li>\n                                <li><a href=\"./category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"./article-1.html\" rel=\"bookmark\"\n                                                   title=\"Permalink to Article 1\">Article 1</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2011-02-17T00:00:00+01:00\">\n                                                        Published: Thu 17 February 2011\n                                                </abbr>\n\n                                                <address class=\"vcard author\">\n                                                        By                         <a class=\"url fn\" href=\"./author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                </address>\n                                                <p>In <a href=\"./category/cat1.html\">cat1</a>.</p>\n\n                                        </footer><!-- /.post-info -->      <p>Article 1</p>\n\n                                </div><!-- /.entry-content -->\n                                <div class=\"comments\">\n                                        <h2>Comments !</h2>\n                                        <div id=\"disqus_thread\"></div>\n                                        <script type=\"text/javascript\">\n                                                var disqus_shortname = 'blog-notmyidea';\n                                                var disqus_identifier = 'article-1.html';\n                                                var disqus_url = './article-1.html';\n                                                (function() {\n                                                        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;\n                                                        dsq.src = '//blog-notmyidea.disqus.com/embed.js';\n                                                        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);\n                                                })();\n                                        </script>\n                                        <noscript>Please enable JavaScript to view the comments.</noscript>\n                                </div>\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/article-2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Article 2</title>\n                <link rel=\"stylesheet\" href=\"./theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n                <meta name=\"description\" content=\"Article 2\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"./\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li><a href=\"./tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"./override/\">Override url/save_as</a></li>\n                                <li><a href=\"./pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"./category/yeah.html\">yeah</a></li>\n                                <li><a href=\"./category/misc.html\">misc</a></li>\n                                <li class=\"active\"><a href=\"./category/cat1.html\">cat1</a></li>\n                                <li><a href=\"./category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"./article-2.html\" rel=\"bookmark\"\n                                                   title=\"Permalink to Article 2\">Article 2</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2011-02-17T00:00:00+01:00\">\n                                                        Published: Thu 17 February 2011\n                                                </abbr>\n\n                                                <address class=\"vcard author\">\n                                                        By                         <a class=\"url fn\" href=\"./author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                </address>\n                                                <p>In <a href=\"./category/cat1.html\">cat1</a>.</p>\n\n                                        </footer><!-- /.post-info -->      <p>Article 2</p>\n\n                                </div><!-- /.entry-content -->\n                                <div class=\"comments\">\n                                        <h2>Comments !</h2>\n                                        <div id=\"disqus_thread\"></div>\n                                        <script type=\"text/javascript\">\n                                                var disqus_shortname = 'blog-notmyidea';\n                                                var disqus_identifier = 'article-2.html';\n                                                var disqus_url = './article-2.html';\n                                                (function() {\n                                                        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;\n                                                        dsq.src = '//blog-notmyidea.disqus.com/embed.js';\n                                                        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);\n                                                })();\n                                        </script>\n                                        <noscript>Please enable JavaScript to view the comments.</noscript>\n                                </div>\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/article-3.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Article 3</title>\n                <link rel=\"stylesheet\" href=\"./theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n                <meta name=\"description\" content=\"Article 3\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"./\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li><a href=\"./tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"./override/\">Override url/save_as</a></li>\n                                <li><a href=\"./pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"./category/yeah.html\">yeah</a></li>\n                                <li><a href=\"./category/misc.html\">misc</a></li>\n                                <li class=\"active\"><a href=\"./category/cat1.html\">cat1</a></li>\n                                <li><a href=\"./category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"./article-3.html\" rel=\"bookmark\"\n                                                   title=\"Permalink to Article 3\">Article 3</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2011-02-17T00:00:00+01:00\">\n                                                        Published: Thu 17 February 2011\n                                                </abbr>\n\n                                                <address class=\"vcard author\">\n                                                        By                         <a class=\"url fn\" href=\"./author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                </address>\n                                                <p>In <a href=\"./category/cat1.html\">cat1</a>.</p>\n\n                                        </footer><!-- /.post-info -->      <p>Article 3</p>\n\n                                </div><!-- /.entry-content -->\n                                <div class=\"comments\">\n                                        <h2>Comments !</h2>\n                                        <div id=\"disqus_thread\"></div>\n                                        <script type=\"text/javascript\">\n                                                var disqus_shortname = 'blog-notmyidea';\n                                                var disqus_identifier = 'article-3.html';\n                                                var disqus_url = './article-3.html';\n                                                (function() {\n                                                        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;\n                                                        dsq.src = '//blog-notmyidea.disqus.com/embed.js';\n                                                        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);\n                                                })();\n                                        </script>\n                                        <noscript>Please enable JavaScript to view the comments.</noscript>\n                                </div>\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/author/alexis-metaireau.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log - Alexis Métaireau</title>\n                <link rel=\"stylesheet\" href=\"../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li><a href=\"../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../category/yeah.html\">yeah</a></li>\n                                <li><a href=\"../category/misc.html\">misc</a></li>\n                                <li><a href=\"../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <aside id=\"featured\" class=\"body\">\n                        <article>\n                                <h1 class=\"entry-title\"><a href=\"../filename_metadata-example.html\">FILENAME_METADATA example</a></h1>\n                                <footer class=\"post-info\">\n                                        <abbr class=\"published\" title=\"2012-11-30T00:00:00+01:00\">\n                                                Published: Fri 30 November 2012\n                                        </abbr>\n\n                                        <address class=\"vcard author\">\n                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                        </address>\n                                        <p>In <a href=\"../category/misc.html\">misc</a>.</p>\n\n                                </footer><!-- /.post-info --><p>Some cool stuff!</p>\n                                <p>There are <a href=\"../filename_metadata-example.html#disqus_thread\">comments</a>.</p>                </article>\n                </aside><!-- /#featured -->\n                <section id=\"content\" class=\"body\">\n                        <h1>Other articles</h1>\n                        <hr />\n                        <ol id=\"posts-list\" class=\"hfeed\">\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"../second-article.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to Second article\">Second article</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2012-02-29T00:00:00+01:00\">\n                                                                Published: Wed 29 February 2012\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"../category/misc.html\">misc</a>.</p>\n                                                        <p>tags: <a href=\"../tag/foo.html\">foo</a> <a href=\"../tag/bar.html\">bar</a> <a href=\"../tag/baz.html\">baz</a> </p>Translations:\n                                                        <a href=\"../second-article-fr.html\" hreflang=\"fr\">fr</a>\n\n                                                </footer><!-- /.post-info -->                <p>This is some article, in english</p>\n\n                                                <a class=\"readmore\" href=\"../second-article.html\">read more</a>\n                                                <p>There are <a href=\"../second-article.html#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"../a-markdown-powered-article.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to A markdown powered article\">A markdown powered article</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2011-04-20T00:00:00+02:00\">\n                                                                Published: Wed 20 April 2011\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"../category/cat1.html\">cat1</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>You're mutually oblivious.</p>\n                                                <p><a href=\"../unbelievable.html\">a root-relative link to unbelievable</a>\n                                                        <a href=\"../unbelievable.html\">a file-relative link to unbelievable</a></p>\n                                                <a class=\"readmore\" href=\"../a-markdown-powered-article.html\">read more</a>\n                                                <p>There are <a href=\"../a-markdown-powered-article.html#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"../article-1.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to Article 1\">Article 1</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2011-02-17T00:00:00+01:00\">\n                                                                Published: Thu 17 February 2011\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"../category/cat1.html\">cat1</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>Article 1</p>\n\n                                                <a class=\"readmore\" href=\"../article-1.html\">read more</a>\n                                                <p>There are <a href=\"../article-1.html#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n                        </ol><!-- /#posts-list -->\n                        <nav>\n                                <ul>\n                                        <li>Page 1 / 3</li>\n                                        <li><a href=\"../author/alexis-metaireau2.html\">&rang;</a></li>\n                                        <li><a href=\"../author/alexis-metaireau3.html\">&Rang;</a></li>\n                                </ul>\n                        </nav>\n                </section><!-- /#content -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/author/alexis-metaireau2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log - Alexis Métaireau</title>\n                <link rel=\"stylesheet\" href=\"../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li><a href=\"../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../category/yeah.html\">yeah</a></li>\n                                <li><a href=\"../category/misc.html\">misc</a></li>\n                                <li><a href=\"../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <section id=\"content\" class=\"body\">\n                        <ol id=\"posts-list\" class=\"hfeed\" start=\"3\">\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"../article-2.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to Article 2\">Article 2</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2011-02-17T00:00:00+01:00\">\n                                                                Published: Thu 17 February 2011\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"../category/cat1.html\">cat1</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>Article 2</p>\n\n                                                <a class=\"readmore\" href=\"../article-2.html\">read more</a>\n                                                <p>There are <a href=\"../article-2.html#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"../article-3.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to Article 3\">Article 3</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2011-02-17T00:00:00+01:00\">\n                                                                Published: Thu 17 February 2011\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"../category/cat1.html\">cat1</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>Article 3</p>\n\n                                                <a class=\"readmore\" href=\"../article-3.html\">read more</a>\n                                                <p>There are <a href=\"../article-3.html#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"../this-is-a-super-article.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to This is a super article !\">This is a super article !</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2010-12-02T10:14:00+01:00\">\n                                                                Published: Thu 02 December 2010\n                                                        </abbr>\n                                                        <br />\n                                                        <abbr class=\"modified\" title=\"2013-11-17T23:29:00+01:00\">\n                                                                Updated: Sun 17 November 2013\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"../category/yeah.html\">yeah</a>.</p>\n                                                        <p>tags: <a href=\"../tag/foo.html\">foo</a> <a href=\"../tag/bar.html\">bar</a> <a href=\"../tag/foobar.html\">foobar</a> </p>\n                                                </footer><!-- /.post-info -->                <p class=\"first last\">Multi-line metadata should be supported\n                                                        as well as <strong>inline markup</strong>.</p>\n\n                                                <a class=\"readmore\" href=\"../this-is-a-super-article.html\">read more</a>\n                                                <p>There are <a href=\"../this-is-a-super-article.html#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"../oh-yeah.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to Oh yeah !\">Oh yeah !</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2010-10-20T10:14:00+02:00\">\n                                                                Published: Wed 20 October 2010\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"../category/bar.html\">bar</a>.</p>\n                                                        <p>tags: <a href=\"../tag/oh.html\">oh</a> <a href=\"../tag/bar.html\">bar</a> <a href=\"../tag/yeah.html\">yeah</a> </p>Translations:\n                                                        <a href=\"../oh-yeah-fr.html\" hreflang=\"fr\">fr</a>\n\n                                                </footer><!-- /.post-info -->                <div class=\"section\" id=\"why-not\">\n                                                        <h2>Why not ?</h2>\n                                                        <p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\n                                                                YEAH !</p>\n                                                        <img alt=\"alternate text\" src=\"../pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" />\n                                                </div>\n\n                                                <a class=\"readmore\" href=\"../oh-yeah.html\">read more</a>\n                                                <p>There are <a href=\"../oh-yeah.html#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n                        </ol><!-- /#posts-list -->\n                        <nav>\n                                <ul>\n                                        <li><a href=\"../author/alexis-metaireau.html\">&Lang;</a></li>\n                                        <li><a href=\"../author/alexis-metaireau.html\">&lang;</a></li>\n                                        <li>Page 2 / 3</li>\n                                        <li><a href=\"../author/alexis-metaireau3.html\">&rang;</a></li>\n                                        <li><a href=\"../author/alexis-metaireau3.html\">&Rang;</a></li>\n                                </ul>\n                        </nav>\n                </section><!-- /#content -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/author/alexis-metaireau3.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log - Alexis Métaireau</title>\n                <link rel=\"stylesheet\" href=\"../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li><a href=\"../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../category/yeah.html\">yeah</a></li>\n                                <li><a href=\"../category/misc.html\">misc</a></li>\n                                <li><a href=\"../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <section id=\"content\" class=\"body\">\n                        <ol id=\"posts-list\" class=\"hfeed\" start=\"3\">\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"../unbelievable.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to Unbelievable !\">Unbelievable !</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2010-10-15T20:30:00+02:00\">\n                                                                Published: Fri 15 October 2010\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"../category/misc.html\">misc</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>Or completely awesome. Depends the needs.</p>\n                                                <p><a class=\"reference external\" href=\"../a-markdown-powered-article.html\">a root-relative link to markdown-article</a>\n                                                        <a class=\"reference external\" href=\"../a-markdown-powered-article.html\">a file-relative link to markdown-article</a></p>\n                                                <div class=\"section\" id=\"testing-sourcecode-directive\">\n                                                        <h2>Testing sourcecode directive</h2>\n                                                        <div class=\"highlight\"><table class=\"highlighttable\"><tr><td class=\"linenos\"><div class=\"linenodiv\"><pre><span class=\"normal\">1</span></pre></div></td><td class=\"code\"><div><pre><span></span><span class=\"n\">formatter</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span> <span class=\"ow\">and</span> <span class=\"n\">VARIANTS</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]]</span>\n</pre></div></td></tr></table></div>\n                                                </div>\n                                                <div class=\"section\" id=\"testing-another-case\">\n                                                        <h2>Testing another case</h2>\n                                                        <p>This will now have a line number in 'custom' since it's the default in\n                                                                pelican.conf, it will …</p></div>\n                                                <a class=\"readmore\" href=\"../unbelievable.html\">read more</a>\n                                                <p>There are <a href=\"../unbelievable.html#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"../tag/baz.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to The baz tag\">The baz tag</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2010-03-14T00:00:00+01:00\">\n                                                                Published: Sun 14 March 2010\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"../category/misc.html\">misc</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>This article overrides the listening of the articles under the <em>baz</em> tag.</p>\n\n                                                <a class=\"readmore\" href=\"../tag/baz.html\">read more</a>\n                                                <p>There are <a href=\"../tag/baz.html#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n                        </ol><!-- /#posts-list -->\n                        <nav>\n                                <ul>\n                                        <li><a href=\"../author/alexis-metaireau.html\">&Lang;</a></li>\n                                        <li><a href=\"../author/alexis-metaireau2.html\">&lang;</a></li>\n                                        <li>Page 3 / 3</li>\n                                </ul>\n                        </nav>\n                </section><!-- /#content -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/authors.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log - Authors</title>\n                <link rel=\"stylesheet\" href=\"./theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"./\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li><a href=\"./tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"./override/\">Override url/save_as</a></li>\n                                <li><a href=\"./pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"./category/yeah.html\">yeah</a></li>\n                                <li><a href=\"./category/misc.html\">misc</a></li>\n                                <li><a href=\"./category/cat1.html\">cat1</a></li>\n                                <li><a href=\"./category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <section id=\"content\" class=\"body\">\n                        <h1>Authors on Alexis' log</h1>\n                        <ul>\n                                <li><a href=\"./author/alexis-metaireau.html\">Alexis Métaireau</a> (10)</li>\n                        </ul>\n                </section>\n\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/categories.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log - Categories</title>\n                <link rel=\"stylesheet\" href=\"./theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"./\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li><a href=\"./tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"./override/\">Override url/save_as</a></li>\n                                <li><a href=\"./pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"./category/yeah.html\">yeah</a></li>\n                                <li><a href=\"./category/misc.html\">misc</a></li>\n                                <li><a href=\"./category/cat1.html\">cat1</a></li>\n                                <li><a href=\"./category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <section id=\"content\" class=\"body\">\n                        <h1>Categories for Alexis' log</h1>\n                        <ul>\n                                <li><a href=\"./category/bar.html\">bar</a> (1)</li>\n                                <li><a href=\"./category/cat1.html\">cat1</a> (4)</li>\n                                <li><a href=\"./category/misc.html\">misc</a> (4)</li>\n                                <li><a href=\"./category/yeah.html\">yeah</a> (1)</li>\n                        </ul>\n                </section>\n\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/category/bar.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log - bar</title>\n                <link rel=\"stylesheet\" href=\"../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li><a href=\"../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../category/yeah.html\">yeah</a></li>\n                                <li><a href=\"../category/misc.html\">misc</a></li>\n                                <li><a href=\"../category/cat1.html\">cat1</a></li>\n                                <li class=\"active\"><a href=\"../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <aside id=\"featured\" class=\"body\">\n                        <article>\n                                <h1 class=\"entry-title\"><a href=\"../oh-yeah.html\">Oh yeah !</a></h1>\n                                <footer class=\"post-info\">\n                                        <abbr class=\"published\" title=\"2010-10-20T10:14:00+02:00\">\n                                                Published: Wed 20 October 2010\n                                        </abbr>\n\n                                        <address class=\"vcard author\">\n                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                        </address>\n                                        <p>In <a href=\"../category/bar.html\">bar</a>.</p>\n                                        <p>tags: <a href=\"../tag/oh.html\">oh</a> <a href=\"../tag/bar.html\">bar</a> <a href=\"../tag/yeah.html\">yeah</a> </p>Translations:\n                                        <a href=\"../oh-yeah-fr.html\" hreflang=\"fr\">fr</a>\n\n                                </footer><!-- /.post-info --><div class=\"section\" id=\"why-not\">\n                                        <h2>Why not ?</h2>\n                                        <p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\n                                                YEAH !</p>\n                                        <img alt=\"alternate text\" src=\"../pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" />\n                                </div>\n                                <p>There are <a href=\"../oh-yeah.html#disqus_thread\">comments</a>.</p>                </article>\n                </aside><!-- /#featured -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/category/cat1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log - cat1</title>\n                <link rel=\"stylesheet\" href=\"../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li><a href=\"../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../category/yeah.html\">yeah</a></li>\n                                <li><a href=\"../category/misc.html\">misc</a></li>\n                                <li class=\"active\"><a href=\"../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <aside id=\"featured\" class=\"body\">\n                        <article>\n                                <h1 class=\"entry-title\"><a href=\"../a-markdown-powered-article.html\">A markdown powered article</a></h1>\n                                <footer class=\"post-info\">\n                                        <abbr class=\"published\" title=\"2011-04-20T00:00:00+02:00\">\n                                                Published: Wed 20 April 2011\n                                        </abbr>\n\n                                        <address class=\"vcard author\">\n                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                        </address>\n                                        <p>In <a href=\"../category/cat1.html\">cat1</a>.</p>\n\n                                </footer><!-- /.post-info --><p>You're mutually oblivious.</p>\n                                <p><a href=\"../unbelievable.html\">a root-relative link to unbelievable</a>\n                                        <a href=\"../unbelievable.html\">a file-relative link to unbelievable</a></p><p>There are <a href=\"../a-markdown-powered-article.html#disqus_thread\">comments</a>.</p>                </article>\n                </aside><!-- /#featured -->\n                <section id=\"content\" class=\"body\">\n                        <h1>Other articles</h1>\n                        <hr />\n                        <ol id=\"posts-list\" class=\"hfeed\">\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"../article-1.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to Article 1\">Article 1</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2011-02-17T00:00:00+01:00\">\n                                                                Published: Thu 17 February 2011\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"../category/cat1.html\">cat1</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>Article 1</p>\n\n                                                <a class=\"readmore\" href=\"../article-1.html\">read more</a>\n                                                <p>There are <a href=\"../article-1.html#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"../article-2.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to Article 2\">Article 2</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2011-02-17T00:00:00+01:00\">\n                                                                Published: Thu 17 February 2011\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"../category/cat1.html\">cat1</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>Article 2</p>\n\n                                                <a class=\"readmore\" href=\"../article-2.html\">read more</a>\n                                                <p>There are <a href=\"../article-2.html#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"../article-3.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to Article 3\">Article 3</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2011-02-17T00:00:00+01:00\">\n                                                                Published: Thu 17 February 2011\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"../category/cat1.html\">cat1</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>Article 3</p>\n\n                                                <a class=\"readmore\" href=\"../article-3.html\">read more</a>\n                                                <p>There are <a href=\"../article-3.html#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n                        </ol><!-- /#posts-list -->\n                </section><!-- /#content -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/category/misc.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log - misc</title>\n                <link rel=\"stylesheet\" href=\"../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li><a href=\"../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../category/yeah.html\">yeah</a></li>\n                                <li class=\"active\"><a href=\"../category/misc.html\">misc</a></li>\n                                <li><a href=\"../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <aside id=\"featured\" class=\"body\">\n                        <article>\n                                <h1 class=\"entry-title\"><a href=\"../filename_metadata-example.html\">FILENAME_METADATA example</a></h1>\n                                <footer class=\"post-info\">\n                                        <abbr class=\"published\" title=\"2012-11-30T00:00:00+01:00\">\n                                                Published: Fri 30 November 2012\n                                        </abbr>\n\n                                        <address class=\"vcard author\">\n                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                        </address>\n                                        <p>In <a href=\"../category/misc.html\">misc</a>.</p>\n\n                                </footer><!-- /.post-info --><p>Some cool stuff!</p>\n                                <p>There are <a href=\"../filename_metadata-example.html#disqus_thread\">comments</a>.</p>                </article>\n                </aside><!-- /#featured -->\n                <section id=\"content\" class=\"body\">\n                        <h1>Other articles</h1>\n                        <hr />\n                        <ol id=\"posts-list\" class=\"hfeed\">\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"../second-article.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to Second article\">Second article</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2012-02-29T00:00:00+01:00\">\n                                                                Published: Wed 29 February 2012\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"../category/misc.html\">misc</a>.</p>\n                                                        <p>tags: <a href=\"../tag/foo.html\">foo</a> <a href=\"../tag/bar.html\">bar</a> <a href=\"../tag/baz.html\">baz</a> </p>Translations:\n                                                        <a href=\"../second-article-fr.html\" hreflang=\"fr\">fr</a>\n\n                                                </footer><!-- /.post-info -->                <p>This is some article, in english</p>\n\n                                                <a class=\"readmore\" href=\"../second-article.html\">read more</a>\n                                                <p>There are <a href=\"../second-article.html#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"../unbelievable.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to Unbelievable !\">Unbelievable !</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2010-10-15T20:30:00+02:00\">\n                                                                Published: Fri 15 October 2010\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"../category/misc.html\">misc</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>Or completely awesome. Depends the needs.</p>\n                                                <p><a class=\"reference external\" href=\"../a-markdown-powered-article.html\">a root-relative link to markdown-article</a>\n                                                        <a class=\"reference external\" href=\"../a-markdown-powered-article.html\">a file-relative link to markdown-article</a></p>\n                                                <div class=\"section\" id=\"testing-sourcecode-directive\">\n                                                        <h2>Testing sourcecode directive</h2>\n                                                        <div class=\"highlight\"><table class=\"highlighttable\"><tr><td class=\"linenos\"><div class=\"linenodiv\"><pre><span class=\"normal\">1</span></pre></div></td><td class=\"code\"><div><pre><span></span><span class=\"n\">formatter</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span> <span class=\"ow\">and</span> <span class=\"n\">VARIANTS</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]]</span>\n</pre></div></td></tr></table></div>\n                                                </div>\n                                                <div class=\"section\" id=\"testing-another-case\">\n                                                        <h2>Testing another case</h2>\n                                                        <p>This will now have a line number in 'custom' since it's the default in\n                                                                pelican.conf, it will …</p></div>\n                                                <a class=\"readmore\" href=\"../unbelievable.html\">read more</a>\n                                                <p>There are <a href=\"../unbelievable.html#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"../tag/baz.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to The baz tag\">The baz tag</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2010-03-14T00:00:00+01:00\">\n                                                                Published: Sun 14 March 2010\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"../category/misc.html\">misc</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>This article overrides the listening of the articles under the <em>baz</em> tag.</p>\n\n                                                <a class=\"readmore\" href=\"../tag/baz.html\">read more</a>\n                                                <p>There are <a href=\"../tag/baz.html#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n                        </ol><!-- /#posts-list -->\n                </section><!-- /#content -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/category/yeah.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log - yeah</title>\n                <link rel=\"stylesheet\" href=\"../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li><a href=\"../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li class=\"active\"><a href=\"../category/yeah.html\">yeah</a></li>\n                                <li><a href=\"../category/misc.html\">misc</a></li>\n                                <li><a href=\"../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <aside id=\"featured\" class=\"body\">\n                        <article>\n                                <h1 class=\"entry-title\"><a href=\"../this-is-a-super-article.html\">This is a super article !</a></h1>\n                                <footer class=\"post-info\">\n                                        <abbr class=\"published\" title=\"2010-12-02T10:14:00+01:00\">\n                                                Published: Thu 02 December 2010\n                                        </abbr>\n                                        <br />\n                                        <abbr class=\"modified\" title=\"2013-11-17T23:29:00+01:00\">\n                                                Updated: Sun 17 November 2013\n                                        </abbr>\n\n                                        <address class=\"vcard author\">\n                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                        </address>\n                                        <p>In <a href=\"../category/yeah.html\">yeah</a>.</p>\n                                        <p>tags: <a href=\"../tag/foo.html\">foo</a> <a href=\"../tag/bar.html\">bar</a> <a href=\"../tag/foobar.html\">foobar</a> </p>\n                                </footer><!-- /.post-info --><p>Some content here !</p>\n                                <div class=\"section\" id=\"this-is-a-simple-title\">\n                                        <h2>This is a simple title</h2>\n                                        <p>And here comes the cool <a class=\"reference external\" href=\"http://books.couchdb.org/relax/design-documents/views\">stuff</a>.</p>\n                                        <img alt=\"alternate text\" src=\"../pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" />\n                                        <img alt=\"alternate text\" src=\"../pictures/Sushi_Macro.jpg\" style=\"width: 600px; height: 450px;\" />\n<pre class=\"literal-block\">\n&gt;&gt;&gt; from ipdb import set_trace\n&gt;&gt;&gt; set_trace()\n</pre>\n                                        <p>→ And now try with some utf8 hell: ééé</p>\n                                </div>\n                                <p>There are <a href=\"../this-is-a-super-article.html#disqus_thread\">comments</a>.</p>                </article>\n                </aside><!-- /#featured -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/drafts/a-draft-article-without-date.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>A draft article without date</title>\n                <link rel=\"stylesheet\" href=\"../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n                <meta name=\"description\" content=\"This is a draft article, it should live under the /drafts/ folder and not be listed anywhere else.\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li><a href=\"../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../category/yeah.html\">yeah</a></li>\n                                <li class=\"active\"><a href=\"../category/misc.html\">misc</a></li>\n                                <li><a href=\"../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"../drafts/a-draft-article-without-date.html\" rel=\"bookmark\"\n                                                   title=\"Permalink to A draft article without date\">A draft article without date</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2012-03-02T14:01:01+01:00\">\n                                                        Published: Fri 02 March 2012\n                                                </abbr>\n\n                                                <address class=\"vcard author\">\n                                                        By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                </address>\n                                                <p>In <a href=\"../category/misc.html\">misc</a>.</p>\n\n                                        </footer><!-- /.post-info -->      <p>This is a draft article, it should live under the /drafts/ folder and not be\n                                                listed anywhere else.</p>\n\n                                </div><!-- /.entry-content -->\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/drafts/a-draft-article.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>A draft article</title>\n                <link rel=\"stylesheet\" href=\"../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n                <meta name=\"description\" content=\"This is a draft article, it should live under the /drafts/ folder and not be listed anywhere else.\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li><a href=\"../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../category/yeah.html\">yeah</a></li>\n                                <li class=\"active\"><a href=\"../category/misc.html\">misc</a></li>\n                                <li><a href=\"../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"../drafts/a-draft-article.html\" rel=\"bookmark\"\n                                                   title=\"Permalink to A draft article\">A draft article</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2011-05-08T15:58:00+02:00\">\n                                                        Published: Sun 08 May 2011\n                                                </abbr>\n\n                                                <address class=\"vcard author\">\n                                                        By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                </address>\n                                                <p>In <a href=\"../category/misc.html\">misc</a>.</p>\n\n                                        </footer><!-- /.post-info -->      <p>This is a draft article, it should live under the /drafts/ folder and not be\n                                                listed anywhere else.</p>\n\n                                </div><!-- /.entry-content -->\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/feeds/alexis-metaireau.atom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<feed xmlns=\"http://www.w3.org/2005/Atom\"><title>Alexis' log - Alexis Métaireau</title><link href=\"http://blog.notmyidea.org/\" rel=\"alternate\"/><link href=\"http://blog.notmyidea.org/feeds/alexis-metaireau.atom.xml\" rel=\"self\"/><id>http://blog.notmyidea.org/</id><updated>2013-11-17T23:29:00+01:00</updated><subtitle>A personal blog.</subtitle><entry><title>FILENAME_METADATA example</title><link href=\"http://blog.notmyidea.org/filename_metadata-example.html\" rel=\"alternate\"/><published>2012-11-30T00:00:00+01:00</published><updated>2012-11-30T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2012-11-30:/filename_metadata-example.html</id><content type=\"html\">&lt;p&gt;Some cool stuff!&lt;/p&gt;\n</content><category term=\"misc\"/></entry><entry><title>Second article</title><link href=\"http://blog.notmyidea.org/second-article.html\" rel=\"alternate\"/><published>2012-02-29T00:00:00+01:00</published><updated>2012-02-29T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2012-02-29:/second-article.html</id><content type=\"html\">&lt;p&gt;This is some article, in english&lt;/p&gt;\n</content><category term=\"misc\"/><category term=\"foo\"/><category term=\"bar\"/><category term=\"baz\"/></entry><entry><title>A markdown powered article</title><link href=\"http://blog.notmyidea.org/a-markdown-powered-article.html\" rel=\"alternate\"/><published>2011-04-20T00:00:00+02:00</published><updated>2011-04-20T00:00:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-04-20:/a-markdown-powered-article.html</id><content type=\"html\">&lt;p&gt;You're mutually oblivious.&lt;/p&gt;\n&lt;p&gt;&lt;a href=\"http://blog.notmyidea.org/unbelievable.html\"&gt;a root-relative link to unbelievable&lt;/a&gt;\n&lt;a href=\"http://blog.notmyidea.org/unbelievable.html\"&gt;a file-relative link to unbelievable&lt;/a&gt;&lt;/p&gt;</content><category term=\"cat1\"/></entry><entry><title>Article 1</title><link href=\"http://blog.notmyidea.org/article-1.html\" rel=\"alternate\"/><published>2011-02-17T00:00:00+01:00</published><updated>2011-02-17T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-02-17:/article-1.html</id><content type=\"html\">&lt;p&gt;Article 1&lt;/p&gt;\n</content><category term=\"cat1\"/></entry><entry><title>Article 2</title><link href=\"http://blog.notmyidea.org/article-2.html\" rel=\"alternate\"/><published>2011-02-17T00:00:00+01:00</published><updated>2011-02-17T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-02-17:/article-2.html</id><content type=\"html\">&lt;p&gt;Article 2&lt;/p&gt;\n</content><category term=\"cat1\"/></entry><entry><title>Article 3</title><link href=\"http://blog.notmyidea.org/article-3.html\" rel=\"alternate\"/><published>2011-02-17T00:00:00+01:00</published><updated>2011-02-17T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-02-17:/article-3.html</id><content type=\"html\">&lt;p&gt;Article 3&lt;/p&gt;\n</content><category term=\"cat1\"/></entry><entry><title>This is a super article !</title><link href=\"http://blog.notmyidea.org/this-is-a-super-article.html\" rel=\"alternate\"/><published>2010-12-02T10:14:00+01:00</published><updated>2013-11-17T23:29:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-12-02:/this-is-a-super-article.html</id><summary type=\"html\">&lt;p class=\"first last\"&gt;Multi-line metadata should be supported\nas well as &lt;strong&gt;inline markup&lt;/strong&gt;.&lt;/p&gt;\n</summary><content type=\"html\">&lt;p&gt;Some content here !&lt;/p&gt;\n&lt;div class=\"section\" id=\"this-is-a-simple-title\"&gt;\n&lt;h2&gt;This is a simple title&lt;/h2&gt;\n&lt;p&gt;And here comes the cool &lt;a class=\"reference external\" href=\"http://books.couchdb.org/relax/design-documents/views\"&gt;stuff&lt;/a&gt;.&lt;/p&gt;\n&lt;img alt=\"alternate text\" src=\"http://blog.notmyidea.org/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;img alt=\"alternate text\" src=\"http://blog.notmyidea.org/pictures/Sushi_Macro.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;pre class=\"literal-block\"&gt;\n&amp;gt;&amp;gt;&amp;gt; from ipdb import set_trace\n&amp;gt;&amp;gt;&amp;gt; set_trace()\n&lt;/pre&gt;\n&lt;p&gt;→ And now try with some utf8 hell: ééé&lt;/p&gt;\n&lt;/div&gt;\n</content><category term=\"yeah\"/><category term=\"foo\"/><category term=\"bar\"/><category term=\"foobar\"/></entry><entry><title>Oh yeah !</title><link href=\"http://blog.notmyidea.org/oh-yeah.html\" rel=\"alternate\"/><published>2010-10-20T10:14:00+02:00</published><updated>2010-10-20T10:14:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-10-20:/oh-yeah.html</id><content type=\"html\">&lt;div class=\"section\" id=\"why-not\"&gt;\n&lt;h2&gt;Why not ?&lt;/h2&gt;\n&lt;p&gt;After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\nYEAH !&lt;/p&gt;\n&lt;img alt=\"alternate text\" src=\"http://blog.notmyidea.org/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;/div&gt;\n</content><category term=\"bar\"/><category term=\"oh\"/><category term=\"bar\"/><category term=\"yeah\"/></entry><entry><title>Unbelievable !</title><link href=\"http://blog.notmyidea.org/unbelievable.html\" rel=\"alternate\"/><published>2010-10-15T20:30:00+02:00</published><updated>2010-10-15T20:30:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-10-15:/unbelievable.html</id><summary type=\"html\">&lt;p&gt;Or completely awesome. Depends the needs.&lt;/p&gt;\n&lt;p&gt;&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/a-markdown-powered-article.html\"&gt;a root-relative link to markdown-article&lt;/a&gt;\n&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/a-markdown-powered-article.html\"&gt;a file-relative link to markdown-article&lt;/a&gt;&lt;/p&gt;\n&lt;div class=\"section\" id=\"testing-sourcecode-directive\"&gt;\n&lt;h2&gt;Testing sourcecode directive&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;table class=\"highlighttable\"&gt;&lt;tr&gt;&lt;td class=\"linenos\"&gt;&lt;div class=\"linenodiv\"&gt;&lt;pre&gt;&lt;span class=\"normal\"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=\"code\"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-another-case\"&gt;\n&lt;h2&gt;Testing another case&lt;/h2&gt;\n&lt;p&gt;This will now have a line number in 'custom' since it's the default in\npelican.conf, it will …&lt;/p&gt;&lt;/div&gt;</summary><content type=\"html\">&lt;p&gt;Or completely awesome. Depends the needs.&lt;/p&gt;\n&lt;p&gt;&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/a-markdown-powered-article.html\"&gt;a root-relative link to markdown-article&lt;/a&gt;\n&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/a-markdown-powered-article.html\"&gt;a file-relative link to markdown-article&lt;/a&gt;&lt;/p&gt;\n&lt;div class=\"section\" id=\"testing-sourcecode-directive\"&gt;\n&lt;h2&gt;Testing sourcecode directive&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;table class=\"highlighttable\"&gt;&lt;tr&gt;&lt;td class=\"linenos\"&gt;&lt;div class=\"linenodiv\"&gt;&lt;pre&gt;&lt;span class=\"normal\"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=\"code\"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-another-case\"&gt;\n&lt;h2&gt;Testing another case&lt;/h2&gt;\n&lt;p&gt;This will now have a line number in 'custom' since it's the default in\npelican.conf, it will have nothing in default.&lt;/p&gt;\n&lt;div class=\"highlight\"&gt;&lt;table class=\"highlighttable\"&gt;&lt;tr&gt;&lt;td class=\"linenos\"&gt;&lt;div class=\"linenodiv\"&gt;&lt;pre&gt;&lt;span class=\"normal\"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=\"code\"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-more-sourcecode-directives\"&gt;\n&lt;h2&gt;Testing more sourcecode directives&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id=\"foo-8\"&gt;&lt;a id=\"foo-8\" name=\"foo-8\"&gt;&lt;/a&gt;&lt;a href=\"#foo-8\"&gt;&lt;span class=\"linenos special\"&gt; 8&lt;/span&gt;&lt;/a&gt;&lt;span class=\"testingk\"&gt;def&lt;/span&gt;&lt;span class=\"testingw\"&gt; &lt;/span&gt;&lt;span class=\"testingnf\"&gt;run&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingp\"&gt;):&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-9\"&gt;&lt;a id=\"foo-9\" name=\"foo-9\"&gt;&lt;/a&gt;&lt;a href=\"#foo-9\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;assert_has_content&lt;/span&gt;&lt;span class=\"testingp\"&gt;()&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-10\"&gt;&lt;a id=\"foo-10\" name=\"foo-10\"&gt;&lt;/a&gt;&lt;a href=\"#foo-10\"&gt;&lt;span class=\"linenos special\"&gt;10&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;try&lt;/span&gt;&lt;span class=\"testingp\"&gt;:&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-11\"&gt;&lt;a id=\"foo-11\" name=\"foo-11\"&gt;&lt;/a&gt;&lt;a href=\"#foo-11\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingn\"&gt;lexer&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;get_lexer_by_name&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;arguments&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testingmi\"&gt;0&lt;/span&gt;&lt;span class=\"testingp\"&gt;])&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-12\"&gt;&lt;a id=\"foo-12\" name=\"foo-12\"&gt;&lt;/a&gt;&lt;a href=\"#foo-12\"&gt;&lt;span class=\"linenos special\"&gt;12&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;except&lt;/span&gt; &lt;span class=\"testingne\"&gt;ValueError&lt;/span&gt;&lt;span class=\"testingp\"&gt;:&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-13\"&gt;&lt;a id=\"foo-13\" name=\"foo-13\"&gt;&lt;/a&gt;&lt;a href=\"#foo-13\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingc1\"&gt;# no lexer found - use the text one instead of an exception&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-14\"&gt;&lt;a id=\"foo-14\" name=\"foo-14\"&gt;&lt;/a&gt;&lt;a href=\"#foo-14\"&gt;&lt;span class=\"linenos special\"&gt;14&lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingn\"&gt;lexer&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;TextLexer&lt;/span&gt;&lt;span class=\"testingp\"&gt;()&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-15\"&gt;&lt;a id=\"foo-15\" name=\"foo-15\"&gt;&lt;/a&gt;&lt;a href=\"#foo-15\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-16\"&gt;&lt;a id=\"foo-16\" name=\"foo-16\"&gt;&lt;/a&gt;&lt;a href=\"#foo-16\"&gt;&lt;span class=\"linenos special\"&gt;16&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;if&lt;/span&gt; &lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;linenos&amp;#39;&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt; &lt;span class=\"testingow\"&gt;and&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-17\"&gt;&lt;a id=\"foo-17\" name=\"foo-17\"&gt;&lt;/a&gt;&lt;a href=\"#foo-17\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;            &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;linenos&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;]&lt;/span&gt; &lt;span class=\"testingow\"&gt;not&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;table&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;inline&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;)):&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-18\"&gt;&lt;a id=\"foo-18\" name=\"foo-18\"&gt;&lt;/a&gt;&lt;a href=\"#foo-18\"&gt;&lt;span class=\"linenos special\"&gt;18&lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;linenos&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;]&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;table&amp;#39;&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-19\"&gt;&lt;a id=\"foo-19\" name=\"foo-19\"&gt;&lt;/a&gt;&lt;a href=\"#foo-19\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-20\"&gt;&lt;a id=\"foo-20\" name=\"foo-20\"&gt;&lt;/a&gt;&lt;a href=\"#foo-20\"&gt;&lt;span class=\"linenos special\"&gt;20&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;for&lt;/span&gt; &lt;span class=\"testingn\"&gt;flag&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;nowrap&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;nobackground&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;anchorlinenos&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;):&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-21\"&gt;&lt;a id=\"foo-21\" name=\"foo-21\"&gt;&lt;/a&gt;&lt;a href=\"#foo-21\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingk\"&gt;if&lt;/span&gt; &lt;span class=\"testingn\"&gt;flag&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;:&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-22\"&gt;&lt;a id=\"foo-22\" name=\"foo-22\"&gt;&lt;/a&gt;&lt;a href=\"#foo-22\"&gt;&lt;span class=\"linenos special\"&gt;22&lt;/span&gt;&lt;/a&gt;            &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testingn\"&gt;flag&lt;/span&gt;&lt;span class=\"testingp\"&gt;]&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingkc\"&gt;True&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-23\"&gt;&lt;a id=\"foo-23\" name=\"foo-23\"&gt;&lt;/a&gt;&lt;a href=\"#foo-23\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-24\"&gt;&lt;a id=\"foo-24\" name=\"foo-24\"&gt;&lt;/a&gt;&lt;a href=\"#foo-24\"&gt;&lt;span class=\"linenos special\"&gt;24&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingc1\"&gt;# noclasses should already default to False, but just in case...&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-25\"&gt;&lt;a id=\"foo-25\" name=\"foo-25\"&gt;&lt;/a&gt;&lt;a href=\"#foo-25\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingn\"&gt;formatter&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;HtmlFormatter&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingn\"&gt;noclasses&lt;/span&gt;&lt;span class=\"testingo\"&gt;=&lt;/span&gt;&lt;span class=\"testingkc\"&gt;False&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingo\"&gt;**&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;)&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-26\"&gt;&lt;a id=\"foo-26\" name=\"foo-26\"&gt;&lt;/a&gt;&lt;a href=\"#foo-26\"&gt;&lt;span class=\"linenos special\"&gt;26&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingn\"&gt;parsed&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;highlight&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;&lt;/span&gt;&lt;span class=\"testingse\"&gt;\\n&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;join&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;content&lt;/span&gt;&lt;span class=\"testingp\"&gt;),&lt;/span&gt; &lt;span class=\"testingn\"&gt;lexer&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingn\"&gt;formatter&lt;/span&gt;&lt;span class=\"testingp\"&gt;)&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-27\"&gt;&lt;a id=\"foo-27\" name=\"foo-27\"&gt;&lt;/a&gt;&lt;a href=\"#foo-27\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;return&lt;/span&gt; &lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testingn\"&gt;nodes&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;raw&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingn\"&gt;parsed&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingnb\"&gt;format&lt;/span&gt;&lt;span class=\"testingo\"&gt;=&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;html&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;)]&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-even-more-sourcecode-directives\"&gt;\n&lt;h2&gt;Testing even more sourcecode directives&lt;/h2&gt;\n&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-overriding-config-defaults\"&gt;\n&lt;h2&gt;Testing overriding config defaults&lt;/h2&gt;\n&lt;p&gt;Even if the default is line numbers, we can override it here&lt;/p&gt;\n&lt;div class=\"highlight\"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n</content><category term=\"misc\"/></entry><entry><title>The baz tag</title><link href=\"http://blog.notmyidea.org/tag/baz.html\" rel=\"alternate\"/><published>2010-03-14T00:00:00+01:00</published><updated>2010-03-14T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-03-14:/tag/baz.html</id><content type=\"html\">&lt;p&gt;This article overrides the listening of the articles under the &lt;em&gt;baz&lt;/em&gt; tag.&lt;/p&gt;\n</content><category term=\"misc\"/></entry></feed>\n"
  },
  {
    "path": "pelican/tests/output/custom/feeds/alexis-metaireau.rss.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<rss version=\"2.0\" xmlns:atom=\"http://www.w3.org/2005/Atom\"><channel><title>Alexis' log - Alexis Métaireau</title><link>http://blog.notmyidea.org/</link><description>A personal blog.</description><atom:link href=\"http://blog.notmyidea.org/feeds/alexis-metaireau.rss.xml\" rel=\"self\"/><lastBuildDate>Sun, 17 Nov 2013 23:29:00 +0100</lastBuildDate><item><title>FILENAME_METADATA example</title><link>http://blog.notmyidea.org/filename_metadata-example.html</link><description>&lt;p&gt;Some cool stuff!&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Fri, 30 Nov 2012 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2012-11-30:/filename_metadata-example.html</guid><category>misc</category></item><item><title>Second article</title><link>http://blog.notmyidea.org/second-article.html</link><description>&lt;p&gt;This is some article, in english&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Wed, 29 Feb 2012 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2012-02-29:/second-article.html</guid><category>misc</category><category>foo</category><category>bar</category><category>baz</category></item><item><title>A markdown powered article</title><link>http://blog.notmyidea.org/a-markdown-powered-article.html</link><description>&lt;p&gt;You're mutually oblivious.&lt;/p&gt;\n&lt;p&gt;&lt;a href=\"http://blog.notmyidea.org/unbelievable.html\"&gt;a root-relative link to unbelievable&lt;/a&gt;\n&lt;a href=\"http://blog.notmyidea.org/unbelievable.html\"&gt;a file-relative link to unbelievable&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Wed, 20 Apr 2011 00:00:00 +0200</pubDate><guid>tag:blog.notmyidea.org,2011-04-20:/a-markdown-powered-article.html</guid><category>cat1</category></item><item><title>Article 1</title><link>http://blog.notmyidea.org/article-1.html</link><description>&lt;p&gt;Article 1&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Thu, 17 Feb 2011 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2011-02-17:/article-1.html</guid><category>cat1</category></item><item><title>Article 2</title><link>http://blog.notmyidea.org/article-2.html</link><description>&lt;p&gt;Article 2&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Thu, 17 Feb 2011 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2011-02-17:/article-2.html</guid><category>cat1</category></item><item><title>Article 3</title><link>http://blog.notmyidea.org/article-3.html</link><description>&lt;p&gt;Article 3&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Thu, 17 Feb 2011 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2011-02-17:/article-3.html</guid><category>cat1</category></item><item><title>This is a super article !</title><link>http://blog.notmyidea.org/this-is-a-super-article.html</link><description>&lt;p class=\"first last\"&gt;Multi-line metadata should be supported\nas well as &lt;strong&gt;inline markup&lt;/strong&gt;.&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Thu, 02 Dec 2010 10:14:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2010-12-02:/this-is-a-super-article.html</guid><category>yeah</category><category>foo</category><category>bar</category><category>foobar</category></item><item><title>Oh yeah !</title><link>http://blog.notmyidea.org/oh-yeah.html</link><description>&lt;div class=\"section\" id=\"why-not\"&gt;\n&lt;h2&gt;Why not ?&lt;/h2&gt;\n&lt;p&gt;After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\nYEAH !&lt;/p&gt;\n&lt;img alt=\"alternate text\" src=\"http://blog.notmyidea.org/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;/div&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Wed, 20 Oct 2010 10:14:00 +0200</pubDate><guid>tag:blog.notmyidea.org,2010-10-20:/oh-yeah.html</guid><category>bar</category><category>oh</category><category>bar</category><category>yeah</category></item><item><title>Unbelievable !</title><link>http://blog.notmyidea.org/unbelievable.html</link><description>&lt;p&gt;Or completely awesome. Depends the needs.&lt;/p&gt;\n&lt;p&gt;&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/a-markdown-powered-article.html\"&gt;a root-relative link to markdown-article&lt;/a&gt;\n&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/a-markdown-powered-article.html\"&gt;a file-relative link to markdown-article&lt;/a&gt;&lt;/p&gt;\n&lt;div class=\"section\" id=\"testing-sourcecode-directive\"&gt;\n&lt;h2&gt;Testing sourcecode directive&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;table class=\"highlighttable\"&gt;&lt;tr&gt;&lt;td class=\"linenos\"&gt;&lt;div class=\"linenodiv\"&gt;&lt;pre&gt;&lt;span class=\"normal\"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=\"code\"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-another-case\"&gt;\n&lt;h2&gt;Testing another case&lt;/h2&gt;\n&lt;p&gt;This will now have a line number in 'custom' since it's the default in\npelican.conf, it will …&lt;/p&gt;&lt;/div&gt;</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Fri, 15 Oct 2010 20:30:00 +0200</pubDate><guid>tag:blog.notmyidea.org,2010-10-15:/unbelievable.html</guid><category>misc</category></item><item><title>The baz tag</title><link>http://blog.notmyidea.org/tag/baz.html</link><description>&lt;p&gt;This article overrides the listening of the articles under the &lt;em&gt;baz&lt;/em&gt; tag.&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Sun, 14 Mar 2010 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2010-03-14:/tag/baz.html</guid><category>misc</category></item></channel></rss>\n"
  },
  {
    "path": "pelican/tests/output/custom/feeds/all-en.atom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<feed xmlns=\"http://www.w3.org/2005/Atom\"><title>Alexis' log</title><link href=\"http://blog.notmyidea.org/\" rel=\"alternate\"/><link href=\"http://blog.notmyidea.org/feeds/all-en.atom.xml\" rel=\"self\"/><id>http://blog.notmyidea.org/</id><updated>2013-11-17T23:29:00+01:00</updated><subtitle>A personal blog.</subtitle><entry><title>FILENAME_METADATA example</title><link href=\"http://blog.notmyidea.org/filename_metadata-example.html\" rel=\"alternate\"/><published>2012-11-30T00:00:00+01:00</published><updated>2012-11-30T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2012-11-30:/filename_metadata-example.html</id><content type=\"html\">&lt;p&gt;Some cool stuff!&lt;/p&gt;\n</content><category term=\"misc\"/></entry><entry><title>Second article</title><link href=\"http://blog.notmyidea.org/second-article.html\" rel=\"alternate\"/><published>2012-02-29T00:00:00+01:00</published><updated>2012-02-29T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2012-02-29:/second-article.html</id><content type=\"html\">&lt;p&gt;This is some article, in english&lt;/p&gt;\n</content><category term=\"misc\"/><category term=\"foo\"/><category term=\"bar\"/><category term=\"baz\"/></entry><entry><title>A markdown powered article</title><link href=\"http://blog.notmyidea.org/a-markdown-powered-article.html\" rel=\"alternate\"/><published>2011-04-20T00:00:00+02:00</published><updated>2011-04-20T00:00:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-04-20:/a-markdown-powered-article.html</id><content type=\"html\">&lt;p&gt;You're mutually oblivious.&lt;/p&gt;\n&lt;p&gt;&lt;a href=\"http://blog.notmyidea.org/unbelievable.html\"&gt;a root-relative link to unbelievable&lt;/a&gt;\n&lt;a href=\"http://blog.notmyidea.org/unbelievable.html\"&gt;a file-relative link to unbelievable&lt;/a&gt;&lt;/p&gt;</content><category term=\"cat1\"/></entry><entry><title>Article 1</title><link href=\"http://blog.notmyidea.org/article-1.html\" rel=\"alternate\"/><published>2011-02-17T00:00:00+01:00</published><updated>2011-02-17T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-02-17:/article-1.html</id><content type=\"html\">&lt;p&gt;Article 1&lt;/p&gt;\n</content><category term=\"cat1\"/></entry><entry><title>Article 2</title><link href=\"http://blog.notmyidea.org/article-2.html\" rel=\"alternate\"/><published>2011-02-17T00:00:00+01:00</published><updated>2011-02-17T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-02-17:/article-2.html</id><content type=\"html\">&lt;p&gt;Article 2&lt;/p&gt;\n</content><category term=\"cat1\"/></entry><entry><title>Article 3</title><link href=\"http://blog.notmyidea.org/article-3.html\" rel=\"alternate\"/><published>2011-02-17T00:00:00+01:00</published><updated>2011-02-17T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-02-17:/article-3.html</id><content type=\"html\">&lt;p&gt;Article 3&lt;/p&gt;\n</content><category term=\"cat1\"/></entry><entry><title>This is a super article !</title><link href=\"http://blog.notmyidea.org/this-is-a-super-article.html\" rel=\"alternate\"/><published>2010-12-02T10:14:00+01:00</published><updated>2013-11-17T23:29:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-12-02:/this-is-a-super-article.html</id><summary type=\"html\">&lt;p class=\"first last\"&gt;Multi-line metadata should be supported\nas well as &lt;strong&gt;inline markup&lt;/strong&gt;.&lt;/p&gt;\n</summary><content type=\"html\">&lt;p&gt;Some content here !&lt;/p&gt;\n&lt;div class=\"section\" id=\"this-is-a-simple-title\"&gt;\n&lt;h2&gt;This is a simple title&lt;/h2&gt;\n&lt;p&gt;And here comes the cool &lt;a class=\"reference external\" href=\"http://books.couchdb.org/relax/design-documents/views\"&gt;stuff&lt;/a&gt;.&lt;/p&gt;\n&lt;img alt=\"alternate text\" src=\"http://blog.notmyidea.org/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;img alt=\"alternate text\" src=\"http://blog.notmyidea.org/pictures/Sushi_Macro.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;pre class=\"literal-block\"&gt;\n&amp;gt;&amp;gt;&amp;gt; from ipdb import set_trace\n&amp;gt;&amp;gt;&amp;gt; set_trace()\n&lt;/pre&gt;\n&lt;p&gt;→ And now try with some utf8 hell: ééé&lt;/p&gt;\n&lt;/div&gt;\n</content><category term=\"yeah\"/><category term=\"foo\"/><category term=\"bar\"/><category term=\"foobar\"/></entry><entry><title>Oh yeah !</title><link href=\"http://blog.notmyidea.org/oh-yeah.html\" rel=\"alternate\"/><published>2010-10-20T10:14:00+02:00</published><updated>2010-10-20T10:14:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-10-20:/oh-yeah.html</id><content type=\"html\">&lt;div class=\"section\" id=\"why-not\"&gt;\n&lt;h2&gt;Why not ?&lt;/h2&gt;\n&lt;p&gt;After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\nYEAH !&lt;/p&gt;\n&lt;img alt=\"alternate text\" src=\"http://blog.notmyidea.org/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;/div&gt;\n</content><category term=\"bar\"/><category term=\"oh\"/><category term=\"bar\"/><category term=\"yeah\"/></entry><entry><title>Unbelievable !</title><link href=\"http://blog.notmyidea.org/unbelievable.html\" rel=\"alternate\"/><published>2010-10-15T20:30:00+02:00</published><updated>2010-10-15T20:30:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-10-15:/unbelievable.html</id><summary type=\"html\">&lt;p&gt;Or completely awesome. Depends the needs.&lt;/p&gt;\n&lt;p&gt;&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/a-markdown-powered-article.html\"&gt;a root-relative link to markdown-article&lt;/a&gt;\n&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/a-markdown-powered-article.html\"&gt;a file-relative link to markdown-article&lt;/a&gt;&lt;/p&gt;\n&lt;div class=\"section\" id=\"testing-sourcecode-directive\"&gt;\n&lt;h2&gt;Testing sourcecode directive&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;table class=\"highlighttable\"&gt;&lt;tr&gt;&lt;td class=\"linenos\"&gt;&lt;div class=\"linenodiv\"&gt;&lt;pre&gt;&lt;span class=\"normal\"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=\"code\"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-another-case\"&gt;\n&lt;h2&gt;Testing another case&lt;/h2&gt;\n&lt;p&gt;This will now have a line number in 'custom' since it's the default in\npelican.conf, it will …&lt;/p&gt;&lt;/div&gt;</summary><content type=\"html\">&lt;p&gt;Or completely awesome. Depends the needs.&lt;/p&gt;\n&lt;p&gt;&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/a-markdown-powered-article.html\"&gt;a root-relative link to markdown-article&lt;/a&gt;\n&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/a-markdown-powered-article.html\"&gt;a file-relative link to markdown-article&lt;/a&gt;&lt;/p&gt;\n&lt;div class=\"section\" id=\"testing-sourcecode-directive\"&gt;\n&lt;h2&gt;Testing sourcecode directive&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;table class=\"highlighttable\"&gt;&lt;tr&gt;&lt;td class=\"linenos\"&gt;&lt;div class=\"linenodiv\"&gt;&lt;pre&gt;&lt;span class=\"normal\"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=\"code\"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-another-case\"&gt;\n&lt;h2&gt;Testing another case&lt;/h2&gt;\n&lt;p&gt;This will now have a line number in 'custom' since it's the default in\npelican.conf, it will have nothing in default.&lt;/p&gt;\n&lt;div class=\"highlight\"&gt;&lt;table class=\"highlighttable\"&gt;&lt;tr&gt;&lt;td class=\"linenos\"&gt;&lt;div class=\"linenodiv\"&gt;&lt;pre&gt;&lt;span class=\"normal\"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=\"code\"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-more-sourcecode-directives\"&gt;\n&lt;h2&gt;Testing more sourcecode directives&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id=\"foo-8\"&gt;&lt;a id=\"foo-8\" name=\"foo-8\"&gt;&lt;/a&gt;&lt;a href=\"#foo-8\"&gt;&lt;span class=\"linenos special\"&gt; 8&lt;/span&gt;&lt;/a&gt;&lt;span class=\"testingk\"&gt;def&lt;/span&gt;&lt;span class=\"testingw\"&gt; &lt;/span&gt;&lt;span class=\"testingnf\"&gt;run&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingp\"&gt;):&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-9\"&gt;&lt;a id=\"foo-9\" name=\"foo-9\"&gt;&lt;/a&gt;&lt;a href=\"#foo-9\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;assert_has_content&lt;/span&gt;&lt;span class=\"testingp\"&gt;()&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-10\"&gt;&lt;a id=\"foo-10\" name=\"foo-10\"&gt;&lt;/a&gt;&lt;a href=\"#foo-10\"&gt;&lt;span class=\"linenos special\"&gt;10&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;try&lt;/span&gt;&lt;span class=\"testingp\"&gt;:&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-11\"&gt;&lt;a id=\"foo-11\" name=\"foo-11\"&gt;&lt;/a&gt;&lt;a href=\"#foo-11\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingn\"&gt;lexer&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;get_lexer_by_name&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;arguments&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testingmi\"&gt;0&lt;/span&gt;&lt;span class=\"testingp\"&gt;])&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-12\"&gt;&lt;a id=\"foo-12\" name=\"foo-12\"&gt;&lt;/a&gt;&lt;a href=\"#foo-12\"&gt;&lt;span class=\"linenos special\"&gt;12&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;except&lt;/span&gt; &lt;span class=\"testingne\"&gt;ValueError&lt;/span&gt;&lt;span class=\"testingp\"&gt;:&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-13\"&gt;&lt;a id=\"foo-13\" name=\"foo-13\"&gt;&lt;/a&gt;&lt;a href=\"#foo-13\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingc1\"&gt;# no lexer found - use the text one instead of an exception&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-14\"&gt;&lt;a id=\"foo-14\" name=\"foo-14\"&gt;&lt;/a&gt;&lt;a href=\"#foo-14\"&gt;&lt;span class=\"linenos special\"&gt;14&lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingn\"&gt;lexer&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;TextLexer&lt;/span&gt;&lt;span class=\"testingp\"&gt;()&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-15\"&gt;&lt;a id=\"foo-15\" name=\"foo-15\"&gt;&lt;/a&gt;&lt;a href=\"#foo-15\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-16\"&gt;&lt;a id=\"foo-16\" name=\"foo-16\"&gt;&lt;/a&gt;&lt;a href=\"#foo-16\"&gt;&lt;span class=\"linenos special\"&gt;16&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;if&lt;/span&gt; &lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;linenos&amp;#39;&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt; &lt;span class=\"testingow\"&gt;and&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-17\"&gt;&lt;a id=\"foo-17\" name=\"foo-17\"&gt;&lt;/a&gt;&lt;a href=\"#foo-17\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;            &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;linenos&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;]&lt;/span&gt; &lt;span class=\"testingow\"&gt;not&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;table&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;inline&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;)):&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-18\"&gt;&lt;a id=\"foo-18\" name=\"foo-18\"&gt;&lt;/a&gt;&lt;a href=\"#foo-18\"&gt;&lt;span class=\"linenos special\"&gt;18&lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;linenos&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;]&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;table&amp;#39;&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-19\"&gt;&lt;a id=\"foo-19\" name=\"foo-19\"&gt;&lt;/a&gt;&lt;a href=\"#foo-19\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-20\"&gt;&lt;a id=\"foo-20\" name=\"foo-20\"&gt;&lt;/a&gt;&lt;a href=\"#foo-20\"&gt;&lt;span class=\"linenos special\"&gt;20&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;for&lt;/span&gt; &lt;span class=\"testingn\"&gt;flag&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;nowrap&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;nobackground&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;anchorlinenos&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;):&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-21\"&gt;&lt;a id=\"foo-21\" name=\"foo-21\"&gt;&lt;/a&gt;&lt;a href=\"#foo-21\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingk\"&gt;if&lt;/span&gt; &lt;span class=\"testingn\"&gt;flag&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;:&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-22\"&gt;&lt;a id=\"foo-22\" name=\"foo-22\"&gt;&lt;/a&gt;&lt;a href=\"#foo-22\"&gt;&lt;span class=\"linenos special\"&gt;22&lt;/span&gt;&lt;/a&gt;            &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testingn\"&gt;flag&lt;/span&gt;&lt;span class=\"testingp\"&gt;]&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingkc\"&gt;True&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-23\"&gt;&lt;a id=\"foo-23\" name=\"foo-23\"&gt;&lt;/a&gt;&lt;a href=\"#foo-23\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-24\"&gt;&lt;a id=\"foo-24\" name=\"foo-24\"&gt;&lt;/a&gt;&lt;a href=\"#foo-24\"&gt;&lt;span class=\"linenos special\"&gt;24&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingc1\"&gt;# noclasses should already default to False, but just in case...&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-25\"&gt;&lt;a id=\"foo-25\" name=\"foo-25\"&gt;&lt;/a&gt;&lt;a href=\"#foo-25\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingn\"&gt;formatter&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;HtmlFormatter&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingn\"&gt;noclasses&lt;/span&gt;&lt;span class=\"testingo\"&gt;=&lt;/span&gt;&lt;span class=\"testingkc\"&gt;False&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingo\"&gt;**&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;)&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-26\"&gt;&lt;a id=\"foo-26\" name=\"foo-26\"&gt;&lt;/a&gt;&lt;a href=\"#foo-26\"&gt;&lt;span class=\"linenos special\"&gt;26&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingn\"&gt;parsed&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;highlight&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;&lt;/span&gt;&lt;span class=\"testingse\"&gt;\\n&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;join&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;content&lt;/span&gt;&lt;span class=\"testingp\"&gt;),&lt;/span&gt; &lt;span class=\"testingn\"&gt;lexer&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingn\"&gt;formatter&lt;/span&gt;&lt;span class=\"testingp\"&gt;)&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-27\"&gt;&lt;a id=\"foo-27\" name=\"foo-27\"&gt;&lt;/a&gt;&lt;a href=\"#foo-27\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;return&lt;/span&gt; &lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testingn\"&gt;nodes&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;raw&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingn\"&gt;parsed&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingnb\"&gt;format&lt;/span&gt;&lt;span class=\"testingo\"&gt;=&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;html&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;)]&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-even-more-sourcecode-directives\"&gt;\n&lt;h2&gt;Testing even more sourcecode directives&lt;/h2&gt;\n&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-overriding-config-defaults\"&gt;\n&lt;h2&gt;Testing overriding config defaults&lt;/h2&gt;\n&lt;p&gt;Even if the default is line numbers, we can override it here&lt;/p&gt;\n&lt;div class=\"highlight\"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n</content><category term=\"misc\"/></entry><entry><title>The baz tag</title><link href=\"http://blog.notmyidea.org/tag/baz.html\" rel=\"alternate\"/><published>2010-03-14T00:00:00+01:00</published><updated>2010-03-14T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-03-14:/tag/baz.html</id><content type=\"html\">&lt;p&gt;This article overrides the listening of the articles under the &lt;em&gt;baz&lt;/em&gt; tag.&lt;/p&gt;\n</content><category term=\"misc\"/></entry></feed>\n"
  },
  {
    "path": "pelican/tests/output/custom/feeds/all-fr.atom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<feed xmlns=\"http://www.w3.org/2005/Atom\"><title>Alexis' log</title><link href=\"http://blog.notmyidea.org/\" rel=\"alternate\"/><link href=\"http://blog.notmyidea.org/feeds/all-fr.atom.xml\" rel=\"self\"/><id>http://blog.notmyidea.org/</id><updated>2012-02-29T00:00:00+01:00</updated><subtitle>A personal blog.</subtitle><entry><title>Deuxième article</title><link href=\"http://blog.notmyidea.org/second-article-fr.html\" rel=\"alternate\"/><published>2012-02-29T00:00:00+01:00</published><updated>2012-02-29T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2012-02-29:/second-article-fr.html</id><content type=\"html\">&lt;p&gt;Ceci est un article, en français.&lt;/p&gt;\n</content><category term=\"misc\"/><category term=\"foo\"/><category term=\"bar\"/><category term=\"baz\"/></entry><entry><title>Trop bien !</title><link href=\"http://blog.notmyidea.org/oh-yeah-fr.html\" rel=\"alternate\"/><published>2010-10-20T10:14:00+02:00</published><updated>2010-10-20T10:14:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-10-20:/oh-yeah-fr.html</id><content type=\"html\">&lt;p&gt;Et voila du contenu en français&lt;/p&gt;\n</content><category term=\"misc\"/></entry></feed>\n"
  },
  {
    "path": "pelican/tests/output/custom/feeds/all.atom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<feed xmlns=\"http://www.w3.org/2005/Atom\"><title>Alexis' log</title><link href=\"http://blog.notmyidea.org/\" rel=\"alternate\"/><link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" rel=\"self\"/><id>http://blog.notmyidea.org/</id><updated>2013-11-17T23:29:00+01:00</updated><subtitle>A personal blog.</subtitle><entry><title>FILENAME_METADATA example</title><link href=\"http://blog.notmyidea.org/filename_metadata-example.html\" rel=\"alternate\"/><published>2012-11-30T00:00:00+01:00</published><updated>2012-11-30T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2012-11-30:/filename_metadata-example.html</id><content type=\"html\">&lt;p&gt;Some cool stuff!&lt;/p&gt;\n</content><category term=\"misc\"/></entry><entry><title>Second article</title><link href=\"http://blog.notmyidea.org/second-article.html\" rel=\"alternate\"/><published>2012-02-29T00:00:00+01:00</published><updated>2012-02-29T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2012-02-29:/second-article.html</id><content type=\"html\">&lt;p&gt;This is some article, in english&lt;/p&gt;\n</content><category term=\"misc\"/><category term=\"foo\"/><category term=\"bar\"/><category term=\"baz\"/></entry><entry><title>Deuxième article</title><link href=\"http://blog.notmyidea.org/second-article-fr.html\" rel=\"alternate\"/><published>2012-02-29T00:00:00+01:00</published><updated>2012-02-29T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2012-02-29:/second-article-fr.html</id><content type=\"html\">&lt;p&gt;Ceci est un article, en français.&lt;/p&gt;\n</content><category term=\"misc\"/><category term=\"foo\"/><category term=\"bar\"/><category term=\"baz\"/></entry><entry><title>A markdown powered article</title><link href=\"http://blog.notmyidea.org/a-markdown-powered-article.html\" rel=\"alternate\"/><published>2011-04-20T00:00:00+02:00</published><updated>2011-04-20T00:00:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-04-20:/a-markdown-powered-article.html</id><content type=\"html\">&lt;p&gt;You're mutually oblivious.&lt;/p&gt;\n&lt;p&gt;&lt;a href=\"http://blog.notmyidea.org/unbelievable.html\"&gt;a root-relative link to unbelievable&lt;/a&gt;\n&lt;a href=\"http://blog.notmyidea.org/unbelievable.html\"&gt;a file-relative link to unbelievable&lt;/a&gt;&lt;/p&gt;</content><category term=\"cat1\"/></entry><entry><title>Article 1</title><link href=\"http://blog.notmyidea.org/article-1.html\" rel=\"alternate\"/><published>2011-02-17T00:00:00+01:00</published><updated>2011-02-17T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-02-17:/article-1.html</id><content type=\"html\">&lt;p&gt;Article 1&lt;/p&gt;\n</content><category term=\"cat1\"/></entry><entry><title>Article 2</title><link href=\"http://blog.notmyidea.org/article-2.html\" rel=\"alternate\"/><published>2011-02-17T00:00:00+01:00</published><updated>2011-02-17T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-02-17:/article-2.html</id><content type=\"html\">&lt;p&gt;Article 2&lt;/p&gt;\n</content><category term=\"cat1\"/></entry><entry><title>Article 3</title><link href=\"http://blog.notmyidea.org/article-3.html\" rel=\"alternate\"/><published>2011-02-17T00:00:00+01:00</published><updated>2011-02-17T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-02-17:/article-3.html</id><content type=\"html\">&lt;p&gt;Article 3&lt;/p&gt;\n</content><category term=\"cat1\"/></entry><entry><title>This is a super article !</title><link href=\"http://blog.notmyidea.org/this-is-a-super-article.html\" rel=\"alternate\"/><published>2010-12-02T10:14:00+01:00</published><updated>2013-11-17T23:29:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-12-02:/this-is-a-super-article.html</id><summary type=\"html\">&lt;p class=\"first last\"&gt;Multi-line metadata should be supported\nas well as &lt;strong&gt;inline markup&lt;/strong&gt;.&lt;/p&gt;\n</summary><content type=\"html\">&lt;p&gt;Some content here !&lt;/p&gt;\n&lt;div class=\"section\" id=\"this-is-a-simple-title\"&gt;\n&lt;h2&gt;This is a simple title&lt;/h2&gt;\n&lt;p&gt;And here comes the cool &lt;a class=\"reference external\" href=\"http://books.couchdb.org/relax/design-documents/views\"&gt;stuff&lt;/a&gt;.&lt;/p&gt;\n&lt;img alt=\"alternate text\" src=\"http://blog.notmyidea.org/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;img alt=\"alternate text\" src=\"http://blog.notmyidea.org/pictures/Sushi_Macro.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;pre class=\"literal-block\"&gt;\n&amp;gt;&amp;gt;&amp;gt; from ipdb import set_trace\n&amp;gt;&amp;gt;&amp;gt; set_trace()\n&lt;/pre&gt;\n&lt;p&gt;→ And now try with some utf8 hell: ééé&lt;/p&gt;\n&lt;/div&gt;\n</content><category term=\"yeah\"/><category term=\"foo\"/><category term=\"bar\"/><category term=\"foobar\"/></entry><entry><title>Oh yeah !</title><link href=\"http://blog.notmyidea.org/oh-yeah.html\" rel=\"alternate\"/><published>2010-10-20T10:14:00+02:00</published><updated>2010-10-20T10:14:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-10-20:/oh-yeah.html</id><content type=\"html\">&lt;div class=\"section\" id=\"why-not\"&gt;\n&lt;h2&gt;Why not ?&lt;/h2&gt;\n&lt;p&gt;After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\nYEAH !&lt;/p&gt;\n&lt;img alt=\"alternate text\" src=\"http://blog.notmyidea.org/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;/div&gt;\n</content><category term=\"bar\"/><category term=\"oh\"/><category term=\"bar\"/><category term=\"yeah\"/></entry><entry><title>Trop bien !</title><link href=\"http://blog.notmyidea.org/oh-yeah-fr.html\" rel=\"alternate\"/><published>2010-10-20T10:14:00+02:00</published><updated>2010-10-20T10:14:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-10-20:/oh-yeah-fr.html</id><content type=\"html\">&lt;p&gt;Et voila du contenu en français&lt;/p&gt;\n</content><category term=\"misc\"/></entry><entry><title>Unbelievable !</title><link href=\"http://blog.notmyidea.org/unbelievable.html\" rel=\"alternate\"/><published>2010-10-15T20:30:00+02:00</published><updated>2010-10-15T20:30:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-10-15:/unbelievable.html</id><summary type=\"html\">&lt;p&gt;Or completely awesome. Depends the needs.&lt;/p&gt;\n&lt;p&gt;&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/a-markdown-powered-article.html\"&gt;a root-relative link to markdown-article&lt;/a&gt;\n&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/a-markdown-powered-article.html\"&gt;a file-relative link to markdown-article&lt;/a&gt;&lt;/p&gt;\n&lt;div class=\"section\" id=\"testing-sourcecode-directive\"&gt;\n&lt;h2&gt;Testing sourcecode directive&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;table class=\"highlighttable\"&gt;&lt;tr&gt;&lt;td class=\"linenos\"&gt;&lt;div class=\"linenodiv\"&gt;&lt;pre&gt;&lt;span class=\"normal\"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=\"code\"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-another-case\"&gt;\n&lt;h2&gt;Testing another case&lt;/h2&gt;\n&lt;p&gt;This will now have a line number in 'custom' since it's the default in\npelican.conf, it will …&lt;/p&gt;&lt;/div&gt;</summary><content type=\"html\">&lt;p&gt;Or completely awesome. Depends the needs.&lt;/p&gt;\n&lt;p&gt;&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/a-markdown-powered-article.html\"&gt;a root-relative link to markdown-article&lt;/a&gt;\n&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/a-markdown-powered-article.html\"&gt;a file-relative link to markdown-article&lt;/a&gt;&lt;/p&gt;\n&lt;div class=\"section\" id=\"testing-sourcecode-directive\"&gt;\n&lt;h2&gt;Testing sourcecode directive&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;table class=\"highlighttable\"&gt;&lt;tr&gt;&lt;td class=\"linenos\"&gt;&lt;div class=\"linenodiv\"&gt;&lt;pre&gt;&lt;span class=\"normal\"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=\"code\"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-another-case\"&gt;\n&lt;h2&gt;Testing another case&lt;/h2&gt;\n&lt;p&gt;This will now have a line number in 'custom' since it's the default in\npelican.conf, it will have nothing in default.&lt;/p&gt;\n&lt;div class=\"highlight\"&gt;&lt;table class=\"highlighttable\"&gt;&lt;tr&gt;&lt;td class=\"linenos\"&gt;&lt;div class=\"linenodiv\"&gt;&lt;pre&gt;&lt;span class=\"normal\"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=\"code\"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-more-sourcecode-directives\"&gt;\n&lt;h2&gt;Testing more sourcecode directives&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id=\"foo-8\"&gt;&lt;a id=\"foo-8\" name=\"foo-8\"&gt;&lt;/a&gt;&lt;a href=\"#foo-8\"&gt;&lt;span class=\"linenos special\"&gt; 8&lt;/span&gt;&lt;/a&gt;&lt;span class=\"testingk\"&gt;def&lt;/span&gt;&lt;span class=\"testingw\"&gt; &lt;/span&gt;&lt;span class=\"testingnf\"&gt;run&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingp\"&gt;):&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-9\"&gt;&lt;a id=\"foo-9\" name=\"foo-9\"&gt;&lt;/a&gt;&lt;a href=\"#foo-9\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;assert_has_content&lt;/span&gt;&lt;span class=\"testingp\"&gt;()&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-10\"&gt;&lt;a id=\"foo-10\" name=\"foo-10\"&gt;&lt;/a&gt;&lt;a href=\"#foo-10\"&gt;&lt;span class=\"linenos special\"&gt;10&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;try&lt;/span&gt;&lt;span class=\"testingp\"&gt;:&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-11\"&gt;&lt;a id=\"foo-11\" name=\"foo-11\"&gt;&lt;/a&gt;&lt;a href=\"#foo-11\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingn\"&gt;lexer&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;get_lexer_by_name&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;arguments&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testingmi\"&gt;0&lt;/span&gt;&lt;span class=\"testingp\"&gt;])&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-12\"&gt;&lt;a id=\"foo-12\" name=\"foo-12\"&gt;&lt;/a&gt;&lt;a href=\"#foo-12\"&gt;&lt;span class=\"linenos special\"&gt;12&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;except&lt;/span&gt; &lt;span class=\"testingne\"&gt;ValueError&lt;/span&gt;&lt;span class=\"testingp\"&gt;:&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-13\"&gt;&lt;a id=\"foo-13\" name=\"foo-13\"&gt;&lt;/a&gt;&lt;a href=\"#foo-13\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingc1\"&gt;# no lexer found - use the text one instead of an exception&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-14\"&gt;&lt;a id=\"foo-14\" name=\"foo-14\"&gt;&lt;/a&gt;&lt;a href=\"#foo-14\"&gt;&lt;span class=\"linenos special\"&gt;14&lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingn\"&gt;lexer&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;TextLexer&lt;/span&gt;&lt;span class=\"testingp\"&gt;()&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-15\"&gt;&lt;a id=\"foo-15\" name=\"foo-15\"&gt;&lt;/a&gt;&lt;a href=\"#foo-15\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-16\"&gt;&lt;a id=\"foo-16\" name=\"foo-16\"&gt;&lt;/a&gt;&lt;a href=\"#foo-16\"&gt;&lt;span class=\"linenos special\"&gt;16&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;if&lt;/span&gt; &lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;linenos&amp;#39;&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt; &lt;span class=\"testingow\"&gt;and&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-17\"&gt;&lt;a id=\"foo-17\" name=\"foo-17\"&gt;&lt;/a&gt;&lt;a href=\"#foo-17\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;            &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;linenos&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;]&lt;/span&gt; &lt;span class=\"testingow\"&gt;not&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;table&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;inline&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;)):&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-18\"&gt;&lt;a id=\"foo-18\" name=\"foo-18\"&gt;&lt;/a&gt;&lt;a href=\"#foo-18\"&gt;&lt;span class=\"linenos special\"&gt;18&lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;linenos&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;]&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;table&amp;#39;&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-19\"&gt;&lt;a id=\"foo-19\" name=\"foo-19\"&gt;&lt;/a&gt;&lt;a href=\"#foo-19\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-20\"&gt;&lt;a id=\"foo-20\" name=\"foo-20\"&gt;&lt;/a&gt;&lt;a href=\"#foo-20\"&gt;&lt;span class=\"linenos special\"&gt;20&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;for&lt;/span&gt; &lt;span class=\"testingn\"&gt;flag&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;nowrap&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;nobackground&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;anchorlinenos&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;):&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-21\"&gt;&lt;a id=\"foo-21\" name=\"foo-21\"&gt;&lt;/a&gt;&lt;a href=\"#foo-21\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingk\"&gt;if&lt;/span&gt; &lt;span class=\"testingn\"&gt;flag&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;:&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-22\"&gt;&lt;a id=\"foo-22\" name=\"foo-22\"&gt;&lt;/a&gt;&lt;a href=\"#foo-22\"&gt;&lt;span class=\"linenos special\"&gt;22&lt;/span&gt;&lt;/a&gt;            &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testingn\"&gt;flag&lt;/span&gt;&lt;span class=\"testingp\"&gt;]&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingkc\"&gt;True&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-23\"&gt;&lt;a id=\"foo-23\" name=\"foo-23\"&gt;&lt;/a&gt;&lt;a href=\"#foo-23\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-24\"&gt;&lt;a id=\"foo-24\" name=\"foo-24\"&gt;&lt;/a&gt;&lt;a href=\"#foo-24\"&gt;&lt;span class=\"linenos special\"&gt;24&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingc1\"&gt;# noclasses should already default to False, but just in case...&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-25\"&gt;&lt;a id=\"foo-25\" name=\"foo-25\"&gt;&lt;/a&gt;&lt;a href=\"#foo-25\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingn\"&gt;formatter&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;HtmlFormatter&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingn\"&gt;noclasses&lt;/span&gt;&lt;span class=\"testingo\"&gt;=&lt;/span&gt;&lt;span class=\"testingkc\"&gt;False&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingo\"&gt;**&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;)&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-26\"&gt;&lt;a id=\"foo-26\" name=\"foo-26\"&gt;&lt;/a&gt;&lt;a href=\"#foo-26\"&gt;&lt;span class=\"linenos special\"&gt;26&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingn\"&gt;parsed&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;highlight&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;&lt;/span&gt;&lt;span class=\"testingse\"&gt;\\n&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;join&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;content&lt;/span&gt;&lt;span class=\"testingp\"&gt;),&lt;/span&gt; &lt;span class=\"testingn\"&gt;lexer&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingn\"&gt;formatter&lt;/span&gt;&lt;span class=\"testingp\"&gt;)&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-27\"&gt;&lt;a id=\"foo-27\" name=\"foo-27\"&gt;&lt;/a&gt;&lt;a href=\"#foo-27\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;return&lt;/span&gt; &lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testingn\"&gt;nodes&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;raw&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingn\"&gt;parsed&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingnb\"&gt;format&lt;/span&gt;&lt;span class=\"testingo\"&gt;=&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;html&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;)]&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-even-more-sourcecode-directives\"&gt;\n&lt;h2&gt;Testing even more sourcecode directives&lt;/h2&gt;\n&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-overriding-config-defaults\"&gt;\n&lt;h2&gt;Testing overriding config defaults&lt;/h2&gt;\n&lt;p&gt;Even if the default is line numbers, we can override it here&lt;/p&gt;\n&lt;div class=\"highlight\"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n</content><category term=\"misc\"/></entry><entry><title>The baz tag</title><link href=\"http://blog.notmyidea.org/tag/baz.html\" rel=\"alternate\"/><published>2010-03-14T00:00:00+01:00</published><updated>2010-03-14T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-03-14:/tag/baz.html</id><content type=\"html\">&lt;p&gt;This article overrides the listening of the articles under the &lt;em&gt;baz&lt;/em&gt; tag.&lt;/p&gt;\n</content><category term=\"misc\"/></entry></feed>\n"
  },
  {
    "path": "pelican/tests/output/custom/feeds/all.rss.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<rss version=\"2.0\" xmlns:atom=\"http://www.w3.org/2005/Atom\"><channel><title>Alexis' log</title><link>http://blog.notmyidea.org/</link><description>A personal blog.</description><atom:link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" rel=\"self\"/><lastBuildDate>Sun, 17 Nov 2013 23:29:00 +0100</lastBuildDate><item><title>FILENAME_METADATA example</title><link>http://blog.notmyidea.org/filename_metadata-example.html</link><description>&lt;p&gt;Some cool stuff!&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Fri, 30 Nov 2012 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2012-11-30:/filename_metadata-example.html</guid><category>misc</category></item><item><title>Second article</title><link>http://blog.notmyidea.org/second-article.html</link><description>&lt;p&gt;This is some article, in english&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Wed, 29 Feb 2012 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2012-02-29:/second-article.html</guid><category>misc</category><category>foo</category><category>bar</category><category>baz</category></item><item><title>Deuxième article</title><link>http://blog.notmyidea.org/second-article-fr.html</link><description>&lt;p&gt;Ceci est un article, en français.&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Wed, 29 Feb 2012 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2012-02-29:/second-article-fr.html</guid><category>misc</category><category>foo</category><category>bar</category><category>baz</category></item><item><title>A markdown powered article</title><link>http://blog.notmyidea.org/a-markdown-powered-article.html</link><description>&lt;p&gt;You're mutually oblivious.&lt;/p&gt;\n&lt;p&gt;&lt;a href=\"http://blog.notmyidea.org/unbelievable.html\"&gt;a root-relative link to unbelievable&lt;/a&gt;\n&lt;a href=\"http://blog.notmyidea.org/unbelievable.html\"&gt;a file-relative link to unbelievable&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Wed, 20 Apr 2011 00:00:00 +0200</pubDate><guid>tag:blog.notmyidea.org,2011-04-20:/a-markdown-powered-article.html</guid><category>cat1</category></item><item><title>Article 1</title><link>http://blog.notmyidea.org/article-1.html</link><description>&lt;p&gt;Article 1&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Thu, 17 Feb 2011 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2011-02-17:/article-1.html</guid><category>cat1</category></item><item><title>Article 2</title><link>http://blog.notmyidea.org/article-2.html</link><description>&lt;p&gt;Article 2&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Thu, 17 Feb 2011 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2011-02-17:/article-2.html</guid><category>cat1</category></item><item><title>Article 3</title><link>http://blog.notmyidea.org/article-3.html</link><description>&lt;p&gt;Article 3&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Thu, 17 Feb 2011 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2011-02-17:/article-3.html</guid><category>cat1</category></item><item><title>This is a super article !</title><link>http://blog.notmyidea.org/this-is-a-super-article.html</link><description>&lt;p class=\"first last\"&gt;Multi-line metadata should be supported\nas well as &lt;strong&gt;inline markup&lt;/strong&gt;.&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Thu, 02 Dec 2010 10:14:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2010-12-02:/this-is-a-super-article.html</guid><category>yeah</category><category>foo</category><category>bar</category><category>foobar</category></item><item><title>Oh yeah !</title><link>http://blog.notmyidea.org/oh-yeah.html</link><description>&lt;div class=\"section\" id=\"why-not\"&gt;\n&lt;h2&gt;Why not ?&lt;/h2&gt;\n&lt;p&gt;After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\nYEAH !&lt;/p&gt;\n&lt;img alt=\"alternate text\" src=\"http://blog.notmyidea.org/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;/div&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Wed, 20 Oct 2010 10:14:00 +0200</pubDate><guid>tag:blog.notmyidea.org,2010-10-20:/oh-yeah.html</guid><category>bar</category><category>oh</category><category>bar</category><category>yeah</category></item><item><title>Trop bien !</title><link>http://blog.notmyidea.org/oh-yeah-fr.html</link><description>&lt;p&gt;Et voila du contenu en français&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Wed, 20 Oct 2010 10:14:00 +0200</pubDate><guid>tag:blog.notmyidea.org,2010-10-20:/oh-yeah-fr.html</guid><category>misc</category></item><item><title>Unbelievable !</title><link>http://blog.notmyidea.org/unbelievable.html</link><description>&lt;p&gt;Or completely awesome. Depends the needs.&lt;/p&gt;\n&lt;p&gt;&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/a-markdown-powered-article.html\"&gt;a root-relative link to markdown-article&lt;/a&gt;\n&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/a-markdown-powered-article.html\"&gt;a file-relative link to markdown-article&lt;/a&gt;&lt;/p&gt;\n&lt;div class=\"section\" id=\"testing-sourcecode-directive\"&gt;\n&lt;h2&gt;Testing sourcecode directive&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;table class=\"highlighttable\"&gt;&lt;tr&gt;&lt;td class=\"linenos\"&gt;&lt;div class=\"linenodiv\"&gt;&lt;pre&gt;&lt;span class=\"normal\"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=\"code\"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-another-case\"&gt;\n&lt;h2&gt;Testing another case&lt;/h2&gt;\n&lt;p&gt;This will now have a line number in 'custom' since it's the default in\npelican.conf, it will …&lt;/p&gt;&lt;/div&gt;</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Fri, 15 Oct 2010 20:30:00 +0200</pubDate><guid>tag:blog.notmyidea.org,2010-10-15:/unbelievable.html</guid><category>misc</category></item><item><title>The baz tag</title><link>http://blog.notmyidea.org/tag/baz.html</link><description>&lt;p&gt;This article overrides the listening of the articles under the &lt;em&gt;baz&lt;/em&gt; tag.&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Sun, 14 Mar 2010 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2010-03-14:/tag/baz.html</guid><category>misc</category></item></channel></rss>\n"
  },
  {
    "path": "pelican/tests/output/custom/feeds/bar.atom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<feed xmlns=\"http://www.w3.org/2005/Atom\"><title>Alexis' log - bar</title><link href=\"http://blog.notmyidea.org/\" rel=\"alternate\"/><link href=\"http://blog.notmyidea.org/feeds/bar.atom.xml\" rel=\"self\"/><id>http://blog.notmyidea.org/</id><updated>2010-10-20T10:14:00+02:00</updated><subtitle>A personal blog.</subtitle><entry><title>Oh yeah !</title><link href=\"http://blog.notmyidea.org/oh-yeah.html\" rel=\"alternate\"/><published>2010-10-20T10:14:00+02:00</published><updated>2010-10-20T10:14:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-10-20:/oh-yeah.html</id><content type=\"html\">&lt;div class=\"section\" id=\"why-not\"&gt;\n&lt;h2&gt;Why not ?&lt;/h2&gt;\n&lt;p&gt;After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\nYEAH !&lt;/p&gt;\n&lt;img alt=\"alternate text\" src=\"http://blog.notmyidea.org/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;/div&gt;\n</content><category term=\"bar\"/><category term=\"oh\"/><category term=\"bar\"/><category term=\"yeah\"/></entry></feed>\n"
  },
  {
    "path": "pelican/tests/output/custom/feeds/bar.rss.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<rss version=\"2.0\" xmlns:atom=\"http://www.w3.org/2005/Atom\"><channel><title>Alexis' log - bar</title><link>http://blog.notmyidea.org/</link><description>A personal blog.</description><atom:link href=\"http://blog.notmyidea.org/feeds/bar.rss.xml\" rel=\"self\"/><lastBuildDate>Wed, 20 Oct 2010 10:14:00 +0200</lastBuildDate><item><title>Oh yeah !</title><link>http://blog.notmyidea.org/oh-yeah.html</link><description>&lt;div class=\"section\" id=\"why-not\"&gt;\n&lt;h2&gt;Why not ?&lt;/h2&gt;\n&lt;p&gt;After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\nYEAH !&lt;/p&gt;\n&lt;img alt=\"alternate text\" src=\"http://blog.notmyidea.org/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;/div&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Wed, 20 Oct 2010 10:14:00 +0200</pubDate><guid>tag:blog.notmyidea.org,2010-10-20:/oh-yeah.html</guid><category>bar</category><category>oh</category><category>bar</category><category>yeah</category></item></channel></rss>\n"
  },
  {
    "path": "pelican/tests/output/custom/feeds/cat1.atom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<feed xmlns=\"http://www.w3.org/2005/Atom\"><title>Alexis' log - cat1</title><link href=\"http://blog.notmyidea.org/\" rel=\"alternate\"/><link href=\"http://blog.notmyidea.org/feeds/cat1.atom.xml\" rel=\"self\"/><id>http://blog.notmyidea.org/</id><updated>2011-04-20T00:00:00+02:00</updated><subtitle>A personal blog.</subtitle><entry><title>A markdown powered article</title><link href=\"http://blog.notmyidea.org/a-markdown-powered-article.html\" rel=\"alternate\"/><published>2011-04-20T00:00:00+02:00</published><updated>2011-04-20T00:00:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-04-20:/a-markdown-powered-article.html</id><content type=\"html\">&lt;p&gt;You're mutually oblivious.&lt;/p&gt;\n&lt;p&gt;&lt;a href=\"http://blog.notmyidea.org/unbelievable.html\"&gt;a root-relative link to unbelievable&lt;/a&gt;\n&lt;a href=\"http://blog.notmyidea.org/unbelievable.html\"&gt;a file-relative link to unbelievable&lt;/a&gt;&lt;/p&gt;</content><category term=\"cat1\"/></entry><entry><title>Article 1</title><link href=\"http://blog.notmyidea.org/article-1.html\" rel=\"alternate\"/><published>2011-02-17T00:00:00+01:00</published><updated>2011-02-17T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-02-17:/article-1.html</id><content type=\"html\">&lt;p&gt;Article 1&lt;/p&gt;\n</content><category term=\"cat1\"/></entry><entry><title>Article 2</title><link href=\"http://blog.notmyidea.org/article-2.html\" rel=\"alternate\"/><published>2011-02-17T00:00:00+01:00</published><updated>2011-02-17T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-02-17:/article-2.html</id><content type=\"html\">&lt;p&gt;Article 2&lt;/p&gt;\n</content><category term=\"cat1\"/></entry><entry><title>Article 3</title><link href=\"http://blog.notmyidea.org/article-3.html\" rel=\"alternate\"/><published>2011-02-17T00:00:00+01:00</published><updated>2011-02-17T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-02-17:/article-3.html</id><content type=\"html\">&lt;p&gt;Article 3&lt;/p&gt;\n</content><category term=\"cat1\"/></entry></feed>\n"
  },
  {
    "path": "pelican/tests/output/custom/feeds/cat1.rss.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<rss version=\"2.0\" xmlns:atom=\"http://www.w3.org/2005/Atom\"><channel><title>Alexis' log - cat1</title><link>http://blog.notmyidea.org/</link><description>A personal blog.</description><atom:link href=\"http://blog.notmyidea.org/feeds/cat1.rss.xml\" rel=\"self\"/><lastBuildDate>Wed, 20 Apr 2011 00:00:00 +0200</lastBuildDate><item><title>A markdown powered article</title><link>http://blog.notmyidea.org/a-markdown-powered-article.html</link><description>&lt;p&gt;You're mutually oblivious.&lt;/p&gt;\n&lt;p&gt;&lt;a href=\"http://blog.notmyidea.org/unbelievable.html\"&gt;a root-relative link to unbelievable&lt;/a&gt;\n&lt;a href=\"http://blog.notmyidea.org/unbelievable.html\"&gt;a file-relative link to unbelievable&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Wed, 20 Apr 2011 00:00:00 +0200</pubDate><guid>tag:blog.notmyidea.org,2011-04-20:/a-markdown-powered-article.html</guid><category>cat1</category></item><item><title>Article 1</title><link>http://blog.notmyidea.org/article-1.html</link><description>&lt;p&gt;Article 1&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Thu, 17 Feb 2011 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2011-02-17:/article-1.html</guid><category>cat1</category></item><item><title>Article 2</title><link>http://blog.notmyidea.org/article-2.html</link><description>&lt;p&gt;Article 2&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Thu, 17 Feb 2011 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2011-02-17:/article-2.html</guid><category>cat1</category></item><item><title>Article 3</title><link>http://blog.notmyidea.org/article-3.html</link><description>&lt;p&gt;Article 3&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Thu, 17 Feb 2011 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2011-02-17:/article-3.html</guid><category>cat1</category></item></channel></rss>\n"
  },
  {
    "path": "pelican/tests/output/custom/feeds/misc.atom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<feed xmlns=\"http://www.w3.org/2005/Atom\"><title>Alexis' log - misc</title><link href=\"http://blog.notmyidea.org/\" rel=\"alternate\"/><link href=\"http://blog.notmyidea.org/feeds/misc.atom.xml\" rel=\"self\"/><id>http://blog.notmyidea.org/</id><updated>2012-11-30T00:00:00+01:00</updated><subtitle>A personal blog.</subtitle><entry><title>FILENAME_METADATA example</title><link href=\"http://blog.notmyidea.org/filename_metadata-example.html\" rel=\"alternate\"/><published>2012-11-30T00:00:00+01:00</published><updated>2012-11-30T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2012-11-30:/filename_metadata-example.html</id><content type=\"html\">&lt;p&gt;Some cool stuff!&lt;/p&gt;\n</content><category term=\"misc\"/></entry><entry><title>Second article</title><link href=\"http://blog.notmyidea.org/second-article.html\" rel=\"alternate\"/><published>2012-02-29T00:00:00+01:00</published><updated>2012-02-29T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2012-02-29:/second-article.html</id><content type=\"html\">&lt;p&gt;This is some article, in english&lt;/p&gt;\n</content><category term=\"misc\"/><category term=\"foo\"/><category term=\"bar\"/><category term=\"baz\"/></entry><entry><title>Unbelievable !</title><link href=\"http://blog.notmyidea.org/unbelievable.html\" rel=\"alternate\"/><published>2010-10-15T20:30:00+02:00</published><updated>2010-10-15T20:30:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-10-15:/unbelievable.html</id><summary type=\"html\">&lt;p&gt;Or completely awesome. Depends the needs.&lt;/p&gt;\n&lt;p&gt;&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/a-markdown-powered-article.html\"&gt;a root-relative link to markdown-article&lt;/a&gt;\n&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/a-markdown-powered-article.html\"&gt;a file-relative link to markdown-article&lt;/a&gt;&lt;/p&gt;\n&lt;div class=\"section\" id=\"testing-sourcecode-directive\"&gt;\n&lt;h2&gt;Testing sourcecode directive&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;table class=\"highlighttable\"&gt;&lt;tr&gt;&lt;td class=\"linenos\"&gt;&lt;div class=\"linenodiv\"&gt;&lt;pre&gt;&lt;span class=\"normal\"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=\"code\"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-another-case\"&gt;\n&lt;h2&gt;Testing another case&lt;/h2&gt;\n&lt;p&gt;This will now have a line number in 'custom' since it's the default in\npelican.conf, it will …&lt;/p&gt;&lt;/div&gt;</summary><content type=\"html\">&lt;p&gt;Or completely awesome. Depends the needs.&lt;/p&gt;\n&lt;p&gt;&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/a-markdown-powered-article.html\"&gt;a root-relative link to markdown-article&lt;/a&gt;\n&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/a-markdown-powered-article.html\"&gt;a file-relative link to markdown-article&lt;/a&gt;&lt;/p&gt;\n&lt;div class=\"section\" id=\"testing-sourcecode-directive\"&gt;\n&lt;h2&gt;Testing sourcecode directive&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;table class=\"highlighttable\"&gt;&lt;tr&gt;&lt;td class=\"linenos\"&gt;&lt;div class=\"linenodiv\"&gt;&lt;pre&gt;&lt;span class=\"normal\"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=\"code\"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-another-case\"&gt;\n&lt;h2&gt;Testing another case&lt;/h2&gt;\n&lt;p&gt;This will now have a line number in 'custom' since it's the default in\npelican.conf, it will have nothing in default.&lt;/p&gt;\n&lt;div class=\"highlight\"&gt;&lt;table class=\"highlighttable\"&gt;&lt;tr&gt;&lt;td class=\"linenos\"&gt;&lt;div class=\"linenodiv\"&gt;&lt;pre&gt;&lt;span class=\"normal\"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=\"code\"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-more-sourcecode-directives\"&gt;\n&lt;h2&gt;Testing more sourcecode directives&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id=\"foo-8\"&gt;&lt;a id=\"foo-8\" name=\"foo-8\"&gt;&lt;/a&gt;&lt;a href=\"#foo-8\"&gt;&lt;span class=\"linenos special\"&gt; 8&lt;/span&gt;&lt;/a&gt;&lt;span class=\"testingk\"&gt;def&lt;/span&gt;&lt;span class=\"testingw\"&gt; &lt;/span&gt;&lt;span class=\"testingnf\"&gt;run&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingp\"&gt;):&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-9\"&gt;&lt;a id=\"foo-9\" name=\"foo-9\"&gt;&lt;/a&gt;&lt;a href=\"#foo-9\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;assert_has_content&lt;/span&gt;&lt;span class=\"testingp\"&gt;()&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-10\"&gt;&lt;a id=\"foo-10\" name=\"foo-10\"&gt;&lt;/a&gt;&lt;a href=\"#foo-10\"&gt;&lt;span class=\"linenos special\"&gt;10&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;try&lt;/span&gt;&lt;span class=\"testingp\"&gt;:&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-11\"&gt;&lt;a id=\"foo-11\" name=\"foo-11\"&gt;&lt;/a&gt;&lt;a href=\"#foo-11\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingn\"&gt;lexer&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;get_lexer_by_name&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;arguments&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testingmi\"&gt;0&lt;/span&gt;&lt;span class=\"testingp\"&gt;])&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-12\"&gt;&lt;a id=\"foo-12\" name=\"foo-12\"&gt;&lt;/a&gt;&lt;a href=\"#foo-12\"&gt;&lt;span class=\"linenos special\"&gt;12&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;except&lt;/span&gt; &lt;span class=\"testingne\"&gt;ValueError&lt;/span&gt;&lt;span class=\"testingp\"&gt;:&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-13\"&gt;&lt;a id=\"foo-13\" name=\"foo-13\"&gt;&lt;/a&gt;&lt;a href=\"#foo-13\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingc1\"&gt;# no lexer found - use the text one instead of an exception&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-14\"&gt;&lt;a id=\"foo-14\" name=\"foo-14\"&gt;&lt;/a&gt;&lt;a href=\"#foo-14\"&gt;&lt;span class=\"linenos special\"&gt;14&lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingn\"&gt;lexer&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;TextLexer&lt;/span&gt;&lt;span class=\"testingp\"&gt;()&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-15\"&gt;&lt;a id=\"foo-15\" name=\"foo-15\"&gt;&lt;/a&gt;&lt;a href=\"#foo-15\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-16\"&gt;&lt;a id=\"foo-16\" name=\"foo-16\"&gt;&lt;/a&gt;&lt;a href=\"#foo-16\"&gt;&lt;span class=\"linenos special\"&gt;16&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;if&lt;/span&gt; &lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;linenos&amp;#39;&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt; &lt;span class=\"testingow\"&gt;and&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-17\"&gt;&lt;a id=\"foo-17\" name=\"foo-17\"&gt;&lt;/a&gt;&lt;a href=\"#foo-17\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;            &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;linenos&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;]&lt;/span&gt; &lt;span class=\"testingow\"&gt;not&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;table&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;inline&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;)):&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-18\"&gt;&lt;a id=\"foo-18\" name=\"foo-18\"&gt;&lt;/a&gt;&lt;a href=\"#foo-18\"&gt;&lt;span class=\"linenos special\"&gt;18&lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;linenos&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;]&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;table&amp;#39;&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-19\"&gt;&lt;a id=\"foo-19\" name=\"foo-19\"&gt;&lt;/a&gt;&lt;a href=\"#foo-19\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-20\"&gt;&lt;a id=\"foo-20\" name=\"foo-20\"&gt;&lt;/a&gt;&lt;a href=\"#foo-20\"&gt;&lt;span class=\"linenos special\"&gt;20&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;for&lt;/span&gt; &lt;span class=\"testingn\"&gt;flag&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;nowrap&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;nobackground&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;anchorlinenos&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;):&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-21\"&gt;&lt;a id=\"foo-21\" name=\"foo-21\"&gt;&lt;/a&gt;&lt;a href=\"#foo-21\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingk\"&gt;if&lt;/span&gt; &lt;span class=\"testingn\"&gt;flag&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;:&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-22\"&gt;&lt;a id=\"foo-22\" name=\"foo-22\"&gt;&lt;/a&gt;&lt;a href=\"#foo-22\"&gt;&lt;span class=\"linenos special\"&gt;22&lt;/span&gt;&lt;/a&gt;            &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testingn\"&gt;flag&lt;/span&gt;&lt;span class=\"testingp\"&gt;]&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingkc\"&gt;True&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-23\"&gt;&lt;a id=\"foo-23\" name=\"foo-23\"&gt;&lt;/a&gt;&lt;a href=\"#foo-23\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-24\"&gt;&lt;a id=\"foo-24\" name=\"foo-24\"&gt;&lt;/a&gt;&lt;a href=\"#foo-24\"&gt;&lt;span class=\"linenos special\"&gt;24&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingc1\"&gt;# noclasses should already default to False, but just in case...&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-25\"&gt;&lt;a id=\"foo-25\" name=\"foo-25\"&gt;&lt;/a&gt;&lt;a href=\"#foo-25\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingn\"&gt;formatter&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;HtmlFormatter&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingn\"&gt;noclasses&lt;/span&gt;&lt;span class=\"testingo\"&gt;=&lt;/span&gt;&lt;span class=\"testingkc\"&gt;False&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingo\"&gt;**&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;)&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-26\"&gt;&lt;a id=\"foo-26\" name=\"foo-26\"&gt;&lt;/a&gt;&lt;a href=\"#foo-26\"&gt;&lt;span class=\"linenos special\"&gt;26&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingn\"&gt;parsed&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;highlight&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;&lt;/span&gt;&lt;span class=\"testingse\"&gt;\\n&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;join&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;content&lt;/span&gt;&lt;span class=\"testingp\"&gt;),&lt;/span&gt; &lt;span class=\"testingn\"&gt;lexer&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingn\"&gt;formatter&lt;/span&gt;&lt;span class=\"testingp\"&gt;)&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-27\"&gt;&lt;a id=\"foo-27\" name=\"foo-27\"&gt;&lt;/a&gt;&lt;a href=\"#foo-27\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;return&lt;/span&gt; &lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testingn\"&gt;nodes&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;raw&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingn\"&gt;parsed&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingnb\"&gt;format&lt;/span&gt;&lt;span class=\"testingo\"&gt;=&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;html&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;)]&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-even-more-sourcecode-directives\"&gt;\n&lt;h2&gt;Testing even more sourcecode directives&lt;/h2&gt;\n&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-overriding-config-defaults\"&gt;\n&lt;h2&gt;Testing overriding config defaults&lt;/h2&gt;\n&lt;p&gt;Even if the default is line numbers, we can override it here&lt;/p&gt;\n&lt;div class=\"highlight\"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n</content><category term=\"misc\"/></entry><entry><title>The baz tag</title><link href=\"http://blog.notmyidea.org/tag/baz.html\" rel=\"alternate\"/><published>2010-03-14T00:00:00+01:00</published><updated>2010-03-14T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-03-14:/tag/baz.html</id><content type=\"html\">&lt;p&gt;This article overrides the listening of the articles under the &lt;em&gt;baz&lt;/em&gt; tag.&lt;/p&gt;\n</content><category term=\"misc\"/></entry></feed>\n"
  },
  {
    "path": "pelican/tests/output/custom/feeds/misc.rss.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<rss version=\"2.0\" xmlns:atom=\"http://www.w3.org/2005/Atom\"><channel><title>Alexis' log - misc</title><link>http://blog.notmyidea.org/</link><description>A personal blog.</description><atom:link href=\"http://blog.notmyidea.org/feeds/misc.rss.xml\" rel=\"self\"/><lastBuildDate>Fri, 30 Nov 2012 00:00:00 +0100</lastBuildDate><item><title>FILENAME_METADATA example</title><link>http://blog.notmyidea.org/filename_metadata-example.html</link><description>&lt;p&gt;Some cool stuff!&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Fri, 30 Nov 2012 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2012-11-30:/filename_metadata-example.html</guid><category>misc</category></item><item><title>Second article</title><link>http://blog.notmyidea.org/second-article.html</link><description>&lt;p&gt;This is some article, in english&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Wed, 29 Feb 2012 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2012-02-29:/second-article.html</guid><category>misc</category><category>foo</category><category>bar</category><category>baz</category></item><item><title>Unbelievable !</title><link>http://blog.notmyidea.org/unbelievable.html</link><description>&lt;p&gt;Or completely awesome. Depends the needs.&lt;/p&gt;\n&lt;p&gt;&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/a-markdown-powered-article.html\"&gt;a root-relative link to markdown-article&lt;/a&gt;\n&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/a-markdown-powered-article.html\"&gt;a file-relative link to markdown-article&lt;/a&gt;&lt;/p&gt;\n&lt;div class=\"section\" id=\"testing-sourcecode-directive\"&gt;\n&lt;h2&gt;Testing sourcecode directive&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;table class=\"highlighttable\"&gt;&lt;tr&gt;&lt;td class=\"linenos\"&gt;&lt;div class=\"linenodiv\"&gt;&lt;pre&gt;&lt;span class=\"normal\"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=\"code\"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-another-case\"&gt;\n&lt;h2&gt;Testing another case&lt;/h2&gt;\n&lt;p&gt;This will now have a line number in 'custom' since it's the default in\npelican.conf, it will …&lt;/p&gt;&lt;/div&gt;</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Fri, 15 Oct 2010 20:30:00 +0200</pubDate><guid>tag:blog.notmyidea.org,2010-10-15:/unbelievable.html</guid><category>misc</category></item><item><title>The baz tag</title><link>http://blog.notmyidea.org/tag/baz.html</link><description>&lt;p&gt;This article overrides the listening of the articles under the &lt;em&gt;baz&lt;/em&gt; tag.&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Sun, 14 Mar 2010 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2010-03-14:/tag/baz.html</guid><category>misc</category></item></channel></rss>\n"
  },
  {
    "path": "pelican/tests/output/custom/feeds/yeah.atom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<feed xmlns=\"http://www.w3.org/2005/Atom\"><title>Alexis' log - yeah</title><link href=\"http://blog.notmyidea.org/\" rel=\"alternate\"/><link href=\"http://blog.notmyidea.org/feeds/yeah.atom.xml\" rel=\"self\"/><id>http://blog.notmyidea.org/</id><updated>2013-11-17T23:29:00+01:00</updated><subtitle>A personal blog.</subtitle><entry><title>This is a super article !</title><link href=\"http://blog.notmyidea.org/this-is-a-super-article.html\" rel=\"alternate\"/><published>2010-12-02T10:14:00+01:00</published><updated>2013-11-17T23:29:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-12-02:/this-is-a-super-article.html</id><summary type=\"html\">&lt;p class=\"first last\"&gt;Multi-line metadata should be supported\nas well as &lt;strong&gt;inline markup&lt;/strong&gt;.&lt;/p&gt;\n</summary><content type=\"html\">&lt;p&gt;Some content here !&lt;/p&gt;\n&lt;div class=\"section\" id=\"this-is-a-simple-title\"&gt;\n&lt;h2&gt;This is a simple title&lt;/h2&gt;\n&lt;p&gt;And here comes the cool &lt;a class=\"reference external\" href=\"http://books.couchdb.org/relax/design-documents/views\"&gt;stuff&lt;/a&gt;.&lt;/p&gt;\n&lt;img alt=\"alternate text\" src=\"http://blog.notmyidea.org/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;img alt=\"alternate text\" src=\"http://blog.notmyidea.org/pictures/Sushi_Macro.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;pre class=\"literal-block\"&gt;\n&amp;gt;&amp;gt;&amp;gt; from ipdb import set_trace\n&amp;gt;&amp;gt;&amp;gt; set_trace()\n&lt;/pre&gt;\n&lt;p&gt;→ And now try with some utf8 hell: ééé&lt;/p&gt;\n&lt;/div&gt;\n</content><category term=\"yeah\"/><category term=\"foo\"/><category term=\"bar\"/><category term=\"foobar\"/></entry></feed>\n"
  },
  {
    "path": "pelican/tests/output/custom/feeds/yeah.rss.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<rss version=\"2.0\" xmlns:atom=\"http://www.w3.org/2005/Atom\"><channel><title>Alexis' log - yeah</title><link>http://blog.notmyidea.org/</link><description>A personal blog.</description><atom:link href=\"http://blog.notmyidea.org/feeds/yeah.rss.xml\" rel=\"self\"/><lastBuildDate>Sun, 17 Nov 2013 23:29:00 +0100</lastBuildDate><item><title>This is a super article !</title><link>http://blog.notmyidea.org/this-is-a-super-article.html</link><description>&lt;p class=\"first last\"&gt;Multi-line metadata should be supported\nas well as &lt;strong&gt;inline markup&lt;/strong&gt;.&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Thu, 02 Dec 2010 10:14:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2010-12-02:/this-is-a-super-article.html</guid><category>yeah</category><category>foo</category><category>bar</category><category>foobar</category></item></channel></rss>\n"
  },
  {
    "path": "pelican/tests/output/custom/filename_metadata-example.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>FILENAME_METADATA example</title>\n                <link rel=\"stylesheet\" href=\"./theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n                <meta name=\"description\" content=\"Some cool stuff!\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"./\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li><a href=\"./tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"./override/\">Override url/save_as</a></li>\n                                <li><a href=\"./pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"./category/yeah.html\">yeah</a></li>\n                                <li class=\"active\"><a href=\"./category/misc.html\">misc</a></li>\n                                <li><a href=\"./category/cat1.html\">cat1</a></li>\n                                <li><a href=\"./category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"./filename_metadata-example.html\" rel=\"bookmark\"\n                                                   title=\"Permalink to FILENAME_METADATA example\">FILENAME_METADATA example</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2012-11-30T00:00:00+01:00\">\n                                                        Published: Fri 30 November 2012\n                                                </abbr>\n\n                                                <address class=\"vcard author\">\n                                                        By                         <a class=\"url fn\" href=\"./author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                </address>\n                                                <p>In <a href=\"./category/misc.html\">misc</a>.</p>\n\n                                        </footer><!-- /.post-info -->      <p>Some cool stuff!</p>\n\n                                </div><!-- /.entry-content -->\n                                <div class=\"comments\">\n                                        <h2>Comments !</h2>\n                                        <div id=\"disqus_thread\"></div>\n                                        <script type=\"text/javascript\">\n                                                var disqus_shortname = 'blog-notmyidea';\n                                                var disqus_identifier = 'filename_metadata-example.html';\n                                                var disqus_url = './filename_metadata-example.html';\n                                                (function() {\n                                                        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;\n                                                        dsq.src = '//blog-notmyidea.disqus.com/embed.js';\n                                                        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);\n                                                })();\n                                        </script>\n                                        <noscript>Please enable JavaScript to view the comments.</noscript>\n                                </div>\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log</title>\n                <link rel=\"stylesheet\" href=\"./theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"./\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li><a href=\"./tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"./override/\">Override url/save_as</a></li>\n                                <li><a href=\"./pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"./category/yeah.html\">yeah</a></li>\n                                <li><a href=\"./category/misc.html\">misc</a></li>\n                                <li><a href=\"./category/cat1.html\">cat1</a></li>\n                                <li><a href=\"./category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <aside id=\"featured\" class=\"body\">\n                        <article>\n                                <h1 class=\"entry-title\"><a href=\"./filename_metadata-example.html\">FILENAME_METADATA example</a></h1>\n                                <footer class=\"post-info\">\n                                        <abbr class=\"published\" title=\"2012-11-30T00:00:00+01:00\">\n                                                Published: Fri 30 November 2012\n                                        </abbr>\n\n                                        <address class=\"vcard author\">\n                                                By                         <a class=\"url fn\" href=\"./author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                        </address>\n                                        <p>In <a href=\"./category/misc.html\">misc</a>.</p>\n\n                                </footer><!-- /.post-info --><p>Some cool stuff!</p>\n                                <p>There are <a href=\"./filename_metadata-example.html#disqus_thread\">comments</a>.</p>                </article>\n                </aside><!-- /#featured -->\n                <section id=\"content\" class=\"body\">\n                        <h1>Other articles</h1>\n                        <hr />\n                        <ol id=\"posts-list\" class=\"hfeed\">\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"./second-article.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to Second article\">Second article</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2012-02-29T00:00:00+01:00\">\n                                                                Published: Wed 29 February 2012\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"./author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"./category/misc.html\">misc</a>.</p>\n                                                        <p>tags: <a href=\"./tag/foo.html\">foo</a> <a href=\"./tag/bar.html\">bar</a> <a href=\"./tag/baz.html\">baz</a> </p>Translations:\n                                                        <a href=\"./second-article-fr.html\" hreflang=\"fr\">fr</a>\n\n                                                </footer><!-- /.post-info -->                <p>This is some article, in english</p>\n\n                                                <a class=\"readmore\" href=\"./second-article.html\">read more</a>\n                                                <p>There are <a href=\"./second-article.html#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"./a-markdown-powered-article.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to A markdown powered article\">A markdown powered article</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2011-04-20T00:00:00+02:00\">\n                                                                Published: Wed 20 April 2011\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"./author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"./category/cat1.html\">cat1</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>You're mutually oblivious.</p>\n                                                <p><a href=\"./unbelievable.html\">a root-relative link to unbelievable</a>\n                                                        <a href=\"./unbelievable.html\">a file-relative link to unbelievable</a></p>\n                                                <a class=\"readmore\" href=\"./a-markdown-powered-article.html\">read more</a>\n                                                <p>There are <a href=\"./a-markdown-powered-article.html#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"./article-1.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to Article 1\">Article 1</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2011-02-17T00:00:00+01:00\">\n                                                                Published: Thu 17 February 2011\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"./author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"./category/cat1.html\">cat1</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>Article 1</p>\n\n                                                <a class=\"readmore\" href=\"./article-1.html\">read more</a>\n                                                <p>There are <a href=\"./article-1.html#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n                        </ol><!-- /#posts-list -->\n                        <nav>\n                                <ul>\n                                        <li>Page 1 / 3</li>\n                                        <li><a href=\"./index2.html\">&rang;</a></li>\n                                        <li><a href=\"./index3.html\">&Rang;</a></li>\n                                </ul>\n                        </nav>\n                </section><!-- /#content -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/index2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log</title>\n                <link rel=\"stylesheet\" href=\"./theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"./\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li><a href=\"./tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"./override/\">Override url/save_as</a></li>\n                                <li><a href=\"./pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"./category/yeah.html\">yeah</a></li>\n                                <li><a href=\"./category/misc.html\">misc</a></li>\n                                <li><a href=\"./category/cat1.html\">cat1</a></li>\n                                <li><a href=\"./category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <section id=\"content\" class=\"body\">\n                        <ol id=\"posts-list\" class=\"hfeed\" start=\"3\">\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"./article-2.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to Article 2\">Article 2</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2011-02-17T00:00:00+01:00\">\n                                                                Published: Thu 17 February 2011\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"./author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"./category/cat1.html\">cat1</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>Article 2</p>\n\n                                                <a class=\"readmore\" href=\"./article-2.html\">read more</a>\n                                                <p>There are <a href=\"./article-2.html#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"./article-3.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to Article 3\">Article 3</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2011-02-17T00:00:00+01:00\">\n                                                                Published: Thu 17 February 2011\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"./author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"./category/cat1.html\">cat1</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>Article 3</p>\n\n                                                <a class=\"readmore\" href=\"./article-3.html\">read more</a>\n                                                <p>There are <a href=\"./article-3.html#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"./this-is-a-super-article.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to This is a super article !\">This is a super article !</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2010-12-02T10:14:00+01:00\">\n                                                                Published: Thu 02 December 2010\n                                                        </abbr>\n                                                        <br />\n                                                        <abbr class=\"modified\" title=\"2013-11-17T23:29:00+01:00\">\n                                                                Updated: Sun 17 November 2013\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"./author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"./category/yeah.html\">yeah</a>.</p>\n                                                        <p>tags: <a href=\"./tag/foo.html\">foo</a> <a href=\"./tag/bar.html\">bar</a> <a href=\"./tag/foobar.html\">foobar</a> </p>\n                                                </footer><!-- /.post-info -->                <p class=\"first last\">Multi-line metadata should be supported\n                                                        as well as <strong>inline markup</strong>.</p>\n\n                                                <a class=\"readmore\" href=\"./this-is-a-super-article.html\">read more</a>\n                                                <p>There are <a href=\"./this-is-a-super-article.html#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"./oh-yeah.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to Oh yeah !\">Oh yeah !</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2010-10-20T10:14:00+02:00\">\n                                                                Published: Wed 20 October 2010\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"./author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"./category/bar.html\">bar</a>.</p>\n                                                        <p>tags: <a href=\"./tag/oh.html\">oh</a> <a href=\"./tag/bar.html\">bar</a> <a href=\"./tag/yeah.html\">yeah</a> </p>Translations:\n                                                        <a href=\"./oh-yeah-fr.html\" hreflang=\"fr\">fr</a>\n\n                                                </footer><!-- /.post-info -->                <div class=\"section\" id=\"why-not\">\n                                                        <h2>Why not ?</h2>\n                                                        <p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\n                                                                YEAH !</p>\n                                                        <img alt=\"alternate text\" src=\"./pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" />\n                                                </div>\n\n                                                <a class=\"readmore\" href=\"./oh-yeah.html\">read more</a>\n                                                <p>There are <a href=\"./oh-yeah.html#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n                        </ol><!-- /#posts-list -->\n                        <nav>\n                                <ul>\n                                        <li><a href=\"./index.html\">&Lang;</a></li>\n                                        <li><a href=\"./index.html\">&lang;</a></li>\n                                        <li>Page 2 / 3</li>\n                                        <li><a href=\"./index3.html\">&rang;</a></li>\n                                        <li><a href=\"./index3.html\">&Rang;</a></li>\n                                </ul>\n                        </nav>\n                </section><!-- /#content -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/index3.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log</title>\n                <link rel=\"stylesheet\" href=\"./theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"./\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li><a href=\"./tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"./override/\">Override url/save_as</a></li>\n                                <li><a href=\"./pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"./category/yeah.html\">yeah</a></li>\n                                <li><a href=\"./category/misc.html\">misc</a></li>\n                                <li><a href=\"./category/cat1.html\">cat1</a></li>\n                                <li><a href=\"./category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <section id=\"content\" class=\"body\">\n                        <ol id=\"posts-list\" class=\"hfeed\" start=\"3\">\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"./unbelievable.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to Unbelievable !\">Unbelievable !</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2010-10-15T20:30:00+02:00\">\n                                                                Published: Fri 15 October 2010\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"./author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"./category/misc.html\">misc</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>Or completely awesome. Depends the needs.</p>\n                                                <p><a class=\"reference external\" href=\"./a-markdown-powered-article.html\">a root-relative link to markdown-article</a>\n                                                        <a class=\"reference external\" href=\"./a-markdown-powered-article.html\">a file-relative link to markdown-article</a></p>\n                                                <div class=\"section\" id=\"testing-sourcecode-directive\">\n                                                        <h2>Testing sourcecode directive</h2>\n                                                        <div class=\"highlight\"><table class=\"highlighttable\"><tr><td class=\"linenos\"><div class=\"linenodiv\"><pre><span class=\"normal\">1</span></pre></div></td><td class=\"code\"><div><pre><span></span><span class=\"n\">formatter</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span> <span class=\"ow\">and</span> <span class=\"n\">VARIANTS</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]]</span>\n</pre></div></td></tr></table></div>\n                                                </div>\n                                                <div class=\"section\" id=\"testing-another-case\">\n                                                        <h2>Testing another case</h2>\n                                                        <p>This will now have a line number in 'custom' since it's the default in\n                                                                pelican.conf, it will …</p></div>\n                                                <a class=\"readmore\" href=\"./unbelievable.html\">read more</a>\n                                                <p>There are <a href=\"./unbelievable.html#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"./tag/baz.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to The baz tag\">The baz tag</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2010-03-14T00:00:00+01:00\">\n                                                                Published: Sun 14 March 2010\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"./author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"./category/misc.html\">misc</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>This article overrides the listening of the articles under the <em>baz</em> tag.</p>\n\n                                                <a class=\"readmore\" href=\"./tag/baz.html\">read more</a>\n                                                <p>There are <a href=\"./tag/baz.html#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n                        </ol><!-- /#posts-list -->\n                        <nav>\n                                <ul>\n                                        <li><a href=\"./index.html\">&Lang;</a></li>\n                                        <li><a href=\"./index2.html\">&lang;</a></li>\n                                        <li>Page 3 / 3</li>\n                                </ul>\n                        </nav>\n                </section><!-- /#content -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/jinja2_template.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log</title>\n                <link rel=\"stylesheet\" href=\"./theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"./\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li><a href=\"./tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"./override/\">Override url/save_as</a></li>\n                                <li><a href=\"./pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"./category/yeah.html\">yeah</a></li>\n                                <li><a href=\"./category/misc.html\">misc</a></li>\n                                <li><a href=\"./category/cat1.html\">cat1</a></li>\n                                <li><a href=\"./category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                Some text\n\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/oh-yeah-fr.html",
    "content": "<!DOCTYPE html>\n<html lang=\"fr\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Trop bien !</title>\n                <link rel=\"stylesheet\" href=\"./theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n                <link rel=\"alternate\" hreflang=\"en\" href=\"./oh-yeah.html\">\n\n                <meta name=\"description\" content=\"Et voila du contenu en français\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"./\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li><a href=\"./tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"./override/\">Override url/save_as</a></li>\n                                <li><a href=\"./pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"./category/yeah.html\">yeah</a></li>\n                                <li class=\"active\"><a href=\"./category/misc.html\">misc</a></li>\n                                <li><a href=\"./category/cat1.html\">cat1</a></li>\n                                <li><a href=\"./category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"./oh-yeah-fr.html\" rel=\"bookmark\"\n                                                   title=\"Permalink to Trop bien !\">Trop bien !</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2010-10-20T10:14:00+02:00\">\n                                                        Published: Wed 20 October 2010\n                                                </abbr>\n\n                                                <address class=\"vcard author\">\n                                                        By                         <a class=\"url fn\" href=\"./author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                </address>\n                                                <p>In <a href=\"./category/misc.html\">misc</a>.</p>\n                                                Translations:\n                                                <a href=\"./oh-yeah.html\" hreflang=\"en\">en</a>\n\n                                        </footer><!-- /.post-info -->      <p>Et voila du contenu en français</p>\n\n                                </div><!-- /.entry-content -->\n                                <div class=\"comments\">\n                                        <h2>Comments !</h2>\n                                        <div id=\"disqus_thread\"></div>\n                                        <script type=\"text/javascript\">\n                                                var disqus_shortname = 'blog-notmyidea';\n                                                var disqus_identifier = 'oh-yeah-fr.html';\n                                                var disqus_url = './oh-yeah-fr.html';\n                                                (function() {\n                                                        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;\n                                                        dsq.src = '//blog-notmyidea.disqus.com/embed.js';\n                                                        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);\n                                                })();\n                                        </script>\n                                        <noscript>Please enable JavaScript to view the comments.</noscript>\n                                </div>\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/oh-yeah.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Oh yeah !</title>\n                <link rel=\"stylesheet\" href=\"./theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n                <link rel=\"alternate\" hreflang=\"fr\" href=\"./oh-yeah-fr.html\">\n\n                <meta name=\"description\" content=\"Why not ? After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst ! YEAH !\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"./\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li><a href=\"./tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"./override/\">Override url/save_as</a></li>\n                                <li><a href=\"./pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"./category/yeah.html\">yeah</a></li>\n                                <li><a href=\"./category/misc.html\">misc</a></li>\n                                <li><a href=\"./category/cat1.html\">cat1</a></li>\n                                <li class=\"active\"><a href=\"./category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"./oh-yeah.html\" rel=\"bookmark\"\n                                                   title=\"Permalink to Oh yeah !\">Oh yeah !</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2010-10-20T10:14:00+02:00\">\n                                                        Published: Wed 20 October 2010\n                                                </abbr>\n\n                                                <address class=\"vcard author\">\n                                                        By                         <a class=\"url fn\" href=\"./author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                </address>\n                                                <p>In <a href=\"./category/bar.html\">bar</a>.</p>\n                                                <p>tags: <a href=\"./tag/oh.html\">oh</a> <a href=\"./tag/bar.html\">bar</a> <a href=\"./tag/yeah.html\">yeah</a> </p>Translations:\n                                                <a href=\"./oh-yeah-fr.html\" hreflang=\"fr\">fr</a>\n\n                                        </footer><!-- /.post-info -->      <div class=\"section\" id=\"why-not\">\n                                                <h2>Why not ?</h2>\n                                                <p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\n                                                        YEAH !</p>\n                                                <img alt=\"alternate text\" src=\"./pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" />\n                                        </div>\n\n                                </div><!-- /.entry-content -->\n                                <div class=\"comments\">\n                                        <h2>Comments !</h2>\n                                        <div id=\"disqus_thread\"></div>\n                                        <script type=\"text/javascript\">\n                                                var disqus_shortname = 'blog-notmyidea';\n                                                var disqus_identifier = 'oh-yeah.html';\n                                                var disqus_url = './oh-yeah.html';\n                                                (function() {\n                                                        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;\n                                                        dsq.src = '//blog-notmyidea.disqus.com/embed.js';\n                                                        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);\n                                                })();\n                                        </script>\n                                        <noscript>Please enable JavaScript to view the comments.</noscript>\n                                </div>\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/override/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Override url/save_as</title>\n                <link rel=\"stylesheet\" href=\"../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li><a href=\"../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li class=\"active\"><a href=\"../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../category/yeah.html\">yeah</a></li>\n                                <li><a href=\"../category/misc.html\">misc</a></li>\n                                <li><a href=\"../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <h1 class=\"entry-title\">Override url/save_as</h1>\n\n                        <p>Test page which overrides save_as and url so that this page will be generated\n                                at a custom location.</p>\n\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/pages/this-is-a-test-hidden-page.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>This is a test hidden page</title>\n                <link rel=\"stylesheet\" href=\"../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li><a href=\"../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../category/yeah.html\">yeah</a></li>\n                                <li><a href=\"../category/misc.html\">misc</a></li>\n                                <li><a href=\"../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <h1 class=\"entry-title\">This is a test hidden page</h1>\n\n                        <p>This is great for things like error(404) pages\n                                Anyone can see this page but it's not linked to anywhere!</p>\n\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/pages/this-is-a-test-page.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>This is a test page</title>\n                <link rel=\"stylesheet\" href=\"../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li><a href=\"../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../override/\">Override url/save_as</a></li>\n                                <li class=\"active\"><a href=\"../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../category/yeah.html\">yeah</a></li>\n                                <li><a href=\"../category/misc.html\">misc</a></li>\n                                <li><a href=\"../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <h1 class=\"entry-title\">This is a test page</h1>\n\n                        <p>Just an image.</p>\n                        <img alt=\"alternate text\" src=\"../pictures/Fat_Cat.jpg\" style=\"width: 600px; height: 450px;\" />\n                        <img alt=\"wrong path since 'images' folder does not exist\" src=\"|filename|/images/Fat_Cat.jpg\" style=\"width: 600px; height: 450px;\" />\n\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/robots.txt",
    "content": "User-agent: *\nDisallow: /pictures\n"
  },
  {
    "path": "pelican/tests/output/custom/second-article-fr.html",
    "content": "<!DOCTYPE html>\n<html lang=\"fr\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Deuxième article</title>\n                <link rel=\"stylesheet\" href=\"./theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n                <link rel=\"alternate\" hreflang=\"en\" href=\"./second-article.html\">\n\n                <meta name=\"description\" content=\"Ceci est un article, en français.\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"./\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li><a href=\"./tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"./override/\">Override url/save_as</a></li>\n                                <li><a href=\"./pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"./category/yeah.html\">yeah</a></li>\n                                <li class=\"active\"><a href=\"./category/misc.html\">misc</a></li>\n                                <li><a href=\"./category/cat1.html\">cat1</a></li>\n                                <li><a href=\"./category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"./second-article-fr.html\" rel=\"bookmark\"\n                                                   title=\"Permalink to Deuxième article\">Deuxième article</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2012-02-29T00:00:00+01:00\">\n                                                        Published: Wed 29 February 2012\n                                                </abbr>\n\n                                                <address class=\"vcard author\">\n                                                        By                         <a class=\"url fn\" href=\"./author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                </address>\n                                                <p>In <a href=\"./category/misc.html\">misc</a>.</p>\n                                                <p>tags: <a href=\"./tag/foo.html\">foo</a> <a href=\"./tag/bar.html\">bar</a> <a href=\"./tag/baz.html\">baz</a> </p>Translations:\n                                                <a href=\"./second-article.html\" hreflang=\"en\">en</a>\n\n                                        </footer><!-- /.post-info -->      <p>Ceci est un article, en français.</p>\n\n                                </div><!-- /.entry-content -->\n                                <div class=\"comments\">\n                                        <h2>Comments !</h2>\n                                        <div id=\"disqus_thread\"></div>\n                                        <script type=\"text/javascript\">\n                                                var disqus_shortname = 'blog-notmyidea';\n                                                var disqus_identifier = 'second-article-fr.html';\n                                                var disqus_url = './second-article-fr.html';\n                                                (function() {\n                                                        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;\n                                                        dsq.src = '//blog-notmyidea.disqus.com/embed.js';\n                                                        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);\n                                                })();\n                                        </script>\n                                        <noscript>Please enable JavaScript to view the comments.</noscript>\n                                </div>\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/second-article.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Second article</title>\n                <link rel=\"stylesheet\" href=\"./theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n                <link rel=\"alternate\" hreflang=\"fr\" href=\"./second-article-fr.html\">\n\n                <meta name=\"description\" content=\"This is some article, in english\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"./\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li><a href=\"./tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"./override/\">Override url/save_as</a></li>\n                                <li><a href=\"./pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"./category/yeah.html\">yeah</a></li>\n                                <li class=\"active\"><a href=\"./category/misc.html\">misc</a></li>\n                                <li><a href=\"./category/cat1.html\">cat1</a></li>\n                                <li><a href=\"./category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"./second-article.html\" rel=\"bookmark\"\n                                                   title=\"Permalink to Second article\">Second article</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2012-02-29T00:00:00+01:00\">\n                                                        Published: Wed 29 February 2012\n                                                </abbr>\n\n                                                <address class=\"vcard author\">\n                                                        By                         <a class=\"url fn\" href=\"./author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                </address>\n                                                <p>In <a href=\"./category/misc.html\">misc</a>.</p>\n                                                <p>tags: <a href=\"./tag/foo.html\">foo</a> <a href=\"./tag/bar.html\">bar</a> <a href=\"./tag/baz.html\">baz</a> </p>Translations:\n                                                <a href=\"./second-article-fr.html\" hreflang=\"fr\">fr</a>\n\n                                        </footer><!-- /.post-info -->      <p>This is some article, in english</p>\n\n                                </div><!-- /.entry-content -->\n                                <div class=\"comments\">\n                                        <h2>Comments !</h2>\n                                        <div id=\"disqus_thread\"></div>\n                                        <script type=\"text/javascript\">\n                                                var disqus_shortname = 'blog-notmyidea';\n                                                var disqus_identifier = 'second-article.html';\n                                                var disqus_url = './second-article.html';\n                                                (function() {\n                                                        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;\n                                                        dsq.src = '//blog-notmyidea.disqus.com/embed.js';\n                                                        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);\n                                                })();\n                                        </script>\n                                        <noscript>Please enable JavaScript to view the comments.</noscript>\n                                </div>\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/tag/bar.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log - bar</title>\n                <link rel=\"stylesheet\" href=\"../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li><a href=\"../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../category/yeah.html\">yeah</a></li>\n                                <li><a href=\"../category/misc.html\">misc</a></li>\n                                <li><a href=\"../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <aside id=\"featured\" class=\"body\">\n                        <article>\n                                <h1 class=\"entry-title\"><a href=\"../second-article.html\">Second article</a></h1>\n                                <footer class=\"post-info\">\n                                        <abbr class=\"published\" title=\"2012-02-29T00:00:00+01:00\">\n                                                Published: Wed 29 February 2012\n                                        </abbr>\n\n                                        <address class=\"vcard author\">\n                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                        </address>\n                                        <p>In <a href=\"../category/misc.html\">misc</a>.</p>\n                                        <p>tags: <a href=\"../tag/foo.html\">foo</a> <a href=\"../tag/bar.html\">bar</a> <a href=\"../tag/baz.html\">baz</a> </p>Translations:\n                                        <a href=\"../second-article-fr.html\" hreflang=\"fr\">fr</a>\n\n                                </footer><!-- /.post-info --><p>This is some article, in english</p>\n                                <p>There are <a href=\"../second-article.html#disqus_thread\">comments</a>.</p>                </article>\n                </aside><!-- /#featured -->\n                <section id=\"content\" class=\"body\">\n                        <h1>Other articles</h1>\n                        <hr />\n                        <ol id=\"posts-list\" class=\"hfeed\">\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"../this-is-a-super-article.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to This is a super article !\">This is a super article !</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2010-12-02T10:14:00+01:00\">\n                                                                Published: Thu 02 December 2010\n                                                        </abbr>\n                                                        <br />\n                                                        <abbr class=\"modified\" title=\"2013-11-17T23:29:00+01:00\">\n                                                                Updated: Sun 17 November 2013\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"../category/yeah.html\">yeah</a>.</p>\n                                                        <p>tags: <a href=\"../tag/foo.html\">foo</a> <a href=\"../tag/bar.html\">bar</a> <a href=\"../tag/foobar.html\">foobar</a> </p>\n                                                </footer><!-- /.post-info -->                <p class=\"first last\">Multi-line metadata should be supported\n                                                        as well as <strong>inline markup</strong>.</p>\n\n                                                <a class=\"readmore\" href=\"../this-is-a-super-article.html\">read more</a>\n                                                <p>There are <a href=\"../this-is-a-super-article.html#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"../oh-yeah.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to Oh yeah !\">Oh yeah !</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2010-10-20T10:14:00+02:00\">\n                                                                Published: Wed 20 October 2010\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"../category/bar.html\">bar</a>.</p>\n                                                        <p>tags: <a href=\"../tag/oh.html\">oh</a> <a href=\"../tag/bar.html\">bar</a> <a href=\"../tag/yeah.html\">yeah</a> </p>Translations:\n                                                        <a href=\"../oh-yeah-fr.html\" hreflang=\"fr\">fr</a>\n\n                                                </footer><!-- /.post-info -->                <div class=\"section\" id=\"why-not\">\n                                                        <h2>Why not ?</h2>\n                                                        <p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\n                                                                YEAH !</p>\n                                                        <img alt=\"alternate text\" src=\"../pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" />\n                                                </div>\n\n                                                <a class=\"readmore\" href=\"../oh-yeah.html\">read more</a>\n                                                <p>There are <a href=\"../oh-yeah.html#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n                        </ol><!-- /#posts-list -->\n                </section><!-- /#content -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/tag/baz.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>The baz tag</title>\n                <link rel=\"stylesheet\" href=\"../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n                <meta name=\"description\" content=\"This article overrides the listening of the articles under the baz tag.\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li><a href=\"../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../category/yeah.html\">yeah</a></li>\n                                <li class=\"active\"><a href=\"../category/misc.html\">misc</a></li>\n                                <li><a href=\"../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"../tag/baz.html\" rel=\"bookmark\"\n                                                   title=\"Permalink to The baz tag\">The baz tag</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2010-03-14T00:00:00+01:00\">\n                                                        Published: Sun 14 March 2010\n                                                </abbr>\n\n                                                <address class=\"vcard author\">\n                                                        By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                </address>\n                                                <p>In <a href=\"../category/misc.html\">misc</a>.</p>\n\n                                        </footer><!-- /.post-info -->      <p>This article overrides the listening of the articles under the <em>baz</em> tag.</p>\n\n                                </div><!-- /.entry-content -->\n                                <div class=\"comments\">\n                                        <h2>Comments !</h2>\n                                        <div id=\"disqus_thread\"></div>\n                                        <script type=\"text/javascript\">\n                                                var disqus_shortname = 'blog-notmyidea';\n                                                var disqus_identifier = 'tag/baz.html';\n                                                var disqus_url = '../tag/baz.html';\n                                                (function() {\n                                                        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;\n                                                        dsq.src = '//blog-notmyidea.disqus.com/embed.js';\n                                                        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);\n                                                })();\n                                        </script>\n                                        <noscript>Please enable JavaScript to view the comments.</noscript>\n                                </div>\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/tag/foo.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log - foo</title>\n                <link rel=\"stylesheet\" href=\"../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li><a href=\"../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../category/yeah.html\">yeah</a></li>\n                                <li><a href=\"../category/misc.html\">misc</a></li>\n                                <li><a href=\"../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <aside id=\"featured\" class=\"body\">\n                        <article>\n                                <h1 class=\"entry-title\"><a href=\"../second-article.html\">Second article</a></h1>\n                                <footer class=\"post-info\">\n                                        <abbr class=\"published\" title=\"2012-02-29T00:00:00+01:00\">\n                                                Published: Wed 29 February 2012\n                                        </abbr>\n\n                                        <address class=\"vcard author\">\n                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                        </address>\n                                        <p>In <a href=\"../category/misc.html\">misc</a>.</p>\n                                        <p>tags: <a href=\"../tag/foo.html\">foo</a> <a href=\"../tag/bar.html\">bar</a> <a href=\"../tag/baz.html\">baz</a> </p>Translations:\n                                        <a href=\"../second-article-fr.html\" hreflang=\"fr\">fr</a>\n\n                                </footer><!-- /.post-info --><p>This is some article, in english</p>\n                                <p>There are <a href=\"../second-article.html#disqus_thread\">comments</a>.</p>                </article>\n                </aside><!-- /#featured -->\n                <section id=\"content\" class=\"body\">\n                        <h1>Other articles</h1>\n                        <hr />\n                        <ol id=\"posts-list\" class=\"hfeed\">\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"../this-is-a-super-article.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to This is a super article !\">This is a super article !</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2010-12-02T10:14:00+01:00\">\n                                                                Published: Thu 02 December 2010\n                                                        </abbr>\n                                                        <br />\n                                                        <abbr class=\"modified\" title=\"2013-11-17T23:29:00+01:00\">\n                                                                Updated: Sun 17 November 2013\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"../category/yeah.html\">yeah</a>.</p>\n                                                        <p>tags: <a href=\"../tag/foo.html\">foo</a> <a href=\"../tag/bar.html\">bar</a> <a href=\"../tag/foobar.html\">foobar</a> </p>\n                                                </footer><!-- /.post-info -->                <p class=\"first last\">Multi-line metadata should be supported\n                                                        as well as <strong>inline markup</strong>.</p>\n\n                                                <a class=\"readmore\" href=\"../this-is-a-super-article.html\">read more</a>\n                                                <p>There are <a href=\"../this-is-a-super-article.html#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n                        </ol><!-- /#posts-list -->\n                </section><!-- /#content -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/tag/foobar.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log - foobar</title>\n                <link rel=\"stylesheet\" href=\"../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li><a href=\"../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../category/yeah.html\">yeah</a></li>\n                                <li><a href=\"../category/misc.html\">misc</a></li>\n                                <li><a href=\"../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <aside id=\"featured\" class=\"body\">\n                        <article>\n                                <h1 class=\"entry-title\"><a href=\"../this-is-a-super-article.html\">This is a super article !</a></h1>\n                                <footer class=\"post-info\">\n                                        <abbr class=\"published\" title=\"2010-12-02T10:14:00+01:00\">\n                                                Published: Thu 02 December 2010\n                                        </abbr>\n                                        <br />\n                                        <abbr class=\"modified\" title=\"2013-11-17T23:29:00+01:00\">\n                                                Updated: Sun 17 November 2013\n                                        </abbr>\n\n                                        <address class=\"vcard author\">\n                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                        </address>\n                                        <p>In <a href=\"../category/yeah.html\">yeah</a>.</p>\n                                        <p>tags: <a href=\"../tag/foo.html\">foo</a> <a href=\"../tag/bar.html\">bar</a> <a href=\"../tag/foobar.html\">foobar</a> </p>\n                                </footer><!-- /.post-info --><p>Some content here !</p>\n                                <div class=\"section\" id=\"this-is-a-simple-title\">\n                                        <h2>This is a simple title</h2>\n                                        <p>And here comes the cool <a class=\"reference external\" href=\"http://books.couchdb.org/relax/design-documents/views\">stuff</a>.</p>\n                                        <img alt=\"alternate text\" src=\"../pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" />\n                                        <img alt=\"alternate text\" src=\"../pictures/Sushi_Macro.jpg\" style=\"width: 600px; height: 450px;\" />\n<pre class=\"literal-block\">\n&gt;&gt;&gt; from ipdb import set_trace\n&gt;&gt;&gt; set_trace()\n</pre>\n                                        <p>→ And now try with some utf8 hell: ééé</p>\n                                </div>\n                                <p>There are <a href=\"../this-is-a-super-article.html#disqus_thread\">comments</a>.</p>                </article>\n                </aside><!-- /#featured -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/tag/oh.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Oh Oh Oh</title>\n                <link rel=\"stylesheet\" href=\"../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li class=\"active\"><a href=\"../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../category/yeah.html\">yeah</a></li>\n                                <li><a href=\"../category/misc.html\">misc</a></li>\n                                <li><a href=\"../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <h1 class=\"entry-title\">Oh Oh Oh</h1>\n\n                        <p>This page overrides the listening of the articles under the <em>oh</em> tag.</p>\n\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/tag/yeah.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log - yeah</title>\n                <link rel=\"stylesheet\" href=\"../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li><a href=\"../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../category/yeah.html\">yeah</a></li>\n                                <li><a href=\"../category/misc.html\">misc</a></li>\n                                <li><a href=\"../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <aside id=\"featured\" class=\"body\">\n                        <article>\n                                <h1 class=\"entry-title\"><a href=\"../oh-yeah.html\">Oh yeah !</a></h1>\n                                <footer class=\"post-info\">\n                                        <abbr class=\"published\" title=\"2010-10-20T10:14:00+02:00\">\n                                                Published: Wed 20 October 2010\n                                        </abbr>\n\n                                        <address class=\"vcard author\">\n                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                        </address>\n                                        <p>In <a href=\"../category/bar.html\">bar</a>.</p>\n                                        <p>tags: <a href=\"../tag/oh.html\">oh</a> <a href=\"../tag/bar.html\">bar</a> <a href=\"../tag/yeah.html\">yeah</a> </p>Translations:\n                                        <a href=\"../oh-yeah-fr.html\" hreflang=\"fr\">fr</a>\n\n                                </footer><!-- /.post-info --><div class=\"section\" id=\"why-not\">\n                                        <h2>Why not ?</h2>\n                                        <p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\n                                                YEAH !</p>\n                                        <img alt=\"alternate text\" src=\"../pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" />\n                                </div>\n                                <p>There are <a href=\"../oh-yeah.html#disqus_thread\">comments</a>.</p>                </article>\n                </aside><!-- /#featured -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/tags.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log - Tags</title>\n                <link rel=\"stylesheet\" href=\"./theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"./\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li><a href=\"./tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"./override/\">Override url/save_as</a></li>\n                                <li><a href=\"./pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"./category/yeah.html\">yeah</a></li>\n                                <li><a href=\"./category/misc.html\">misc</a></li>\n                                <li><a href=\"./category/cat1.html\">cat1</a></li>\n                                <li><a href=\"./category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <section id=\"content\" class=\"body\">\n                        <h1>Tags for Alexis' log</h1>\n                        <ul>\n                                <li><a href=\"./tag/bar.html\">bar</a> (3)</li>\n                                <li><a href=\"./tag/baz.html\">baz</a> (1)</li>\n                                <li><a href=\"./tag/foo.html\">foo</a> (2)</li>\n                                <li><a href=\"./tag/foobar.html\">foobar</a> (1)</li>\n                                <li><a href=\"./tag/oh.html\">oh</a> (1)</li>\n                                <li><a href=\"./tag/yeah.html\">yeah</a> (1)</li>\n                        </ul>\n                </section>\n\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/theme/css/fonts.css",
    "content": "@font-face {\n    font-family: 'Yanone Kaffeesatz';\n    font-style: normal;\n    font-weight: 400;\n    src:\n    local('Yanone Kaffeesatz Regular'),\n    local('YanoneKaffeesatz-Regular'),\n\t\t/* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLRTHiN2BPBirwIkMLKUspj4.woff */\n    url('../fonts/Yanone_Kaffeesatz_400.woff') format('woff'),\n\t\t/* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLfGwxTS8d1Q9KiDNCMKLFUM.woff2 */\n    url('../fonts/Yanone_Kaffeesatz_400.woff2') format('woff2');\n}\n"
  },
  {
    "path": "pelican/tests/output/custom/theme/css/main.css",
    "content": "/*\n\tName: Smashing HTML5\n\tDate: July 2009\n\tDescription: Sample layout for HTML5 and CSS3 goodness.\n\tVersion: 1.0\n\tLicense: MIT <https://opensource.org/licenses/MIT>\n\tLicensed by: Smashing Media GmbH <https://www.smashingmagazine.com/>\n\tOriginal author: Enrique Ramírez <http://enrique-ramirez.com/>\n*/\n\n/* Imports */\n@import url(\"reset.css\");\n@import url(\"pygment.css\");\n@import url(\"typogrify.css\");\n@import url(\"fonts.css\");\n\n/***** Global *****/\n/* Body */\nbody {\n    background: #F5F4EF;\n    color: #000305;\n    font-size: 87.5%; /* Base font size: 14px */\n    font-family: 'Trebuchet MS', Trebuchet, 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif;\n    line-height: 1.429;\n    margin: 0;\n    padding: 0;\n    text-align: left;\n}\n\n@media (prefers-color-scheme: dark) {\n    body {\n        background: #070808;\n        color: #FFFEFE;\n    }\n}\n\n/* Headings */\nh1 {font-size: 2em }\nh2 {font-size: 1.571em}\t/* 22px */\nh3 {font-size: 1.429em}\t/* 20px */\nh4 {font-size: 1.286em}\t/* 18px */\nh5 {font-size: 1.143em}\t/* 16px */\nh6 {font-size: 1em}\t\t/* 14px */\n\nh1, h2, h3, h4, h5, h6 {\n    font-weight: 400;\n    line-height: 1.1;\n    margin-bottom: .8em;\n    font-family: 'Yanone Kaffeesatz', arial, serif;\n}\n\nh3, h4, h5, h6 { margin-top: .8em; }\n\nhr { border: 2px solid #EEEEEE; }\n\n/* Anchors */\na {outline: 0;}\na img {border: 0px; text-decoration: none;}\na:link, a:visited {\n    color: #C74350;\n    padding: 0 1px;\n    text-decoration: underline;\n}\na:hover, a:active {\n    background-color: #C74350;\n    color: #fff;\n    text-decoration: none;\n    text-shadow: 1px 1px 1px #333;\n}\n\nh1 a:hover {\n    background-color: inherit\n}\n\n/* Paragraphs */\ndiv.line-block,\np { margin-top: 1em;\n    margin-bottom: 1em;}\n\nstrong, b {font-weight: bold;}\nem, i {font-style: italic;}\n\n/* Lists */\nul {\n    list-style: outside disc;\n    margin: 0em 0 0 1.5em;\n}\n\nol {\n    list-style: outside decimal;\n    margin: 0em 0 0 1.5em;\n}\n\nli { margin-top: 0.5em;\n    margin-bottom: 1em; }\n\n.post-info {\n    float:right;\n    margin:10px;\n    padding:5px;\n}\n\n.post-info p{\n    margin-top: 1px;\n    margin-bottom: 1px;\n}\n\n.readmore { float: right }\n\ndl {margin: 0 0 1.5em 0;}\ndt {font-weight: bold;}\ndd {margin-left: 1.5em;}\n\npre{background-color:  rgb(238, 238, 238); padding: 10px; margin: 10px; overflow: auto;}\n\n@media (prefers-color-scheme: dark) {\n    pre {\n        background: rgb(38, 38, 38);\n    }\n}\n\n/* Quotes */\nblockquote {\n    margin: 20px;\n    font-style: italic;\n}\ncite {}\n\nq {}\n\ndiv.note {\n    float: right;\n    margin: 5px;\n    font-size: 85%;\n    max-width: 300px;\n}\n\n/* Tables */\ntable {margin: .5em auto 1.5em auto; width: 98%;}\n\n\t/* Thead */\nthead th {padding: .5em .4em; text-align: left;}\nthead td {}\n\n\t/* Tbody */\ntbody td {padding: .5em .4em;}\ntbody th {}\n\ntbody .alt td {}\ntbody .alt th {}\n\n\t/* Tfoot */\ntfoot th {}\ntfoot td {}\n\n/* HTML5 tags */\nheader, section, footer,\naside, nav, article, figure {\n    display: block;\n}\n\n/***** Layout *****/\n.body {clear: both; margin: 0 auto; max-width: 800px;}\nimg { max-width: 100%; }\nimg.right, figure.right, div.figure.align-right {\n    float: right;\n    margin: 0 0 2em 2em;\n}\nimg.left, figure.left, div.figure.align-left {\n    float: left;\n    margin: 0 2em 2em 0;\n}\n\n/* .rst support */\ndiv.figure img, figure img {  /* to fill figure exactly */\n    max-width: 100%;\n}\ndiv.figure p.caption, figure p.caption { /* margin provided by figure */\n    margin-top: 0;\n    margin-bottom: 0;\n}\n\n/*\n\tHeader\n*****************/\n#banner {\n    margin: 0 auto;\n    padding: 0.8em 0 0 0;\n}\n\n\t/* Banner */\n#banner h1 {\n    font-size: 3.571em;\n    line-height: 1.0;\n    margin-bottom: .3em;\n}\n\n#banner h1 a:link, #banner h1 a:visited {\n    color: #000305;\n    display: block;\n    font-weight: bold;\n    margin: 0 0 0 .2em;\n    text-decoration: none;\n}\n#banner h1 a:hover, #banner h1 a:active {\n    background: none;\n    color: #C74350;\n    text-shadow: none;\n}\n\n#banner h1 strong {font-size: 0.36em; font-weight: normal;}\n\n@media (prefers-color-scheme: dark) {\n    #banner h1 a:link, #banner h1 a:visited {\n        color: #FFFAF8;\n    }\n}\n\n\t/* Main Nav */\n#banner nav {\n    background: #000305;\n    font-size: 1.143em;\n    overflow: auto;\n    line-height: 30px;\n    margin: 0 auto 2em auto;\n    padding: 0;\n    text-align: center;\n    max-width: 800px;\n\n    border-radius: 5px;\n    -moz-border-radius: 5px;\n    -webkit-border-radius: 5px;\n}\n\n@media (prefers-color-scheme: dark) {\n    #banner nav {\n        background: #121518;\n    }\n}\n\n#banner nav ul {list-style: none; margin: 0 auto; max-width: 800px;}\n#banner nav li {float: left; display: inline; margin: 0;}\n\n#banner nav a:link, #banner nav a:visited {\n    color: #fff;\n    display: inline-block;\n    height: 30px;\n    padding: 5px 1.5em;\n    text-decoration: none;\n}\n#banner nav a:hover, #banner nav a:active,\n#banner nav .active a:link, #banner nav .active a:visited {\n    background: #C74451;\n    color: #fff;\n    text-shadow: none !important;\n}\n\n#banner nav li:first-child a {\n    border-top-left-radius: 5px;\n    -moz-border-radius-topleft: 5px;\n    -webkit-border-top-left-radius: 5px;\n\n    border-bottom-left-radius: 5px;\n    -moz-border-radius-bottomleft: 5px;\n    -webkit-border-bottom-left-radius: 5px;\n}\n\n/*\n\tFeatured\n*****************/\n#featured {\n    background: #fff;\n    margin-bottom: 2em;\n    overflow: hidden;\n    padding: 20px;\n    max-width: 760px;\n\n    border-radius: 10px;\n    -moz-border-radius: 10px;\n    -webkit-border-radius: 10px;\n}\n\n@media (prefers-color-scheme: dark) {\n    #featured {\n        background: #151617;\n    }\n}\n\n#featured figure {\n    border: 2px solid #eee;\n    float: right;\n    margin: 0.786em 2em 0 5em;\n    max-width: 248px;\n}\n#featured figure img {display: block; float: right;}\n\n#featured h2 {color: #C74451; font-size: 1.714em; margin-bottom: 0.333em;}\n#featured h3 {font-size: 1.429em; margin-bottom: .5em;}\n\n#featured h3 a:link, #featured h3 a:visited {color: #000305; text-decoration: none;}\n#featured h3 a:hover, #featured h3 a:active {color: #fff;}\n\n/*\n\tBody\n*****************/\n#content {\n    background: #fff;\n    margin-bottom: 2em;\n    overflow: hidden;\n    padding: 20px 20px;\n    max-width: 760px;\n\n    border-radius: 10px;\n    -moz-border-radius: 10px;\n    -webkit-border-radius: 10px;\n}\n\n@media (prefers-color-scheme: dark) {\n    #content {\n        background: #111;\n    }\n}\n\n/*\n\tExtras\n*****************/\n#extras {margin: 0 auto 3em auto; overflow: hidden;}\n\n#extras ul {list-style: none; margin: 0;}\n#extras li {border-bottom: 1px solid #fff;}\n#extras h2 {\n    color: #C74350;\n    font-size: 1.429em;\n    margin-bottom: .25em;\n    padding: 0 3px;\n}\n\n#extras a:link, #extras a:visited {\n    color: #444;\n    display: block;\n    border-bottom: 1px solid #F4E3E3;\n    text-decoration: none;\n    padding: .3em .25em;\n}\n\n@media (prefers-color-scheme: dark) {\n    #extras a:link, #extras a:visited {\n        color: #888;\n    }\n}\n\n#extras a:hover, #extras a:active {color: #fff;}\n\n\t/* Blogroll */\n#extras .blogroll {\n    float: left;\n    max-width: 615px;\n}\n\n#extras .blogroll li {float: left; margin: 0 20px 0 0; max-width: 185px;}\n\n\t/* Social */\n#extras .social {\n    float: right;\n    max-width: 175px;\n}\n\n/*\n\tAbout\n*****************/\n#about {\n    background: #fff;\n    font-style: normal;\n    margin-bottom: 2em;\n    overflow: hidden;\n    padding: 20px;\n    text-align: left;\n    max-width: 760px;\n\n    border-radius: 10px;\n    -moz-border-radius: 10px;\n    -webkit-border-radius: 10px;\n}\n\n@media (prefers-color-scheme: dark) {\n    #about {\n        background: #222;\n    }\n}\n\n#about .primary {float: left; max-width: 165px;}\n#about .primary strong {color: #C64350; display: block; font-size: 1.286em;}\n#about .photo {float: left; margin: 5px 20px;}\n\n#about .url:link, #about .url:visited {text-decoration: none;}\n\n#about .bio {float: right; max-width: 500px;}\n\n/*\n\tFooter\n*****************/\n#contentinfo {padding-bottom: 2em; text-align: right;}\n\n/***** Sections *****/\n/* Blog */\n.hentry {\n    display: block;\n    clear: both;\n    border-top: 1px solid #eee;\n    padding: 1.5em 0;\n}\nli:first-child .hentry, #content > .hentry {border: 0; margin: 0;}\n#content > .hentry {padding: 1em 0;}\n.hentry img{display : none ;}\n.entry-title {font-size: 3em; margin-bottom: 10px; margin-top: 0;}\n.entry-title a:link, .entry-title a:visited {text-decoration: none; color: #333;}\n.entry-title a:visited {background-color: #fff;}\n\n@media (prefers-color-scheme: dark) {\n    .entry-title a:link, .entry-title a:visited {\n        color: #C74350;\n    }\n}\n\n.hentry .post-info * {font-style: normal;}\n\n\t/* Content */\n.hentry footer {margin-bottom: 2em;}\n.hentry footer address {display: inline;}\n#posts-list footer address {display: block;}\n\n\t/* Blog Index */\n#posts-list {list-style: none; margin: 0;}\n#posts-list .hentry {padding-left: 10px; position: relative;}\n\n#posts-list footer {\n    left: 10px;\n    position: relative;\n    float: left;\n    top: 0.5em;\n    max-width: 190px;\n}\n\n\t/* About the Author */\n#about-author {\n    background: #f9f9f9;\n    clear: both;\n    font-style: normal;\n    margin: 2em 0;\n    padding: 10px 20px 15px 20px;\n\n    border-radius: 5px;\n    -moz-border-radius: 5px;\n    -webkit-border-radius: 5px;\n}\n\n#about-author strong {\n    color: #C64350;\n    clear: both;\n    display: block;\n    font-size: 1.429em;\n}\n\n#about-author .photo {border: 1px solid #ddd; float: left; margin: 5px 1em 0 0;}\n\n\t/* Comments */\n#comments-list {list-style: none; margin: 0 1em;}\n#comments-list blockquote {\n    background: #f8f8f8;\n    clear: both;\n    font-style: normal;\n    margin: 0;\n    padding: 15px 20px;\n\n    border-radius: 5px;\n    -moz-border-radius: 5px;\n    -webkit-border-radius: 5px;\n}\n#comments-list footer {color: #888; padding: .5em 1em 0 0; text-align: right;}\n\n#comments-list li:nth-child(2n) blockquote {background: #F5f5f5;}\n\n\t/* Add a Comment */\n#add-comment label {clear: left; float: left; text-align: left; max-width: 150px;}\n#add-comment input[type='text'],\n#add-comment input[type='email'],\n#add-comment input[type='url'] {float: left; max-width: 200px;}\n\n#add-comment textarea {float: left; height: 150px; max-width: 495px;}\n\n#add-comment p.req {clear: both; margin: 0 .5em 1em 0; text-align: right;}\n\n#add-comment input[type='submit'] {float: right; margin: 0 .5em;}\n#add-comment * {margin-bottom: .5em;}\n"
  },
  {
    "path": "pelican/tests/output/custom/theme/css/pygment.css",
    "content": ".hll {\n    background-color:#eee;\n}\n.c {\n    color:#408090;\n    font-style:italic;\n}\n.err {\n    border:1px solid #FF0000;\n}\n.k {\n    color:#007020;\n    font-weight:bold;\n}\n.o {\n    color:#666666;\n}\n.cm {\n    color:#408090;\n    font-style:italic;\n}\n.cp {\n    color:#007020;\n}\n.c1 {\n    color:#408090;\n    font-style:italic;\n}\n.cs {\n    background-color:#FFF0F0;\n    color:#408090;\n}\n.gd {\n    color:#A00000;\n}\n.ge {\n    font-style:italic;\n}\n.gr {\n    color:#FF0000;\n}\n.gh {\n    color:#000080;\n    font-weight:bold;\n}\n.gi {\n    color:#00A000;\n}\n.go {\n    color:#303030;\n}\n.gp {\n    color:#C65D09;\n    font-weight:bold;\n}\n.gs {\n    font-weight:bold;\n}\n.gu {\n    color:#800080;\n    font-weight:bold;\n}\n.gt {\n    color:#0040D0;\n}\n.kc {\n    color:#007020;\n    font-weight:bold;\n}\n.kd {\n    color:#007020;\n    font-weight:bold;\n}\n.kn {\n    color:#007020;\n    font-weight:bold;\n}\n.kp {\n    color:#007020;\n}\n.kr {\n    color:#007020;\n    font-weight:bold;\n}\n.kt {\n    color:#902000;\n}\n.m {\n    color:#208050;\n}\n.s {\n    color:#4070A0;\n}\n.na {\n    color:#4070A0;\n}\n.nb {\n    color:#007020;\n}\n.nc {\n    color:#0E84B5;\n    font-weight:bold;\n}\n.no {\n    color:#60ADD5;\n}\n.nd {\n    color:#555555;\n    font-weight:bold;\n}\n.ni {\n    color:#D55537;\n    font-weight:bold;\n}\n.ne {\n    color:#007020;\n}\n.nf {\n    color:#06287E;\n}\n.nl {\n    color:#002070;\n    font-weight:bold;\n}\n.nn {\n    color:#0E84B5;\n    font-weight:bold;\n}\n.nt {\n    color:#062873;\n    font-weight:bold;\n}\n.nv {\n    color:#BB60D5;\n}\n.ow {\n    color:#007020;\n    font-weight:bold;\n}\n.w {\n    color:#BBBBBB;\n}\n.mf {\n    color:#208050;\n}\n.mh {\n    color:#208050;\n}\n.mi {\n    color:#208050;\n}\n.mo {\n    color:#208050;\n}\n.sb {\n    color:#4070A0;\n}\n.sc {\n    color:#4070A0;\n}\n.sd {\n    color:#4070A0;\n    font-style:italic;\n}\n.s2 {\n    color:#4070A0;\n}\n.se {\n    color:#4070A0;\n    font-weight:bold;\n}\n.sh {\n    color:#4070A0;\n}\n.si {\n    color:#70A0D0;\n    font-style:italic;\n}\n.sx {\n    color:#C65D09;\n}\n.sr {\n    color:#235388;\n}\n.s1 {\n    color:#4070A0;\n}\n.ss {\n    color:#517918;\n}\n.bp {\n    color:#007020;\n}\n.vc {\n    color:#BB60D5;\n}\n.vg {\n    color:#BB60D5;\n}\n.vi {\n    color:#BB60D5;\n}\n.il {\n    color:#208050;\n}\n"
  },
  {
    "path": "pelican/tests/output/custom/theme/css/reset.css",
    "content": "/*\n\tName: Reset Stylesheet\n\tDescription: Resets browser's default CSS\n\tAuthor: Eric Meyer\n\tAuthor URI: https://meyerweb.com/eric/tools/css/reset/\n*/\n\n/* v1.0 | 20080212 */\nhtml, body, div, span, applet, object, iframe,\nh1, h2, h3, h4, h5, h6, p, blockquote, pre,\na, abbr, acronym, address, big, cite, code,\ndel, dfn, em, font, img, ins, kbd, q, s, samp,\nsmall, strike, strong, sub, sup, tt, var,\nb, u, i, center,\ndl, dt, dd, ol, ul, li,\nfieldset, form, label, legend,\ntable, caption, tbody, tfoot, thead, tr, th, td {\n    background: transparent;\n    border: 0;\n    font-size: 100%;\n    margin: 0;\n    outline: 0;\n    padding: 0;\n    vertical-align: baseline;\n}\n\nbody {line-height: 1;}\n\nol, ul {list-style: none;}\n\nblockquote, q {quotes: none;}\n\nblockquote:before, blockquote:after,\nq:before, q:after {\n    content: '';\n    content: none;\n}\n\n/* remember to define focus styles! */\n:focus {\n    outline: 0;\n}\n\n/* remember to highlight inserts somehow! */\nins {text-decoration: none;}\ndel {text-decoration: line-through;}\n\n/* tables still need 'cellspacing=\"0\"' in the markup */\ntable {\n    border-collapse: collapse;\n    border-spacing: 0;\n}\n"
  },
  {
    "path": "pelican/tests/output/custom/theme/css/typogrify.css",
    "content": ".caps {font-size:.92em;}\n.amp {color:#666; font-size:1.05em;font-family:\"Warnock Pro\", \"Goudy Old Style\",\"Palatino\",\"Book Antiqua\",serif; font-style:italic;}\n.dquo {margin-left:-.38em;}\n"
  },
  {
    "path": "pelican/tests/output/custom/theme/css/wide.css",
    "content": "@import url(\"main.css\");\n\nbody {\n    font:1.3em/1.3 \"Hoefler Text\",\"Georgia\",Georgia,serif,sans-serif;\n}\n\n.post-info{\n    display: none;\n}\n\n#banner nav {\n    display: none;\n    -moz-border-radius: 0px;\n    margin-bottom: 20px;\n    overflow: hidden;\n    font-size: 1em;\n    background: #F5F4EF;\n}\n\n#banner nav ul{\n    padding-right: 50px;\n}\n\n#banner nav li{\n    float: right;\n    color: #000;\n}\n\n#banner nav li a {\n    color: #000;\n}\n\n#banner h1 {\n    margin-bottom: -18px;\n}\n\n#featured, #extras {\n    padding: 50px;\n}\n\n#featured {\n    padding-top: 20px;\n}\n\n#extras {\n    padding-top: 0px;\n    padding-bottom: 0px;\n}\n"
  },
  {
    "path": "pelican/tests/output/custom/theme/fonts/Yanone_Kaffeesatz_LICENSE.txt",
    "content": "Copyright 2010 The Yanone Kaffeesatz Project Authors (https://github.com/alexeiva/yanone-kaffeesatz)\n\nThis Font Software is licensed under the SIL Open Font License, Version 1.1.\nThis license is copied below, and is also available with a FAQ at:\nhttp://scripts.sil.org/OFL\n\n\n-----------------------------------------------------------\nSIL OPEN FONT LICENSE Version 1.1 - 26 February 2007\n-----------------------------------------------------------\n\nPREAMBLE\nThe goals of the Open Font License (OFL) are to stimulate worldwide\ndevelopment of collaborative font projects, to support the font creation\nefforts of academic and linguistic communities, and to provide a free and\nopen framework in which fonts may be shared and improved in partnership\nwith others.\n\nThe OFL allows the licensed fonts to be used, studied, modified and\nredistributed freely as long as they are not sold by themselves. The\nfonts, including any derivative works, can be bundled, embedded,\nredistributed and/or sold with any software provided that any reserved\nnames are not used by derivative works. The fonts and derivatives,\nhowever, cannot be released under any other type of license. The\nrequirement for fonts to remain under this license does not apply\nto any document created using the fonts or their derivatives.\n\nDEFINITIONS\n\"Font Software\" refers to the set of files released by the Copyright\nHolder(s) under this license and clearly marked as such. This may\ninclude source files, build scripts and documentation.\n\n\"Reserved Font Name\" refers to any names specified as such after the\ncopyright statement(s).\n\n\"Original Version\" refers to the collection of Font Software components as\ndistributed by the Copyright Holder(s).\n\n\"Modified Version\" refers to any derivative made by adding to, deleting,\nor substituting -- in part or in whole -- any of the components of the\nOriginal Version, by changing formats or by porting the Font Software to a\nnew environment.\n\n\"Author\" refers to any designer, engineer, programmer, technical\nwriter or other person who contributed to the Font Software.\n\nPERMISSION & CONDITIONS\nPermission is hereby granted, free of charge, to any person obtaining\na copy of the Font Software, to use, study, copy, merge, embed, modify,\nredistribute, and sell modified and unmodified copies of the Font\nSoftware, subject to the following conditions:\n\n1) Neither the Font Software nor any of its individual components,\nin Original or Modified Versions, may be sold by itself.\n\n2) Original or Modified Versions of the Font Software may be bundled,\nredistributed and/or sold with any software, provided that each copy\ncontains the above copyright notice and this license. These can be\nincluded either as stand-alone text files, human-readable headers or\nin the appropriate machine-readable metadata fields within text or\nbinary files as long as those fields can be easily viewed by the user.\n\n3) No Modified Version of the Font Software may use the Reserved Font\nName(s) unless explicit written permission is granted by the corresponding\nCopyright Holder. This restriction only applies to the primary font name as\npresented to the users.\n\n4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font\nSoftware shall not be used to promote, endorse or advertise any\nModified Version, except to acknowledge the contribution(s) of the\nCopyright Holder(s) and the Author(s) or with their explicit written\npermission.\n\n5) The Font Software, modified or unmodified, in part or in whole,\nmust be distributed entirely under this license, and must not be\ndistributed under any other license. The requirement for fonts to\nremain under this license does not apply to any document created\nusing the Font Software.\n\nTERMINATION\nThis license becomes null and void if any of the above conditions are\nnot met.\n\nDISCLAIMER\nTHE FONT SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT\nOF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE\nCOPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nINCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL\nDAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM\nOTHER DEALINGS IN THE FONT SOFTWARE.\n"
  },
  {
    "path": "pelican/tests/output/custom/theme/fonts/font.css",
    "content": "@font-face {\n    font-family: 'Yanone Kaffeesatz';\n    font-style: normal;\n    font-weight: 400;\n    src:\n    local('Yanone Kaffeesatz Regular'),\n    local('YanoneKaffeesatz-Regular'),\n\t\t/* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLRTHiN2BPBirwIkMLKUspj4.woff */\n    url('Yanone_Kaffeesatz_400.woff') format('woff'),\n\t\t/* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLfGwxTS8d1Q9KiDNCMKLFUM.woff2 */\n    url('Yanone_Kaffeesatz_400.woff2') format('woff2');\n}\n"
  },
  {
    "path": "pelican/tests/output/custom/this-is-a-super-article.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>This is a super article !</title>\n                <link rel=\"stylesheet\" href=\"./theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n                <meta name=\"description\" content=\"Multi-line metadata should be supported as well as inline markup.\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"./\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li><a href=\"./tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"./override/\">Override url/save_as</a></li>\n                                <li><a href=\"./pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li class=\"active\"><a href=\"./category/yeah.html\">yeah</a></li>\n                                <li><a href=\"./category/misc.html\">misc</a></li>\n                                <li><a href=\"./category/cat1.html\">cat1</a></li>\n                                <li><a href=\"./category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"./this-is-a-super-article.html\" rel=\"bookmark\"\n                                                   title=\"Permalink to This is a super article !\">This is a super article !</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2010-12-02T10:14:00+01:00\">\n                                                        Published: Thu 02 December 2010\n                                                </abbr>\n                                                <br />\n                                                <abbr class=\"modified\" title=\"2013-11-17T23:29:00+01:00\">\n                                                        Updated: Sun 17 November 2013\n                                                </abbr>\n\n                                                <address class=\"vcard author\">\n                                                        By                         <a class=\"url fn\" href=\"./author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                </address>\n                                                <p>In <a href=\"./category/yeah.html\">yeah</a>.</p>\n                                                <p>tags: <a href=\"./tag/foo.html\">foo</a> <a href=\"./tag/bar.html\">bar</a> <a href=\"./tag/foobar.html\">foobar</a> </p>\n                                        </footer><!-- /.post-info -->      <p>Some content here !</p>\n                                        <div class=\"section\" id=\"this-is-a-simple-title\">\n                                                <h2>This is a simple title</h2>\n                                                <p>And here comes the cool <a class=\"reference external\" href=\"http://books.couchdb.org/relax/design-documents/views\">stuff</a>.</p>\n                                                <img alt=\"alternate text\" src=\"./pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" />\n                                                <img alt=\"alternate text\" src=\"./pictures/Sushi_Macro.jpg\" style=\"width: 600px; height: 450px;\" />\n<pre class=\"literal-block\">\n&gt;&gt;&gt; from ipdb import set_trace\n&gt;&gt;&gt; set_trace()\n</pre>\n                                                <p>→ And now try with some utf8 hell: ééé</p>\n                                        </div>\n\n                                </div><!-- /.entry-content -->\n                                <div class=\"comments\">\n                                        <h2>Comments !</h2>\n                                        <div id=\"disqus_thread\"></div>\n                                        <script type=\"text/javascript\">\n                                                var disqus_shortname = 'blog-notmyidea';\n                                                var disqus_identifier = 'this-is-a-super-article.html';\n                                                var disqus_url = './this-is-a-super-article.html';\n                                                (function() {\n                                                        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;\n                                                        dsq.src = '//blog-notmyidea.disqus.com/embed.js';\n                                                        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);\n                                                })();\n                                        </script>\n                                        <noscript>Please enable JavaScript to view the comments.</noscript>\n                                </div>\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom/unbelievable.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Unbelievable !</title>\n                <link rel=\"stylesheet\" href=\"./theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n                <meta name=\"description\" content=\"Or completely awesome. Depends the needs. a root-relative link to markdown-article a file-relative link to markdown-article Testing sourcecode...\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"./\">Alexis' log <strong>A personal blog.</strong></a></h1>\n                        <nav><ul>\n                                <li><a href=\"./tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"./override/\">Override url/save_as</a></li>\n                                <li><a href=\"./pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"./category/yeah.html\">yeah</a></li>\n                                <li class=\"active\"><a href=\"./category/misc.html\">misc</a></li>\n                                <li><a href=\"./category/cat1.html\">cat1</a></li>\n                                <li><a href=\"./category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"./unbelievable.html\" rel=\"bookmark\"\n                                                   title=\"Permalink to Unbelievable !\">Unbelievable !</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2010-10-15T20:30:00+02:00\">\n                                                        Published: Fri 15 October 2010\n                                                </abbr>\n\n                                                <address class=\"vcard author\">\n                                                        By                         <a class=\"url fn\" href=\"./author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                </address>\n                                                <p>In <a href=\"./category/misc.html\">misc</a>.</p>\n\n                                        </footer><!-- /.post-info -->      <p>Or completely awesome. Depends the needs.</p>\n                                        <p><a class=\"reference external\" href=\"./a-markdown-powered-article.html\">a root-relative link to markdown-article</a>\n                                                <a class=\"reference external\" href=\"./a-markdown-powered-article.html\">a file-relative link to markdown-article</a></p>\n                                        <div class=\"section\" id=\"testing-sourcecode-directive\">\n                                                <h2>Testing sourcecode directive</h2>\n                                                <div class=\"highlight\"><table class=\"highlighttable\"><tr><td class=\"linenos\"><div class=\"linenodiv\"><pre><span class=\"normal\">1</span></pre></div></td><td class=\"code\"><div><pre><span></span><span class=\"n\">formatter</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span> <span class=\"ow\">and</span> <span class=\"n\">VARIANTS</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]]</span>\n</pre></div></td></tr></table></div>\n                                        </div>\n                                        <div class=\"section\" id=\"testing-another-case\">\n                                                <h2>Testing another case</h2>\n                                                <p>This will now have a line number in 'custom' since it's the default in\n                                                        pelican.conf, it will have nothing in default.</p>\n                                                <div class=\"highlight\"><table class=\"highlighttable\"><tr><td class=\"linenos\"><div class=\"linenodiv\"><pre><span class=\"normal\">1</span></pre></div></td><td class=\"code\"><div><pre><span></span><span class=\"n\">formatter</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span> <span class=\"ow\">and</span> <span class=\"n\">VARIANTS</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]]</span>\n</pre></div></td></tr></table></div>\n                                                <p>Lovely.</p>\n                                        </div>\n                                        <div class=\"section\" id=\"testing-more-sourcecode-directives\">\n                                                <h2>Testing more sourcecode directives</h2>\n                                                <div class=\"highlight\"><pre><span></span><span id=\"foo-8\"><a id=\"foo-8\" name=\"foo-8\"></a><a href=\"#foo-8\"><span class=\"linenos special\"> 8</span></a><span class=\"testingk\">def</span><span class=\"testingw\"> </span><span class=\"testingnf\">run</span><span class=\"testingp\">(</span><span class=\"testingbp\">self</span><span class=\"testingp\">):</span><br></span><span id=\"foo-9\"><a id=\"foo-9\" name=\"foo-9\"></a><a href=\"#foo-9\"><span class=\"linenos\">  </span></a>    <span class=\"testingbp\">self</span><span class=\"testingo\">.</span><span class=\"testingn\">assert_has_content</span><span class=\"testingp\">()</span><br></span><span id=\"foo-10\"><a id=\"foo-10\" name=\"foo-10\"></a><a href=\"#foo-10\"><span class=\"linenos special\">10</span></a>    <span class=\"testingk\">try</span><span class=\"testingp\">:</span><br></span><span id=\"foo-11\"><a id=\"foo-11\" name=\"foo-11\"></a><a href=\"#foo-11\"><span class=\"linenos\">  </span></a>        <span class=\"testingn\">lexer</span> <span class=\"testingo\">=</span> <span class=\"testingn\">get_lexer_by_name</span><span class=\"testingp\">(</span><span class=\"testingbp\">self</span><span class=\"testingo\">.</span><span class=\"testingn\">arguments</span><span class=\"testingp\">[</span><span class=\"testingmi\">0</span><span class=\"testingp\">])</span><br></span><span id=\"foo-12\"><a id=\"foo-12\" name=\"foo-12\"></a><a href=\"#foo-12\"><span class=\"linenos special\">12</span></a>    <span class=\"testingk\">except</span> <span class=\"testingne\">ValueError</span><span class=\"testingp\">:</span><br></span><span id=\"foo-13\"><a id=\"foo-13\" name=\"foo-13\"></a><a href=\"#foo-13\"><span class=\"linenos\">  </span></a>        <span class=\"testingc1\"># no lexer found - use the text one instead of an exception</span><br></span><span id=\"foo-14\"><a id=\"foo-14\" name=\"foo-14\"></a><a href=\"#foo-14\"><span class=\"linenos special\">14</span></a>        <span class=\"testingn\">lexer</span> <span class=\"testingo\">=</span> <span class=\"testingn\">TextLexer</span><span class=\"testingp\">()</span><br></span><span id=\"foo-15\"><a id=\"foo-15\" name=\"foo-15\"></a><a href=\"#foo-15\"><span class=\"linenos\">  </span></a><br></span><span id=\"foo-16\"><a id=\"foo-16\" name=\"foo-16\"></a><a href=\"#foo-16\"><span class=\"linenos special\">16</span></a>    <span class=\"testingk\">if</span> <span class=\"testingp\">(</span><span class=\"testings1\">&#39;linenos&#39;</span> <span class=\"testingow\">in</span> <span class=\"testingbp\">self</span><span class=\"testingo\">.</span><span class=\"testingn\">options</span> <span class=\"testingow\">and</span><br></span><span id=\"foo-17\"><a id=\"foo-17\" name=\"foo-17\"></a><a href=\"#foo-17\"><span class=\"linenos\">  </span></a>            <span class=\"testingbp\">self</span><span class=\"testingo\">.</span><span class=\"testingn\">options</span><span class=\"testingp\">[</span><span class=\"testings1\">&#39;linenos&#39;</span><span class=\"testingp\">]</span> <span class=\"testingow\">not</span> <span class=\"testingow\">in</span> <span class=\"testingp\">(</span><span class=\"testings1\">&#39;table&#39;</span><span class=\"testingp\">,</span> <span class=\"testings1\">&#39;inline&#39;</span><span class=\"testingp\">)):</span><br></span><span id=\"foo-18\"><a id=\"foo-18\" name=\"foo-18\"></a><a href=\"#foo-18\"><span class=\"linenos special\">18</span></a>        <span class=\"testingbp\">self</span><span class=\"testingo\">.</span><span class=\"testingn\">options</span><span class=\"testingp\">[</span><span class=\"testings1\">&#39;linenos&#39;</span><span class=\"testingp\">]</span> <span class=\"testingo\">=</span> <span class=\"testings1\">&#39;table&#39;</span><br></span><span id=\"foo-19\"><a id=\"foo-19\" name=\"foo-19\"></a><a href=\"#foo-19\"><span class=\"linenos\">  </span></a><br></span><span id=\"foo-20\"><a id=\"foo-20\" name=\"foo-20\"></a><a href=\"#foo-20\"><span class=\"linenos special\">20</span></a>    <span class=\"testingk\">for</span> <span class=\"testingn\">flag</span> <span class=\"testingow\">in</span> <span class=\"testingp\">(</span><span class=\"testings1\">&#39;nowrap&#39;</span><span class=\"testingp\">,</span> <span class=\"testings1\">&#39;nobackground&#39;</span><span class=\"testingp\">,</span> <span class=\"testings1\">&#39;anchorlinenos&#39;</span><span class=\"testingp\">):</span><br></span><span id=\"foo-21\"><a id=\"foo-21\" name=\"foo-21\"></a><a href=\"#foo-21\"><span class=\"linenos\">  </span></a>        <span class=\"testingk\">if</span> <span class=\"testingn\">flag</span> <span class=\"testingow\">in</span> <span class=\"testingbp\">self</span><span class=\"testingo\">.</span><span class=\"testingn\">options</span><span class=\"testingp\">:</span><br></span><span id=\"foo-22\"><a id=\"foo-22\" name=\"foo-22\"></a><a href=\"#foo-22\"><span class=\"linenos special\">22</span></a>            <span class=\"testingbp\">self</span><span class=\"testingo\">.</span><span class=\"testingn\">options</span><span class=\"testingp\">[</span><span class=\"testingn\">flag</span><span class=\"testingp\">]</span> <span class=\"testingo\">=</span> <span class=\"testingkc\">True</span><br></span><span id=\"foo-23\"><a id=\"foo-23\" name=\"foo-23\"></a><a href=\"#foo-23\"><span class=\"linenos\">  </span></a><br></span><span id=\"foo-24\"><a id=\"foo-24\" name=\"foo-24\"></a><a href=\"#foo-24\"><span class=\"linenos special\">24</span></a>    <span class=\"testingc1\"># noclasses should already default to False, but just in case...</span><br></span><span id=\"foo-25\"><a id=\"foo-25\" name=\"foo-25\"></a><a href=\"#foo-25\"><span class=\"linenos\">  </span></a>    <span class=\"testingn\">formatter</span> <span class=\"testingo\">=</span> <span class=\"testingn\">HtmlFormatter</span><span class=\"testingp\">(</span><span class=\"testingn\">noclasses</span><span class=\"testingo\">=</span><span class=\"testingkc\">False</span><span class=\"testingp\">,</span> <span class=\"testingo\">**</span><span class=\"testingbp\">self</span><span class=\"testingo\">.</span><span class=\"testingn\">options</span><span class=\"testingp\">)</span><br></span><span id=\"foo-26\"><a id=\"foo-26\" name=\"foo-26\"></a><a href=\"#foo-26\"><span class=\"linenos special\">26</span></a>    <span class=\"testingn\">parsed</span> <span class=\"testingo\">=</span> <span class=\"testingn\">highlight</span><span class=\"testingp\">(</span><span class=\"testings1\">&#39;</span><span class=\"testingse\">\\n</span><span class=\"testings1\">&#39;</span><span class=\"testingo\">.</span><span class=\"testingn\">join</span><span class=\"testingp\">(</span><span class=\"testingbp\">self</span><span class=\"testingo\">.</span><span class=\"testingn\">content</span><span class=\"testingp\">),</span> <span class=\"testingn\">lexer</span><span class=\"testingp\">,</span> <span class=\"testingn\">formatter</span><span class=\"testingp\">)</span><br></span><span id=\"foo-27\"><a id=\"foo-27\" name=\"foo-27\"></a><a href=\"#foo-27\"><span class=\"linenos\">  </span></a>    <span class=\"testingk\">return</span> <span class=\"testingp\">[</span><span class=\"testingn\">nodes</span><span class=\"testingo\">.</span><span class=\"testingn\">raw</span><span class=\"testingp\">(</span><span class=\"testings1\">&#39;&#39;</span><span class=\"testingp\">,</span> <span class=\"testingn\">parsed</span><span class=\"testingp\">,</span> <span class=\"testingnb\">format</span><span class=\"testingo\">=</span><span class=\"testings1\">&#39;html&#39;</span><span class=\"testingp\">)]</span><br></span></pre></div>\n                                                <p>Lovely.</p>\n                                        </div>\n                                        <div class=\"section\" id=\"testing-even-more-sourcecode-directives\">\n                                                <h2>Testing even more sourcecode directives</h2>\n                                                <span class=\"n\">formatter</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span> <span class=\"ow\">and</span> <span class=\"n\">VARIANTS</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]]</span>\n                                                <p>Lovely.</p>\n                                        </div>\n                                        <div class=\"section\" id=\"testing-overriding-config-defaults\">\n                                                <h2>Testing overriding config defaults</h2>\n                                                <p>Even if the default is line numbers, we can override it here</p>\n                                                <div class=\"highlight\"><pre><span></span><span class=\"n\">formatter</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span> <span class=\"ow\">and</span> <span class=\"n\">VARIANTS</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]]</span>\n</pre></div>\n                                                <p>Lovely.</p>\n                                        </div>\n\n                                </div><!-- /.entry-content -->\n                                <div class=\"comments\">\n                                        <h2>Comments !</h2>\n                                        <div id=\"disqus_thread\"></div>\n                                        <script type=\"text/javascript\">\n                                                var disqus_shortname = 'blog-notmyidea';\n                                                var disqus_identifier = 'unbelievable.html';\n                                                var disqus_url = './unbelievable.html';\n                                                (function() {\n                                                        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;\n                                                        dsq.src = '//blog-notmyidea.disqus.com/embed.js';\n                                                        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);\n                                                })();\n                                        </script>\n                                        <noscript>Please enable JavaScript to view the comments.</noscript>\n                                </div>\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/archives.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log</title>\n                <link rel=\"stylesheet\" href=\"./theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"./\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li><a href=\"./tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"./override/\">Override url/save_as</a></li>\n                                <li><a href=\"./pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"./category/yeah.html\">yeah</a></li>\n                                <li><a href=\"./category/misc.html\">misc</a></li>\n                                <li><a href=\"./category/cat1.html\">cat1</a></li>\n                                <li><a href=\"./category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <h1>Archives for Alexis' log</h1>\n\n                        <dl>\n                                <dt>30 novembre 2012</dt>\n                                <dd><a href=\"./posts/2012/novembre/30/filename_metadata-example/\">FILENAME_METADATA example</a></dd>\n                                <dt>29 février 2012</dt>\n                                <dd><a href=\"./posts/2012/février/29/second-article/\">Second article</a></dd>\n                                <dt>20 avril 2011</dt>\n                                <dd><a href=\"./posts/2011/avril/20/a-markdown-powered-article/\">A markdown powered article</a></dd>\n                                <dt>17 février 2011</dt>\n                                <dd><a href=\"./posts/2011/février/17/article-1/\">Article 1</a></dd>\n                                <dt>17 février 2011</dt>\n                                <dd><a href=\"./posts/2011/février/17/article-2/\">Article 2</a></dd>\n                                <dt>17 février 2011</dt>\n                                <dd><a href=\"./posts/2011/février/17/article-3/\">Article 3</a></dd>\n                                <dt>02 décembre 2010</dt>\n                                <dd><a href=\"./posts/2010/décembre/02/this-is-a-super-article/\">This is a super article !</a></dd>\n                                <dt>20 octobre 2010</dt>\n                                <dd><a href=\"./posts/2010/octobre/20/oh-yeah/\">Oh yeah !</a></dd>\n                                <dt>15 octobre 2010</dt>\n                                <dd><a href=\"./posts/2010/octobre/15/unbelievable/\">Unbelievable !</a></dd>\n                                <dt>14 mars 2010</dt>\n                                <dd><a href=\"./tag/baz.html\">The baz tag</a></dd>\n                        </dl>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/author/alexis-metaireau.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log - Alexis Métaireau</title>\n                <link rel=\"stylesheet\" href=\"../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li><a href=\"../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../category/yeah.html\">yeah</a></li>\n                                <li><a href=\"../category/misc.html\">misc</a></li>\n                                <li><a href=\"../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <aside id=\"featured\" class=\"body\">\n                        <article>\n                                <h1 class=\"entry-title\"><a href=\"../posts/2012/novembre/30/filename_metadata-example/\">FILENAME_METADATA example</a></h1>\n                                <footer class=\"post-info\">\n                                        <abbr class=\"published\" title=\"2012-11-30T00:00:00+01:00\">\n                                                Published: 30 novembre 2012\n                                        </abbr>\n\n                                        <address class=\"vcard author\">\n                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                        </address>\n                                        <p>In <a href=\"../category/misc.html\">misc</a>.</p>\n\n                                </footer><!-- /.post-info --><p>Some cool stuff!</p>\n                                <p>There are <a href=\"../posts/2012/novembre/30/filename_metadata-example/#disqus_thread\">comments</a>.</p>                </article>\n                </aside><!-- /#featured -->\n                <section id=\"content\" class=\"body\">\n                        <h1>Other articles</h1>\n                        <hr />\n                        <ol id=\"posts-list\" class=\"hfeed\">\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"../posts/2012/février/29/second-article/\" rel=\"bookmark\"\n                                                       title=\"Permalink to Second article\">Second article</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2012-02-29T00:00:00+01:00\">\n                                                                Published: 29 février 2012\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"../category/misc.html\">misc</a>.</p>\n                                                        <p>tags: <a href=\"../tag/foo.html\">foo</a> <a href=\"../tag/bar.html\">bar</a> <a href=\"../tag/baz.html\">baz</a> </p>Translations:\n                                                        <a href=\"../second-article-fr.html\" hreflang=\"fr\">fr</a>\n\n                                                </footer><!-- /.post-info -->                <p>This is some article, in english</p>\n\n                                                <a class=\"readmore\" href=\"../posts/2012/février/29/second-article/\">read more</a>\n                                                <p>There are <a href=\"../posts/2012/février/29/second-article/#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"../posts/2011/avril/20/a-markdown-powered-article/\" rel=\"bookmark\"\n                                                       title=\"Permalink to A markdown powered article\">A markdown powered article</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2011-04-20T00:00:00+02:00\">\n                                                                Published: 20 avril 2011\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"../category/cat1.html\">cat1</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>You're mutually oblivious.</p>\n                                                <p><a href=\"../posts/2010/octobre/15/unbelievable/\">a root-relative link to unbelievable</a>\n                                                        <a href=\"../posts/2010/octobre/15/unbelievable/\">a file-relative link to unbelievable</a></p>\n                                                <a class=\"readmore\" href=\"../posts/2011/avril/20/a-markdown-powered-article/\">read more</a>\n                                                <p>There are <a href=\"../posts/2011/avril/20/a-markdown-powered-article/#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"../posts/2011/février/17/article-1/\" rel=\"bookmark\"\n                                                       title=\"Permalink to Article 1\">Article 1</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2011-02-17T00:00:00+01:00\">\n                                                                Published: 17 février 2011\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"../category/cat1.html\">cat1</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>Article 1</p>\n\n                                                <a class=\"readmore\" href=\"../posts/2011/février/17/article-1/\">read more</a>\n                                                <p>There are <a href=\"../posts/2011/février/17/article-1/#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n                        </ol><!-- /#posts-list -->\n                        <nav>\n                                <ul>\n                                        <li>Page 1 / 3</li>\n                                        <li><a href=\"../author/alexis-metaireau2.html\">&rang;</a></li>\n                                        <li><a href=\"../author/alexis-metaireau3.html\">&Rang;</a></li>\n                                </ul>\n                        </nav>\n                </section><!-- /#content -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/author/alexis-metaireau2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log - Alexis Métaireau</title>\n                <link rel=\"stylesheet\" href=\"../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li><a href=\"../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../category/yeah.html\">yeah</a></li>\n                                <li><a href=\"../category/misc.html\">misc</a></li>\n                                <li><a href=\"../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <section id=\"content\" class=\"body\">\n                        <ol id=\"posts-list\" class=\"hfeed\" start=\"3\">\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"../posts/2011/février/17/article-2/\" rel=\"bookmark\"\n                                                       title=\"Permalink to Article 2\">Article 2</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2011-02-17T00:00:00+01:00\">\n                                                                Published: 17 février 2011\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"../category/cat1.html\">cat1</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>Article 2</p>\n\n                                                <a class=\"readmore\" href=\"../posts/2011/février/17/article-2/\">read more</a>\n                                                <p>There are <a href=\"../posts/2011/février/17/article-2/#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"../posts/2011/février/17/article-3/\" rel=\"bookmark\"\n                                                       title=\"Permalink to Article 3\">Article 3</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2011-02-17T00:00:00+01:00\">\n                                                                Published: 17 février 2011\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"../category/cat1.html\">cat1</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>Article 3</p>\n\n                                                <a class=\"readmore\" href=\"../posts/2011/février/17/article-3/\">read more</a>\n                                                <p>There are <a href=\"../posts/2011/février/17/article-3/#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"../posts/2010/décembre/02/this-is-a-super-article/\" rel=\"bookmark\"\n                                                       title=\"Permalink to This is a super article !\">This is a super article !</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2010-12-02T10:14:00+01:00\">\n                                                                Published: 02 décembre 2010\n                                                        </abbr>\n                                                        <br />\n                                                        <abbr class=\"modified\" title=\"2013-11-17T23:29:00+01:00\">\n                                                                Updated: 17 novembre 2013\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"../category/yeah.html\">yeah</a>.</p>\n                                                        <p>tags: <a href=\"../tag/foo.html\">foo</a> <a href=\"../tag/bar.html\">bar</a> <a href=\"../tag/foobar.html\">foobar</a> </p>\n                                                </footer><!-- /.post-info -->                <p class=\"first last\">Multi-line metadata should be supported\n                                                        as well as <strong>inline markup</strong>.</p>\n\n                                                <a class=\"readmore\" href=\"../posts/2010/décembre/02/this-is-a-super-article/\">read more</a>\n                                                <p>There are <a href=\"../posts/2010/décembre/02/this-is-a-super-article/#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"../posts/2010/octobre/20/oh-yeah/\" rel=\"bookmark\"\n                                                       title=\"Permalink to Oh yeah !\">Oh yeah !</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2010-10-20T10:14:00+02:00\">\n                                                                Published: 20 octobre 2010\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"../category/bar.html\">bar</a>.</p>\n                                                        <p>tags: <a href=\"../tag/oh.html\">oh</a> <a href=\"../tag/bar.html\">bar</a> <a href=\"../tag/yeah.html\">yeah</a> </p>Translations:\n                                                        <a href=\"../oh-yeah-fr.html\" hreflang=\"fr\">fr</a>\n\n                                                </footer><!-- /.post-info -->                <div class=\"section\" id=\"why-not\">\n                                                        <h2>Why not ?</h2>\n                                                        <p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\n                                                                YEAH !</p>\n                                                        <img alt=\"alternate text\" src=\"../pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" />\n                                                </div>\n\n                                                <a class=\"readmore\" href=\"../posts/2010/octobre/20/oh-yeah/\">read more</a>\n                                                <p>There are <a href=\"../posts/2010/octobre/20/oh-yeah/#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n                        </ol><!-- /#posts-list -->\n                        <nav>\n                                <ul>\n                                        <li><a href=\"../author/alexis-metaireau.html\">&Lang;</a></li>\n                                        <li><a href=\"../author/alexis-metaireau.html\">&lang;</a></li>\n                                        <li>Page 2 / 3</li>\n                                        <li><a href=\"../author/alexis-metaireau3.html\">&rang;</a></li>\n                                        <li><a href=\"../author/alexis-metaireau3.html\">&Rang;</a></li>\n                                </ul>\n                        </nav>\n                </section><!-- /#content -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/author/alexis-metaireau3.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log - Alexis Métaireau</title>\n                <link rel=\"stylesheet\" href=\"../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li><a href=\"../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../category/yeah.html\">yeah</a></li>\n                                <li><a href=\"../category/misc.html\">misc</a></li>\n                                <li><a href=\"../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <section id=\"content\" class=\"body\">\n                        <ol id=\"posts-list\" class=\"hfeed\" start=\"3\">\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"../posts/2010/octobre/15/unbelievable/\" rel=\"bookmark\"\n                                                       title=\"Permalink to Unbelievable !\">Unbelievable !</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2010-10-15T20:30:00+02:00\">\n                                                                Published: 15 octobre 2010\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"../category/misc.html\">misc</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>Or completely awesome. Depends the needs.</p>\n                                                <p><a class=\"reference external\" href=\"../posts/2011/avril/20/a-markdown-powered-article/\">a root-relative link to markdown-article</a>\n                                                        <a class=\"reference external\" href=\"../posts/2011/avril/20/a-markdown-powered-article/\">a file-relative link to markdown-article</a></p>\n                                                <div class=\"section\" id=\"testing-sourcecode-directive\">\n                                                        <h2>Testing sourcecode directive</h2>\n                                                        <div class=\"highlight\"><table class=\"highlighttable\"><tr><td class=\"linenos\"><div class=\"linenodiv\"><pre><span class=\"normal\">1</span></pre></div></td><td class=\"code\"><div><pre><span></span><span class=\"n\">formatter</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span> <span class=\"ow\">and</span> <span class=\"n\">VARIANTS</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]]</span>\n</pre></div></td></tr></table></div>\n                                                </div>\n                                                <div class=\"section\" id=\"testing-another-case\">\n                                                        <h2>Testing another case</h2>\n                                                        <p>This will now have a line number in 'custom' since it's the default in\n                                                                pelican.conf, it will …</p></div>\n                                                <a class=\"readmore\" href=\"../posts/2010/octobre/15/unbelievable/\">read more</a>\n                                                <p>There are <a href=\"../posts/2010/octobre/15/unbelievable/#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"../tag/baz.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to The baz tag\">The baz tag</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2010-03-14T00:00:00+01:00\">\n                                                                Published: 14 mars 2010\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"../category/misc.html\">misc</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>This article overrides the listening of the articles under the <em>baz</em> tag.</p>\n\n                                                <a class=\"readmore\" href=\"../tag/baz.html\">read more</a>\n                                                <p>There are <a href=\"../tag/baz.html#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n                        </ol><!-- /#posts-list -->\n                        <nav>\n                                <ul>\n                                        <li><a href=\"../author/alexis-metaireau.html\">&Lang;</a></li>\n                                        <li><a href=\"../author/alexis-metaireau2.html\">&lang;</a></li>\n                                        <li>Page 3 / 3</li>\n                                </ul>\n                        </nav>\n                </section><!-- /#content -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/authors.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log - Authors</title>\n                <link rel=\"stylesheet\" href=\"./theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"./\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li><a href=\"./tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"./override/\">Override url/save_as</a></li>\n                                <li><a href=\"./pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"./category/yeah.html\">yeah</a></li>\n                                <li><a href=\"./category/misc.html\">misc</a></li>\n                                <li><a href=\"./category/cat1.html\">cat1</a></li>\n                                <li><a href=\"./category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <section id=\"content\" class=\"body\">\n                        <h1>Authors on Alexis' log</h1>\n                        <ul>\n                                <li><a href=\"./author/alexis-metaireau.html\">Alexis Métaireau</a> (10)</li>\n                        </ul>\n                </section>\n\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/categories.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log - Categories</title>\n                <link rel=\"stylesheet\" href=\"./theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"./\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li><a href=\"./tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"./override/\">Override url/save_as</a></li>\n                                <li><a href=\"./pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"./category/yeah.html\">yeah</a></li>\n                                <li><a href=\"./category/misc.html\">misc</a></li>\n                                <li><a href=\"./category/cat1.html\">cat1</a></li>\n                                <li><a href=\"./category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <section id=\"content\" class=\"body\">\n                        <h1>Categories for Alexis' log</h1>\n                        <ul>\n                                <li><a href=\"./category/bar.html\">bar</a> (1)</li>\n                                <li><a href=\"./category/cat1.html\">cat1</a> (4)</li>\n                                <li><a href=\"./category/misc.html\">misc</a> (4)</li>\n                                <li><a href=\"./category/yeah.html\">yeah</a> (1)</li>\n                        </ul>\n                </section>\n\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/category/bar.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log - bar</title>\n                <link rel=\"stylesheet\" href=\"../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li><a href=\"../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../category/yeah.html\">yeah</a></li>\n                                <li><a href=\"../category/misc.html\">misc</a></li>\n                                <li><a href=\"../category/cat1.html\">cat1</a></li>\n                                <li class=\"active\"><a href=\"../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <aside id=\"featured\" class=\"body\">\n                        <article>\n                                <h1 class=\"entry-title\"><a href=\"../posts/2010/octobre/20/oh-yeah/\">Oh yeah !</a></h1>\n                                <footer class=\"post-info\">\n                                        <abbr class=\"published\" title=\"2010-10-20T10:14:00+02:00\">\n                                                Published: 20 octobre 2010\n                                        </abbr>\n\n                                        <address class=\"vcard author\">\n                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                        </address>\n                                        <p>In <a href=\"../category/bar.html\">bar</a>.</p>\n                                        <p>tags: <a href=\"../tag/oh.html\">oh</a> <a href=\"../tag/bar.html\">bar</a> <a href=\"../tag/yeah.html\">yeah</a> </p>Translations:\n                                        <a href=\"../oh-yeah-fr.html\" hreflang=\"fr\">fr</a>\n\n                                </footer><!-- /.post-info --><div class=\"section\" id=\"why-not\">\n                                        <h2>Why not ?</h2>\n                                        <p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\n                                                YEAH !</p>\n                                        <img alt=\"alternate text\" src=\"../pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" />\n                                </div>\n                                <p>There are <a href=\"../posts/2010/octobre/20/oh-yeah/#disqus_thread\">comments</a>.</p>                </article>\n                </aside><!-- /#featured -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/category/cat1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log - cat1</title>\n                <link rel=\"stylesheet\" href=\"../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li><a href=\"../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../category/yeah.html\">yeah</a></li>\n                                <li><a href=\"../category/misc.html\">misc</a></li>\n                                <li class=\"active\"><a href=\"../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <aside id=\"featured\" class=\"body\">\n                        <article>\n                                <h1 class=\"entry-title\"><a href=\"../posts/2011/avril/20/a-markdown-powered-article/\">A markdown powered article</a></h1>\n                                <footer class=\"post-info\">\n                                        <abbr class=\"published\" title=\"2011-04-20T00:00:00+02:00\">\n                                                Published: 20 avril 2011\n                                        </abbr>\n\n                                        <address class=\"vcard author\">\n                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                        </address>\n                                        <p>In <a href=\"../category/cat1.html\">cat1</a>.</p>\n\n                                </footer><!-- /.post-info --><p>You're mutually oblivious.</p>\n                                <p><a href=\"../posts/2010/octobre/15/unbelievable/\">a root-relative link to unbelievable</a>\n                                        <a href=\"../posts/2010/octobre/15/unbelievable/\">a file-relative link to unbelievable</a></p><p>There are <a href=\"../posts/2011/avril/20/a-markdown-powered-article/#disqus_thread\">comments</a>.</p>                </article>\n                </aside><!-- /#featured -->\n                <section id=\"content\" class=\"body\">\n                        <h1>Other articles</h1>\n                        <hr />\n                        <ol id=\"posts-list\" class=\"hfeed\">\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"../posts/2011/février/17/article-1/\" rel=\"bookmark\"\n                                                       title=\"Permalink to Article 1\">Article 1</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2011-02-17T00:00:00+01:00\">\n                                                                Published: 17 février 2011\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"../category/cat1.html\">cat1</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>Article 1</p>\n\n                                                <a class=\"readmore\" href=\"../posts/2011/février/17/article-1/\">read more</a>\n                                                <p>There are <a href=\"../posts/2011/février/17/article-1/#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"../posts/2011/février/17/article-2/\" rel=\"bookmark\"\n                                                       title=\"Permalink to Article 2\">Article 2</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2011-02-17T00:00:00+01:00\">\n                                                                Published: 17 février 2011\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"../category/cat1.html\">cat1</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>Article 2</p>\n\n                                                <a class=\"readmore\" href=\"../posts/2011/février/17/article-2/\">read more</a>\n                                                <p>There are <a href=\"../posts/2011/février/17/article-2/#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"../posts/2011/février/17/article-3/\" rel=\"bookmark\"\n                                                       title=\"Permalink to Article 3\">Article 3</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2011-02-17T00:00:00+01:00\">\n                                                                Published: 17 février 2011\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"../category/cat1.html\">cat1</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>Article 3</p>\n\n                                                <a class=\"readmore\" href=\"../posts/2011/février/17/article-3/\">read more</a>\n                                                <p>There are <a href=\"../posts/2011/février/17/article-3/#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n                        </ol><!-- /#posts-list -->\n                </section><!-- /#content -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/category/misc.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log - misc</title>\n                <link rel=\"stylesheet\" href=\"../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li><a href=\"../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../category/yeah.html\">yeah</a></li>\n                                <li class=\"active\"><a href=\"../category/misc.html\">misc</a></li>\n                                <li><a href=\"../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <aside id=\"featured\" class=\"body\">\n                        <article>\n                                <h1 class=\"entry-title\"><a href=\"../posts/2012/novembre/30/filename_metadata-example/\">FILENAME_METADATA example</a></h1>\n                                <footer class=\"post-info\">\n                                        <abbr class=\"published\" title=\"2012-11-30T00:00:00+01:00\">\n                                                Published: 30 novembre 2012\n                                        </abbr>\n\n                                        <address class=\"vcard author\">\n                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                        </address>\n                                        <p>In <a href=\"../category/misc.html\">misc</a>.</p>\n\n                                </footer><!-- /.post-info --><p>Some cool stuff!</p>\n                                <p>There are <a href=\"../posts/2012/novembre/30/filename_metadata-example/#disqus_thread\">comments</a>.</p>                </article>\n                </aside><!-- /#featured -->\n                <section id=\"content\" class=\"body\">\n                        <h1>Other articles</h1>\n                        <hr />\n                        <ol id=\"posts-list\" class=\"hfeed\">\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"../posts/2012/février/29/second-article/\" rel=\"bookmark\"\n                                                       title=\"Permalink to Second article\">Second article</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2012-02-29T00:00:00+01:00\">\n                                                                Published: 29 février 2012\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"../category/misc.html\">misc</a>.</p>\n                                                        <p>tags: <a href=\"../tag/foo.html\">foo</a> <a href=\"../tag/bar.html\">bar</a> <a href=\"../tag/baz.html\">baz</a> </p>Translations:\n                                                        <a href=\"../second-article-fr.html\" hreflang=\"fr\">fr</a>\n\n                                                </footer><!-- /.post-info -->                <p>This is some article, in english</p>\n\n                                                <a class=\"readmore\" href=\"../posts/2012/février/29/second-article/\">read more</a>\n                                                <p>There are <a href=\"../posts/2012/février/29/second-article/#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"../posts/2010/octobre/15/unbelievable/\" rel=\"bookmark\"\n                                                       title=\"Permalink to Unbelievable !\">Unbelievable !</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2010-10-15T20:30:00+02:00\">\n                                                                Published: 15 octobre 2010\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"../category/misc.html\">misc</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>Or completely awesome. Depends the needs.</p>\n                                                <p><a class=\"reference external\" href=\"../posts/2011/avril/20/a-markdown-powered-article/\">a root-relative link to markdown-article</a>\n                                                        <a class=\"reference external\" href=\"../posts/2011/avril/20/a-markdown-powered-article/\">a file-relative link to markdown-article</a></p>\n                                                <div class=\"section\" id=\"testing-sourcecode-directive\">\n                                                        <h2>Testing sourcecode directive</h2>\n                                                        <div class=\"highlight\"><table class=\"highlighttable\"><tr><td class=\"linenos\"><div class=\"linenodiv\"><pre><span class=\"normal\">1</span></pre></div></td><td class=\"code\"><div><pre><span></span><span class=\"n\">formatter</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span> <span class=\"ow\">and</span> <span class=\"n\">VARIANTS</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]]</span>\n</pre></div></td></tr></table></div>\n                                                </div>\n                                                <div class=\"section\" id=\"testing-another-case\">\n                                                        <h2>Testing another case</h2>\n                                                        <p>This will now have a line number in 'custom' since it's the default in\n                                                                pelican.conf, it will …</p></div>\n                                                <a class=\"readmore\" href=\"../posts/2010/octobre/15/unbelievable/\">read more</a>\n                                                <p>There are <a href=\"../posts/2010/octobre/15/unbelievable/#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"../tag/baz.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to The baz tag\">The baz tag</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2010-03-14T00:00:00+01:00\">\n                                                                Published: 14 mars 2010\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"../category/misc.html\">misc</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>This article overrides the listening of the articles under the <em>baz</em> tag.</p>\n\n                                                <a class=\"readmore\" href=\"../tag/baz.html\">read more</a>\n                                                <p>There are <a href=\"../tag/baz.html#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n                        </ol><!-- /#posts-list -->\n                </section><!-- /#content -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/category/yeah.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log - yeah</title>\n                <link rel=\"stylesheet\" href=\"../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li><a href=\"../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li class=\"active\"><a href=\"../category/yeah.html\">yeah</a></li>\n                                <li><a href=\"../category/misc.html\">misc</a></li>\n                                <li><a href=\"../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <aside id=\"featured\" class=\"body\">\n                        <article>\n                                <h1 class=\"entry-title\"><a href=\"../posts/2010/décembre/02/this-is-a-super-article/\">This is a super article !</a></h1>\n                                <footer class=\"post-info\">\n                                        <abbr class=\"published\" title=\"2010-12-02T10:14:00+01:00\">\n                                                Published: 02 décembre 2010\n                                        </abbr>\n                                        <br />\n                                        <abbr class=\"modified\" title=\"2013-11-17T23:29:00+01:00\">\n                                                Updated: 17 novembre 2013\n                                        </abbr>\n\n                                        <address class=\"vcard author\">\n                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                        </address>\n                                        <p>In <a href=\"../category/yeah.html\">yeah</a>.</p>\n                                        <p>tags: <a href=\"../tag/foo.html\">foo</a> <a href=\"../tag/bar.html\">bar</a> <a href=\"../tag/foobar.html\">foobar</a> </p>\n                                </footer><!-- /.post-info --><p>Some content here !</p>\n                                <div class=\"section\" id=\"this-is-a-simple-title\">\n                                        <h2>This is a simple title</h2>\n                                        <p>And here comes the cool <a class=\"reference external\" href=\"http://books.couchdb.org/relax/design-documents/views\">stuff</a>.</p>\n                                        <img alt=\"alternate text\" src=\"../pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" />\n                                        <img alt=\"alternate text\" src=\"../pictures/Sushi_Macro.jpg\" style=\"width: 600px; height: 450px;\" />\n<pre class=\"literal-block\">\n&gt;&gt;&gt; from ipdb import set_trace\n&gt;&gt;&gt; set_trace()\n</pre>\n                                        <p>→ And now try with some utf8 hell: ééé</p>\n                                </div>\n                                <p>There are <a href=\"../posts/2010/décembre/02/this-is-a-super-article/#disqus_thread\">comments</a>.</p>                </article>\n                </aside><!-- /#featured -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/drafts/a-draft-article-without-date.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>A draft article without date</title>\n                <link rel=\"stylesheet\" href=\"../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n                <meta name=\"description\" content=\"This is a draft article, it should live under the /drafts/ folder and not be listed anywhere else.\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li><a href=\"../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../category/yeah.html\">yeah</a></li>\n                                <li class=\"active\"><a href=\"../category/misc.html\">misc</a></li>\n                                <li><a href=\"../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"../drafts/a-draft-article-without-date.html\" rel=\"bookmark\"\n                                                   title=\"Permalink to A draft article without date\">A draft article without date</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2012-03-02T14:01:01+01:00\">\n                                                        Published: 02 mars 2012\n                                                </abbr>\n\n                                                <address class=\"vcard author\">\n                                                        By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                </address>\n                                                <p>In <a href=\"../category/misc.html\">misc</a>.</p>\n\n                                        </footer><!-- /.post-info -->      <p>This is a draft article, it should live under the /drafts/ folder and not be\n                                                listed anywhere else.</p>\n\n                                </div><!-- /.entry-content -->\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/drafts/a-draft-article.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>A draft article</title>\n                <link rel=\"stylesheet\" href=\"../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n                <meta name=\"description\" content=\"This is a draft article, it should live under the /drafts/ folder and not be listed anywhere else.\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li><a href=\"../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../category/yeah.html\">yeah</a></li>\n                                <li class=\"active\"><a href=\"../category/misc.html\">misc</a></li>\n                                <li><a href=\"../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"../drafts/a-draft-article.html\" rel=\"bookmark\"\n                                                   title=\"Permalink to A draft article\">A draft article</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2011-05-08T15:58:00+02:00\">\n                                                        Published: 08 mai 2011\n                                                </abbr>\n\n                                                <address class=\"vcard author\">\n                                                        By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                </address>\n                                                <p>In <a href=\"../category/misc.html\">misc</a>.</p>\n\n                                        </footer><!-- /.post-info -->      <p>This is a draft article, it should live under the /drafts/ folder and not be\n                                                listed anywhere else.</p>\n\n                                </div><!-- /.entry-content -->\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/feeds/alexis-metaireau.atom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<feed xmlns=\"http://www.w3.org/2005/Atom\"><title>Alexis' log - Alexis Métaireau</title><link href=\"http://blog.notmyidea.org/\" rel=\"alternate\"/><link href=\"http://blog.notmyidea.org/feeds/alexis-metaireau.atom.xml\" rel=\"self\"/><id>http://blog.notmyidea.org/</id><updated>2013-11-17T23:29:00+01:00</updated><entry><title>FILENAME_METADATA example</title><link href=\"http://blog.notmyidea.org/posts/2012/novembre/30/filename_metadata-example/\" rel=\"alternate\"/><published>2012-11-30T00:00:00+01:00</published><updated>2012-11-30T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2012-11-30:/posts/2012/novembre/30/filename_metadata-example/</id><content type=\"html\">&lt;p&gt;Some cool stuff!&lt;/p&gt;\n</content><category term=\"misc\"/></entry><entry><title>Second article</title><link href=\"http://blog.notmyidea.org/posts/2012/f%C3%A9vrier/29/second-article/\" rel=\"alternate\"/><published>2012-02-29T00:00:00+01:00</published><updated>2012-02-29T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2012-02-29:/posts/2012/février/29/second-article/</id><content type=\"html\">&lt;p&gt;This is some article, in english&lt;/p&gt;\n</content><category term=\"misc\"/><category term=\"foo\"/><category term=\"bar\"/><category term=\"baz\"/></entry><entry><title>A markdown powered article</title><link href=\"http://blog.notmyidea.org/posts/2011/avril/20/a-markdown-powered-article/\" rel=\"alternate\"/><published>2011-04-20T00:00:00+02:00</published><updated>2011-04-20T00:00:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-04-20:/posts/2011/avril/20/a-markdown-powered-article/</id><content type=\"html\">&lt;p&gt;You're mutually oblivious.&lt;/p&gt;\n&lt;p&gt;&lt;a href=\"http://blog.notmyidea.org/posts/2010/octobre/15/unbelievable/\"&gt;a root-relative link to unbelievable&lt;/a&gt;\n&lt;a href=\"http://blog.notmyidea.org/posts/2010/octobre/15/unbelievable/\"&gt;a file-relative link to unbelievable&lt;/a&gt;&lt;/p&gt;</content><category term=\"cat1\"/></entry><entry><title>Article 1</title><link href=\"http://blog.notmyidea.org/posts/2011/f%C3%A9vrier/17/article-1/\" rel=\"alternate\"/><published>2011-02-17T00:00:00+01:00</published><updated>2011-02-17T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-02-17:/posts/2011/février/17/article-1/</id><content type=\"html\">&lt;p&gt;Article 1&lt;/p&gt;\n</content><category term=\"cat1\"/></entry><entry><title>Article 2</title><link href=\"http://blog.notmyidea.org/posts/2011/f%C3%A9vrier/17/article-2/\" rel=\"alternate\"/><published>2011-02-17T00:00:00+01:00</published><updated>2011-02-17T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-02-17:/posts/2011/février/17/article-2/</id><content type=\"html\">&lt;p&gt;Article 2&lt;/p&gt;\n</content><category term=\"cat1\"/></entry><entry><title>Article 3</title><link href=\"http://blog.notmyidea.org/posts/2011/f%C3%A9vrier/17/article-3/\" rel=\"alternate\"/><published>2011-02-17T00:00:00+01:00</published><updated>2011-02-17T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-02-17:/posts/2011/février/17/article-3/</id><content type=\"html\">&lt;p&gt;Article 3&lt;/p&gt;\n</content><category term=\"cat1\"/></entry><entry><title>This is a super article !</title><link href=\"http://blog.notmyidea.org/posts/2010/d%C3%A9cembre/02/this-is-a-super-article/\" rel=\"alternate\"/><published>2010-12-02T10:14:00+01:00</published><updated>2013-11-17T23:29:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-12-02:/posts/2010/décembre/02/this-is-a-super-article/</id><summary type=\"html\">&lt;p class=\"first last\"&gt;Multi-line metadata should be supported\nas well as &lt;strong&gt;inline markup&lt;/strong&gt;.&lt;/p&gt;\n</summary><content type=\"html\">&lt;p&gt;Some content here !&lt;/p&gt;\n&lt;div class=\"section\" id=\"this-is-a-simple-title\"&gt;\n&lt;h2&gt;This is a simple title&lt;/h2&gt;\n&lt;p&gt;And here comes the cool &lt;a class=\"reference external\" href=\"http://books.couchdb.org/relax/design-documents/views\"&gt;stuff&lt;/a&gt;.&lt;/p&gt;\n&lt;img alt=\"alternate text\" src=\"http://blog.notmyidea.org/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;img alt=\"alternate text\" src=\"http://blog.notmyidea.org/pictures/Sushi_Macro.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;pre class=\"literal-block\"&gt;\n&amp;gt;&amp;gt;&amp;gt; from ipdb import set_trace\n&amp;gt;&amp;gt;&amp;gt; set_trace()\n&lt;/pre&gt;\n&lt;p&gt;→ And now try with some utf8 hell: ééé&lt;/p&gt;\n&lt;/div&gt;\n</content><category term=\"yeah\"/><category term=\"foo\"/><category term=\"bar\"/><category term=\"foobar\"/></entry><entry><title>Oh yeah !</title><link href=\"http://blog.notmyidea.org/posts/2010/octobre/20/oh-yeah/\" rel=\"alternate\"/><published>2010-10-20T10:14:00+02:00</published><updated>2010-10-20T10:14:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-10-20:/posts/2010/octobre/20/oh-yeah/</id><content type=\"html\">&lt;div class=\"section\" id=\"why-not\"&gt;\n&lt;h2&gt;Why not ?&lt;/h2&gt;\n&lt;p&gt;After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\nYEAH !&lt;/p&gt;\n&lt;img alt=\"alternate text\" src=\"http://blog.notmyidea.org/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;/div&gt;\n</content><category term=\"bar\"/><category term=\"oh\"/><category term=\"bar\"/><category term=\"yeah\"/></entry><entry><title>Unbelievable !</title><link href=\"http://blog.notmyidea.org/posts/2010/octobre/15/unbelievable/\" rel=\"alternate\"/><published>2010-10-15T20:30:00+02:00</published><updated>2010-10-15T20:30:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-10-15:/posts/2010/octobre/15/unbelievable/</id><summary type=\"html\">&lt;p&gt;Or completely awesome. Depends the needs.&lt;/p&gt;\n&lt;p&gt;&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/posts/2011/avril/20/a-markdown-powered-article/\"&gt;a root-relative link to markdown-article&lt;/a&gt;\n&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/posts/2011/avril/20/a-markdown-powered-article/\"&gt;a file-relative link to markdown-article&lt;/a&gt;&lt;/p&gt;\n&lt;div class=\"section\" id=\"testing-sourcecode-directive\"&gt;\n&lt;h2&gt;Testing sourcecode directive&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;table class=\"highlighttable\"&gt;&lt;tr&gt;&lt;td class=\"linenos\"&gt;&lt;div class=\"linenodiv\"&gt;&lt;pre&gt;&lt;span class=\"normal\"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=\"code\"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-another-case\"&gt;\n&lt;h2&gt;Testing another case&lt;/h2&gt;\n&lt;p&gt;This will now have a line number in 'custom' since it's the default in\npelican.conf, it will …&lt;/p&gt;&lt;/div&gt;</summary><content type=\"html\">&lt;p&gt;Or completely awesome. Depends the needs.&lt;/p&gt;\n&lt;p&gt;&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/posts/2011/avril/20/a-markdown-powered-article/\"&gt;a root-relative link to markdown-article&lt;/a&gt;\n&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/posts/2011/avril/20/a-markdown-powered-article/\"&gt;a file-relative link to markdown-article&lt;/a&gt;&lt;/p&gt;\n&lt;div class=\"section\" id=\"testing-sourcecode-directive\"&gt;\n&lt;h2&gt;Testing sourcecode directive&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;table class=\"highlighttable\"&gt;&lt;tr&gt;&lt;td class=\"linenos\"&gt;&lt;div class=\"linenodiv\"&gt;&lt;pre&gt;&lt;span class=\"normal\"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=\"code\"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-another-case\"&gt;\n&lt;h2&gt;Testing another case&lt;/h2&gt;\n&lt;p&gt;This will now have a line number in 'custom' since it's the default in\npelican.conf, it will have nothing in default.&lt;/p&gt;\n&lt;div class=\"highlight\"&gt;&lt;table class=\"highlighttable\"&gt;&lt;tr&gt;&lt;td class=\"linenos\"&gt;&lt;div class=\"linenodiv\"&gt;&lt;pre&gt;&lt;span class=\"normal\"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=\"code\"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-more-sourcecode-directives\"&gt;\n&lt;h2&gt;Testing more sourcecode directives&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id=\"foo-8\"&gt;&lt;a id=\"foo-8\" name=\"foo-8\"&gt;&lt;/a&gt;&lt;a href=\"#foo-8\"&gt;&lt;span class=\"linenos special\"&gt; 8&lt;/span&gt;&lt;/a&gt;&lt;span class=\"testingk\"&gt;def&lt;/span&gt;&lt;span class=\"testingw\"&gt; &lt;/span&gt;&lt;span class=\"testingnf\"&gt;run&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingp\"&gt;):&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-9\"&gt;&lt;a id=\"foo-9\" name=\"foo-9\"&gt;&lt;/a&gt;&lt;a href=\"#foo-9\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;assert_has_content&lt;/span&gt;&lt;span class=\"testingp\"&gt;()&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-10\"&gt;&lt;a id=\"foo-10\" name=\"foo-10\"&gt;&lt;/a&gt;&lt;a href=\"#foo-10\"&gt;&lt;span class=\"linenos special\"&gt;10&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;try&lt;/span&gt;&lt;span class=\"testingp\"&gt;:&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-11\"&gt;&lt;a id=\"foo-11\" name=\"foo-11\"&gt;&lt;/a&gt;&lt;a href=\"#foo-11\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingn\"&gt;lexer&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;get_lexer_by_name&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;arguments&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testingmi\"&gt;0&lt;/span&gt;&lt;span class=\"testingp\"&gt;])&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-12\"&gt;&lt;a id=\"foo-12\" name=\"foo-12\"&gt;&lt;/a&gt;&lt;a href=\"#foo-12\"&gt;&lt;span class=\"linenos special\"&gt;12&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;except&lt;/span&gt; &lt;span class=\"testingne\"&gt;ValueError&lt;/span&gt;&lt;span class=\"testingp\"&gt;:&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-13\"&gt;&lt;a id=\"foo-13\" name=\"foo-13\"&gt;&lt;/a&gt;&lt;a href=\"#foo-13\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingc1\"&gt;# no lexer found - use the text one instead of an exception&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-14\"&gt;&lt;a id=\"foo-14\" name=\"foo-14\"&gt;&lt;/a&gt;&lt;a href=\"#foo-14\"&gt;&lt;span class=\"linenos special\"&gt;14&lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingn\"&gt;lexer&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;TextLexer&lt;/span&gt;&lt;span class=\"testingp\"&gt;()&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-15\"&gt;&lt;a id=\"foo-15\" name=\"foo-15\"&gt;&lt;/a&gt;&lt;a href=\"#foo-15\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-16\"&gt;&lt;a id=\"foo-16\" name=\"foo-16\"&gt;&lt;/a&gt;&lt;a href=\"#foo-16\"&gt;&lt;span class=\"linenos special\"&gt;16&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;if&lt;/span&gt; &lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;linenos&amp;#39;&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt; &lt;span class=\"testingow\"&gt;and&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-17\"&gt;&lt;a id=\"foo-17\" name=\"foo-17\"&gt;&lt;/a&gt;&lt;a href=\"#foo-17\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;            &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;linenos&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;]&lt;/span&gt; &lt;span class=\"testingow\"&gt;not&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;table&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;inline&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;)):&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-18\"&gt;&lt;a id=\"foo-18\" name=\"foo-18\"&gt;&lt;/a&gt;&lt;a href=\"#foo-18\"&gt;&lt;span class=\"linenos special\"&gt;18&lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;linenos&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;]&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;table&amp;#39;&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-19\"&gt;&lt;a id=\"foo-19\" name=\"foo-19\"&gt;&lt;/a&gt;&lt;a href=\"#foo-19\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-20\"&gt;&lt;a id=\"foo-20\" name=\"foo-20\"&gt;&lt;/a&gt;&lt;a href=\"#foo-20\"&gt;&lt;span class=\"linenos special\"&gt;20&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;for&lt;/span&gt; &lt;span class=\"testingn\"&gt;flag&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;nowrap&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;nobackground&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;anchorlinenos&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;):&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-21\"&gt;&lt;a id=\"foo-21\" name=\"foo-21\"&gt;&lt;/a&gt;&lt;a href=\"#foo-21\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingk\"&gt;if&lt;/span&gt; &lt;span class=\"testingn\"&gt;flag&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;:&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-22\"&gt;&lt;a id=\"foo-22\" name=\"foo-22\"&gt;&lt;/a&gt;&lt;a href=\"#foo-22\"&gt;&lt;span class=\"linenos special\"&gt;22&lt;/span&gt;&lt;/a&gt;            &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testingn\"&gt;flag&lt;/span&gt;&lt;span class=\"testingp\"&gt;]&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingkc\"&gt;True&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-23\"&gt;&lt;a id=\"foo-23\" name=\"foo-23\"&gt;&lt;/a&gt;&lt;a href=\"#foo-23\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-24\"&gt;&lt;a id=\"foo-24\" name=\"foo-24\"&gt;&lt;/a&gt;&lt;a href=\"#foo-24\"&gt;&lt;span class=\"linenos special\"&gt;24&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingc1\"&gt;# noclasses should already default to False, but just in case...&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-25\"&gt;&lt;a id=\"foo-25\" name=\"foo-25\"&gt;&lt;/a&gt;&lt;a href=\"#foo-25\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingn\"&gt;formatter&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;HtmlFormatter&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingn\"&gt;noclasses&lt;/span&gt;&lt;span class=\"testingo\"&gt;=&lt;/span&gt;&lt;span class=\"testingkc\"&gt;False&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingo\"&gt;**&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;)&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-26\"&gt;&lt;a id=\"foo-26\" name=\"foo-26\"&gt;&lt;/a&gt;&lt;a href=\"#foo-26\"&gt;&lt;span class=\"linenos special\"&gt;26&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingn\"&gt;parsed&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;highlight&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;&lt;/span&gt;&lt;span class=\"testingse\"&gt;\\n&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;join&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;content&lt;/span&gt;&lt;span class=\"testingp\"&gt;),&lt;/span&gt; &lt;span class=\"testingn\"&gt;lexer&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingn\"&gt;formatter&lt;/span&gt;&lt;span class=\"testingp\"&gt;)&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-27\"&gt;&lt;a id=\"foo-27\" name=\"foo-27\"&gt;&lt;/a&gt;&lt;a href=\"#foo-27\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;return&lt;/span&gt; &lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testingn\"&gt;nodes&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;raw&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingn\"&gt;parsed&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingnb\"&gt;format&lt;/span&gt;&lt;span class=\"testingo\"&gt;=&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;html&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;)]&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-even-more-sourcecode-directives\"&gt;\n&lt;h2&gt;Testing even more sourcecode directives&lt;/h2&gt;\n&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-overriding-config-defaults\"&gt;\n&lt;h2&gt;Testing overriding config defaults&lt;/h2&gt;\n&lt;p&gt;Even if the default is line numbers, we can override it here&lt;/p&gt;\n&lt;div class=\"highlight\"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n</content><category term=\"misc\"/></entry><entry><title>The baz tag</title><link href=\"http://blog.notmyidea.org/tag/baz.html\" rel=\"alternate\"/><published>2010-03-14T00:00:00+01:00</published><updated>2010-03-14T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-03-14:/tag/baz.html</id><content type=\"html\">&lt;p&gt;This article overrides the listening of the articles under the &lt;em&gt;baz&lt;/em&gt; tag.&lt;/p&gt;\n</content><category term=\"misc\"/></entry></feed>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/feeds/alexis-metaireau.rss.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<rss version=\"2.0\" xmlns:atom=\"http://www.w3.org/2005/Atom\"><channel><title>Alexis' log - Alexis Métaireau</title><link>http://blog.notmyidea.org/</link><description/><atom:link href=\"http://blog.notmyidea.org/feeds/alexis-metaireau.rss.xml\" rel=\"self\"/><lastBuildDate>Sun, 17 Nov 2013 23:29:00 +0100</lastBuildDate><item><title>FILENAME_METADATA example</title><link>http://blog.notmyidea.org/posts/2012/novembre/30/filename_metadata-example/</link><description>&lt;p&gt;Some cool stuff!&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Fri, 30 Nov 2012 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2012-11-30:/posts/2012/novembre/30/filename_metadata-example/</guid><category>misc</category></item><item><title>Second article</title><link>http://blog.notmyidea.org/posts/2012/f%C3%A9vrier/29/second-article/</link><description>&lt;p&gt;This is some article, in english&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Wed, 29 Feb 2012 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2012-02-29:/posts/2012/février/29/second-article/</guid><category>misc</category><category>foo</category><category>bar</category><category>baz</category></item><item><title>A markdown powered article</title><link>http://blog.notmyidea.org/posts/2011/avril/20/a-markdown-powered-article/</link><description>&lt;p&gt;You're mutually oblivious.&lt;/p&gt;\n&lt;p&gt;&lt;a href=\"http://blog.notmyidea.org/posts/2010/octobre/15/unbelievable/\"&gt;a root-relative link to unbelievable&lt;/a&gt;\n&lt;a href=\"http://blog.notmyidea.org/posts/2010/octobre/15/unbelievable/\"&gt;a file-relative link to unbelievable&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Wed, 20 Apr 2011 00:00:00 +0200</pubDate><guid>tag:blog.notmyidea.org,2011-04-20:/posts/2011/avril/20/a-markdown-powered-article/</guid><category>cat1</category></item><item><title>Article 1</title><link>http://blog.notmyidea.org/posts/2011/f%C3%A9vrier/17/article-1/</link><description>&lt;p&gt;Article 1&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Thu, 17 Feb 2011 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2011-02-17:/posts/2011/février/17/article-1/</guid><category>cat1</category></item><item><title>Article 2</title><link>http://blog.notmyidea.org/posts/2011/f%C3%A9vrier/17/article-2/</link><description>&lt;p&gt;Article 2&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Thu, 17 Feb 2011 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2011-02-17:/posts/2011/février/17/article-2/</guid><category>cat1</category></item><item><title>Article 3</title><link>http://blog.notmyidea.org/posts/2011/f%C3%A9vrier/17/article-3/</link><description>&lt;p&gt;Article 3&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Thu, 17 Feb 2011 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2011-02-17:/posts/2011/février/17/article-3/</guid><category>cat1</category></item><item><title>This is a super article !</title><link>http://blog.notmyidea.org/posts/2010/d%C3%A9cembre/02/this-is-a-super-article/</link><description>&lt;p class=\"first last\"&gt;Multi-line metadata should be supported\nas well as &lt;strong&gt;inline markup&lt;/strong&gt;.&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Thu, 02 Dec 2010 10:14:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2010-12-02:/posts/2010/décembre/02/this-is-a-super-article/</guid><category>yeah</category><category>foo</category><category>bar</category><category>foobar</category></item><item><title>Oh yeah !</title><link>http://blog.notmyidea.org/posts/2010/octobre/20/oh-yeah/</link><description>&lt;div class=\"section\" id=\"why-not\"&gt;\n&lt;h2&gt;Why not ?&lt;/h2&gt;\n&lt;p&gt;After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\nYEAH !&lt;/p&gt;\n&lt;img alt=\"alternate text\" src=\"http://blog.notmyidea.org/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;/div&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Wed, 20 Oct 2010 10:14:00 +0200</pubDate><guid>tag:blog.notmyidea.org,2010-10-20:/posts/2010/octobre/20/oh-yeah/</guid><category>bar</category><category>oh</category><category>bar</category><category>yeah</category></item><item><title>Unbelievable !</title><link>http://blog.notmyidea.org/posts/2010/octobre/15/unbelievable/</link><description>&lt;p&gt;Or completely awesome. Depends the needs.&lt;/p&gt;\n&lt;p&gt;&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/posts/2011/avril/20/a-markdown-powered-article/\"&gt;a root-relative link to markdown-article&lt;/a&gt;\n&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/posts/2011/avril/20/a-markdown-powered-article/\"&gt;a file-relative link to markdown-article&lt;/a&gt;&lt;/p&gt;\n&lt;div class=\"section\" id=\"testing-sourcecode-directive\"&gt;\n&lt;h2&gt;Testing sourcecode directive&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;table class=\"highlighttable\"&gt;&lt;tr&gt;&lt;td class=\"linenos\"&gt;&lt;div class=\"linenodiv\"&gt;&lt;pre&gt;&lt;span class=\"normal\"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=\"code\"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-another-case\"&gt;\n&lt;h2&gt;Testing another case&lt;/h2&gt;\n&lt;p&gt;This will now have a line number in 'custom' since it's the default in\npelican.conf, it will …&lt;/p&gt;&lt;/div&gt;</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Fri, 15 Oct 2010 20:30:00 +0200</pubDate><guid>tag:blog.notmyidea.org,2010-10-15:/posts/2010/octobre/15/unbelievable/</guid><category>misc</category></item><item><title>The baz tag</title><link>http://blog.notmyidea.org/tag/baz.html</link><description>&lt;p&gt;This article overrides the listening of the articles under the &lt;em&gt;baz&lt;/em&gt; tag.&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Sun, 14 Mar 2010 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2010-03-14:/tag/baz.html</guid><category>misc</category></item></channel></rss>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/feeds/all-en.atom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<feed xmlns=\"http://www.w3.org/2005/Atom\"><title>Alexis' log</title><link href=\"http://blog.notmyidea.org/\" rel=\"alternate\"/><link href=\"http://blog.notmyidea.org/feeds/all-en.atom.xml\" rel=\"self\"/><id>http://blog.notmyidea.org/</id><updated>2013-11-17T23:29:00+01:00</updated><entry><title>FILENAME_METADATA example</title><link href=\"http://blog.notmyidea.org/posts/2012/novembre/30/filename_metadata-example/\" rel=\"alternate\"/><published>2012-11-30T00:00:00+01:00</published><updated>2012-11-30T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2012-11-30:/posts/2012/novembre/30/filename_metadata-example/</id><content type=\"html\">&lt;p&gt;Some cool stuff!&lt;/p&gt;\n</content><category term=\"misc\"/></entry><entry><title>Second article</title><link href=\"http://blog.notmyidea.org/posts/2012/f%C3%A9vrier/29/second-article/\" rel=\"alternate\"/><published>2012-02-29T00:00:00+01:00</published><updated>2012-02-29T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2012-02-29:/posts/2012/février/29/second-article/</id><content type=\"html\">&lt;p&gt;This is some article, in english&lt;/p&gt;\n</content><category term=\"misc\"/><category term=\"foo\"/><category term=\"bar\"/><category term=\"baz\"/></entry><entry><title>A markdown powered article</title><link href=\"http://blog.notmyidea.org/posts/2011/avril/20/a-markdown-powered-article/\" rel=\"alternate\"/><published>2011-04-20T00:00:00+02:00</published><updated>2011-04-20T00:00:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-04-20:/posts/2011/avril/20/a-markdown-powered-article/</id><content type=\"html\">&lt;p&gt;You're mutually oblivious.&lt;/p&gt;\n&lt;p&gt;&lt;a href=\"http://blog.notmyidea.org/posts/2010/octobre/15/unbelievable/\"&gt;a root-relative link to unbelievable&lt;/a&gt;\n&lt;a href=\"http://blog.notmyidea.org/posts/2010/octobre/15/unbelievable/\"&gt;a file-relative link to unbelievable&lt;/a&gt;&lt;/p&gt;</content><category term=\"cat1\"/></entry><entry><title>Article 1</title><link href=\"http://blog.notmyidea.org/posts/2011/f%C3%A9vrier/17/article-1/\" rel=\"alternate\"/><published>2011-02-17T00:00:00+01:00</published><updated>2011-02-17T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-02-17:/posts/2011/février/17/article-1/</id><content type=\"html\">&lt;p&gt;Article 1&lt;/p&gt;\n</content><category term=\"cat1\"/></entry><entry><title>Article 2</title><link href=\"http://blog.notmyidea.org/posts/2011/f%C3%A9vrier/17/article-2/\" rel=\"alternate\"/><published>2011-02-17T00:00:00+01:00</published><updated>2011-02-17T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-02-17:/posts/2011/février/17/article-2/</id><content type=\"html\">&lt;p&gt;Article 2&lt;/p&gt;\n</content><category term=\"cat1\"/></entry><entry><title>Article 3</title><link href=\"http://blog.notmyidea.org/posts/2011/f%C3%A9vrier/17/article-3/\" rel=\"alternate\"/><published>2011-02-17T00:00:00+01:00</published><updated>2011-02-17T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-02-17:/posts/2011/février/17/article-3/</id><content type=\"html\">&lt;p&gt;Article 3&lt;/p&gt;\n</content><category term=\"cat1\"/></entry><entry><title>This is a super article !</title><link href=\"http://blog.notmyidea.org/posts/2010/d%C3%A9cembre/02/this-is-a-super-article/\" rel=\"alternate\"/><published>2010-12-02T10:14:00+01:00</published><updated>2013-11-17T23:29:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-12-02:/posts/2010/décembre/02/this-is-a-super-article/</id><summary type=\"html\">&lt;p class=\"first last\"&gt;Multi-line metadata should be supported\nas well as &lt;strong&gt;inline markup&lt;/strong&gt;.&lt;/p&gt;\n</summary><content type=\"html\">&lt;p&gt;Some content here !&lt;/p&gt;\n&lt;div class=\"section\" id=\"this-is-a-simple-title\"&gt;\n&lt;h2&gt;This is a simple title&lt;/h2&gt;\n&lt;p&gt;And here comes the cool &lt;a class=\"reference external\" href=\"http://books.couchdb.org/relax/design-documents/views\"&gt;stuff&lt;/a&gt;.&lt;/p&gt;\n&lt;img alt=\"alternate text\" src=\"http://blog.notmyidea.org/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;img alt=\"alternate text\" src=\"http://blog.notmyidea.org/pictures/Sushi_Macro.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;pre class=\"literal-block\"&gt;\n&amp;gt;&amp;gt;&amp;gt; from ipdb import set_trace\n&amp;gt;&amp;gt;&amp;gt; set_trace()\n&lt;/pre&gt;\n&lt;p&gt;→ And now try with some utf8 hell: ééé&lt;/p&gt;\n&lt;/div&gt;\n</content><category term=\"yeah\"/><category term=\"foo\"/><category term=\"bar\"/><category term=\"foobar\"/></entry><entry><title>Oh yeah !</title><link href=\"http://blog.notmyidea.org/posts/2010/octobre/20/oh-yeah/\" rel=\"alternate\"/><published>2010-10-20T10:14:00+02:00</published><updated>2010-10-20T10:14:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-10-20:/posts/2010/octobre/20/oh-yeah/</id><content type=\"html\">&lt;div class=\"section\" id=\"why-not\"&gt;\n&lt;h2&gt;Why not ?&lt;/h2&gt;\n&lt;p&gt;After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\nYEAH !&lt;/p&gt;\n&lt;img alt=\"alternate text\" src=\"http://blog.notmyidea.org/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;/div&gt;\n</content><category term=\"bar\"/><category term=\"oh\"/><category term=\"bar\"/><category term=\"yeah\"/></entry><entry><title>Unbelievable !</title><link href=\"http://blog.notmyidea.org/posts/2010/octobre/15/unbelievable/\" rel=\"alternate\"/><published>2010-10-15T20:30:00+02:00</published><updated>2010-10-15T20:30:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-10-15:/posts/2010/octobre/15/unbelievable/</id><summary type=\"html\">&lt;p&gt;Or completely awesome. Depends the needs.&lt;/p&gt;\n&lt;p&gt;&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/posts/2011/avril/20/a-markdown-powered-article/\"&gt;a root-relative link to markdown-article&lt;/a&gt;\n&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/posts/2011/avril/20/a-markdown-powered-article/\"&gt;a file-relative link to markdown-article&lt;/a&gt;&lt;/p&gt;\n&lt;div class=\"section\" id=\"testing-sourcecode-directive\"&gt;\n&lt;h2&gt;Testing sourcecode directive&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;table class=\"highlighttable\"&gt;&lt;tr&gt;&lt;td class=\"linenos\"&gt;&lt;div class=\"linenodiv\"&gt;&lt;pre&gt;&lt;span class=\"normal\"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=\"code\"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-another-case\"&gt;\n&lt;h2&gt;Testing another case&lt;/h2&gt;\n&lt;p&gt;This will now have a line number in 'custom' since it's the default in\npelican.conf, it will …&lt;/p&gt;&lt;/div&gt;</summary><content type=\"html\">&lt;p&gt;Or completely awesome. Depends the needs.&lt;/p&gt;\n&lt;p&gt;&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/posts/2011/avril/20/a-markdown-powered-article/\"&gt;a root-relative link to markdown-article&lt;/a&gt;\n&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/posts/2011/avril/20/a-markdown-powered-article/\"&gt;a file-relative link to markdown-article&lt;/a&gt;&lt;/p&gt;\n&lt;div class=\"section\" id=\"testing-sourcecode-directive\"&gt;\n&lt;h2&gt;Testing sourcecode directive&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;table class=\"highlighttable\"&gt;&lt;tr&gt;&lt;td class=\"linenos\"&gt;&lt;div class=\"linenodiv\"&gt;&lt;pre&gt;&lt;span class=\"normal\"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=\"code\"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-another-case\"&gt;\n&lt;h2&gt;Testing another case&lt;/h2&gt;\n&lt;p&gt;This will now have a line number in 'custom' since it's the default in\npelican.conf, it will have nothing in default.&lt;/p&gt;\n&lt;div class=\"highlight\"&gt;&lt;table class=\"highlighttable\"&gt;&lt;tr&gt;&lt;td class=\"linenos\"&gt;&lt;div class=\"linenodiv\"&gt;&lt;pre&gt;&lt;span class=\"normal\"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=\"code\"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-more-sourcecode-directives\"&gt;\n&lt;h2&gt;Testing more sourcecode directives&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id=\"foo-8\"&gt;&lt;a id=\"foo-8\" name=\"foo-8\"&gt;&lt;/a&gt;&lt;a href=\"#foo-8\"&gt;&lt;span class=\"linenos special\"&gt; 8&lt;/span&gt;&lt;/a&gt;&lt;span class=\"testingk\"&gt;def&lt;/span&gt;&lt;span class=\"testingw\"&gt; &lt;/span&gt;&lt;span class=\"testingnf\"&gt;run&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingp\"&gt;):&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-9\"&gt;&lt;a id=\"foo-9\" name=\"foo-9\"&gt;&lt;/a&gt;&lt;a href=\"#foo-9\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;assert_has_content&lt;/span&gt;&lt;span class=\"testingp\"&gt;()&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-10\"&gt;&lt;a id=\"foo-10\" name=\"foo-10\"&gt;&lt;/a&gt;&lt;a href=\"#foo-10\"&gt;&lt;span class=\"linenos special\"&gt;10&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;try&lt;/span&gt;&lt;span class=\"testingp\"&gt;:&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-11\"&gt;&lt;a id=\"foo-11\" name=\"foo-11\"&gt;&lt;/a&gt;&lt;a href=\"#foo-11\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingn\"&gt;lexer&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;get_lexer_by_name&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;arguments&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testingmi\"&gt;0&lt;/span&gt;&lt;span class=\"testingp\"&gt;])&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-12\"&gt;&lt;a id=\"foo-12\" name=\"foo-12\"&gt;&lt;/a&gt;&lt;a href=\"#foo-12\"&gt;&lt;span class=\"linenos special\"&gt;12&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;except&lt;/span&gt; &lt;span class=\"testingne\"&gt;ValueError&lt;/span&gt;&lt;span class=\"testingp\"&gt;:&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-13\"&gt;&lt;a id=\"foo-13\" name=\"foo-13\"&gt;&lt;/a&gt;&lt;a href=\"#foo-13\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingc1\"&gt;# no lexer found - use the text one instead of an exception&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-14\"&gt;&lt;a id=\"foo-14\" name=\"foo-14\"&gt;&lt;/a&gt;&lt;a href=\"#foo-14\"&gt;&lt;span class=\"linenos special\"&gt;14&lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingn\"&gt;lexer&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;TextLexer&lt;/span&gt;&lt;span class=\"testingp\"&gt;()&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-15\"&gt;&lt;a id=\"foo-15\" name=\"foo-15\"&gt;&lt;/a&gt;&lt;a href=\"#foo-15\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-16\"&gt;&lt;a id=\"foo-16\" name=\"foo-16\"&gt;&lt;/a&gt;&lt;a href=\"#foo-16\"&gt;&lt;span class=\"linenos special\"&gt;16&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;if&lt;/span&gt; &lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;linenos&amp;#39;&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt; &lt;span class=\"testingow\"&gt;and&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-17\"&gt;&lt;a id=\"foo-17\" name=\"foo-17\"&gt;&lt;/a&gt;&lt;a href=\"#foo-17\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;            &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;linenos&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;]&lt;/span&gt; &lt;span class=\"testingow\"&gt;not&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;table&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;inline&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;)):&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-18\"&gt;&lt;a id=\"foo-18\" name=\"foo-18\"&gt;&lt;/a&gt;&lt;a href=\"#foo-18\"&gt;&lt;span class=\"linenos special\"&gt;18&lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;linenos&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;]&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;table&amp;#39;&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-19\"&gt;&lt;a id=\"foo-19\" name=\"foo-19\"&gt;&lt;/a&gt;&lt;a href=\"#foo-19\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-20\"&gt;&lt;a id=\"foo-20\" name=\"foo-20\"&gt;&lt;/a&gt;&lt;a href=\"#foo-20\"&gt;&lt;span class=\"linenos special\"&gt;20&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;for&lt;/span&gt; &lt;span class=\"testingn\"&gt;flag&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;nowrap&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;nobackground&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;anchorlinenos&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;):&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-21\"&gt;&lt;a id=\"foo-21\" name=\"foo-21\"&gt;&lt;/a&gt;&lt;a href=\"#foo-21\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingk\"&gt;if&lt;/span&gt; &lt;span class=\"testingn\"&gt;flag&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;:&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-22\"&gt;&lt;a id=\"foo-22\" name=\"foo-22\"&gt;&lt;/a&gt;&lt;a href=\"#foo-22\"&gt;&lt;span class=\"linenos special\"&gt;22&lt;/span&gt;&lt;/a&gt;            &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testingn\"&gt;flag&lt;/span&gt;&lt;span class=\"testingp\"&gt;]&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingkc\"&gt;True&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-23\"&gt;&lt;a id=\"foo-23\" name=\"foo-23\"&gt;&lt;/a&gt;&lt;a href=\"#foo-23\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-24\"&gt;&lt;a id=\"foo-24\" name=\"foo-24\"&gt;&lt;/a&gt;&lt;a href=\"#foo-24\"&gt;&lt;span class=\"linenos special\"&gt;24&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingc1\"&gt;# noclasses should already default to False, but just in case...&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-25\"&gt;&lt;a id=\"foo-25\" name=\"foo-25\"&gt;&lt;/a&gt;&lt;a href=\"#foo-25\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingn\"&gt;formatter&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;HtmlFormatter&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingn\"&gt;noclasses&lt;/span&gt;&lt;span class=\"testingo\"&gt;=&lt;/span&gt;&lt;span class=\"testingkc\"&gt;False&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingo\"&gt;**&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;)&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-26\"&gt;&lt;a id=\"foo-26\" name=\"foo-26\"&gt;&lt;/a&gt;&lt;a href=\"#foo-26\"&gt;&lt;span class=\"linenos special\"&gt;26&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingn\"&gt;parsed&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;highlight&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;&lt;/span&gt;&lt;span class=\"testingse\"&gt;\\n&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;join&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;content&lt;/span&gt;&lt;span class=\"testingp\"&gt;),&lt;/span&gt; &lt;span class=\"testingn\"&gt;lexer&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingn\"&gt;formatter&lt;/span&gt;&lt;span class=\"testingp\"&gt;)&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-27\"&gt;&lt;a id=\"foo-27\" name=\"foo-27\"&gt;&lt;/a&gt;&lt;a href=\"#foo-27\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;return&lt;/span&gt; &lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testingn\"&gt;nodes&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;raw&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingn\"&gt;parsed&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingnb\"&gt;format&lt;/span&gt;&lt;span class=\"testingo\"&gt;=&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;html&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;)]&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-even-more-sourcecode-directives\"&gt;\n&lt;h2&gt;Testing even more sourcecode directives&lt;/h2&gt;\n&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-overriding-config-defaults\"&gt;\n&lt;h2&gt;Testing overriding config defaults&lt;/h2&gt;\n&lt;p&gt;Even if the default is line numbers, we can override it here&lt;/p&gt;\n&lt;div class=\"highlight\"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n</content><category term=\"misc\"/></entry><entry><title>The baz tag</title><link href=\"http://blog.notmyidea.org/tag/baz.html\" rel=\"alternate\"/><published>2010-03-14T00:00:00+01:00</published><updated>2010-03-14T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-03-14:/tag/baz.html</id><content type=\"html\">&lt;p&gt;This article overrides the listening of the articles under the &lt;em&gt;baz&lt;/em&gt; tag.&lt;/p&gt;\n</content><category term=\"misc\"/></entry></feed>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/feeds/all-fr.atom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<feed xmlns=\"http://www.w3.org/2005/Atom\"><title>Alexis' log</title><link href=\"http://blog.notmyidea.org/\" rel=\"alternate\"/><link href=\"http://blog.notmyidea.org/feeds/all-fr.atom.xml\" rel=\"self\"/><id>http://blog.notmyidea.org/</id><updated>2012-02-29T00:00:00+01:00</updated><entry><title>Deuxième article</title><link href=\"http://blog.notmyidea.org/second-article-fr.html\" rel=\"alternate\"/><published>2012-02-29T00:00:00+01:00</published><updated>2012-02-29T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2012-02-29:/second-article-fr.html</id><content type=\"html\">&lt;p&gt;Ceci est un article, en français.&lt;/p&gt;\n</content><category term=\"misc\"/><category term=\"foo\"/><category term=\"bar\"/><category term=\"baz\"/></entry><entry><title>Trop bien !</title><link href=\"http://blog.notmyidea.org/oh-yeah-fr.html\" rel=\"alternate\"/><published>2010-10-20T10:14:00+02:00</published><updated>2010-10-20T10:14:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-10-20:/oh-yeah-fr.html</id><content type=\"html\">&lt;p&gt;Et voila du contenu en français&lt;/p&gt;\n</content><category term=\"misc\"/></entry></feed>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/feeds/all.atom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<feed xmlns=\"http://www.w3.org/2005/Atom\"><title>Alexis' log</title><link href=\"http://blog.notmyidea.org/\" rel=\"alternate\"/><link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" rel=\"self\"/><id>http://blog.notmyidea.org/</id><updated>2013-11-17T23:29:00+01:00</updated><entry><title>FILENAME_METADATA example</title><link href=\"http://blog.notmyidea.org/posts/2012/novembre/30/filename_metadata-example/\" rel=\"alternate\"/><published>2012-11-30T00:00:00+01:00</published><updated>2012-11-30T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2012-11-30:/posts/2012/novembre/30/filename_metadata-example/</id><content type=\"html\">&lt;p&gt;Some cool stuff!&lt;/p&gt;\n</content><category term=\"misc\"/></entry><entry><title>Second article</title><link href=\"http://blog.notmyidea.org/posts/2012/f%C3%A9vrier/29/second-article/\" rel=\"alternate\"/><published>2012-02-29T00:00:00+01:00</published><updated>2012-02-29T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2012-02-29:/posts/2012/février/29/second-article/</id><content type=\"html\">&lt;p&gt;This is some article, in english&lt;/p&gt;\n</content><category term=\"misc\"/><category term=\"foo\"/><category term=\"bar\"/><category term=\"baz\"/></entry><entry><title>Deuxième article</title><link href=\"http://blog.notmyidea.org/second-article-fr.html\" rel=\"alternate\"/><published>2012-02-29T00:00:00+01:00</published><updated>2012-02-29T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2012-02-29:/second-article-fr.html</id><content type=\"html\">&lt;p&gt;Ceci est un article, en français.&lt;/p&gt;\n</content><category term=\"misc\"/><category term=\"foo\"/><category term=\"bar\"/><category term=\"baz\"/></entry><entry><title>A markdown powered article</title><link href=\"http://blog.notmyidea.org/posts/2011/avril/20/a-markdown-powered-article/\" rel=\"alternate\"/><published>2011-04-20T00:00:00+02:00</published><updated>2011-04-20T00:00:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-04-20:/posts/2011/avril/20/a-markdown-powered-article/</id><content type=\"html\">&lt;p&gt;You're mutually oblivious.&lt;/p&gt;\n&lt;p&gt;&lt;a href=\"http://blog.notmyidea.org/posts/2010/octobre/15/unbelievable/\"&gt;a root-relative link to unbelievable&lt;/a&gt;\n&lt;a href=\"http://blog.notmyidea.org/posts/2010/octobre/15/unbelievable/\"&gt;a file-relative link to unbelievable&lt;/a&gt;&lt;/p&gt;</content><category term=\"cat1\"/></entry><entry><title>Article 1</title><link href=\"http://blog.notmyidea.org/posts/2011/f%C3%A9vrier/17/article-1/\" rel=\"alternate\"/><published>2011-02-17T00:00:00+01:00</published><updated>2011-02-17T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-02-17:/posts/2011/février/17/article-1/</id><content type=\"html\">&lt;p&gt;Article 1&lt;/p&gt;\n</content><category term=\"cat1\"/></entry><entry><title>Article 2</title><link href=\"http://blog.notmyidea.org/posts/2011/f%C3%A9vrier/17/article-2/\" rel=\"alternate\"/><published>2011-02-17T00:00:00+01:00</published><updated>2011-02-17T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-02-17:/posts/2011/février/17/article-2/</id><content type=\"html\">&lt;p&gt;Article 2&lt;/p&gt;\n</content><category term=\"cat1\"/></entry><entry><title>Article 3</title><link href=\"http://blog.notmyidea.org/posts/2011/f%C3%A9vrier/17/article-3/\" rel=\"alternate\"/><published>2011-02-17T00:00:00+01:00</published><updated>2011-02-17T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-02-17:/posts/2011/février/17/article-3/</id><content type=\"html\">&lt;p&gt;Article 3&lt;/p&gt;\n</content><category term=\"cat1\"/></entry><entry><title>This is a super article !</title><link href=\"http://blog.notmyidea.org/posts/2010/d%C3%A9cembre/02/this-is-a-super-article/\" rel=\"alternate\"/><published>2010-12-02T10:14:00+01:00</published><updated>2013-11-17T23:29:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-12-02:/posts/2010/décembre/02/this-is-a-super-article/</id><summary type=\"html\">&lt;p class=\"first last\"&gt;Multi-line metadata should be supported\nas well as &lt;strong&gt;inline markup&lt;/strong&gt;.&lt;/p&gt;\n</summary><content type=\"html\">&lt;p&gt;Some content here !&lt;/p&gt;\n&lt;div class=\"section\" id=\"this-is-a-simple-title\"&gt;\n&lt;h2&gt;This is a simple title&lt;/h2&gt;\n&lt;p&gt;And here comes the cool &lt;a class=\"reference external\" href=\"http://books.couchdb.org/relax/design-documents/views\"&gt;stuff&lt;/a&gt;.&lt;/p&gt;\n&lt;img alt=\"alternate text\" src=\"http://blog.notmyidea.org/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;img alt=\"alternate text\" src=\"http://blog.notmyidea.org/pictures/Sushi_Macro.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;pre class=\"literal-block\"&gt;\n&amp;gt;&amp;gt;&amp;gt; from ipdb import set_trace\n&amp;gt;&amp;gt;&amp;gt; set_trace()\n&lt;/pre&gt;\n&lt;p&gt;→ And now try with some utf8 hell: ééé&lt;/p&gt;\n&lt;/div&gt;\n</content><category term=\"yeah\"/><category term=\"foo\"/><category term=\"bar\"/><category term=\"foobar\"/></entry><entry><title>Oh yeah !</title><link href=\"http://blog.notmyidea.org/posts/2010/octobre/20/oh-yeah/\" rel=\"alternate\"/><published>2010-10-20T10:14:00+02:00</published><updated>2010-10-20T10:14:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-10-20:/posts/2010/octobre/20/oh-yeah/</id><content type=\"html\">&lt;div class=\"section\" id=\"why-not\"&gt;\n&lt;h2&gt;Why not ?&lt;/h2&gt;\n&lt;p&gt;After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\nYEAH !&lt;/p&gt;\n&lt;img alt=\"alternate text\" src=\"http://blog.notmyidea.org/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;/div&gt;\n</content><category term=\"bar\"/><category term=\"oh\"/><category term=\"bar\"/><category term=\"yeah\"/></entry><entry><title>Trop bien !</title><link href=\"http://blog.notmyidea.org/oh-yeah-fr.html\" rel=\"alternate\"/><published>2010-10-20T10:14:00+02:00</published><updated>2010-10-20T10:14:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-10-20:/oh-yeah-fr.html</id><content type=\"html\">&lt;p&gt;Et voila du contenu en français&lt;/p&gt;\n</content><category term=\"misc\"/></entry><entry><title>Unbelievable !</title><link href=\"http://blog.notmyidea.org/posts/2010/octobre/15/unbelievable/\" rel=\"alternate\"/><published>2010-10-15T20:30:00+02:00</published><updated>2010-10-15T20:30:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-10-15:/posts/2010/octobre/15/unbelievable/</id><summary type=\"html\">&lt;p&gt;Or completely awesome. Depends the needs.&lt;/p&gt;\n&lt;p&gt;&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/posts/2011/avril/20/a-markdown-powered-article/\"&gt;a root-relative link to markdown-article&lt;/a&gt;\n&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/posts/2011/avril/20/a-markdown-powered-article/\"&gt;a file-relative link to markdown-article&lt;/a&gt;&lt;/p&gt;\n&lt;div class=\"section\" id=\"testing-sourcecode-directive\"&gt;\n&lt;h2&gt;Testing sourcecode directive&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;table class=\"highlighttable\"&gt;&lt;tr&gt;&lt;td class=\"linenos\"&gt;&lt;div class=\"linenodiv\"&gt;&lt;pre&gt;&lt;span class=\"normal\"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=\"code\"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-another-case\"&gt;\n&lt;h2&gt;Testing another case&lt;/h2&gt;\n&lt;p&gt;This will now have a line number in 'custom' since it's the default in\npelican.conf, it will …&lt;/p&gt;&lt;/div&gt;</summary><content type=\"html\">&lt;p&gt;Or completely awesome. Depends the needs.&lt;/p&gt;\n&lt;p&gt;&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/posts/2011/avril/20/a-markdown-powered-article/\"&gt;a root-relative link to markdown-article&lt;/a&gt;\n&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/posts/2011/avril/20/a-markdown-powered-article/\"&gt;a file-relative link to markdown-article&lt;/a&gt;&lt;/p&gt;\n&lt;div class=\"section\" id=\"testing-sourcecode-directive\"&gt;\n&lt;h2&gt;Testing sourcecode directive&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;table class=\"highlighttable\"&gt;&lt;tr&gt;&lt;td class=\"linenos\"&gt;&lt;div class=\"linenodiv\"&gt;&lt;pre&gt;&lt;span class=\"normal\"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=\"code\"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-another-case\"&gt;\n&lt;h2&gt;Testing another case&lt;/h2&gt;\n&lt;p&gt;This will now have a line number in 'custom' since it's the default in\npelican.conf, it will have nothing in default.&lt;/p&gt;\n&lt;div class=\"highlight\"&gt;&lt;table class=\"highlighttable\"&gt;&lt;tr&gt;&lt;td class=\"linenos\"&gt;&lt;div class=\"linenodiv\"&gt;&lt;pre&gt;&lt;span class=\"normal\"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=\"code\"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-more-sourcecode-directives\"&gt;\n&lt;h2&gt;Testing more sourcecode directives&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id=\"foo-8\"&gt;&lt;a id=\"foo-8\" name=\"foo-8\"&gt;&lt;/a&gt;&lt;a href=\"#foo-8\"&gt;&lt;span class=\"linenos special\"&gt; 8&lt;/span&gt;&lt;/a&gt;&lt;span class=\"testingk\"&gt;def&lt;/span&gt;&lt;span class=\"testingw\"&gt; &lt;/span&gt;&lt;span class=\"testingnf\"&gt;run&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingp\"&gt;):&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-9\"&gt;&lt;a id=\"foo-9\" name=\"foo-9\"&gt;&lt;/a&gt;&lt;a href=\"#foo-9\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;assert_has_content&lt;/span&gt;&lt;span class=\"testingp\"&gt;()&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-10\"&gt;&lt;a id=\"foo-10\" name=\"foo-10\"&gt;&lt;/a&gt;&lt;a href=\"#foo-10\"&gt;&lt;span class=\"linenos special\"&gt;10&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;try&lt;/span&gt;&lt;span class=\"testingp\"&gt;:&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-11\"&gt;&lt;a id=\"foo-11\" name=\"foo-11\"&gt;&lt;/a&gt;&lt;a href=\"#foo-11\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingn\"&gt;lexer&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;get_lexer_by_name&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;arguments&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testingmi\"&gt;0&lt;/span&gt;&lt;span class=\"testingp\"&gt;])&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-12\"&gt;&lt;a id=\"foo-12\" name=\"foo-12\"&gt;&lt;/a&gt;&lt;a href=\"#foo-12\"&gt;&lt;span class=\"linenos special\"&gt;12&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;except&lt;/span&gt; &lt;span class=\"testingne\"&gt;ValueError&lt;/span&gt;&lt;span class=\"testingp\"&gt;:&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-13\"&gt;&lt;a id=\"foo-13\" name=\"foo-13\"&gt;&lt;/a&gt;&lt;a href=\"#foo-13\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingc1\"&gt;# no lexer found - use the text one instead of an exception&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-14\"&gt;&lt;a id=\"foo-14\" name=\"foo-14\"&gt;&lt;/a&gt;&lt;a href=\"#foo-14\"&gt;&lt;span class=\"linenos special\"&gt;14&lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingn\"&gt;lexer&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;TextLexer&lt;/span&gt;&lt;span class=\"testingp\"&gt;()&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-15\"&gt;&lt;a id=\"foo-15\" name=\"foo-15\"&gt;&lt;/a&gt;&lt;a href=\"#foo-15\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-16\"&gt;&lt;a id=\"foo-16\" name=\"foo-16\"&gt;&lt;/a&gt;&lt;a href=\"#foo-16\"&gt;&lt;span class=\"linenos special\"&gt;16&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;if&lt;/span&gt; &lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;linenos&amp;#39;&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt; &lt;span class=\"testingow\"&gt;and&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-17\"&gt;&lt;a id=\"foo-17\" name=\"foo-17\"&gt;&lt;/a&gt;&lt;a href=\"#foo-17\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;            &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;linenos&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;]&lt;/span&gt; &lt;span class=\"testingow\"&gt;not&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;table&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;inline&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;)):&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-18\"&gt;&lt;a id=\"foo-18\" name=\"foo-18\"&gt;&lt;/a&gt;&lt;a href=\"#foo-18\"&gt;&lt;span class=\"linenos special\"&gt;18&lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;linenos&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;]&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;table&amp;#39;&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-19\"&gt;&lt;a id=\"foo-19\" name=\"foo-19\"&gt;&lt;/a&gt;&lt;a href=\"#foo-19\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-20\"&gt;&lt;a id=\"foo-20\" name=\"foo-20\"&gt;&lt;/a&gt;&lt;a href=\"#foo-20\"&gt;&lt;span class=\"linenos special\"&gt;20&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;for&lt;/span&gt; &lt;span class=\"testingn\"&gt;flag&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;nowrap&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;nobackground&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;anchorlinenos&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;):&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-21\"&gt;&lt;a id=\"foo-21\" name=\"foo-21\"&gt;&lt;/a&gt;&lt;a href=\"#foo-21\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingk\"&gt;if&lt;/span&gt; &lt;span class=\"testingn\"&gt;flag&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;:&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-22\"&gt;&lt;a id=\"foo-22\" name=\"foo-22\"&gt;&lt;/a&gt;&lt;a href=\"#foo-22\"&gt;&lt;span class=\"linenos special\"&gt;22&lt;/span&gt;&lt;/a&gt;            &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testingn\"&gt;flag&lt;/span&gt;&lt;span class=\"testingp\"&gt;]&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingkc\"&gt;True&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-23\"&gt;&lt;a id=\"foo-23\" name=\"foo-23\"&gt;&lt;/a&gt;&lt;a href=\"#foo-23\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-24\"&gt;&lt;a id=\"foo-24\" name=\"foo-24\"&gt;&lt;/a&gt;&lt;a href=\"#foo-24\"&gt;&lt;span class=\"linenos special\"&gt;24&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingc1\"&gt;# noclasses should already default to False, but just in case...&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-25\"&gt;&lt;a id=\"foo-25\" name=\"foo-25\"&gt;&lt;/a&gt;&lt;a href=\"#foo-25\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingn\"&gt;formatter&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;HtmlFormatter&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingn\"&gt;noclasses&lt;/span&gt;&lt;span class=\"testingo\"&gt;=&lt;/span&gt;&lt;span class=\"testingkc\"&gt;False&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingo\"&gt;**&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;)&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-26\"&gt;&lt;a id=\"foo-26\" name=\"foo-26\"&gt;&lt;/a&gt;&lt;a href=\"#foo-26\"&gt;&lt;span class=\"linenos special\"&gt;26&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingn\"&gt;parsed&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;highlight&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;&lt;/span&gt;&lt;span class=\"testingse\"&gt;\\n&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;join&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;content&lt;/span&gt;&lt;span class=\"testingp\"&gt;),&lt;/span&gt; &lt;span class=\"testingn\"&gt;lexer&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingn\"&gt;formatter&lt;/span&gt;&lt;span class=\"testingp\"&gt;)&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-27\"&gt;&lt;a id=\"foo-27\" name=\"foo-27\"&gt;&lt;/a&gt;&lt;a href=\"#foo-27\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;return&lt;/span&gt; &lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testingn\"&gt;nodes&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;raw&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingn\"&gt;parsed&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingnb\"&gt;format&lt;/span&gt;&lt;span class=\"testingo\"&gt;=&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;html&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;)]&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-even-more-sourcecode-directives\"&gt;\n&lt;h2&gt;Testing even more sourcecode directives&lt;/h2&gt;\n&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-overriding-config-defaults\"&gt;\n&lt;h2&gt;Testing overriding config defaults&lt;/h2&gt;\n&lt;p&gt;Even if the default is line numbers, we can override it here&lt;/p&gt;\n&lt;div class=\"highlight\"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n</content><category term=\"misc\"/></entry><entry><title>The baz tag</title><link href=\"http://blog.notmyidea.org/tag/baz.html\" rel=\"alternate\"/><published>2010-03-14T00:00:00+01:00</published><updated>2010-03-14T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-03-14:/tag/baz.html</id><content type=\"html\">&lt;p&gt;This article overrides the listening of the articles under the &lt;em&gt;baz&lt;/em&gt; tag.&lt;/p&gt;\n</content><category term=\"misc\"/></entry></feed>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/feeds/all.rss.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<rss version=\"2.0\" xmlns:atom=\"http://www.w3.org/2005/Atom\"><channel><title>Alexis' log</title><link>http://blog.notmyidea.org/</link><description/><atom:link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" rel=\"self\"/><lastBuildDate>Sun, 17 Nov 2013 23:29:00 +0100</lastBuildDate><item><title>FILENAME_METADATA example</title><link>http://blog.notmyidea.org/posts/2012/novembre/30/filename_metadata-example/</link><description>&lt;p&gt;Some cool stuff!&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Fri, 30 Nov 2012 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2012-11-30:/posts/2012/novembre/30/filename_metadata-example/</guid><category>misc</category></item><item><title>Second article</title><link>http://blog.notmyidea.org/posts/2012/f%C3%A9vrier/29/second-article/</link><description>&lt;p&gt;This is some article, in english&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Wed, 29 Feb 2012 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2012-02-29:/posts/2012/février/29/second-article/</guid><category>misc</category><category>foo</category><category>bar</category><category>baz</category></item><item><title>Deuxième article</title><link>http://blog.notmyidea.org/second-article-fr.html</link><description>&lt;p&gt;Ceci est un article, en français.&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Wed, 29 Feb 2012 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2012-02-29:/second-article-fr.html</guid><category>misc</category><category>foo</category><category>bar</category><category>baz</category></item><item><title>A markdown powered article</title><link>http://blog.notmyidea.org/posts/2011/avril/20/a-markdown-powered-article/</link><description>&lt;p&gt;You're mutually oblivious.&lt;/p&gt;\n&lt;p&gt;&lt;a href=\"http://blog.notmyidea.org/posts/2010/octobre/15/unbelievable/\"&gt;a root-relative link to unbelievable&lt;/a&gt;\n&lt;a href=\"http://blog.notmyidea.org/posts/2010/octobre/15/unbelievable/\"&gt;a file-relative link to unbelievable&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Wed, 20 Apr 2011 00:00:00 +0200</pubDate><guid>tag:blog.notmyidea.org,2011-04-20:/posts/2011/avril/20/a-markdown-powered-article/</guid><category>cat1</category></item><item><title>Article 1</title><link>http://blog.notmyidea.org/posts/2011/f%C3%A9vrier/17/article-1/</link><description>&lt;p&gt;Article 1&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Thu, 17 Feb 2011 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2011-02-17:/posts/2011/février/17/article-1/</guid><category>cat1</category></item><item><title>Article 2</title><link>http://blog.notmyidea.org/posts/2011/f%C3%A9vrier/17/article-2/</link><description>&lt;p&gt;Article 2&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Thu, 17 Feb 2011 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2011-02-17:/posts/2011/février/17/article-2/</guid><category>cat1</category></item><item><title>Article 3</title><link>http://blog.notmyidea.org/posts/2011/f%C3%A9vrier/17/article-3/</link><description>&lt;p&gt;Article 3&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Thu, 17 Feb 2011 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2011-02-17:/posts/2011/février/17/article-3/</guid><category>cat1</category></item><item><title>This is a super article !</title><link>http://blog.notmyidea.org/posts/2010/d%C3%A9cembre/02/this-is-a-super-article/</link><description>&lt;p class=\"first last\"&gt;Multi-line metadata should be supported\nas well as &lt;strong&gt;inline markup&lt;/strong&gt;.&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Thu, 02 Dec 2010 10:14:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2010-12-02:/posts/2010/décembre/02/this-is-a-super-article/</guid><category>yeah</category><category>foo</category><category>bar</category><category>foobar</category></item><item><title>Oh yeah !</title><link>http://blog.notmyidea.org/posts/2010/octobre/20/oh-yeah/</link><description>&lt;div class=\"section\" id=\"why-not\"&gt;\n&lt;h2&gt;Why not ?&lt;/h2&gt;\n&lt;p&gt;After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\nYEAH !&lt;/p&gt;\n&lt;img alt=\"alternate text\" src=\"http://blog.notmyidea.org/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;/div&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Wed, 20 Oct 2010 10:14:00 +0200</pubDate><guid>tag:blog.notmyidea.org,2010-10-20:/posts/2010/octobre/20/oh-yeah/</guid><category>bar</category><category>oh</category><category>bar</category><category>yeah</category></item><item><title>Trop bien !</title><link>http://blog.notmyidea.org/oh-yeah-fr.html</link><description>&lt;p&gt;Et voila du contenu en français&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Wed, 20 Oct 2010 10:14:00 +0200</pubDate><guid>tag:blog.notmyidea.org,2010-10-20:/oh-yeah-fr.html</guid><category>misc</category></item><item><title>Unbelievable !</title><link>http://blog.notmyidea.org/posts/2010/octobre/15/unbelievable/</link><description>&lt;p&gt;Or completely awesome. Depends the needs.&lt;/p&gt;\n&lt;p&gt;&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/posts/2011/avril/20/a-markdown-powered-article/\"&gt;a root-relative link to markdown-article&lt;/a&gt;\n&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/posts/2011/avril/20/a-markdown-powered-article/\"&gt;a file-relative link to markdown-article&lt;/a&gt;&lt;/p&gt;\n&lt;div class=\"section\" id=\"testing-sourcecode-directive\"&gt;\n&lt;h2&gt;Testing sourcecode directive&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;table class=\"highlighttable\"&gt;&lt;tr&gt;&lt;td class=\"linenos\"&gt;&lt;div class=\"linenodiv\"&gt;&lt;pre&gt;&lt;span class=\"normal\"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=\"code\"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-another-case\"&gt;\n&lt;h2&gt;Testing another case&lt;/h2&gt;\n&lt;p&gt;This will now have a line number in 'custom' since it's the default in\npelican.conf, it will …&lt;/p&gt;&lt;/div&gt;</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Fri, 15 Oct 2010 20:30:00 +0200</pubDate><guid>tag:blog.notmyidea.org,2010-10-15:/posts/2010/octobre/15/unbelievable/</guid><category>misc</category></item><item><title>The baz tag</title><link>http://blog.notmyidea.org/tag/baz.html</link><description>&lt;p&gt;This article overrides the listening of the articles under the &lt;em&gt;baz&lt;/em&gt; tag.&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Sun, 14 Mar 2010 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2010-03-14:/tag/baz.html</guid><category>misc</category></item></channel></rss>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/feeds/bar.atom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<feed xmlns=\"http://www.w3.org/2005/Atom\"><title>Alexis' log - bar</title><link href=\"http://blog.notmyidea.org/\" rel=\"alternate\"/><link href=\"http://blog.notmyidea.org/feeds/bar.atom.xml\" rel=\"self\"/><id>http://blog.notmyidea.org/</id><updated>2010-10-20T10:14:00+02:00</updated><entry><title>Oh yeah !</title><link href=\"http://blog.notmyidea.org/posts/2010/octobre/20/oh-yeah/\" rel=\"alternate\"/><published>2010-10-20T10:14:00+02:00</published><updated>2010-10-20T10:14:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-10-20:/posts/2010/octobre/20/oh-yeah/</id><content type=\"html\">&lt;div class=\"section\" id=\"why-not\"&gt;\n&lt;h2&gt;Why not ?&lt;/h2&gt;\n&lt;p&gt;After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\nYEAH !&lt;/p&gt;\n&lt;img alt=\"alternate text\" src=\"http://blog.notmyidea.org/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;/div&gt;\n</content><category term=\"bar\"/><category term=\"oh\"/><category term=\"bar\"/><category term=\"yeah\"/></entry></feed>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/feeds/bar.rss.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<rss version=\"2.0\" xmlns:atom=\"http://www.w3.org/2005/Atom\"><channel><title>Alexis' log - bar</title><link>http://blog.notmyidea.org/</link><description/><atom:link href=\"http://blog.notmyidea.org/feeds/bar.rss.xml\" rel=\"self\"/><lastBuildDate>Wed, 20 Oct 2010 10:14:00 +0200</lastBuildDate><item><title>Oh yeah !</title><link>http://blog.notmyidea.org/posts/2010/octobre/20/oh-yeah/</link><description>&lt;div class=\"section\" id=\"why-not\"&gt;\n&lt;h2&gt;Why not ?&lt;/h2&gt;\n&lt;p&gt;After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\nYEAH !&lt;/p&gt;\n&lt;img alt=\"alternate text\" src=\"http://blog.notmyidea.org/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;/div&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Wed, 20 Oct 2010 10:14:00 +0200</pubDate><guid>tag:blog.notmyidea.org,2010-10-20:/posts/2010/octobre/20/oh-yeah/</guid><category>bar</category><category>oh</category><category>bar</category><category>yeah</category></item></channel></rss>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/feeds/cat1.atom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<feed xmlns=\"http://www.w3.org/2005/Atom\"><title>Alexis' log - cat1</title><link href=\"http://blog.notmyidea.org/\" rel=\"alternate\"/><link href=\"http://blog.notmyidea.org/feeds/cat1.atom.xml\" rel=\"self\"/><id>http://blog.notmyidea.org/</id><updated>2011-04-20T00:00:00+02:00</updated><entry><title>A markdown powered article</title><link href=\"http://blog.notmyidea.org/posts/2011/avril/20/a-markdown-powered-article/\" rel=\"alternate\"/><published>2011-04-20T00:00:00+02:00</published><updated>2011-04-20T00:00:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-04-20:/posts/2011/avril/20/a-markdown-powered-article/</id><content type=\"html\">&lt;p&gt;You're mutually oblivious.&lt;/p&gt;\n&lt;p&gt;&lt;a href=\"http://blog.notmyidea.org/posts/2010/octobre/15/unbelievable/\"&gt;a root-relative link to unbelievable&lt;/a&gt;\n&lt;a href=\"http://blog.notmyidea.org/posts/2010/octobre/15/unbelievable/\"&gt;a file-relative link to unbelievable&lt;/a&gt;&lt;/p&gt;</content><category term=\"cat1\"/></entry><entry><title>Article 1</title><link href=\"http://blog.notmyidea.org/posts/2011/f%C3%A9vrier/17/article-1/\" rel=\"alternate\"/><published>2011-02-17T00:00:00+01:00</published><updated>2011-02-17T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-02-17:/posts/2011/février/17/article-1/</id><content type=\"html\">&lt;p&gt;Article 1&lt;/p&gt;\n</content><category term=\"cat1\"/></entry><entry><title>Article 2</title><link href=\"http://blog.notmyidea.org/posts/2011/f%C3%A9vrier/17/article-2/\" rel=\"alternate\"/><published>2011-02-17T00:00:00+01:00</published><updated>2011-02-17T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-02-17:/posts/2011/février/17/article-2/</id><content type=\"html\">&lt;p&gt;Article 2&lt;/p&gt;\n</content><category term=\"cat1\"/></entry><entry><title>Article 3</title><link href=\"http://blog.notmyidea.org/posts/2011/f%C3%A9vrier/17/article-3/\" rel=\"alternate\"/><published>2011-02-17T00:00:00+01:00</published><updated>2011-02-17T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-02-17:/posts/2011/février/17/article-3/</id><content type=\"html\">&lt;p&gt;Article 3&lt;/p&gt;\n</content><category term=\"cat1\"/></entry></feed>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/feeds/cat1.rss.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<rss version=\"2.0\" xmlns:atom=\"http://www.w3.org/2005/Atom\"><channel><title>Alexis' log - cat1</title><link>http://blog.notmyidea.org/</link><description/><atom:link href=\"http://blog.notmyidea.org/feeds/cat1.rss.xml\" rel=\"self\"/><lastBuildDate>Wed, 20 Apr 2011 00:00:00 +0200</lastBuildDate><item><title>A markdown powered article</title><link>http://blog.notmyidea.org/posts/2011/avril/20/a-markdown-powered-article/</link><description>&lt;p&gt;You're mutually oblivious.&lt;/p&gt;\n&lt;p&gt;&lt;a href=\"http://blog.notmyidea.org/posts/2010/octobre/15/unbelievable/\"&gt;a root-relative link to unbelievable&lt;/a&gt;\n&lt;a href=\"http://blog.notmyidea.org/posts/2010/octobre/15/unbelievable/\"&gt;a file-relative link to unbelievable&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Wed, 20 Apr 2011 00:00:00 +0200</pubDate><guid>tag:blog.notmyidea.org,2011-04-20:/posts/2011/avril/20/a-markdown-powered-article/</guid><category>cat1</category></item><item><title>Article 1</title><link>http://blog.notmyidea.org/posts/2011/f%C3%A9vrier/17/article-1/</link><description>&lt;p&gt;Article 1&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Thu, 17 Feb 2011 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2011-02-17:/posts/2011/février/17/article-1/</guid><category>cat1</category></item><item><title>Article 2</title><link>http://blog.notmyidea.org/posts/2011/f%C3%A9vrier/17/article-2/</link><description>&lt;p&gt;Article 2&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Thu, 17 Feb 2011 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2011-02-17:/posts/2011/février/17/article-2/</guid><category>cat1</category></item><item><title>Article 3</title><link>http://blog.notmyidea.org/posts/2011/f%C3%A9vrier/17/article-3/</link><description>&lt;p&gt;Article 3&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Thu, 17 Feb 2011 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2011-02-17:/posts/2011/février/17/article-3/</guid><category>cat1</category></item></channel></rss>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/feeds/misc.atom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<feed xmlns=\"http://www.w3.org/2005/Atom\"><title>Alexis' log - misc</title><link href=\"http://blog.notmyidea.org/\" rel=\"alternate\"/><link href=\"http://blog.notmyidea.org/feeds/misc.atom.xml\" rel=\"self\"/><id>http://blog.notmyidea.org/</id><updated>2012-11-30T00:00:00+01:00</updated><entry><title>FILENAME_METADATA example</title><link href=\"http://blog.notmyidea.org/posts/2012/novembre/30/filename_metadata-example/\" rel=\"alternate\"/><published>2012-11-30T00:00:00+01:00</published><updated>2012-11-30T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2012-11-30:/posts/2012/novembre/30/filename_metadata-example/</id><content type=\"html\">&lt;p&gt;Some cool stuff!&lt;/p&gt;\n</content><category term=\"misc\"/></entry><entry><title>Second article</title><link href=\"http://blog.notmyidea.org/posts/2012/f%C3%A9vrier/29/second-article/\" rel=\"alternate\"/><published>2012-02-29T00:00:00+01:00</published><updated>2012-02-29T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2012-02-29:/posts/2012/février/29/second-article/</id><content type=\"html\">&lt;p&gt;This is some article, in english&lt;/p&gt;\n</content><category term=\"misc\"/><category term=\"foo\"/><category term=\"bar\"/><category term=\"baz\"/></entry><entry><title>Unbelievable !</title><link href=\"http://blog.notmyidea.org/posts/2010/octobre/15/unbelievable/\" rel=\"alternate\"/><published>2010-10-15T20:30:00+02:00</published><updated>2010-10-15T20:30:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-10-15:/posts/2010/octobre/15/unbelievable/</id><summary type=\"html\">&lt;p&gt;Or completely awesome. Depends the needs.&lt;/p&gt;\n&lt;p&gt;&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/posts/2011/avril/20/a-markdown-powered-article/\"&gt;a root-relative link to markdown-article&lt;/a&gt;\n&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/posts/2011/avril/20/a-markdown-powered-article/\"&gt;a file-relative link to markdown-article&lt;/a&gt;&lt;/p&gt;\n&lt;div class=\"section\" id=\"testing-sourcecode-directive\"&gt;\n&lt;h2&gt;Testing sourcecode directive&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;table class=\"highlighttable\"&gt;&lt;tr&gt;&lt;td class=\"linenos\"&gt;&lt;div class=\"linenodiv\"&gt;&lt;pre&gt;&lt;span class=\"normal\"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=\"code\"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-another-case\"&gt;\n&lt;h2&gt;Testing another case&lt;/h2&gt;\n&lt;p&gt;This will now have a line number in 'custom' since it's the default in\npelican.conf, it will …&lt;/p&gt;&lt;/div&gt;</summary><content type=\"html\">&lt;p&gt;Or completely awesome. Depends the needs.&lt;/p&gt;\n&lt;p&gt;&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/posts/2011/avril/20/a-markdown-powered-article/\"&gt;a root-relative link to markdown-article&lt;/a&gt;\n&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/posts/2011/avril/20/a-markdown-powered-article/\"&gt;a file-relative link to markdown-article&lt;/a&gt;&lt;/p&gt;\n&lt;div class=\"section\" id=\"testing-sourcecode-directive\"&gt;\n&lt;h2&gt;Testing sourcecode directive&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;table class=\"highlighttable\"&gt;&lt;tr&gt;&lt;td class=\"linenos\"&gt;&lt;div class=\"linenodiv\"&gt;&lt;pre&gt;&lt;span class=\"normal\"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=\"code\"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-another-case\"&gt;\n&lt;h2&gt;Testing another case&lt;/h2&gt;\n&lt;p&gt;This will now have a line number in 'custom' since it's the default in\npelican.conf, it will have nothing in default.&lt;/p&gt;\n&lt;div class=\"highlight\"&gt;&lt;table class=\"highlighttable\"&gt;&lt;tr&gt;&lt;td class=\"linenos\"&gt;&lt;div class=\"linenodiv\"&gt;&lt;pre&gt;&lt;span class=\"normal\"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=\"code\"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-more-sourcecode-directives\"&gt;\n&lt;h2&gt;Testing more sourcecode directives&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id=\"foo-8\"&gt;&lt;a id=\"foo-8\" name=\"foo-8\"&gt;&lt;/a&gt;&lt;a href=\"#foo-8\"&gt;&lt;span class=\"linenos special\"&gt; 8&lt;/span&gt;&lt;/a&gt;&lt;span class=\"testingk\"&gt;def&lt;/span&gt;&lt;span class=\"testingw\"&gt; &lt;/span&gt;&lt;span class=\"testingnf\"&gt;run&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingp\"&gt;):&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-9\"&gt;&lt;a id=\"foo-9\" name=\"foo-9\"&gt;&lt;/a&gt;&lt;a href=\"#foo-9\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;assert_has_content&lt;/span&gt;&lt;span class=\"testingp\"&gt;()&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-10\"&gt;&lt;a id=\"foo-10\" name=\"foo-10\"&gt;&lt;/a&gt;&lt;a href=\"#foo-10\"&gt;&lt;span class=\"linenos special\"&gt;10&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;try&lt;/span&gt;&lt;span class=\"testingp\"&gt;:&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-11\"&gt;&lt;a id=\"foo-11\" name=\"foo-11\"&gt;&lt;/a&gt;&lt;a href=\"#foo-11\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingn\"&gt;lexer&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;get_lexer_by_name&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;arguments&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testingmi\"&gt;0&lt;/span&gt;&lt;span class=\"testingp\"&gt;])&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-12\"&gt;&lt;a id=\"foo-12\" name=\"foo-12\"&gt;&lt;/a&gt;&lt;a href=\"#foo-12\"&gt;&lt;span class=\"linenos special\"&gt;12&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;except&lt;/span&gt; &lt;span class=\"testingne\"&gt;ValueError&lt;/span&gt;&lt;span class=\"testingp\"&gt;:&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-13\"&gt;&lt;a id=\"foo-13\" name=\"foo-13\"&gt;&lt;/a&gt;&lt;a href=\"#foo-13\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingc1\"&gt;# no lexer found - use the text one instead of an exception&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-14\"&gt;&lt;a id=\"foo-14\" name=\"foo-14\"&gt;&lt;/a&gt;&lt;a href=\"#foo-14\"&gt;&lt;span class=\"linenos special\"&gt;14&lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingn\"&gt;lexer&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;TextLexer&lt;/span&gt;&lt;span class=\"testingp\"&gt;()&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-15\"&gt;&lt;a id=\"foo-15\" name=\"foo-15\"&gt;&lt;/a&gt;&lt;a href=\"#foo-15\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-16\"&gt;&lt;a id=\"foo-16\" name=\"foo-16\"&gt;&lt;/a&gt;&lt;a href=\"#foo-16\"&gt;&lt;span class=\"linenos special\"&gt;16&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;if&lt;/span&gt; &lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;linenos&amp;#39;&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt; &lt;span class=\"testingow\"&gt;and&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-17\"&gt;&lt;a id=\"foo-17\" name=\"foo-17\"&gt;&lt;/a&gt;&lt;a href=\"#foo-17\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;            &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;linenos&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;]&lt;/span&gt; &lt;span class=\"testingow\"&gt;not&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;table&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;inline&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;)):&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-18\"&gt;&lt;a id=\"foo-18\" name=\"foo-18\"&gt;&lt;/a&gt;&lt;a href=\"#foo-18\"&gt;&lt;span class=\"linenos special\"&gt;18&lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;linenos&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;]&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;table&amp;#39;&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-19\"&gt;&lt;a id=\"foo-19\" name=\"foo-19\"&gt;&lt;/a&gt;&lt;a href=\"#foo-19\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-20\"&gt;&lt;a id=\"foo-20\" name=\"foo-20\"&gt;&lt;/a&gt;&lt;a href=\"#foo-20\"&gt;&lt;span class=\"linenos special\"&gt;20&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;for&lt;/span&gt; &lt;span class=\"testingn\"&gt;flag&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;nowrap&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;nobackground&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testings1\"&gt;&amp;#39;anchorlinenos&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;):&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-21\"&gt;&lt;a id=\"foo-21\" name=\"foo-21\"&gt;&lt;/a&gt;&lt;a href=\"#foo-21\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;        &lt;span class=\"testingk\"&gt;if&lt;/span&gt; &lt;span class=\"testingn\"&gt;flag&lt;/span&gt; &lt;span class=\"testingow\"&gt;in&lt;/span&gt; &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;:&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-22\"&gt;&lt;a id=\"foo-22\" name=\"foo-22\"&gt;&lt;/a&gt;&lt;a href=\"#foo-22\"&gt;&lt;span class=\"linenos special\"&gt;22&lt;/span&gt;&lt;/a&gt;            &lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testingn\"&gt;flag&lt;/span&gt;&lt;span class=\"testingp\"&gt;]&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingkc\"&gt;True&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-23\"&gt;&lt;a id=\"foo-23\" name=\"foo-23\"&gt;&lt;/a&gt;&lt;a href=\"#foo-23\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-24\"&gt;&lt;a id=\"foo-24\" name=\"foo-24\"&gt;&lt;/a&gt;&lt;a href=\"#foo-24\"&gt;&lt;span class=\"linenos special\"&gt;24&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingc1\"&gt;# noclasses should already default to False, but just in case...&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-25\"&gt;&lt;a id=\"foo-25\" name=\"foo-25\"&gt;&lt;/a&gt;&lt;a href=\"#foo-25\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingn\"&gt;formatter&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;HtmlFormatter&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingn\"&gt;noclasses&lt;/span&gt;&lt;span class=\"testingo\"&gt;=&lt;/span&gt;&lt;span class=\"testingkc\"&gt;False&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingo\"&gt;**&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;options&lt;/span&gt;&lt;span class=\"testingp\"&gt;)&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-26\"&gt;&lt;a id=\"foo-26\" name=\"foo-26\"&gt;&lt;/a&gt;&lt;a href=\"#foo-26\"&gt;&lt;span class=\"linenos special\"&gt;26&lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingn\"&gt;parsed&lt;/span&gt; &lt;span class=\"testingo\"&gt;=&lt;/span&gt; &lt;span class=\"testingn\"&gt;highlight&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;&lt;/span&gt;&lt;span class=\"testingse\"&gt;\\n&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;join&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testingbp\"&gt;self&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;content&lt;/span&gt;&lt;span class=\"testingp\"&gt;),&lt;/span&gt; &lt;span class=\"testingn\"&gt;lexer&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingn\"&gt;formatter&lt;/span&gt;&lt;span class=\"testingp\"&gt;)&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span id=\"foo-27\"&gt;&lt;a id=\"foo-27\" name=\"foo-27\"&gt;&lt;/a&gt;&lt;a href=\"#foo-27\"&gt;&lt;span class=\"linenos\"&gt;  &lt;/span&gt;&lt;/a&gt;    &lt;span class=\"testingk\"&gt;return&lt;/span&gt; &lt;span class=\"testingp\"&gt;[&lt;/span&gt;&lt;span class=\"testingn\"&gt;nodes&lt;/span&gt;&lt;span class=\"testingo\"&gt;.&lt;/span&gt;&lt;span class=\"testingn\"&gt;raw&lt;/span&gt;&lt;span class=\"testingp\"&gt;(&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingn\"&gt;parsed&lt;/span&gt;&lt;span class=\"testingp\"&gt;,&lt;/span&gt; &lt;span class=\"testingnb\"&gt;format&lt;/span&gt;&lt;span class=\"testingo\"&gt;=&lt;/span&gt;&lt;span class=\"testings1\"&gt;&amp;#39;html&amp;#39;&lt;/span&gt;&lt;span class=\"testingp\"&gt;)]&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-even-more-sourcecode-directives\"&gt;\n&lt;h2&gt;Testing even more sourcecode directives&lt;/h2&gt;\n&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-overriding-config-defaults\"&gt;\n&lt;h2&gt;Testing overriding config defaults&lt;/h2&gt;\n&lt;p&gt;Even if the default is line numbers, we can override it here&lt;/p&gt;\n&lt;div class=\"highlight\"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;\n&lt;p&gt;Lovely.&lt;/p&gt;\n&lt;/div&gt;\n</content><category term=\"misc\"/></entry><entry><title>The baz tag</title><link href=\"http://blog.notmyidea.org/tag/baz.html\" rel=\"alternate\"/><published>2010-03-14T00:00:00+01:00</published><updated>2010-03-14T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-03-14:/tag/baz.html</id><content type=\"html\">&lt;p&gt;This article overrides the listening of the articles under the &lt;em&gt;baz&lt;/em&gt; tag.&lt;/p&gt;\n</content><category term=\"misc\"/></entry></feed>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/feeds/misc.rss.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<rss version=\"2.0\" xmlns:atom=\"http://www.w3.org/2005/Atom\"><channel><title>Alexis' log - misc</title><link>http://blog.notmyidea.org/</link><description/><atom:link href=\"http://blog.notmyidea.org/feeds/misc.rss.xml\" rel=\"self\"/><lastBuildDate>Fri, 30 Nov 2012 00:00:00 +0100</lastBuildDate><item><title>FILENAME_METADATA example</title><link>http://blog.notmyidea.org/posts/2012/novembre/30/filename_metadata-example/</link><description>&lt;p&gt;Some cool stuff!&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Fri, 30 Nov 2012 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2012-11-30:/posts/2012/novembre/30/filename_metadata-example/</guid><category>misc</category></item><item><title>Second article</title><link>http://blog.notmyidea.org/posts/2012/f%C3%A9vrier/29/second-article/</link><description>&lt;p&gt;This is some article, in english&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Wed, 29 Feb 2012 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2012-02-29:/posts/2012/février/29/second-article/</guid><category>misc</category><category>foo</category><category>bar</category><category>baz</category></item><item><title>Unbelievable !</title><link>http://blog.notmyidea.org/posts/2010/octobre/15/unbelievable/</link><description>&lt;p&gt;Or completely awesome. Depends the needs.&lt;/p&gt;\n&lt;p&gt;&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/posts/2011/avril/20/a-markdown-powered-article/\"&gt;a root-relative link to markdown-article&lt;/a&gt;\n&lt;a class=\"reference external\" href=\"http://blog.notmyidea.org/posts/2011/avril/20/a-markdown-powered-article/\"&gt;a file-relative link to markdown-article&lt;/a&gt;&lt;/p&gt;\n&lt;div class=\"section\" id=\"testing-sourcecode-directive\"&gt;\n&lt;h2&gt;Testing sourcecode directive&lt;/h2&gt;\n&lt;div class=\"highlight\"&gt;&lt;table class=\"highlighttable\"&gt;&lt;tr&gt;&lt;td class=\"linenos\"&gt;&lt;div class=\"linenodiv\"&gt;&lt;pre&gt;&lt;span class=\"normal\"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=\"code\"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=\"n\"&gt;formatter&lt;/span&gt; &lt;span class=\"o\"&gt;=&lt;/span&gt; &lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt; &lt;span class=\"ow\"&gt;and&lt;/span&gt; &lt;span class=\"n\"&gt;VARIANTS&lt;/span&gt;&lt;span class=\"p\"&gt;[&lt;/span&gt;&lt;span class=\"bp\"&gt;self&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;options&lt;/span&gt;&lt;span class=\"o\"&gt;.&lt;/span&gt;&lt;span class=\"n\"&gt;keys&lt;/span&gt;&lt;span class=\"p\"&gt;()[&lt;/span&gt;&lt;span class=\"mi\"&gt;0&lt;/span&gt;&lt;span class=\"p\"&gt;]]&lt;/span&gt;\n&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;\n&lt;/div&gt;\n&lt;div class=\"section\" id=\"testing-another-case\"&gt;\n&lt;h2&gt;Testing another case&lt;/h2&gt;\n&lt;p&gt;This will now have a line number in 'custom' since it's the default in\npelican.conf, it will …&lt;/p&gt;&lt;/div&gt;</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Fri, 15 Oct 2010 20:30:00 +0200</pubDate><guid>tag:blog.notmyidea.org,2010-10-15:/posts/2010/octobre/15/unbelievable/</guid><category>misc</category></item><item><title>The baz tag</title><link>http://blog.notmyidea.org/tag/baz.html</link><description>&lt;p&gt;This article overrides the listening of the articles under the &lt;em&gt;baz&lt;/em&gt; tag.&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Sun, 14 Mar 2010 00:00:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2010-03-14:/tag/baz.html</guid><category>misc</category></item></channel></rss>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/feeds/yeah.atom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<feed xmlns=\"http://www.w3.org/2005/Atom\"><title>Alexis' log - yeah</title><link href=\"http://blog.notmyidea.org/\" rel=\"alternate\"/><link href=\"http://blog.notmyidea.org/feeds/yeah.atom.xml\" rel=\"self\"/><id>http://blog.notmyidea.org/</id><updated>2013-11-17T23:29:00+01:00</updated><entry><title>This is a super article !</title><link href=\"http://blog.notmyidea.org/posts/2010/d%C3%A9cembre/02/this-is-a-super-article/\" rel=\"alternate\"/><published>2010-12-02T10:14:00+01:00</published><updated>2013-11-17T23:29:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-12-02:/posts/2010/décembre/02/this-is-a-super-article/</id><summary type=\"html\">&lt;p class=\"first last\"&gt;Multi-line metadata should be supported\nas well as &lt;strong&gt;inline markup&lt;/strong&gt;.&lt;/p&gt;\n</summary><content type=\"html\">&lt;p&gt;Some content here !&lt;/p&gt;\n&lt;div class=\"section\" id=\"this-is-a-simple-title\"&gt;\n&lt;h2&gt;This is a simple title&lt;/h2&gt;\n&lt;p&gt;And here comes the cool &lt;a class=\"reference external\" href=\"http://books.couchdb.org/relax/design-documents/views\"&gt;stuff&lt;/a&gt;.&lt;/p&gt;\n&lt;img alt=\"alternate text\" src=\"http://blog.notmyidea.org/pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;img alt=\"alternate text\" src=\"http://blog.notmyidea.org/pictures/Sushi_Macro.jpg\" style=\"width: 600px; height: 450px;\" /&gt;\n&lt;pre class=\"literal-block\"&gt;\n&amp;gt;&amp;gt;&amp;gt; from ipdb import set_trace\n&amp;gt;&amp;gt;&amp;gt; set_trace()\n&lt;/pre&gt;\n&lt;p&gt;→ And now try with some utf8 hell: ééé&lt;/p&gt;\n&lt;/div&gt;\n</content><category term=\"yeah\"/><category term=\"foo\"/><category term=\"bar\"/><category term=\"foobar\"/></entry></feed>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/feeds/yeah.rss.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<rss version=\"2.0\" xmlns:atom=\"http://www.w3.org/2005/Atom\"><channel><title>Alexis' log - yeah</title><link>http://blog.notmyidea.org/</link><description/><atom:link href=\"http://blog.notmyidea.org/feeds/yeah.rss.xml\" rel=\"self\"/><lastBuildDate>Sun, 17 Nov 2013 23:29:00 +0100</lastBuildDate><item><title>This is a super article !</title><link>http://blog.notmyidea.org/posts/2010/d%C3%A9cembre/02/this-is-a-super-article/</link><description>&lt;p class=\"first last\"&gt;Multi-line metadata should be supported\nas well as &lt;strong&gt;inline markup&lt;/strong&gt;.&lt;/p&gt;\n</description><dc:creator xmlns:dc=\"http://purl.org/dc/elements/1.1/\">Alexis Métaireau</dc:creator><pubDate>Thu, 02 Dec 2010 10:14:00 +0100</pubDate><guid>tag:blog.notmyidea.org,2010-12-02:/posts/2010/décembre/02/this-is-a-super-article/</guid><category>yeah</category><category>foo</category><category>bar</category><category>foobar</category></item></channel></rss>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log</title>\n                <link rel=\"stylesheet\" href=\"./theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"./\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li><a href=\"./tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"./override/\">Override url/save_as</a></li>\n                                <li><a href=\"./pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"./category/yeah.html\">yeah</a></li>\n                                <li><a href=\"./category/misc.html\">misc</a></li>\n                                <li><a href=\"./category/cat1.html\">cat1</a></li>\n                                <li><a href=\"./category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <aside id=\"featured\" class=\"body\">\n                        <article>\n                                <h1 class=\"entry-title\"><a href=\"./posts/2012/novembre/30/filename_metadata-example/\">FILENAME_METADATA example</a></h1>\n                                <footer class=\"post-info\">\n                                        <abbr class=\"published\" title=\"2012-11-30T00:00:00+01:00\">\n                                                Published: 30 novembre 2012\n                                        </abbr>\n\n                                        <address class=\"vcard author\">\n                                                By                         <a class=\"url fn\" href=\"./author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                        </address>\n                                        <p>In <a href=\"./category/misc.html\">misc</a>.</p>\n\n                                </footer><!-- /.post-info --><p>Some cool stuff!</p>\n                                <p>There are <a href=\"./posts/2012/novembre/30/filename_metadata-example/#disqus_thread\">comments</a>.</p>                </article>\n                </aside><!-- /#featured -->\n                <section id=\"content\" class=\"body\">\n                        <h1>Other articles</h1>\n                        <hr />\n                        <ol id=\"posts-list\" class=\"hfeed\">\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"./posts/2012/février/29/second-article/\" rel=\"bookmark\"\n                                                       title=\"Permalink to Second article\">Second article</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2012-02-29T00:00:00+01:00\">\n                                                                Published: 29 février 2012\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"./author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"./category/misc.html\">misc</a>.</p>\n                                                        <p>tags: <a href=\"./tag/foo.html\">foo</a> <a href=\"./tag/bar.html\">bar</a> <a href=\"./tag/baz.html\">baz</a> </p>Translations:\n                                                        <a href=\"./second-article-fr.html\" hreflang=\"fr\">fr</a>\n\n                                                </footer><!-- /.post-info -->                <p>This is some article, in english</p>\n\n                                                <a class=\"readmore\" href=\"./posts/2012/février/29/second-article/\">read more</a>\n                                                <p>There are <a href=\"./posts/2012/février/29/second-article/#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"./posts/2011/avril/20/a-markdown-powered-article/\" rel=\"bookmark\"\n                                                       title=\"Permalink to A markdown powered article\">A markdown powered article</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2011-04-20T00:00:00+02:00\">\n                                                                Published: 20 avril 2011\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"./author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"./category/cat1.html\">cat1</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>You're mutually oblivious.</p>\n                                                <p><a href=\"./posts/2010/octobre/15/unbelievable/\">a root-relative link to unbelievable</a>\n                                                        <a href=\"./posts/2010/octobre/15/unbelievable/\">a file-relative link to unbelievable</a></p>\n                                                <a class=\"readmore\" href=\"./posts/2011/avril/20/a-markdown-powered-article/\">read more</a>\n                                                <p>There are <a href=\"./posts/2011/avril/20/a-markdown-powered-article/#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"./posts/2011/février/17/article-1/\" rel=\"bookmark\"\n                                                       title=\"Permalink to Article 1\">Article 1</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2011-02-17T00:00:00+01:00\">\n                                                                Published: 17 février 2011\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"./author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"./category/cat1.html\">cat1</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>Article 1</p>\n\n                                                <a class=\"readmore\" href=\"./posts/2011/février/17/article-1/\">read more</a>\n                                                <p>There are <a href=\"./posts/2011/février/17/article-1/#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n                        </ol><!-- /#posts-list -->\n                        <nav>\n                                <ul>\n                                        <li>Page 1 / 3</li>\n                                        <li><a href=\"./index2.html\">&rang;</a></li>\n                                        <li><a href=\"./index3.html\">&Rang;</a></li>\n                                </ul>\n                        </nav>\n                </section><!-- /#content -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/index2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log</title>\n                <link rel=\"stylesheet\" href=\"./theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"./\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li><a href=\"./tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"./override/\">Override url/save_as</a></li>\n                                <li><a href=\"./pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"./category/yeah.html\">yeah</a></li>\n                                <li><a href=\"./category/misc.html\">misc</a></li>\n                                <li><a href=\"./category/cat1.html\">cat1</a></li>\n                                <li><a href=\"./category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <section id=\"content\" class=\"body\">\n                        <ol id=\"posts-list\" class=\"hfeed\" start=\"3\">\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"./posts/2011/février/17/article-2/\" rel=\"bookmark\"\n                                                       title=\"Permalink to Article 2\">Article 2</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2011-02-17T00:00:00+01:00\">\n                                                                Published: 17 février 2011\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"./author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"./category/cat1.html\">cat1</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>Article 2</p>\n\n                                                <a class=\"readmore\" href=\"./posts/2011/février/17/article-2/\">read more</a>\n                                                <p>There are <a href=\"./posts/2011/février/17/article-2/#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"./posts/2011/février/17/article-3/\" rel=\"bookmark\"\n                                                       title=\"Permalink to Article 3\">Article 3</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2011-02-17T00:00:00+01:00\">\n                                                                Published: 17 février 2011\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"./author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"./category/cat1.html\">cat1</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>Article 3</p>\n\n                                                <a class=\"readmore\" href=\"./posts/2011/février/17/article-3/\">read more</a>\n                                                <p>There are <a href=\"./posts/2011/février/17/article-3/#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"./posts/2010/décembre/02/this-is-a-super-article/\" rel=\"bookmark\"\n                                                       title=\"Permalink to This is a super article !\">This is a super article !</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2010-12-02T10:14:00+01:00\">\n                                                                Published: 02 décembre 2010\n                                                        </abbr>\n                                                        <br />\n                                                        <abbr class=\"modified\" title=\"2013-11-17T23:29:00+01:00\">\n                                                                Updated: 17 novembre 2013\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"./author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"./category/yeah.html\">yeah</a>.</p>\n                                                        <p>tags: <a href=\"./tag/foo.html\">foo</a> <a href=\"./tag/bar.html\">bar</a> <a href=\"./tag/foobar.html\">foobar</a> </p>\n                                                </footer><!-- /.post-info -->                <p class=\"first last\">Multi-line metadata should be supported\n                                                        as well as <strong>inline markup</strong>.</p>\n\n                                                <a class=\"readmore\" href=\"./posts/2010/décembre/02/this-is-a-super-article/\">read more</a>\n                                                <p>There are <a href=\"./posts/2010/décembre/02/this-is-a-super-article/#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"./posts/2010/octobre/20/oh-yeah/\" rel=\"bookmark\"\n                                                       title=\"Permalink to Oh yeah !\">Oh yeah !</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2010-10-20T10:14:00+02:00\">\n                                                                Published: 20 octobre 2010\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"./author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"./category/bar.html\">bar</a>.</p>\n                                                        <p>tags: <a href=\"./tag/oh.html\">oh</a> <a href=\"./tag/bar.html\">bar</a> <a href=\"./tag/yeah.html\">yeah</a> </p>Translations:\n                                                        <a href=\"./oh-yeah-fr.html\" hreflang=\"fr\">fr</a>\n\n                                                </footer><!-- /.post-info -->                <div class=\"section\" id=\"why-not\">\n                                                        <h2>Why not ?</h2>\n                                                        <p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\n                                                                YEAH !</p>\n                                                        <img alt=\"alternate text\" src=\"./pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" />\n                                                </div>\n\n                                                <a class=\"readmore\" href=\"./posts/2010/octobre/20/oh-yeah/\">read more</a>\n                                                <p>There are <a href=\"./posts/2010/octobre/20/oh-yeah/#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n                        </ol><!-- /#posts-list -->\n                        <nav>\n                                <ul>\n                                        <li><a href=\"./index.html\">&Lang;</a></li>\n                                        <li><a href=\"./index.html\">&lang;</a></li>\n                                        <li>Page 2 / 3</li>\n                                        <li><a href=\"./index3.html\">&rang;</a></li>\n                                        <li><a href=\"./index3.html\">&Rang;</a></li>\n                                </ul>\n                        </nav>\n                </section><!-- /#content -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/index3.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log</title>\n                <link rel=\"stylesheet\" href=\"./theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"./\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li><a href=\"./tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"./override/\">Override url/save_as</a></li>\n                                <li><a href=\"./pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"./category/yeah.html\">yeah</a></li>\n                                <li><a href=\"./category/misc.html\">misc</a></li>\n                                <li><a href=\"./category/cat1.html\">cat1</a></li>\n                                <li><a href=\"./category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <section id=\"content\" class=\"body\">\n                        <ol id=\"posts-list\" class=\"hfeed\" start=\"3\">\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"./posts/2010/octobre/15/unbelievable/\" rel=\"bookmark\"\n                                                       title=\"Permalink to Unbelievable !\">Unbelievable !</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2010-10-15T20:30:00+02:00\">\n                                                                Published: 15 octobre 2010\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"./author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"./category/misc.html\">misc</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>Or completely awesome. Depends the needs.</p>\n                                                <p><a class=\"reference external\" href=\"./posts/2011/avril/20/a-markdown-powered-article/\">a root-relative link to markdown-article</a>\n                                                        <a class=\"reference external\" href=\"./posts/2011/avril/20/a-markdown-powered-article/\">a file-relative link to markdown-article</a></p>\n                                                <div class=\"section\" id=\"testing-sourcecode-directive\">\n                                                        <h2>Testing sourcecode directive</h2>\n                                                        <div class=\"highlight\"><table class=\"highlighttable\"><tr><td class=\"linenos\"><div class=\"linenodiv\"><pre><span class=\"normal\">1</span></pre></div></td><td class=\"code\"><div><pre><span></span><span class=\"n\">formatter</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span> <span class=\"ow\">and</span> <span class=\"n\">VARIANTS</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]]</span>\n</pre></div></td></tr></table></div>\n                                                </div>\n                                                <div class=\"section\" id=\"testing-another-case\">\n                                                        <h2>Testing another case</h2>\n                                                        <p>This will now have a line number in 'custom' since it's the default in\n                                                                pelican.conf, it will …</p></div>\n                                                <a class=\"readmore\" href=\"./posts/2010/octobre/15/unbelievable/\">read more</a>\n                                                <p>There are <a href=\"./posts/2010/octobre/15/unbelievable/#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"./tag/baz.html\" rel=\"bookmark\"\n                                                       title=\"Permalink to The baz tag\">The baz tag</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2010-03-14T00:00:00+01:00\">\n                                                                Published: 14 mars 2010\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"./author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"./category/misc.html\">misc</a>.</p>\n\n                                                </footer><!-- /.post-info -->                <p>This article overrides the listening of the articles under the <em>baz</em> tag.</p>\n\n                                                <a class=\"readmore\" href=\"./tag/baz.html\">read more</a>\n                                                <p>There are <a href=\"./tag/baz.html#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n                        </ol><!-- /#posts-list -->\n                        <nav>\n                                <ul>\n                                        <li><a href=\"./index.html\">&Lang;</a></li>\n                                        <li><a href=\"./index2.html\">&lang;</a></li>\n                                        <li>Page 3 / 3</li>\n                                </ul>\n                        </nav>\n                </section><!-- /#content -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/jinja2_template.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log</title>\n                <link rel=\"stylesheet\" href=\"./theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"./\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li><a href=\"./tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"./override/\">Override url/save_as</a></li>\n                                <li><a href=\"./pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"./category/yeah.html\">yeah</a></li>\n                                <li><a href=\"./category/misc.html\">misc</a></li>\n                                <li><a href=\"./category/cat1.html\">cat1</a></li>\n                                <li><a href=\"./category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                Some text\n\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/oh-yeah-fr.html",
    "content": "<!DOCTYPE html>\n<html lang=\"fr\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Trop bien !</title>\n                <link rel=\"stylesheet\" href=\"./theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n                <link rel=\"alternate\" hreflang=\"en\" href=\"./posts/2010/octobre/20/oh-yeah/\">\n\n                <meta name=\"description\" content=\"Et voila du contenu en français\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"./\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li><a href=\"./tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"./override/\">Override url/save_as</a></li>\n                                <li><a href=\"./pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"./category/yeah.html\">yeah</a></li>\n                                <li class=\"active\"><a href=\"./category/misc.html\">misc</a></li>\n                                <li><a href=\"./category/cat1.html\">cat1</a></li>\n                                <li><a href=\"./category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"./oh-yeah-fr.html\" rel=\"bookmark\"\n                                                   title=\"Permalink to Trop bien !\">Trop bien !</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2010-10-20T10:14:00+02:00\">\n                                                        Published: 20 octobre 2010\n                                                </abbr>\n\n                                                <address class=\"vcard author\">\n                                                        By                         <a class=\"url fn\" href=\"./author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                </address>\n                                                <p>In <a href=\"./category/misc.html\">misc</a>.</p>\n                                                Translations:\n                                                <a href=\"./posts/2010/octobre/20/oh-yeah/\" hreflang=\"en\">en</a>\n\n                                        </footer><!-- /.post-info -->      <p>Et voila du contenu en français</p>\n\n                                </div><!-- /.entry-content -->\n                                <div class=\"comments\">\n                                        <h2>Comments !</h2>\n                                        <div id=\"disqus_thread\"></div>\n                                        <script type=\"text/javascript\">\n                                                var disqus_shortname = 'blog-notmyidea';\n                                                var disqus_identifier = 'oh-yeah-fr.html';\n                                                var disqus_url = './oh-yeah-fr.html';\n                                                (function() {\n                                                        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;\n                                                        dsq.src = '//blog-notmyidea.disqus.com/embed.js';\n                                                        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);\n                                                })();\n                                        </script>\n                                        <noscript>Please enable JavaScript to view the comments.</noscript>\n                                </div>\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/override/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Override url/save_as</title>\n                <link rel=\"stylesheet\" href=\"../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li><a href=\"../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li class=\"active\"><a href=\"../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../category/yeah.html\">yeah</a></li>\n                                <li><a href=\"../category/misc.html\">misc</a></li>\n                                <li><a href=\"../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <h1 class=\"entry-title\">Override url/save_as</h1>\n\n                        <p>Test page which overrides save_as and url so that this page will be generated\n                                at a custom location.</p>\n\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/pages/this-is-a-test-hidden-page.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>This is a test hidden page</title>\n                <link rel=\"stylesheet\" href=\"../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li><a href=\"../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../category/yeah.html\">yeah</a></li>\n                                <li><a href=\"../category/misc.html\">misc</a></li>\n                                <li><a href=\"../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <h1 class=\"entry-title\">This is a test hidden page</h1>\n\n                        <p>This is great for things like error(404) pages\n                                Anyone can see this page but it's not linked to anywhere!</p>\n\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/pages/this-is-a-test-page.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>This is a test page</title>\n                <link rel=\"stylesheet\" href=\"../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li><a href=\"../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../override/\">Override url/save_as</a></li>\n                                <li class=\"active\"><a href=\"../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../category/yeah.html\">yeah</a></li>\n                                <li><a href=\"../category/misc.html\">misc</a></li>\n                                <li><a href=\"../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <h1 class=\"entry-title\">This is a test page</h1>\n\n                        <p>Just an image.</p>\n                        <img alt=\"alternate text\" src=\"../pictures/Fat_Cat.jpg\" style=\"width: 600px; height: 450px;\" />\n                        <img alt=\"wrong path since 'images' folder does not exist\" src=\"|filename|/images/Fat_Cat.jpg\" style=\"width: 600px; height: 450px;\" />\n\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/posts/2010/décembre/02/this-is-a-super-article/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>This is a super article !</title>\n                <link rel=\"stylesheet\" href=\"../../../../../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n                <meta name=\"description\" content=\"Multi-line metadata should be supported as well as inline markup.\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../../../../../\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li><a href=\"../../../../../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../../../../../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../../../../../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li class=\"active\"><a href=\"../../../../../category/yeah.html\">yeah</a></li>\n                                <li><a href=\"../../../../../category/misc.html\">misc</a></li>\n                                <li><a href=\"../../../../../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../../../../../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"../../../../../posts/2010/décembre/02/this-is-a-super-article/\" rel=\"bookmark\"\n                                                   title=\"Permalink to This is a super article !\">This is a super article !</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2010-12-02T10:14:00+01:00\">\n                                                        Published: 02 décembre 2010\n                                                </abbr>\n                                                <br />\n                                                <abbr class=\"modified\" title=\"2013-11-17T23:29:00+01:00\">\n                                                        Updated: 17 novembre 2013\n                                                </abbr>\n\n                                                <address class=\"vcard author\">\n                                                        By                         <a class=\"url fn\" href=\"../../../../../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                </address>\n                                                <p>In <a href=\"../../../../../category/yeah.html\">yeah</a>.</p>\n                                                <p>tags: <a href=\"../../../../../tag/foo.html\">foo</a> <a href=\"../../../../../tag/bar.html\">bar</a> <a href=\"../../../../../tag/foobar.html\">foobar</a> </p>\n                                        </footer><!-- /.post-info -->      <p>Some content here !</p>\n                                        <div class=\"section\" id=\"this-is-a-simple-title\">\n                                                <h2>This is a simple title</h2>\n                                                <p>And here comes the cool <a class=\"reference external\" href=\"http://books.couchdb.org/relax/design-documents/views\">stuff</a>.</p>\n                                                <img alt=\"alternate text\" src=\"../../../../../pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" />\n                                                <img alt=\"alternate text\" src=\"../../../../../pictures/Sushi_Macro.jpg\" style=\"width: 600px; height: 450px;\" />\n<pre class=\"literal-block\">\n&gt;&gt;&gt; from ipdb import set_trace\n&gt;&gt;&gt; set_trace()\n</pre>\n                                                <p>→ And now try with some utf8 hell: ééé</p>\n                                        </div>\n\n                                </div><!-- /.entry-content -->\n                                <div class=\"comments\">\n                                        <h2>Comments !</h2>\n                                        <div id=\"disqus_thread\"></div>\n                                        <script type=\"text/javascript\">\n                                                var disqus_shortname = 'blog-notmyidea';\n                                                var disqus_identifier = 'posts/2010/décembre/02/this-is-a-super-article/';\n                                                var disqus_url = '../../../../../posts/2010/décembre/02/this-is-a-super-article/';\n                                                (function() {\n                                                        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;\n                                                        dsq.src = '//blog-notmyidea.disqus.com/embed.js';\n                                                        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);\n                                                })();\n                                        </script>\n                                        <noscript>Please enable JavaScript to view the comments.</noscript>\n                                </div>\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/posts/2010/octobre/15/unbelievable/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Unbelievable !</title>\n                <link rel=\"stylesheet\" href=\"../../../../../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n                <meta name=\"description\" content=\"Or completely awesome. Depends the needs. a root-relative link to markdown-article a file-relative link to markdown-article Testing sourcecode...\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../../../../../\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li><a href=\"../../../../../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../../../../../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../../../../../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../../../../../category/yeah.html\">yeah</a></li>\n                                <li class=\"active\"><a href=\"../../../../../category/misc.html\">misc</a></li>\n                                <li><a href=\"../../../../../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../../../../../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"../../../../../posts/2010/octobre/15/unbelievable/\" rel=\"bookmark\"\n                                                   title=\"Permalink to Unbelievable !\">Unbelievable !</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2010-10-15T20:30:00+02:00\">\n                                                        Published: 15 octobre 2010\n                                                </abbr>\n\n                                                <address class=\"vcard author\">\n                                                        By                         <a class=\"url fn\" href=\"../../../../../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                </address>\n                                                <p>In <a href=\"../../../../../category/misc.html\">misc</a>.</p>\n\n                                        </footer><!-- /.post-info -->      <p>Or completely awesome. Depends the needs.</p>\n                                        <p><a class=\"reference external\" href=\"../../../../../posts/2011/avril/20/a-markdown-powered-article/\">a root-relative link to markdown-article</a>\n                                                <a class=\"reference external\" href=\"../../../../../posts/2011/avril/20/a-markdown-powered-article/\">a file-relative link to markdown-article</a></p>\n                                        <div class=\"section\" id=\"testing-sourcecode-directive\">\n                                                <h2>Testing sourcecode directive</h2>\n                                                <div class=\"highlight\"><table class=\"highlighttable\"><tr><td class=\"linenos\"><div class=\"linenodiv\"><pre><span class=\"normal\">1</span></pre></div></td><td class=\"code\"><div><pre><span></span><span class=\"n\">formatter</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span> <span class=\"ow\">and</span> <span class=\"n\">VARIANTS</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]]</span>\n</pre></div></td></tr></table></div>\n                                        </div>\n                                        <div class=\"section\" id=\"testing-another-case\">\n                                                <h2>Testing another case</h2>\n                                                <p>This will now have a line number in 'custom' since it's the default in\n                                                        pelican.conf, it will have nothing in default.</p>\n                                                <div class=\"highlight\"><table class=\"highlighttable\"><tr><td class=\"linenos\"><div class=\"linenodiv\"><pre><span class=\"normal\">1</span></pre></div></td><td class=\"code\"><div><pre><span></span><span class=\"n\">formatter</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span> <span class=\"ow\">and</span> <span class=\"n\">VARIANTS</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]]</span>\n</pre></div></td></tr></table></div>\n                                                <p>Lovely.</p>\n                                        </div>\n                                        <div class=\"section\" id=\"testing-more-sourcecode-directives\">\n                                                <h2>Testing more sourcecode directives</h2>\n                                                <div class=\"highlight\"><pre><span></span><span id=\"foo-8\"><a id=\"foo-8\" name=\"foo-8\"></a><a href=\"#foo-8\"><span class=\"linenos special\"> 8</span></a><span class=\"testingk\">def</span><span class=\"testingw\"> </span><span class=\"testingnf\">run</span><span class=\"testingp\">(</span><span class=\"testingbp\">self</span><span class=\"testingp\">):</span><br></span><span id=\"foo-9\"><a id=\"foo-9\" name=\"foo-9\"></a><a href=\"#foo-9\"><span class=\"linenos\">  </span></a>    <span class=\"testingbp\">self</span><span class=\"testingo\">.</span><span class=\"testingn\">assert_has_content</span><span class=\"testingp\">()</span><br></span><span id=\"foo-10\"><a id=\"foo-10\" name=\"foo-10\"></a><a href=\"#foo-10\"><span class=\"linenos special\">10</span></a>    <span class=\"testingk\">try</span><span class=\"testingp\">:</span><br></span><span id=\"foo-11\"><a id=\"foo-11\" name=\"foo-11\"></a><a href=\"#foo-11\"><span class=\"linenos\">  </span></a>        <span class=\"testingn\">lexer</span> <span class=\"testingo\">=</span> <span class=\"testingn\">get_lexer_by_name</span><span class=\"testingp\">(</span><span class=\"testingbp\">self</span><span class=\"testingo\">.</span><span class=\"testingn\">arguments</span><span class=\"testingp\">[</span><span class=\"testingmi\">0</span><span class=\"testingp\">])</span><br></span><span id=\"foo-12\"><a id=\"foo-12\" name=\"foo-12\"></a><a href=\"#foo-12\"><span class=\"linenos special\">12</span></a>    <span class=\"testingk\">except</span> <span class=\"testingne\">ValueError</span><span class=\"testingp\">:</span><br></span><span id=\"foo-13\"><a id=\"foo-13\" name=\"foo-13\"></a><a href=\"#foo-13\"><span class=\"linenos\">  </span></a>        <span class=\"testingc1\"># no lexer found - use the text one instead of an exception</span><br></span><span id=\"foo-14\"><a id=\"foo-14\" name=\"foo-14\"></a><a href=\"#foo-14\"><span class=\"linenos special\">14</span></a>        <span class=\"testingn\">lexer</span> <span class=\"testingo\">=</span> <span class=\"testingn\">TextLexer</span><span class=\"testingp\">()</span><br></span><span id=\"foo-15\"><a id=\"foo-15\" name=\"foo-15\"></a><a href=\"#foo-15\"><span class=\"linenos\">  </span></a><br></span><span id=\"foo-16\"><a id=\"foo-16\" name=\"foo-16\"></a><a href=\"#foo-16\"><span class=\"linenos special\">16</span></a>    <span class=\"testingk\">if</span> <span class=\"testingp\">(</span><span class=\"testings1\">&#39;linenos&#39;</span> <span class=\"testingow\">in</span> <span class=\"testingbp\">self</span><span class=\"testingo\">.</span><span class=\"testingn\">options</span> <span class=\"testingow\">and</span><br></span><span id=\"foo-17\"><a id=\"foo-17\" name=\"foo-17\"></a><a href=\"#foo-17\"><span class=\"linenos\">  </span></a>            <span class=\"testingbp\">self</span><span class=\"testingo\">.</span><span class=\"testingn\">options</span><span class=\"testingp\">[</span><span class=\"testings1\">&#39;linenos&#39;</span><span class=\"testingp\">]</span> <span class=\"testingow\">not</span> <span class=\"testingow\">in</span> <span class=\"testingp\">(</span><span class=\"testings1\">&#39;table&#39;</span><span class=\"testingp\">,</span> <span class=\"testings1\">&#39;inline&#39;</span><span class=\"testingp\">)):</span><br></span><span id=\"foo-18\"><a id=\"foo-18\" name=\"foo-18\"></a><a href=\"#foo-18\"><span class=\"linenos special\">18</span></a>        <span class=\"testingbp\">self</span><span class=\"testingo\">.</span><span class=\"testingn\">options</span><span class=\"testingp\">[</span><span class=\"testings1\">&#39;linenos&#39;</span><span class=\"testingp\">]</span> <span class=\"testingo\">=</span> <span class=\"testings1\">&#39;table&#39;</span><br></span><span id=\"foo-19\"><a id=\"foo-19\" name=\"foo-19\"></a><a href=\"#foo-19\"><span class=\"linenos\">  </span></a><br></span><span id=\"foo-20\"><a id=\"foo-20\" name=\"foo-20\"></a><a href=\"#foo-20\"><span class=\"linenos special\">20</span></a>    <span class=\"testingk\">for</span> <span class=\"testingn\">flag</span> <span class=\"testingow\">in</span> <span class=\"testingp\">(</span><span class=\"testings1\">&#39;nowrap&#39;</span><span class=\"testingp\">,</span> <span class=\"testings1\">&#39;nobackground&#39;</span><span class=\"testingp\">,</span> <span class=\"testings1\">&#39;anchorlinenos&#39;</span><span class=\"testingp\">):</span><br></span><span id=\"foo-21\"><a id=\"foo-21\" name=\"foo-21\"></a><a href=\"#foo-21\"><span class=\"linenos\">  </span></a>        <span class=\"testingk\">if</span> <span class=\"testingn\">flag</span> <span class=\"testingow\">in</span> <span class=\"testingbp\">self</span><span class=\"testingo\">.</span><span class=\"testingn\">options</span><span class=\"testingp\">:</span><br></span><span id=\"foo-22\"><a id=\"foo-22\" name=\"foo-22\"></a><a href=\"#foo-22\"><span class=\"linenos special\">22</span></a>            <span class=\"testingbp\">self</span><span class=\"testingo\">.</span><span class=\"testingn\">options</span><span class=\"testingp\">[</span><span class=\"testingn\">flag</span><span class=\"testingp\">]</span> <span class=\"testingo\">=</span> <span class=\"testingkc\">True</span><br></span><span id=\"foo-23\"><a id=\"foo-23\" name=\"foo-23\"></a><a href=\"#foo-23\"><span class=\"linenos\">  </span></a><br></span><span id=\"foo-24\"><a id=\"foo-24\" name=\"foo-24\"></a><a href=\"#foo-24\"><span class=\"linenos special\">24</span></a>    <span class=\"testingc1\"># noclasses should already default to False, but just in case...</span><br></span><span id=\"foo-25\"><a id=\"foo-25\" name=\"foo-25\"></a><a href=\"#foo-25\"><span class=\"linenos\">  </span></a>    <span class=\"testingn\">formatter</span> <span class=\"testingo\">=</span> <span class=\"testingn\">HtmlFormatter</span><span class=\"testingp\">(</span><span class=\"testingn\">noclasses</span><span class=\"testingo\">=</span><span class=\"testingkc\">False</span><span class=\"testingp\">,</span> <span class=\"testingo\">**</span><span class=\"testingbp\">self</span><span class=\"testingo\">.</span><span class=\"testingn\">options</span><span class=\"testingp\">)</span><br></span><span id=\"foo-26\"><a id=\"foo-26\" name=\"foo-26\"></a><a href=\"#foo-26\"><span class=\"linenos special\">26</span></a>    <span class=\"testingn\">parsed</span> <span class=\"testingo\">=</span> <span class=\"testingn\">highlight</span><span class=\"testingp\">(</span><span class=\"testings1\">&#39;</span><span class=\"testingse\">\\n</span><span class=\"testings1\">&#39;</span><span class=\"testingo\">.</span><span class=\"testingn\">join</span><span class=\"testingp\">(</span><span class=\"testingbp\">self</span><span class=\"testingo\">.</span><span class=\"testingn\">content</span><span class=\"testingp\">),</span> <span class=\"testingn\">lexer</span><span class=\"testingp\">,</span> <span class=\"testingn\">formatter</span><span class=\"testingp\">)</span><br></span><span id=\"foo-27\"><a id=\"foo-27\" name=\"foo-27\"></a><a href=\"#foo-27\"><span class=\"linenos\">  </span></a>    <span class=\"testingk\">return</span> <span class=\"testingp\">[</span><span class=\"testingn\">nodes</span><span class=\"testingo\">.</span><span class=\"testingn\">raw</span><span class=\"testingp\">(</span><span class=\"testings1\">&#39;&#39;</span><span class=\"testingp\">,</span> <span class=\"testingn\">parsed</span><span class=\"testingp\">,</span> <span class=\"testingnb\">format</span><span class=\"testingo\">=</span><span class=\"testings1\">&#39;html&#39;</span><span class=\"testingp\">)]</span><br></span></pre></div>\n                                                <p>Lovely.</p>\n                                        </div>\n                                        <div class=\"section\" id=\"testing-even-more-sourcecode-directives\">\n                                                <h2>Testing even more sourcecode directives</h2>\n                                                <span class=\"n\">formatter</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span> <span class=\"ow\">and</span> <span class=\"n\">VARIANTS</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]]</span>\n                                                <p>Lovely.</p>\n                                        </div>\n                                        <div class=\"section\" id=\"testing-overriding-config-defaults\">\n                                                <h2>Testing overriding config defaults</h2>\n                                                <p>Even if the default is line numbers, we can override it here</p>\n                                                <div class=\"highlight\"><pre><span></span><span class=\"n\">formatter</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span> <span class=\"ow\">and</span> <span class=\"n\">VARIANTS</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]]</span>\n</pre></div>\n                                                <p>Lovely.</p>\n                                        </div>\n\n                                </div><!-- /.entry-content -->\n                                <div class=\"comments\">\n                                        <h2>Comments !</h2>\n                                        <div id=\"disqus_thread\"></div>\n                                        <script type=\"text/javascript\">\n                                                var disqus_shortname = 'blog-notmyidea';\n                                                var disqus_identifier = 'posts/2010/octobre/15/unbelievable/';\n                                                var disqus_url = '../../../../../posts/2010/octobre/15/unbelievable/';\n                                                (function() {\n                                                        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;\n                                                        dsq.src = '//blog-notmyidea.disqus.com/embed.js';\n                                                        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);\n                                                })();\n                                        </script>\n                                        <noscript>Please enable JavaScript to view the comments.</noscript>\n                                </div>\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/posts/2010/octobre/20/oh-yeah/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Oh yeah !</title>\n                <link rel=\"stylesheet\" href=\"../../../../../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n                <link rel=\"alternate\" hreflang=\"fr\" href=\"../../../../../oh-yeah-fr.html\">\n\n                <meta name=\"description\" content=\"Why not ? After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst ! YEAH !\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../../../../../\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li><a href=\"../../../../../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../../../../../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../../../../../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../../../../../category/yeah.html\">yeah</a></li>\n                                <li><a href=\"../../../../../category/misc.html\">misc</a></li>\n                                <li><a href=\"../../../../../category/cat1.html\">cat1</a></li>\n                                <li class=\"active\"><a href=\"../../../../../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"../../../../../posts/2010/octobre/20/oh-yeah/\" rel=\"bookmark\"\n                                                   title=\"Permalink to Oh yeah !\">Oh yeah !</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2010-10-20T10:14:00+02:00\">\n                                                        Published: 20 octobre 2010\n                                                </abbr>\n\n                                                <address class=\"vcard author\">\n                                                        By                         <a class=\"url fn\" href=\"../../../../../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                </address>\n                                                <p>In <a href=\"../../../../../category/bar.html\">bar</a>.</p>\n                                                <p>tags: <a href=\"../../../../../tag/oh.html\">oh</a> <a href=\"../../../../../tag/bar.html\">bar</a> <a href=\"../../../../../tag/yeah.html\">yeah</a> </p>Translations:\n                                                <a href=\"../../../../../oh-yeah-fr.html\" hreflang=\"fr\">fr</a>\n\n                                        </footer><!-- /.post-info -->      <div class=\"section\" id=\"why-not\">\n                                                <h2>Why not ?</h2>\n                                                <p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\n                                                        YEAH !</p>\n                                                <img alt=\"alternate text\" src=\"../../../../../pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" />\n                                        </div>\n\n                                </div><!-- /.entry-content -->\n                                <div class=\"comments\">\n                                        <h2>Comments !</h2>\n                                        <div id=\"disqus_thread\"></div>\n                                        <script type=\"text/javascript\">\n                                                var disqus_shortname = 'blog-notmyidea';\n                                                var disqus_identifier = 'posts/2010/octobre/20/oh-yeah/';\n                                                var disqus_url = '../../../../../posts/2010/octobre/20/oh-yeah/';\n                                                (function() {\n                                                        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;\n                                                        dsq.src = '//blog-notmyidea.disqus.com/embed.js';\n                                                        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);\n                                                })();\n                                        </script>\n                                        <noscript>Please enable JavaScript to view the comments.</noscript>\n                                </div>\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/posts/2011/avril/20/a-markdown-powered-article/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>A markdown powered article</title>\n                <link rel=\"stylesheet\" href=\"../../../../../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n                <meta name=\"description\" content=\"You're mutually oblivious. a root-relative link to unbelievable a file-relative link to unbelievable\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../../../../../\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li><a href=\"../../../../../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../../../../../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../../../../../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../../../../../category/yeah.html\">yeah</a></li>\n                                <li><a href=\"../../../../../category/misc.html\">misc</a></li>\n                                <li class=\"active\"><a href=\"../../../../../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../../../../../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"../../../../../posts/2011/avril/20/a-markdown-powered-article/\" rel=\"bookmark\"\n                                                   title=\"Permalink to A markdown powered article\">A markdown powered article</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2011-04-20T00:00:00+02:00\">\n                                                        Published: 20 avril 2011\n                                                </abbr>\n\n                                                <address class=\"vcard author\">\n                                                        By                         <a class=\"url fn\" href=\"../../../../../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                </address>\n                                                <p>In <a href=\"../../../../../category/cat1.html\">cat1</a>.</p>\n\n                                        </footer><!-- /.post-info -->      <p>You're mutually oblivious.</p>\n                                        <p><a href=\"../../../../../posts/2010/octobre/15/unbelievable/\">a root-relative link to unbelievable</a>\n                                                <a href=\"../../../../../posts/2010/octobre/15/unbelievable/\">a file-relative link to unbelievable</a></p>\n                                </div><!-- /.entry-content -->\n                                <div class=\"comments\">\n                                        <h2>Comments !</h2>\n                                        <div id=\"disqus_thread\"></div>\n                                        <script type=\"text/javascript\">\n                                                var disqus_shortname = 'blog-notmyidea';\n                                                var disqus_identifier = 'posts/2011/avril/20/a-markdown-powered-article/';\n                                                var disqus_url = '../../../../../posts/2011/avril/20/a-markdown-powered-article/';\n                                                (function() {\n                                                        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;\n                                                        dsq.src = '//blog-notmyidea.disqus.com/embed.js';\n                                                        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);\n                                                })();\n                                        </script>\n                                        <noscript>Please enable JavaScript to view the comments.</noscript>\n                                </div>\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/posts/2011/février/17/article-1/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Article 1</title>\n                <link rel=\"stylesheet\" href=\"../../../../../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n                <meta name=\"description\" content=\"Article 1\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../../../../../\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li><a href=\"../../../../../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../../../../../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../../../../../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../../../../../category/yeah.html\">yeah</a></li>\n                                <li><a href=\"../../../../../category/misc.html\">misc</a></li>\n                                <li class=\"active\"><a href=\"../../../../../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../../../../../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"../../../../../posts/2011/février/17/article-1/\" rel=\"bookmark\"\n                                                   title=\"Permalink to Article 1\">Article 1</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2011-02-17T00:00:00+01:00\">\n                                                        Published: 17 février 2011\n                                                </abbr>\n\n                                                <address class=\"vcard author\">\n                                                        By                         <a class=\"url fn\" href=\"../../../../../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                </address>\n                                                <p>In <a href=\"../../../../../category/cat1.html\">cat1</a>.</p>\n\n                                        </footer><!-- /.post-info -->      <p>Article 1</p>\n\n                                </div><!-- /.entry-content -->\n                                <div class=\"comments\">\n                                        <h2>Comments !</h2>\n                                        <div id=\"disqus_thread\"></div>\n                                        <script type=\"text/javascript\">\n                                                var disqus_shortname = 'blog-notmyidea';\n                                                var disqus_identifier = 'posts/2011/février/17/article-1/';\n                                                var disqus_url = '../../../../../posts/2011/février/17/article-1/';\n                                                (function() {\n                                                        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;\n                                                        dsq.src = '//blog-notmyidea.disqus.com/embed.js';\n                                                        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);\n                                                })();\n                                        </script>\n                                        <noscript>Please enable JavaScript to view the comments.</noscript>\n                                </div>\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/posts/2011/février/17/article-2/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Article 2</title>\n                <link rel=\"stylesheet\" href=\"../../../../../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n                <meta name=\"description\" content=\"Article 2\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../../../../../\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li><a href=\"../../../../../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../../../../../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../../../../../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../../../../../category/yeah.html\">yeah</a></li>\n                                <li><a href=\"../../../../../category/misc.html\">misc</a></li>\n                                <li class=\"active\"><a href=\"../../../../../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../../../../../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"../../../../../posts/2011/février/17/article-2/\" rel=\"bookmark\"\n                                                   title=\"Permalink to Article 2\">Article 2</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2011-02-17T00:00:00+01:00\">\n                                                        Published: 17 février 2011\n                                                </abbr>\n\n                                                <address class=\"vcard author\">\n                                                        By                         <a class=\"url fn\" href=\"../../../../../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                </address>\n                                                <p>In <a href=\"../../../../../category/cat1.html\">cat1</a>.</p>\n\n                                        </footer><!-- /.post-info -->      <p>Article 2</p>\n\n                                </div><!-- /.entry-content -->\n                                <div class=\"comments\">\n                                        <h2>Comments !</h2>\n                                        <div id=\"disqus_thread\"></div>\n                                        <script type=\"text/javascript\">\n                                                var disqus_shortname = 'blog-notmyidea';\n                                                var disqus_identifier = 'posts/2011/février/17/article-2/';\n                                                var disqus_url = '../../../../../posts/2011/février/17/article-2/';\n                                                (function() {\n                                                        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;\n                                                        dsq.src = '//blog-notmyidea.disqus.com/embed.js';\n                                                        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);\n                                                })();\n                                        </script>\n                                        <noscript>Please enable JavaScript to view the comments.</noscript>\n                                </div>\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/posts/2011/février/17/article-3/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Article 3</title>\n                <link rel=\"stylesheet\" href=\"../../../../../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n                <meta name=\"description\" content=\"Article 3\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../../../../../\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li><a href=\"../../../../../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../../../../../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../../../../../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../../../../../category/yeah.html\">yeah</a></li>\n                                <li><a href=\"../../../../../category/misc.html\">misc</a></li>\n                                <li class=\"active\"><a href=\"../../../../../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../../../../../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"../../../../../posts/2011/février/17/article-3/\" rel=\"bookmark\"\n                                                   title=\"Permalink to Article 3\">Article 3</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2011-02-17T00:00:00+01:00\">\n                                                        Published: 17 février 2011\n                                                </abbr>\n\n                                                <address class=\"vcard author\">\n                                                        By                         <a class=\"url fn\" href=\"../../../../../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                </address>\n                                                <p>In <a href=\"../../../../../category/cat1.html\">cat1</a>.</p>\n\n                                        </footer><!-- /.post-info -->      <p>Article 3</p>\n\n                                </div><!-- /.entry-content -->\n                                <div class=\"comments\">\n                                        <h2>Comments !</h2>\n                                        <div id=\"disqus_thread\"></div>\n                                        <script type=\"text/javascript\">\n                                                var disqus_shortname = 'blog-notmyidea';\n                                                var disqus_identifier = 'posts/2011/février/17/article-3/';\n                                                var disqus_url = '../../../../../posts/2011/février/17/article-3/';\n                                                (function() {\n                                                        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;\n                                                        dsq.src = '//blog-notmyidea.disqus.com/embed.js';\n                                                        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);\n                                                })();\n                                        </script>\n                                        <noscript>Please enable JavaScript to view the comments.</noscript>\n                                </div>\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/posts/2012/février/29/second-article/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Second article</title>\n                <link rel=\"stylesheet\" href=\"../../../../../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n                <link rel=\"alternate\" hreflang=\"fr\" href=\"../../../../../second-article-fr.html\">\n\n                <meta name=\"description\" content=\"This is some article, in english\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../../../../../\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li><a href=\"../../../../../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../../../../../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../../../../../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../../../../../category/yeah.html\">yeah</a></li>\n                                <li class=\"active\"><a href=\"../../../../../category/misc.html\">misc</a></li>\n                                <li><a href=\"../../../../../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../../../../../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"../../../../../posts/2012/février/29/second-article/\" rel=\"bookmark\"\n                                                   title=\"Permalink to Second article\">Second article</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2012-02-29T00:00:00+01:00\">\n                                                        Published: 29 février 2012\n                                                </abbr>\n\n                                                <address class=\"vcard author\">\n                                                        By                         <a class=\"url fn\" href=\"../../../../../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                </address>\n                                                <p>In <a href=\"../../../../../category/misc.html\">misc</a>.</p>\n                                                <p>tags: <a href=\"../../../../../tag/foo.html\">foo</a> <a href=\"../../../../../tag/bar.html\">bar</a> <a href=\"../../../../../tag/baz.html\">baz</a> </p>Translations:\n                                                <a href=\"../../../../../second-article-fr.html\" hreflang=\"fr\">fr</a>\n\n                                        </footer><!-- /.post-info -->      <p>This is some article, in english</p>\n\n                                </div><!-- /.entry-content -->\n                                <div class=\"comments\">\n                                        <h2>Comments !</h2>\n                                        <div id=\"disqus_thread\"></div>\n                                        <script type=\"text/javascript\">\n                                                var disqus_shortname = 'blog-notmyidea';\n                                                var disqus_identifier = 'posts/2012/février/29/second-article/';\n                                                var disqus_url = '../../../../../posts/2012/février/29/second-article/';\n                                                (function() {\n                                                        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;\n                                                        dsq.src = '//blog-notmyidea.disqus.com/embed.js';\n                                                        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);\n                                                })();\n                                        </script>\n                                        <noscript>Please enable JavaScript to view the comments.</noscript>\n                                </div>\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/posts/2012/novembre/30/filename_metadata-example/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>FILENAME_METADATA example</title>\n                <link rel=\"stylesheet\" href=\"../../../../../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n                <meta name=\"description\" content=\"Some cool stuff!\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../../../../../\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li><a href=\"../../../../../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../../../../../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../../../../../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../../../../../category/yeah.html\">yeah</a></li>\n                                <li class=\"active\"><a href=\"../../../../../category/misc.html\">misc</a></li>\n                                <li><a href=\"../../../../../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../../../../../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"../../../../../posts/2012/novembre/30/filename_metadata-example/\" rel=\"bookmark\"\n                                                   title=\"Permalink to FILENAME_METADATA example\">FILENAME_METADATA example</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2012-11-30T00:00:00+01:00\">\n                                                        Published: 30 novembre 2012\n                                                </abbr>\n\n                                                <address class=\"vcard author\">\n                                                        By                         <a class=\"url fn\" href=\"../../../../../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                </address>\n                                                <p>In <a href=\"../../../../../category/misc.html\">misc</a>.</p>\n\n                                        </footer><!-- /.post-info -->      <p>Some cool stuff!</p>\n\n                                </div><!-- /.entry-content -->\n                                <div class=\"comments\">\n                                        <h2>Comments !</h2>\n                                        <div id=\"disqus_thread\"></div>\n                                        <script type=\"text/javascript\">\n                                                var disqus_shortname = 'blog-notmyidea';\n                                                var disqus_identifier = 'posts/2012/novembre/30/filename_metadata-example/';\n                                                var disqus_url = '../../../../../posts/2012/novembre/30/filename_metadata-example/';\n                                                (function() {\n                                                        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;\n                                                        dsq.src = '//blog-notmyidea.disqus.com/embed.js';\n                                                        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);\n                                                })();\n                                        </script>\n                                        <noscript>Please enable JavaScript to view the comments.</noscript>\n                                </div>\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/robots.txt",
    "content": "User-agent: *\nDisallow: /pictures\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/second-article-fr.html",
    "content": "<!DOCTYPE html>\n<html lang=\"fr\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Deuxième article</title>\n                <link rel=\"stylesheet\" href=\"./theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n                <link rel=\"alternate\" hreflang=\"en\" href=\"./posts/2012/février/29/second-article/\">\n\n                <meta name=\"description\" content=\"Ceci est un article, en français.\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"./\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li><a href=\"./tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"./override/\">Override url/save_as</a></li>\n                                <li><a href=\"./pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"./category/yeah.html\">yeah</a></li>\n                                <li class=\"active\"><a href=\"./category/misc.html\">misc</a></li>\n                                <li><a href=\"./category/cat1.html\">cat1</a></li>\n                                <li><a href=\"./category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"./second-article-fr.html\" rel=\"bookmark\"\n                                                   title=\"Permalink to Deuxième article\">Deuxième article</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2012-02-29T00:00:00+01:00\">\n                                                        Published: 29 février 2012\n                                                </abbr>\n\n                                                <address class=\"vcard author\">\n                                                        By                         <a class=\"url fn\" href=\"./author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                </address>\n                                                <p>In <a href=\"./category/misc.html\">misc</a>.</p>\n                                                <p>tags: <a href=\"./tag/foo.html\">foo</a> <a href=\"./tag/bar.html\">bar</a> <a href=\"./tag/baz.html\">baz</a> </p>Translations:\n                                                <a href=\"./posts/2012/février/29/second-article/\" hreflang=\"en\">en</a>\n\n                                        </footer><!-- /.post-info -->      <p>Ceci est un article, en français.</p>\n\n                                </div><!-- /.entry-content -->\n                                <div class=\"comments\">\n                                        <h2>Comments !</h2>\n                                        <div id=\"disqus_thread\"></div>\n                                        <script type=\"text/javascript\">\n                                                var disqus_shortname = 'blog-notmyidea';\n                                                var disqus_identifier = 'second-article-fr.html';\n                                                var disqus_url = './second-article-fr.html';\n                                                (function() {\n                                                        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;\n                                                        dsq.src = '//blog-notmyidea.disqus.com/embed.js';\n                                                        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);\n                                                })();\n                                        </script>\n                                        <noscript>Please enable JavaScript to view the comments.</noscript>\n                                </div>\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/tag/bar.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log - bar</title>\n                <link rel=\"stylesheet\" href=\"../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li><a href=\"../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../category/yeah.html\">yeah</a></li>\n                                <li><a href=\"../category/misc.html\">misc</a></li>\n                                <li><a href=\"../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <aside id=\"featured\" class=\"body\">\n                        <article>\n                                <h1 class=\"entry-title\"><a href=\"../posts/2012/février/29/second-article/\">Second article</a></h1>\n                                <footer class=\"post-info\">\n                                        <abbr class=\"published\" title=\"2012-02-29T00:00:00+01:00\">\n                                                Published: 29 février 2012\n                                        </abbr>\n\n                                        <address class=\"vcard author\">\n                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                        </address>\n                                        <p>In <a href=\"../category/misc.html\">misc</a>.</p>\n                                        <p>tags: <a href=\"../tag/foo.html\">foo</a> <a href=\"../tag/bar.html\">bar</a> <a href=\"../tag/baz.html\">baz</a> </p>Translations:\n                                        <a href=\"../second-article-fr.html\" hreflang=\"fr\">fr</a>\n\n                                </footer><!-- /.post-info --><p>This is some article, in english</p>\n                                <p>There are <a href=\"../posts/2012/février/29/second-article/#disqus_thread\">comments</a>.</p>                </article>\n                </aside><!-- /#featured -->\n                <section id=\"content\" class=\"body\">\n                        <h1>Other articles</h1>\n                        <hr />\n                        <ol id=\"posts-list\" class=\"hfeed\">\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"../posts/2010/décembre/02/this-is-a-super-article/\" rel=\"bookmark\"\n                                                       title=\"Permalink to This is a super article !\">This is a super article !</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2010-12-02T10:14:00+01:00\">\n                                                                Published: 02 décembre 2010\n                                                        </abbr>\n                                                        <br />\n                                                        <abbr class=\"modified\" title=\"2013-11-17T23:29:00+01:00\">\n                                                                Updated: 17 novembre 2013\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"../category/yeah.html\">yeah</a>.</p>\n                                                        <p>tags: <a href=\"../tag/foo.html\">foo</a> <a href=\"../tag/bar.html\">bar</a> <a href=\"../tag/foobar.html\">foobar</a> </p>\n                                                </footer><!-- /.post-info -->                <p class=\"first last\">Multi-line metadata should be supported\n                                                        as well as <strong>inline markup</strong>.</p>\n\n                                                <a class=\"readmore\" href=\"../posts/2010/décembre/02/this-is-a-super-article/\">read more</a>\n                                                <p>There are <a href=\"../posts/2010/décembre/02/this-is-a-super-article/#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"../posts/2010/octobre/20/oh-yeah/\" rel=\"bookmark\"\n                                                       title=\"Permalink to Oh yeah !\">Oh yeah !</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2010-10-20T10:14:00+02:00\">\n                                                                Published: 20 octobre 2010\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"../category/bar.html\">bar</a>.</p>\n                                                        <p>tags: <a href=\"../tag/oh.html\">oh</a> <a href=\"../tag/bar.html\">bar</a> <a href=\"../tag/yeah.html\">yeah</a> </p>Translations:\n                                                        <a href=\"../oh-yeah-fr.html\" hreflang=\"fr\">fr</a>\n\n                                                </footer><!-- /.post-info -->                <div class=\"section\" id=\"why-not\">\n                                                        <h2>Why not ?</h2>\n                                                        <p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\n                                                                YEAH !</p>\n                                                        <img alt=\"alternate text\" src=\"../pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" />\n                                                </div>\n\n                                                <a class=\"readmore\" href=\"../posts/2010/octobre/20/oh-yeah/\">read more</a>\n                                                <p>There are <a href=\"../posts/2010/octobre/20/oh-yeah/#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n                        </ol><!-- /#posts-list -->\n                </section><!-- /#content -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/tag/baz.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>The baz tag</title>\n                <link rel=\"stylesheet\" href=\"../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n                <meta name=\"description\" content=\"This article overrides the listening of the articles under the baz tag.\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li><a href=\"../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../category/yeah.html\">yeah</a></li>\n                                <li class=\"active\"><a href=\"../category/misc.html\">misc</a></li>\n                                <li><a href=\"../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <article>\n                                <header>\n                                        <h1 class=\"entry-title\">\n                                                <a href=\"../tag/baz.html\" rel=\"bookmark\"\n                                                   title=\"Permalink to The baz tag\">The baz tag</a></h1>\n                                </header>\n\n                                <div class=\"entry-content\">\n                                        <footer class=\"post-info\">\n                                                <abbr class=\"published\" title=\"2010-03-14T00:00:00+01:00\">\n                                                        Published: 14 mars 2010\n                                                </abbr>\n\n                                                <address class=\"vcard author\">\n                                                        By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                </address>\n                                                <p>In <a href=\"../category/misc.html\">misc</a>.</p>\n\n                                        </footer><!-- /.post-info -->      <p>This article overrides the listening of the articles under the <em>baz</em> tag.</p>\n\n                                </div><!-- /.entry-content -->\n                                <div class=\"comments\">\n                                        <h2>Comments !</h2>\n                                        <div id=\"disqus_thread\"></div>\n                                        <script type=\"text/javascript\">\n                                                var disqus_shortname = 'blog-notmyidea';\n                                                var disqus_identifier = 'tag/baz.html';\n                                                var disqus_url = '../tag/baz.html';\n                                                (function() {\n                                                        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;\n                                                        dsq.src = '//blog-notmyidea.disqus.com/embed.js';\n                                                        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);\n                                                })();\n                                        </script>\n                                        <noscript>Please enable JavaScript to view the comments.</noscript>\n                                </div>\n\n                        </article>\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/tag/foo.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log - foo</title>\n                <link rel=\"stylesheet\" href=\"../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li><a href=\"../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../category/yeah.html\">yeah</a></li>\n                                <li><a href=\"../category/misc.html\">misc</a></li>\n                                <li><a href=\"../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <aside id=\"featured\" class=\"body\">\n                        <article>\n                                <h1 class=\"entry-title\"><a href=\"../posts/2012/février/29/second-article/\">Second article</a></h1>\n                                <footer class=\"post-info\">\n                                        <abbr class=\"published\" title=\"2012-02-29T00:00:00+01:00\">\n                                                Published: 29 février 2012\n                                        </abbr>\n\n                                        <address class=\"vcard author\">\n                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                        </address>\n                                        <p>In <a href=\"../category/misc.html\">misc</a>.</p>\n                                        <p>tags: <a href=\"../tag/foo.html\">foo</a> <a href=\"../tag/bar.html\">bar</a> <a href=\"../tag/baz.html\">baz</a> </p>Translations:\n                                        <a href=\"../second-article-fr.html\" hreflang=\"fr\">fr</a>\n\n                                </footer><!-- /.post-info --><p>This is some article, in english</p>\n                                <p>There are <a href=\"../posts/2012/février/29/second-article/#disqus_thread\">comments</a>.</p>                </article>\n                </aside><!-- /#featured -->\n                <section id=\"content\" class=\"body\">\n                        <h1>Other articles</h1>\n                        <hr />\n                        <ol id=\"posts-list\" class=\"hfeed\">\n\n                                <li><article class=\"hentry\">\n                                        <header>\n                                                <h1><a href=\"../posts/2010/décembre/02/this-is-a-super-article/\" rel=\"bookmark\"\n                                                       title=\"Permalink to This is a super article !\">This is a super article !</a></h1>\n                                        </header>\n\n                                        <div class=\"entry-content\">\n                                                <footer class=\"post-info\">\n                                                        <abbr class=\"published\" title=\"2010-12-02T10:14:00+01:00\">\n                                                                Published: 02 décembre 2010\n                                                        </abbr>\n                                                        <br />\n                                                        <abbr class=\"modified\" title=\"2013-11-17T23:29:00+01:00\">\n                                                                Updated: 17 novembre 2013\n                                                        </abbr>\n\n                                                        <address class=\"vcard author\">\n                                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                                        </address>\n                                                        <p>In <a href=\"../category/yeah.html\">yeah</a>.</p>\n                                                        <p>tags: <a href=\"../tag/foo.html\">foo</a> <a href=\"../tag/bar.html\">bar</a> <a href=\"../tag/foobar.html\">foobar</a> </p>\n                                                </footer><!-- /.post-info -->                <p class=\"first last\">Multi-line metadata should be supported\n                                                        as well as <strong>inline markup</strong>.</p>\n\n                                                <a class=\"readmore\" href=\"../posts/2010/décembre/02/this-is-a-super-article/\">read more</a>\n                                                <p>There are <a href=\"../posts/2010/décembre/02/this-is-a-super-article/#disqus_thread\">comments</a>.</p>                </div><!-- /.entry-content -->\n                                </article></li>\n                        </ol><!-- /#posts-list -->\n                </section><!-- /#content -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/tag/foobar.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log - foobar</title>\n                <link rel=\"stylesheet\" href=\"../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li><a href=\"../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../category/yeah.html\">yeah</a></li>\n                                <li><a href=\"../category/misc.html\">misc</a></li>\n                                <li><a href=\"../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <aside id=\"featured\" class=\"body\">\n                        <article>\n                                <h1 class=\"entry-title\"><a href=\"../posts/2010/décembre/02/this-is-a-super-article/\">This is a super article !</a></h1>\n                                <footer class=\"post-info\">\n                                        <abbr class=\"published\" title=\"2010-12-02T10:14:00+01:00\">\n                                                Published: 02 décembre 2010\n                                        </abbr>\n                                        <br />\n                                        <abbr class=\"modified\" title=\"2013-11-17T23:29:00+01:00\">\n                                                Updated: 17 novembre 2013\n                                        </abbr>\n\n                                        <address class=\"vcard author\">\n                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                        </address>\n                                        <p>In <a href=\"../category/yeah.html\">yeah</a>.</p>\n                                        <p>tags: <a href=\"../tag/foo.html\">foo</a> <a href=\"../tag/bar.html\">bar</a> <a href=\"../tag/foobar.html\">foobar</a> </p>\n                                </footer><!-- /.post-info --><p>Some content here !</p>\n                                <div class=\"section\" id=\"this-is-a-simple-title\">\n                                        <h2>This is a simple title</h2>\n                                        <p>And here comes the cool <a class=\"reference external\" href=\"http://books.couchdb.org/relax/design-documents/views\">stuff</a>.</p>\n                                        <img alt=\"alternate text\" src=\"../pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" />\n                                        <img alt=\"alternate text\" src=\"../pictures/Sushi_Macro.jpg\" style=\"width: 600px; height: 450px;\" />\n<pre class=\"literal-block\">\n&gt;&gt;&gt; from ipdb import set_trace\n&gt;&gt;&gt; set_trace()\n</pre>\n                                        <p>→ And now try with some utf8 hell: ééé</p>\n                                </div>\n                                <p>There are <a href=\"../posts/2010/décembre/02/this-is-a-super-article/#disqus_thread\">comments</a>.</p>                </article>\n                </aside><!-- /#featured -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/tag/oh.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Oh Oh Oh</title>\n                <link rel=\"stylesheet\" href=\"../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li class=\"active\"><a href=\"../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../category/yeah.html\">yeah</a></li>\n                                <li><a href=\"../category/misc.html\">misc</a></li>\n                                <li><a href=\"../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n                <section id=\"content\" class=\"body\">\n                        <h1 class=\"entry-title\">Oh Oh Oh</h1>\n\n                        <p>This page overrides the listening of the articles under the <em>oh</em> tag.</p>\n\n                </section>\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/tag/yeah.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log - yeah</title>\n                <link rel=\"stylesheet\" href=\"../theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"../\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li><a href=\"../tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"../override/\">Override url/save_as</a></li>\n                                <li><a href=\"../pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"../category/yeah.html\">yeah</a></li>\n                                <li><a href=\"../category/misc.html\">misc</a></li>\n                                <li><a href=\"../category/cat1.html\">cat1</a></li>\n                                <li><a href=\"../category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <aside id=\"featured\" class=\"body\">\n                        <article>\n                                <h1 class=\"entry-title\"><a href=\"../posts/2010/octobre/20/oh-yeah/\">Oh yeah !</a></h1>\n                                <footer class=\"post-info\">\n                                        <abbr class=\"published\" title=\"2010-10-20T10:14:00+02:00\">\n                                                Published: 20 octobre 2010\n                                        </abbr>\n\n                                        <address class=\"vcard author\">\n                                                By                         <a class=\"url fn\" href=\"../author/alexis-metaireau.html\">Alexis Métaireau</a>\n                                        </address>\n                                        <p>In <a href=\"../category/bar.html\">bar</a>.</p>\n                                        <p>tags: <a href=\"../tag/oh.html\">oh</a> <a href=\"../tag/bar.html\">bar</a> <a href=\"../tag/yeah.html\">yeah</a> </p>Translations:\n                                        <a href=\"../oh-yeah-fr.html\" hreflang=\"fr\">fr</a>\n\n                                </footer><!-- /.post-info --><div class=\"section\" id=\"why-not\">\n                                        <h2>Why not ?</h2>\n                                        <p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\n                                                YEAH !</p>\n                                        <img alt=\"alternate text\" src=\"../pictures/Sushi.jpg\" style=\"width: 600px; height: 450px;\" />\n                                </div>\n                                <p>There are <a href=\"../posts/2010/octobre/20/oh-yeah/#disqus_thread\">comments</a>.</p>                </article>\n                </aside><!-- /#featured -->\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/tags.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n        <head>\n                <meta charset=\"utf-8\" />\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                <meta name=\"generator\" content=\"Pelican\" />\n                <title>Alexis' log - Tags</title>\n                <link rel=\"stylesheet\" href=\"./theme/css/main.css\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"Alexis' log Atom Feed\" />\n                <link href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\" title=\"Alexis' log RSS Feed\" />\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                <style type=\"text/css\">\n                        div.github_url {\n                                position: absolute;\n                                border: 0;\n                                background: black;\n                                padding: 2px 8px;\n                                width: 120px;\n                        }\n                </style>\n                <a href=\"http://github.com/ametaireau/\">\n                        <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n                </a>\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"./\">Alexis' log</a></h1>\n                        <nav><ul>\n                                <li><a href=\"./tag/oh.html\">Oh Oh Oh</a></li>\n                                <li><a href=\"./override/\">Override url/save_as</a></li>\n                                <li><a href=\"./pages/this-is-a-test-page.html\">This is a test page</a></li>\n                                <li><a href=\"./category/yeah.html\">yeah</a></li>\n                                <li><a href=\"./category/misc.html\">misc</a></li>\n                                <li><a href=\"./category/cat1.html\">cat1</a></li>\n                                <li><a href=\"./category/bar.html\">bar</a></li>\n                        </ul></nav>\n                </header><!-- /#banner -->\n\n                <section id=\"content\" class=\"body\">\n                        <h1>Tags for Alexis' log</h1>\n                        <ul>\n                                <li><a href=\"./tag/bar.html\">bar</a> (3)</li>\n                                <li><a href=\"./tag/baz.html\">baz</a> (1)</li>\n                                <li><a href=\"./tag/foo.html\">foo</a> (2)</li>\n                                <li><a href=\"./tag/foobar.html\">foobar</a> (1)</li>\n                                <li><a href=\"./tag/oh.html\">oh</a> (1)</li>\n                                <li><a href=\"./tag/yeah.html\">yeah</a> (1)</li>\n                        </ul>\n                </section>\n\n                <section id=\"extras\" class=\"body\">\n                        <div class=\"blogroll\">\n                                <h2>links</h2>\n                                <ul>\n                                        <li><a href=\"http://biologeek.org\">Biologeek</a></li>\n                                        <li><a href=\"http://filyb.info/\">Filyb</a></li>\n                                        <li><a href=\"http://www.libert-fr.com\">Libert-fr</a></li>\n                                        <li><a href=\"http://prendreuncafe.com/blog/\">N1k0</a></li>\n                                        <li><a href=\"http://ziade.org/blog\">Tarek Ziadé</a></li>\n                                        <li><a href=\"http://zubin71.wordpress.com/\">Zubin Mithra</a></li>\n                                </ul>\n                        </div><!-- /.blogroll -->\n                        <div class=\"social\">\n                                <h2>social</h2>\n                                <ul>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.atom.xml\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                        <li><a href=\"http://blog.notmyidea.org/feeds/all.rss.xml\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n\n                                        <li><a href=\"http://twitter.com/ametaireau\">twitter</a></li>\n                                        <li><a href=\"http://lastfm.com/user/akounet\">lastfm</a></li>\n                                        <li><a href=\"http://github.com/ametaireau\">github</a></li>\n                                </ul>\n                        </div><!-- /.social -->\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                <script type=\"text/javascript\">\n                        var disqus_shortname = 'blog-notmyidea';\n                        (function () {\n                                var s = document.createElement('script'); s.async = true;\n                                s.type = 'text/javascript';\n                                s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n                                (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n                        }());\n                </script>\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/theme/css/fonts.css",
    "content": "@font-face {\n    font-family: 'Yanone Kaffeesatz';\n    font-style: normal;\n    font-weight: 400;\n    src:\n    local('Yanone Kaffeesatz Regular'),\n    local('YanoneKaffeesatz-Regular'),\n\t\t/* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLRTHiN2BPBirwIkMLKUspj4.woff */\n    url('../fonts/Yanone_Kaffeesatz_400.woff') format('woff'),\n\t\t/* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLfGwxTS8d1Q9KiDNCMKLFUM.woff2 */\n    url('../fonts/Yanone_Kaffeesatz_400.woff2') format('woff2');\n}\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/theme/css/main.css",
    "content": "/*\n\tName: Smashing HTML5\n\tDate: July 2009\n\tDescription: Sample layout for HTML5 and CSS3 goodness.\n\tVersion: 1.0\n\tLicense: MIT <https://opensource.org/licenses/MIT>\n\tLicensed by: Smashing Media GmbH <https://www.smashingmagazine.com/>\n\tOriginal author: Enrique Ramírez <http://enrique-ramirez.com/>\n*/\n\n/* Imports */\n@import url(\"reset.css\");\n@import url(\"pygment.css\");\n@import url(\"typogrify.css\");\n@import url(\"fonts.css\");\n\n/***** Global *****/\n/* Body */\nbody {\n    background: #F5F4EF;\n    color: #000305;\n    font-size: 87.5%; /* Base font size: 14px */\n    font-family: 'Trebuchet MS', Trebuchet, 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif;\n    line-height: 1.429;\n    margin: 0;\n    padding: 0;\n    text-align: left;\n}\n\n@media (prefers-color-scheme: dark) {\n    body {\n        background: #070808;\n        color: #FFFEFE;\n    }\n}\n\n/* Headings */\nh1 {font-size: 2em }\nh2 {font-size: 1.571em}\t/* 22px */\nh3 {font-size: 1.429em}\t/* 20px */\nh4 {font-size: 1.286em}\t/* 18px */\nh5 {font-size: 1.143em}\t/* 16px */\nh6 {font-size: 1em}\t\t/* 14px */\n\nh1, h2, h3, h4, h5, h6 {\n    font-weight: 400;\n    line-height: 1.1;\n    margin-bottom: .8em;\n    font-family: 'Yanone Kaffeesatz', arial, serif;\n}\n\nh3, h4, h5, h6 { margin-top: .8em; }\n\nhr { border: 2px solid #EEEEEE; }\n\n/* Anchors */\na {outline: 0;}\na img {border: 0px; text-decoration: none;}\na:link, a:visited {\n    color: #C74350;\n    padding: 0 1px;\n    text-decoration: underline;\n}\na:hover, a:active {\n    background-color: #C74350;\n    color: #fff;\n    text-decoration: none;\n    text-shadow: 1px 1px 1px #333;\n}\n\nh1 a:hover {\n    background-color: inherit\n}\n\n/* Paragraphs */\ndiv.line-block,\np { margin-top: 1em;\n    margin-bottom: 1em;}\n\nstrong, b {font-weight: bold;}\nem, i {font-style: italic;}\n\n/* Lists */\nul {\n    list-style: outside disc;\n    margin: 0em 0 0 1.5em;\n}\n\nol {\n    list-style: outside decimal;\n    margin: 0em 0 0 1.5em;\n}\n\nli { margin-top: 0.5em;\n    margin-bottom: 1em; }\n\n.post-info {\n    float:right;\n    margin:10px;\n    padding:5px;\n}\n\n.post-info p{\n    margin-top: 1px;\n    margin-bottom: 1px;\n}\n\n.readmore { float: right }\n\ndl {margin: 0 0 1.5em 0;}\ndt {font-weight: bold;}\ndd {margin-left: 1.5em;}\n\npre{background-color:  rgb(238, 238, 238); padding: 10px; margin: 10px; overflow: auto;}\n\n@media (prefers-color-scheme: dark) {\n    pre {\n        background: rgb(38, 38, 38);\n    }\n}\n\n/* Quotes */\nblockquote {\n    margin: 20px;\n    font-style: italic;\n}\ncite {}\n\nq {}\n\ndiv.note {\n    float: right;\n    margin: 5px;\n    font-size: 85%;\n    max-width: 300px;\n}\n\n/* Tables */\ntable {margin: .5em auto 1.5em auto; width: 98%;}\n\n\t/* Thead */\nthead th {padding: .5em .4em; text-align: left;}\nthead td {}\n\n\t/* Tbody */\ntbody td {padding: .5em .4em;}\ntbody th {}\n\ntbody .alt td {}\ntbody .alt th {}\n\n\t/* Tfoot */\ntfoot th {}\ntfoot td {}\n\n/* HTML5 tags */\nheader, section, footer,\naside, nav, article, figure {\n    display: block;\n}\n\n/***** Layout *****/\n.body {clear: both; margin: 0 auto; max-width: 800px;}\nimg { max-width: 100%; }\nimg.right, figure.right, div.figure.align-right {\n    float: right;\n    margin: 0 0 2em 2em;\n}\nimg.left, figure.left, div.figure.align-left {\n    float: left;\n    margin: 0 2em 2em 0;\n}\n\n/* .rst support */\ndiv.figure img, figure img {  /* to fill figure exactly */\n    max-width: 100%;\n}\ndiv.figure p.caption, figure p.caption { /* margin provided by figure */\n    margin-top: 0;\n    margin-bottom: 0;\n}\n\n/*\n\tHeader\n*****************/\n#banner {\n    margin: 0 auto;\n    padding: 0.8em 0 0 0;\n}\n\n\t/* Banner */\n#banner h1 {\n    font-size: 3.571em;\n    line-height: 1.0;\n    margin-bottom: .3em;\n}\n\n#banner h1 a:link, #banner h1 a:visited {\n    color: #000305;\n    display: block;\n    font-weight: bold;\n    margin: 0 0 0 .2em;\n    text-decoration: none;\n}\n#banner h1 a:hover, #banner h1 a:active {\n    background: none;\n    color: #C74350;\n    text-shadow: none;\n}\n\n#banner h1 strong {font-size: 0.36em; font-weight: normal;}\n\n@media (prefers-color-scheme: dark) {\n    #banner h1 a:link, #banner h1 a:visited {\n        color: #FFFAF8;\n    }\n}\n\n\t/* Main Nav */\n#banner nav {\n    background: #000305;\n    font-size: 1.143em;\n    overflow: auto;\n    line-height: 30px;\n    margin: 0 auto 2em auto;\n    padding: 0;\n    text-align: center;\n    max-width: 800px;\n\n    border-radius: 5px;\n    -moz-border-radius: 5px;\n    -webkit-border-radius: 5px;\n}\n\n@media (prefers-color-scheme: dark) {\n    #banner nav {\n        background: #121518;\n    }\n}\n\n#banner nav ul {list-style: none; margin: 0 auto; max-width: 800px;}\n#banner nav li {float: left; display: inline; margin: 0;}\n\n#banner nav a:link, #banner nav a:visited {\n    color: #fff;\n    display: inline-block;\n    height: 30px;\n    padding: 5px 1.5em;\n    text-decoration: none;\n}\n#banner nav a:hover, #banner nav a:active,\n#banner nav .active a:link, #banner nav .active a:visited {\n    background: #C74451;\n    color: #fff;\n    text-shadow: none !important;\n}\n\n#banner nav li:first-child a {\n    border-top-left-radius: 5px;\n    -moz-border-radius-topleft: 5px;\n    -webkit-border-top-left-radius: 5px;\n\n    border-bottom-left-radius: 5px;\n    -moz-border-radius-bottomleft: 5px;\n    -webkit-border-bottom-left-radius: 5px;\n}\n\n/*\n\tFeatured\n*****************/\n#featured {\n    background: #fff;\n    margin-bottom: 2em;\n    overflow: hidden;\n    padding: 20px;\n    max-width: 760px;\n\n    border-radius: 10px;\n    -moz-border-radius: 10px;\n    -webkit-border-radius: 10px;\n}\n\n@media (prefers-color-scheme: dark) {\n    #featured {\n        background: #151617;\n    }\n}\n\n#featured figure {\n    border: 2px solid #eee;\n    float: right;\n    margin: 0.786em 2em 0 5em;\n    max-width: 248px;\n}\n#featured figure img {display: block; float: right;}\n\n#featured h2 {color: #C74451; font-size: 1.714em; margin-bottom: 0.333em;}\n#featured h3 {font-size: 1.429em; margin-bottom: .5em;}\n\n#featured h3 a:link, #featured h3 a:visited {color: #000305; text-decoration: none;}\n#featured h3 a:hover, #featured h3 a:active {color: #fff;}\n\n/*\n\tBody\n*****************/\n#content {\n    background: #fff;\n    margin-bottom: 2em;\n    overflow: hidden;\n    padding: 20px 20px;\n    max-width: 760px;\n\n    border-radius: 10px;\n    -moz-border-radius: 10px;\n    -webkit-border-radius: 10px;\n}\n\n@media (prefers-color-scheme: dark) {\n    #content {\n        background: #111;\n    }\n}\n\n/*\n\tExtras\n*****************/\n#extras {margin: 0 auto 3em auto; overflow: hidden;}\n\n#extras ul {list-style: none; margin: 0;}\n#extras li {border-bottom: 1px solid #fff;}\n#extras h2 {\n    color: #C74350;\n    font-size: 1.429em;\n    margin-bottom: .25em;\n    padding: 0 3px;\n}\n\n#extras a:link, #extras a:visited {\n    color: #444;\n    display: block;\n    border-bottom: 1px solid #F4E3E3;\n    text-decoration: none;\n    padding: .3em .25em;\n}\n\n@media (prefers-color-scheme: dark) {\n    #extras a:link, #extras a:visited {\n        color: #888;\n    }\n}\n\n#extras a:hover, #extras a:active {color: #fff;}\n\n\t/* Blogroll */\n#extras .blogroll {\n    float: left;\n    max-width: 615px;\n}\n\n#extras .blogroll li {float: left; margin: 0 20px 0 0; max-width: 185px;}\n\n\t/* Social */\n#extras .social {\n    float: right;\n    max-width: 175px;\n}\n\n/*\n\tAbout\n*****************/\n#about {\n    background: #fff;\n    font-style: normal;\n    margin-bottom: 2em;\n    overflow: hidden;\n    padding: 20px;\n    text-align: left;\n    max-width: 760px;\n\n    border-radius: 10px;\n    -moz-border-radius: 10px;\n    -webkit-border-radius: 10px;\n}\n\n@media (prefers-color-scheme: dark) {\n    #about {\n        background: #222;\n    }\n}\n\n#about .primary {float: left; max-width: 165px;}\n#about .primary strong {color: #C64350; display: block; font-size: 1.286em;}\n#about .photo {float: left; margin: 5px 20px;}\n\n#about .url:link, #about .url:visited {text-decoration: none;}\n\n#about .bio {float: right; max-width: 500px;}\n\n/*\n\tFooter\n*****************/\n#contentinfo {padding-bottom: 2em; text-align: right;}\n\n/***** Sections *****/\n/* Blog */\n.hentry {\n    display: block;\n    clear: both;\n    border-top: 1px solid #eee;\n    padding: 1.5em 0;\n}\nli:first-child .hentry, #content > .hentry {border: 0; margin: 0;}\n#content > .hentry {padding: 1em 0;}\n.hentry img{display : none ;}\n.entry-title {font-size: 3em; margin-bottom: 10px; margin-top: 0;}\n.entry-title a:link, .entry-title a:visited {text-decoration: none; color: #333;}\n.entry-title a:visited {background-color: #fff;}\n\n@media (prefers-color-scheme: dark) {\n    .entry-title a:link, .entry-title a:visited {\n        color: #C74350;\n    }\n}\n\n.hentry .post-info * {font-style: normal;}\n\n\t/* Content */\n.hentry footer {margin-bottom: 2em;}\n.hentry footer address {display: inline;}\n#posts-list footer address {display: block;}\n\n\t/* Blog Index */\n#posts-list {list-style: none; margin: 0;}\n#posts-list .hentry {padding-left: 10px; position: relative;}\n\n#posts-list footer {\n    left: 10px;\n    position: relative;\n    float: left;\n    top: 0.5em;\n    max-width: 190px;\n}\n\n\t/* About the Author */\n#about-author {\n    background: #f9f9f9;\n    clear: both;\n    font-style: normal;\n    margin: 2em 0;\n    padding: 10px 20px 15px 20px;\n\n    border-radius: 5px;\n    -moz-border-radius: 5px;\n    -webkit-border-radius: 5px;\n}\n\n#about-author strong {\n    color: #C64350;\n    clear: both;\n    display: block;\n    font-size: 1.429em;\n}\n\n#about-author .photo {border: 1px solid #ddd; float: left; margin: 5px 1em 0 0;}\n\n\t/* Comments */\n#comments-list {list-style: none; margin: 0 1em;}\n#comments-list blockquote {\n    background: #f8f8f8;\n    clear: both;\n    font-style: normal;\n    margin: 0;\n    padding: 15px 20px;\n\n    border-radius: 5px;\n    -moz-border-radius: 5px;\n    -webkit-border-radius: 5px;\n}\n#comments-list footer {color: #888; padding: .5em 1em 0 0; text-align: right;}\n\n#comments-list li:nth-child(2n) blockquote {background: #F5f5f5;}\n\n\t/* Add a Comment */\n#add-comment label {clear: left; float: left; text-align: left; max-width: 150px;}\n#add-comment input[type='text'],\n#add-comment input[type='email'],\n#add-comment input[type='url'] {float: left; max-width: 200px;}\n\n#add-comment textarea {float: left; height: 150px; max-width: 495px;}\n\n#add-comment p.req {clear: both; margin: 0 .5em 1em 0; text-align: right;}\n\n#add-comment input[type='submit'] {float: right; margin: 0 .5em;}\n#add-comment * {margin-bottom: .5em;}\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/theme/css/pygment.css",
    "content": ".hll {\n    background-color:#eee;\n}\n.c {\n    color:#408090;\n    font-style:italic;\n}\n.err {\n    border:1px solid #FF0000;\n}\n.k {\n    color:#007020;\n    font-weight:bold;\n}\n.o {\n    color:#666666;\n}\n.cm {\n    color:#408090;\n    font-style:italic;\n}\n.cp {\n    color:#007020;\n}\n.c1 {\n    color:#408090;\n    font-style:italic;\n}\n.cs {\n    background-color:#FFF0F0;\n    color:#408090;\n}\n.gd {\n    color:#A00000;\n}\n.ge {\n    font-style:italic;\n}\n.gr {\n    color:#FF0000;\n}\n.gh {\n    color:#000080;\n    font-weight:bold;\n}\n.gi {\n    color:#00A000;\n}\n.go {\n    color:#303030;\n}\n.gp {\n    color:#C65D09;\n    font-weight:bold;\n}\n.gs {\n    font-weight:bold;\n}\n.gu {\n    color:#800080;\n    font-weight:bold;\n}\n.gt {\n    color:#0040D0;\n}\n.kc {\n    color:#007020;\n    font-weight:bold;\n}\n.kd {\n    color:#007020;\n    font-weight:bold;\n}\n.kn {\n    color:#007020;\n    font-weight:bold;\n}\n.kp {\n    color:#007020;\n}\n.kr {\n    color:#007020;\n    font-weight:bold;\n}\n.kt {\n    color:#902000;\n}\n.m {\n    color:#208050;\n}\n.s {\n    color:#4070A0;\n}\n.na {\n    color:#4070A0;\n}\n.nb {\n    color:#007020;\n}\n.nc {\n    color:#0E84B5;\n    font-weight:bold;\n}\n.no {\n    color:#60ADD5;\n}\n.nd {\n    color:#555555;\n    font-weight:bold;\n}\n.ni {\n    color:#D55537;\n    font-weight:bold;\n}\n.ne {\n    color:#007020;\n}\n.nf {\n    color:#06287E;\n}\n.nl {\n    color:#002070;\n    font-weight:bold;\n}\n.nn {\n    color:#0E84B5;\n    font-weight:bold;\n}\n.nt {\n    color:#062873;\n    font-weight:bold;\n}\n.nv {\n    color:#BB60D5;\n}\n.ow {\n    color:#007020;\n    font-weight:bold;\n}\n.w {\n    color:#BBBBBB;\n}\n.mf {\n    color:#208050;\n}\n.mh {\n    color:#208050;\n}\n.mi {\n    color:#208050;\n}\n.mo {\n    color:#208050;\n}\n.sb {\n    color:#4070A0;\n}\n.sc {\n    color:#4070A0;\n}\n.sd {\n    color:#4070A0;\n    font-style:italic;\n}\n.s2 {\n    color:#4070A0;\n}\n.se {\n    color:#4070A0;\n    font-weight:bold;\n}\n.sh {\n    color:#4070A0;\n}\n.si {\n    color:#70A0D0;\n    font-style:italic;\n}\n.sx {\n    color:#C65D09;\n}\n.sr {\n    color:#235388;\n}\n.s1 {\n    color:#4070A0;\n}\n.ss {\n    color:#517918;\n}\n.bp {\n    color:#007020;\n}\n.vc {\n    color:#BB60D5;\n}\n.vg {\n    color:#BB60D5;\n}\n.vi {\n    color:#BB60D5;\n}\n.il {\n    color:#208050;\n}\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/theme/css/reset.css",
    "content": "/*\n\tName: Reset Stylesheet\n\tDescription: Resets browser's default CSS\n\tAuthor: Eric Meyer\n\tAuthor URI: https://meyerweb.com/eric/tools/css/reset/\n*/\n\n/* v1.0 | 20080212 */\nhtml, body, div, span, applet, object, iframe,\nh1, h2, h3, h4, h5, h6, p, blockquote, pre,\na, abbr, acronym, address, big, cite, code,\ndel, dfn, em, font, img, ins, kbd, q, s, samp,\nsmall, strike, strong, sub, sup, tt, var,\nb, u, i, center,\ndl, dt, dd, ol, ul, li,\nfieldset, form, label, legend,\ntable, caption, tbody, tfoot, thead, tr, th, td {\n    background: transparent;\n    border: 0;\n    font-size: 100%;\n    margin: 0;\n    outline: 0;\n    padding: 0;\n    vertical-align: baseline;\n}\n\nbody {line-height: 1;}\n\nol, ul {list-style: none;}\n\nblockquote, q {quotes: none;}\n\nblockquote:before, blockquote:after,\nq:before, q:after {\n    content: '';\n    content: none;\n}\n\n/* remember to define focus styles! */\n:focus {\n    outline: 0;\n}\n\n/* remember to highlight inserts somehow! */\nins {text-decoration: none;}\ndel {text-decoration: line-through;}\n\n/* tables still need 'cellspacing=\"0\"' in the markup */\ntable {\n    border-collapse: collapse;\n    border-spacing: 0;\n}\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/theme/css/typogrify.css",
    "content": ".caps {font-size:.92em;}\n.amp {color:#666; font-size:1.05em;font-family:\"Warnock Pro\", \"Goudy Old Style\",\"Palatino\",\"Book Antiqua\",serif; font-style:italic;}\n.dquo {margin-left:-.38em;}\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/theme/css/wide.css",
    "content": "@import url(\"main.css\");\n\nbody {\n    font:1.3em/1.3 \"Hoefler Text\",\"Georgia\",Georgia,serif,sans-serif;\n}\n\n.post-info{\n    display: none;\n}\n\n#banner nav {\n    display: none;\n    -moz-border-radius: 0px;\n    margin-bottom: 20px;\n    overflow: hidden;\n    font-size: 1em;\n    background: #F5F4EF;\n}\n\n#banner nav ul{\n    padding-right: 50px;\n}\n\n#banner nav li{\n    float: right;\n    color: #000;\n}\n\n#banner nav li a {\n    color: #000;\n}\n\n#banner h1 {\n    margin-bottom: -18px;\n}\n\n#featured, #extras {\n    padding: 50px;\n}\n\n#featured {\n    padding-top: 20px;\n}\n\n#extras {\n    padding-top: 0px;\n    padding-bottom: 0px;\n}\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/theme/fonts/Yanone_Kaffeesatz_LICENSE.txt",
    "content": "Copyright 2010 The Yanone Kaffeesatz Project Authors (https://github.com/alexeiva/yanone-kaffeesatz)\n\nThis Font Software is licensed under the SIL Open Font License, Version 1.1.\nThis license is copied below, and is also available with a FAQ at:\nhttp://scripts.sil.org/OFL\n\n\n-----------------------------------------------------------\nSIL OPEN FONT LICENSE Version 1.1 - 26 February 2007\n-----------------------------------------------------------\n\nPREAMBLE\nThe goals of the Open Font License (OFL) are to stimulate worldwide\ndevelopment of collaborative font projects, to support the font creation\nefforts of academic and linguistic communities, and to provide a free and\nopen framework in which fonts may be shared and improved in partnership\nwith others.\n\nThe OFL allows the licensed fonts to be used, studied, modified and\nredistributed freely as long as they are not sold by themselves. The\nfonts, including any derivative works, can be bundled, embedded,\nredistributed and/or sold with any software provided that any reserved\nnames are not used by derivative works. The fonts and derivatives,\nhowever, cannot be released under any other type of license. The\nrequirement for fonts to remain under this license does not apply\nto any document created using the fonts or their derivatives.\n\nDEFINITIONS\n\"Font Software\" refers to the set of files released by the Copyright\nHolder(s) under this license and clearly marked as such. This may\ninclude source files, build scripts and documentation.\n\n\"Reserved Font Name\" refers to any names specified as such after the\ncopyright statement(s).\n\n\"Original Version\" refers to the collection of Font Software components as\ndistributed by the Copyright Holder(s).\n\n\"Modified Version\" refers to any derivative made by adding to, deleting,\nor substituting -- in part or in whole -- any of the components of the\nOriginal Version, by changing formats or by porting the Font Software to a\nnew environment.\n\n\"Author\" refers to any designer, engineer, programmer, technical\nwriter or other person who contributed to the Font Software.\n\nPERMISSION & CONDITIONS\nPermission is hereby granted, free of charge, to any person obtaining\na copy of the Font Software, to use, study, copy, merge, embed, modify,\nredistribute, and sell modified and unmodified copies of the Font\nSoftware, subject to the following conditions:\n\n1) Neither the Font Software nor any of its individual components,\nin Original or Modified Versions, may be sold by itself.\n\n2) Original or Modified Versions of the Font Software may be bundled,\nredistributed and/or sold with any software, provided that each copy\ncontains the above copyright notice and this license. These can be\nincluded either as stand-alone text files, human-readable headers or\nin the appropriate machine-readable metadata fields within text or\nbinary files as long as those fields can be easily viewed by the user.\n\n3) No Modified Version of the Font Software may use the Reserved Font\nName(s) unless explicit written permission is granted by the corresponding\nCopyright Holder. This restriction only applies to the primary font name as\npresented to the users.\n\n4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font\nSoftware shall not be used to promote, endorse or advertise any\nModified Version, except to acknowledge the contribution(s) of the\nCopyright Holder(s) and the Author(s) or with their explicit written\npermission.\n\n5) The Font Software, modified or unmodified, in part or in whole,\nmust be distributed entirely under this license, and must not be\ndistributed under any other license. The requirement for fonts to\nremain under this license does not apply to any document created\nusing the Font Software.\n\nTERMINATION\nThis license becomes null and void if any of the above conditions are\nnot met.\n\nDISCLAIMER\nTHE FONT SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT\nOF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE\nCOPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nINCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL\nDAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM\nOTHER DEALINGS IN THE FONT SOFTWARE.\n"
  },
  {
    "path": "pelican/tests/output/custom_locale/theme/fonts/font.css",
    "content": "@font-face {\n    font-family: 'Yanone Kaffeesatz';\n    font-style: normal;\n    font-weight: 400;\n    src:\n    local('Yanone Kaffeesatz Regular'),\n    local('YanoneKaffeesatz-Regular'),\n\t\t/* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLRTHiN2BPBirwIkMLKUspj4.woff */\n    url('Yanone_Kaffeesatz_400.woff') format('woff'),\n\t\t/* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLfGwxTS8d1Q9KiDNCMKLFUM.woff2 */\n    url('Yanone_Kaffeesatz_400.woff2') format('woff2');\n}\n"
  },
  {
    "path": "pelican/tests/parse_error/parse_error.rst",
    "content": "Page with a parse error\n#############\n\nThe underline is too short.\n"
  },
  {
    "path": "pelican/tests/support.py",
    "content": "import locale\nimport logging\nimport os\nimport re\nimport subprocess\nimport sys\nimport unittest\nfrom contextlib import contextmanager\nfrom functools import wraps\nfrom io import StringIO\nfrom logging.handlers import BufferingHandler\nfrom shutil import rmtree\nfrom tempfile import mkdtemp\n\nfrom pelican.contents import Article\nfrom pelican.readers import default_metadata\nfrom pelican.settings import DEFAULT_CONFIG\n\n__all__ = [\n    \"get_article\",\n    \"unittest\",\n]\n\n\n@contextmanager\ndef temporary_folder():\n    \"\"\"creates a temporary folder, return it and delete it afterwards.\n\n    This allows to do something like this in tests:\n\n        >>> with temporary_folder() as d:\n            # do whatever you want\n    \"\"\"\n    tempdir = mkdtemp()\n    try:\n        yield tempdir\n    finally:\n        rmtree(tempdir)\n\n\ndef isplit(s, sep=None):\n    \"\"\"Behaves like str.split but returns a generator instead of a list.\n\n    >>> list(isplit('\\tUse the force\\n')) == '\\tUse the force\\n'.split()\n    True\n    >>> list(isplit('\\tUse the force\\n')) == ['Use', 'the', 'force']\n    True\n    >>> (list(isplit('\\tUse the force\\n', \"e\"))\n         == '\\tUse the force\\n'.split(\"e\"))\n    True\n    >>> list(isplit('Use the force', \"e\")) == 'Use the force'.split(\"e\")\n    True\n    >>> list(isplit('Use the force', \"e\")) == ['Us', ' th', ' forc', '']\n    True\n\n    \"\"\"\n    sep, hardsep = r\"\\s+\" if sep is None else re.escape(sep), sep is not None\n    exp, pos, length = re.compile(sep), 0, len(s)\n    while True:\n        m = exp.search(s, pos)\n        if not m:\n            if pos < length or hardsep:\n                #      ^ mimic \"split()\": ''.split() returns []\n                yield s[pos:]\n            break\n        start = m.start()\n        if pos < start or hardsep:\n            #           ^ mimic \"split()\": includes trailing empty string\n            yield s[pos:start]\n        pos = m.end()\n\n\ndef mute(returns_output=False):\n    \"\"\"Decorate a function that prints to stdout, intercepting the output.\n    If \"returns_output\" is True, the function will return a generator\n    yielding the printed lines instead of the return values.\n\n    The decorator literally hijack sys.stdout during each function\n    execution, so be careful with what you apply it to.\n\n    >>> def numbers():\n        print \"42\"\n        print \"1984\"\n    ...\n    >>> numbers()\n    42\n    1984\n    >>> mute()(numbers)()\n    >>> list(mute(True)(numbers)())\n    ['42', '1984']\n\n    \"\"\"\n\n    def decorator(func):\n        @wraps(func)\n        def wrapper(*args, **kwargs):\n            saved_stdout = sys.stdout\n            sys.stdout = StringIO()\n\n            try:\n                out = func(*args, **kwargs)\n                if returns_output:\n                    out = isplit(sys.stdout.getvalue().strip())\n            finally:\n                sys.stdout = saved_stdout\n\n            return out\n\n        return wrapper\n\n    return decorator\n\n\ndef get_article(title, content, **extra_metadata):\n    metadata = default_metadata(settings=DEFAULT_CONFIG)\n    metadata[\"title\"] = title\n    if extra_metadata:\n        metadata.update(extra_metadata)\n    return Article(content, metadata=metadata)\n\n\ndef skipIfNoExecutable(executable):\n    \"\"\"Skip test if `executable` is not found\n\n    Tries to run `executable` with subprocess to make sure it's in the path,\n    and skips the tests if not found (if subprocess raises a `OSError`).\n    \"\"\"\n\n    with open(os.devnull, \"w\") as fnull:\n        try:\n            res = subprocess.call(executable, stdout=fnull, stderr=fnull)\n        except OSError:\n            res = None\n\n    if res is None:\n        return unittest.skip(f\"{executable} executable not found\")\n\n    return lambda func: func\n\n\ndef module_exists(module_name):\n    \"\"\"Test if a module is importable.\"\"\"\n\n    try:\n        __import__(module_name)\n    except ImportError:\n        return False\n    else:\n        return True\n\n\ndef locale_available(locale_):\n    old_locale = locale.setlocale(locale.LC_TIME)\n\n    try:\n        locale.setlocale(locale.LC_TIME, str(locale_))\n    except locale.Error:\n        return False\n    else:\n        locale.setlocale(locale.LC_TIME, old_locale)\n        return True\n\n\ndef can_symlink():\n    res = True\n    try:\n        with temporary_folder() as f:\n            os.symlink(f, os.path.join(f, \"symlink\"))\n    except OSError:\n        res = False\n    return res\n\n\ndef get_settings(**kwargs):\n    \"\"\"Provide tweaked setting dictionaries for testing\n\n    Set keyword arguments to override specific settings.\n    \"\"\"\n    settings = DEFAULT_CONFIG.copy()\n    for key, value in kwargs.items():\n        settings[key] = value\n    return settings\n\n\ndef get_context(settings=None, **kwargs):\n    context = settings.copy() if settings else {}\n    context[\"generated_content\"] = {}\n    context[\"static_links\"] = set()\n    context[\"static_content\"] = {}\n    context.update(kwargs)\n    return context\n\n\nclass LogCountHandler(BufferingHandler):\n    \"\"\"Capturing and counting logged messages.\"\"\"\n\n    def __init__(self, capacity=1000):\n        super().__init__(capacity)\n\n    def count_logs(self, msg=None, level=None):\n        return len(\n            [\n                rec\n                for rec in self.buffer\n                if (msg is None or re.match(msg, rec.getMessage()))\n                and (level is None or rec.levelno == level)\n            ]\n        )\n\n    def count_formatted_logs(self, msg=None, level=None):\n        return len(\n            [\n                rec\n                for rec in self.buffer\n                if (msg is None or re.search(msg, self.format(rec)))\n                and (level is None or rec.levelno == level)\n            ]\n        )\n\n\ndef diff_subproc(first, second):\n    \"\"\"\n    Return a subprocess that runs a diff on the two paths.\n\n    Check results with::\n\n        >>> out_stream, err_stream = proc.communicate()\n        >>> didCheckFail = proc.returnCode != 0\n    \"\"\"\n    return subprocess.Popen(\n        [\n            \"git\",\n            \"--no-pager\",\n            \"diff\",\n            \"--no-ext-diff\",\n            \"--exit-code\",\n            \"-w\",\n            first,\n            second,\n        ],\n        stdout=subprocess.PIPE,\n        stderr=subprocess.PIPE,\n        encoding=\"utf-8\",\n    )\n\n\nclass LoggedTestCase(unittest.TestCase):\n    \"\"\"A test case that captures log messages.\"\"\"\n\n    def setUp(self):\n        super().setUp()\n        self._logcount_handler = LogCountHandler()\n        logging.getLogger().addHandler(self._logcount_handler)\n\n    def tearDown(self):\n        logging.getLogger().removeHandler(self._logcount_handler)\n        super().tearDown()\n\n    def assertLogCountEqual(self, count=None, msg=None, **kwargs):\n        actual = self._logcount_handler.count_logs(msg=msg, **kwargs)\n        self.assertEqual(\n            actual,\n            count,\n            msg=f\"expected {count} occurrences of {msg!r}, but found {actual}\",\n        )\n\n\nclass TestCaseWithCLocale(unittest.TestCase):\n    \"\"\"Set locale to C for each test case, then restore afterward.\n\n    Use utils.temporary_locale if you want a context manager (\"with\" statement).\n    \"\"\"\n\n    def setUp(self):\n        self.old_locale = locale.setlocale(locale.LC_ALL)\n        locale.setlocale(locale.LC_ALL, \"C\")\n\n    def tearDown(self):\n        locale.setlocale(locale.LC_ALL, self.old_locale)\n"
  },
  {
    "path": "pelican/tests/test_cache.py",
    "content": "import os\nfrom shutil import rmtree\nfrom tempfile import mkdtemp\nfrom unittest.mock import MagicMock\n\nfrom pelican.generators import ArticlesGenerator, PagesGenerator\nfrom pelican.tests.support import get_context, get_settings, unittest\n\nCUR_DIR = os.path.dirname(__file__)\nCONTENT_DIR = os.path.join(CUR_DIR, \"content\")\n\n\nclass TestCache(unittest.TestCase):\n    def setUp(self):\n        self.temp_cache = mkdtemp(prefix=\"pelican_cache.\")\n\n    def tearDown(self):\n        rmtree(self.temp_cache)\n\n    def _get_cache_enabled_settings(self):\n        settings = get_settings()\n        settings[\"CACHE_CONTENT\"] = True\n        settings[\"LOAD_CONTENT_CACHE\"] = True\n        settings[\"CACHE_PATH\"] = self.temp_cache\n        return settings\n\n    def test_generator_caching(self):\n        \"\"\"Test that cached and uncached content is same in generator level\"\"\"\n        settings = self._get_cache_enabled_settings()\n        settings[\"CONTENT_CACHING_LAYER\"] = \"generator\"\n        settings[\"PAGE_PATHS\"] = [\"TestPages\"]\n        settings[\"DEFAULT_DATE\"] = (1970, 1, 1)\n        settings[\"READERS\"] = {\"asc\": None}\n        context = get_context(settings)\n\n        def sorted_titles(items):\n            return sorted(item.title for item in items)\n\n        # Articles\n        generator = ArticlesGenerator(\n            context=context.copy(),\n            settings=settings,\n            path=CONTENT_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        generator.generate_context()\n        uncached_articles = sorted_titles(generator.articles)\n        uncached_drafts = sorted_titles(generator.drafts)\n\n        generator = ArticlesGenerator(\n            context=context.copy(),\n            settings=settings,\n            path=CONTENT_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        generator.generate_context()\n        cached_articles = sorted_titles(generator.articles)\n        cached_drafts = sorted_titles(generator.drafts)\n\n        self.assertEqual(uncached_articles, cached_articles)\n        self.assertEqual(uncached_drafts, cached_drafts)\n\n        # Pages\n        generator = PagesGenerator(\n            context=context.copy(),\n            settings=settings,\n            path=CUR_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        generator.generate_context()\n        uncached_pages = sorted_titles(generator.pages)\n        uncached_hidden_pages = sorted_titles(generator.hidden_pages)\n        uncached_draft_pages = sorted_titles(generator.draft_pages)\n\n        generator = PagesGenerator(\n            context=context.copy(),\n            settings=settings,\n            path=CUR_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        generator.generate_context()\n        cached_pages = sorted_titles(generator.pages)\n        cached_hidden_pages = sorted_titles(generator.hidden_pages)\n        cached_draft_pages = sorted_titles(generator.draft_pages)\n\n        self.assertEqual(uncached_pages, cached_pages)\n        self.assertEqual(uncached_hidden_pages, cached_hidden_pages)\n        self.assertEqual(uncached_draft_pages, cached_draft_pages)\n\n    def test_reader_caching(self):\n        \"\"\"Test that cached and uncached content is same in reader level\"\"\"\n        settings = self._get_cache_enabled_settings()\n        settings[\"CONTENT_CACHING_LAYER\"] = \"reader\"\n        settings[\"PAGE_PATHS\"] = [\"TestPages\"]\n        settings[\"DEFAULT_DATE\"] = (1970, 1, 1)\n        settings[\"READERS\"] = {\"asc\": None}\n        context = get_context(settings)\n\n        def sorted_titles(items):\n            return sorted(item.title for item in items)\n\n        # Articles\n        generator = ArticlesGenerator(\n            context=context.copy(),\n            settings=settings,\n            path=CONTENT_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        generator.generate_context()\n        uncached_articles = sorted_titles(generator.articles)\n        uncached_drafts = sorted_titles(generator.drafts)\n\n        generator = ArticlesGenerator(\n            context=context.copy(),\n            settings=settings,\n            path=CONTENT_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        generator.generate_context()\n        cached_articles = sorted_titles(generator.articles)\n        cached_drafts = sorted_titles(generator.drafts)\n\n        self.assertEqual(uncached_articles, cached_articles)\n        self.assertEqual(uncached_drafts, cached_drafts)\n\n        # Pages\n        generator = PagesGenerator(\n            context=context.copy(),\n            settings=settings,\n            path=CUR_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        generator.generate_context()\n        uncached_pages = sorted_titles(generator.pages)\n        uncached_hidden_pages = sorted_titles(generator.hidden_pages)\n\n        generator = PagesGenerator(\n            context=context.copy(),\n            settings=settings,\n            path=CUR_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        generator.generate_context()\n        cached_pages = sorted_titles(generator.pages)\n        cached_hidden_pages = sorted_titles(generator.hidden_pages)\n\n        self.assertEqual(uncached_pages, cached_pages)\n        self.assertEqual(uncached_hidden_pages, cached_hidden_pages)\n\n    def test_article_object_caching(self):\n        \"\"\"Test Article objects caching at the generator level\"\"\"\n        settings = self._get_cache_enabled_settings()\n        settings[\"CONTENT_CACHING_LAYER\"] = \"generator\"\n        settings[\"DEFAULT_DATE\"] = (1970, 1, 1)\n        settings[\"READERS\"] = {\"asc\": None}\n        context = get_context(settings)\n\n        generator = ArticlesGenerator(\n            context=context.copy(),\n            settings=settings,\n            path=CONTENT_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        generator.generate_context()\n        self.assertTrue(hasattr(generator, \"_cache\"))\n\n        generator = ArticlesGenerator(\n            context=context.copy(),\n            settings=settings,\n            path=CONTENT_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        generator.readers.read_file = MagicMock()\n        generator.generate_context()\n        \"\"\"\n        7 files don't get cached because they were not valid\n        - article_with_attributes_containing_double_quotes.html\n        - article_with_comments.html\n        - article_with_null_attributes.html\n        - 2012-11-30_md_w_filename_meta#foo-bar.md\n        - empty.md\n        - empty_with_bom.md\n        - article_skip.md\n        \"\"\"\n        self.assertEqual(generator.readers.read_file.call_count, 7)\n\n    def test_article_reader_content_caching(self):\n        \"\"\"Test raw article content caching at the reader level\"\"\"\n        settings = self._get_cache_enabled_settings()\n        settings[\"READERS\"] = {\"asc\": None}\n        context = get_context(settings)\n\n        generator = ArticlesGenerator(\n            context=context.copy(),\n            settings=settings,\n            path=CONTENT_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        generator.generate_context()\n        self.assertTrue(hasattr(generator.readers, \"_cache\"))\n\n        generator = ArticlesGenerator(\n            context=context.copy(),\n            settings=settings,\n            path=CONTENT_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        readers = generator.readers.readers\n        for reader in readers.values():\n            reader.read = MagicMock()\n        generator.generate_context()\n        for reader in readers.values():\n            self.assertEqual(reader.read.call_count, 0)\n\n    def test_article_ignore_cache(self):\n        \"\"\"Test that all the articles are read again when not loading cache\n\n        used in --ignore-cache or autoreload mode\"\"\"\n        settings = self._get_cache_enabled_settings()\n        settings[\"READERS\"] = {\"asc\": None}\n        context = get_context(settings)\n\n        generator = ArticlesGenerator(\n            context=context.copy(),\n            settings=settings,\n            path=CONTENT_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        generator.readers.read_file = MagicMock()\n        generator.generate_context()\n        self.assertTrue(hasattr(generator, \"_cache_open\"))\n        orig_call_count = generator.readers.read_file.call_count\n\n        settings[\"LOAD_CONTENT_CACHE\"] = False\n        generator = ArticlesGenerator(\n            context=context.copy(),\n            settings=settings,\n            path=CONTENT_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        generator.readers.read_file = MagicMock()\n        generator.generate_context()\n        self.assertEqual(generator.readers.read_file.call_count, orig_call_count)\n\n    def test_page_object_caching(self):\n        \"\"\"Test Page objects caching at the generator level\"\"\"\n        settings = self._get_cache_enabled_settings()\n        settings[\"CONTENT_CACHING_LAYER\"] = \"generator\"\n        settings[\"PAGE_PATHS\"] = [\"TestPages\"]\n        settings[\"READERS\"] = {\"asc\": None}\n        context = get_context(settings)\n\n        generator = PagesGenerator(\n            context=context.copy(),\n            settings=settings,\n            path=CUR_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        generator.generate_context()\n        self.assertTrue(hasattr(generator, \"_cache\"))\n\n        generator = PagesGenerator(\n            context=context.copy(),\n            settings=settings,\n            path=CUR_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        generator.readers.read_file = MagicMock()\n        generator.generate_context()\n        \"\"\"\n        1 File doesn't get cached because it was not valid\n        - bad_page.rst\n        \"\"\"\n        self.assertEqual(generator.readers.read_file.call_count, 1)\n\n    def test_page_reader_content_caching(self):\n        \"\"\"Test raw page content caching at the reader level\"\"\"\n        settings = self._get_cache_enabled_settings()\n        settings[\"PAGE_PATHS\"] = [\"TestPages\"]\n        settings[\"READERS\"] = {\"asc\": None}\n        context = get_context(settings)\n\n        generator = PagesGenerator(\n            context=context.copy(),\n            settings=settings,\n            path=CUR_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        generator.generate_context()\n        self.assertTrue(hasattr(generator.readers, \"_cache\"))\n\n        generator = PagesGenerator(\n            context=context.copy(),\n            settings=settings,\n            path=CUR_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        readers = generator.readers.readers\n        for reader in readers.values():\n            reader.read = MagicMock()\n        generator.generate_context()\n        for reader in readers.values():\n            self.assertEqual(reader.read.call_count, 0)\n\n    def test_page_ignore_cache(self):\n        \"\"\"Test that all the pages are read again when not loading cache\n\n        used in --ignore_cache or autoreload mode\"\"\"\n        settings = self._get_cache_enabled_settings()\n        settings[\"PAGE_PATHS\"] = [\"TestPages\"]\n        settings[\"READERS\"] = {\"asc\": None}\n        context = get_context(settings)\n\n        generator = PagesGenerator(\n            context=context.copy(),\n            settings=settings,\n            path=CUR_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        generator.readers.read_file = MagicMock()\n        generator.generate_context()\n        self.assertTrue(hasattr(generator, \"_cache_open\"))\n        orig_call_count = generator.readers.read_file.call_count\n\n        settings[\"LOAD_CONTENT_CACHE\"] = False\n        generator = PagesGenerator(\n            context=context.copy(),\n            settings=settings,\n            path=CUR_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        generator.readers.read_file = MagicMock()\n        generator.generate_context()\n        self.assertEqual(generator.readers.read_file.call_count, orig_call_count)\n"
  },
  {
    "path": "pelican/tests/test_cli.py",
    "content": "import unittest\n\nfrom pelican import get_config, parse_arguments\n\n\nclass TestParseOverrides(unittest.TestCase):\n    def test_flags(self):\n        for flag in [\"-e\", \"--extra-settings\"]:\n            args = parse_arguments([flag, \"k=1\"])\n            self.assertDictEqual(args.overrides, {\"k\": 1})\n\n    def test_parse_multiple_items(self):\n        args = parse_arguments(\"-e k1=1 k2=2\".split())\n        self.assertDictEqual(args.overrides, {\"k1\": 1, \"k2\": 2})\n\n    def test_parse_valid_json(self):\n        json_values_python_values_map = {\n            '\"\"': \"\",\n            \"null\": None,\n            '\"string\"': \"string\",\n            '[\"foo\", 12, \"4\", {}]': [\"foo\", 12, \"4\", {}],\n        }\n        for k, v in json_values_python_values_map.items():\n            args = parse_arguments([\"-e\", \"k=\" + k])\n            self.assertDictEqual(args.overrides, {\"k\": v})\n\n    def test_parse_invalid_syntax(self):\n        invalid_items = [\"k= 1\", \"k =1\", \"k\", \"k v\"]\n        for item in invalid_items:\n            with self.assertRaises(ValueError):\n                parse_arguments(f\"-e {item}\".split())\n\n    def test_parse_invalid_json(self):\n        invalid_json = {\n            \"\",\n            \"False\",\n            \"True\",\n            \"None\",\n            \"some other string\",\n            '{\"foo\": bar}',\n            \"[foo]\",\n        }\n        for v in invalid_json:\n            with self.assertRaises(ValueError):\n                parse_arguments([\"-e \", \"k=\" + v])\n\n\nclass TestGetConfigFromArgs(unittest.TestCase):\n    def test_overrides_known_keys(self):\n        args = parse_arguments(\n            [\n                \"-e\",\n                \"DELETE_OUTPUT_DIRECTORY=false\",\n                'OUTPUT_RETENTION=[\"1.txt\"]',\n                'SITENAME=\"Title\"',\n            ]\n        )\n        config = get_config(args)\n        config_must_contain = {\n            \"DELETE_OUTPUT_DIRECTORY\": False,\n            \"OUTPUT_RETENTION\": [\"1.txt\"],\n            \"SITENAME\": \"Title\",\n        }\n        self.assertDictEqual(config, {**config, **config_must_contain})\n\n    def test_overrides_non_default_type(self):\n        args = parse_arguments(\n            [\n                \"-e\",\n                \"DISPLAY_PAGES_ON_MENU=123\",\n                \"PAGE_TRANSLATION_ID=null\",\n                'TRANSLATION_FEED_RSS_URL=\"someurl\"',\n            ]\n        )\n        config = get_config(args)\n        config_must_contain = {\n            \"DISPLAY_PAGES_ON_MENU\": 123,\n            \"PAGE_TRANSLATION_ID\": None,\n            \"TRANSLATION_FEED_RSS_URL\": \"someurl\",\n        }\n        self.assertDictEqual(config, {**config, **config_must_contain})\n"
  },
  {
    "path": "pelican/tests/test_contents.py",
    "content": "import datetime\nimport locale\nimport logging\nimport os.path\nfrom posixpath import join as posix_join\nfrom sys import platform\n\nfrom jinja2.utils import generate_lorem_ipsum\n\nfrom pelican.contents import Article, Author, Category, Page, Static, logger\nfrom pelican.plugins.signals import content_object_init\nfrom pelican.settings import DEFAULT_CONFIG\nfrom pelican.tests.support import LoggedTestCase, get_context, get_settings, unittest\nfrom pelican.utils import path_to_url, posixize_path, truncate_html_words\n\n# generate 3 test paragraphs, each enclosed with <p>\n# save the first paragraph separately for testing the summary generation algorithm\n# NOTE: these values are nondeterministic between test runs\nTEST_CONTENT_FIRST_PARAGRAPH = str(generate_lorem_ipsum(n=1))\nTEST_CONTENT_REMAINING_PARAGRAPHS = str(generate_lorem_ipsum(n=2))\nTEST_CONTENT = TEST_CONTENT_FIRST_PARAGRAPH + TEST_CONTENT_REMAINING_PARAGRAPHS\nTEST_SUMMARY = generate_lorem_ipsum(n=1, html=False)\n\n\nclass TestBase(LoggedTestCase):\n    def setUp(self):\n        super().setUp()\n        self.old_locale = locale.setlocale(locale.LC_ALL)\n        locale.setlocale(locale.LC_ALL, \"C\")\n        self.page_kwargs = {\n            \"content\": TEST_CONTENT,\n            \"context\": {\n                \"localsiteurl\": \"\",\n                \"generated_content\": {},\n                \"static_content\": {},\n                \"static_links\": set(),\n            },\n            \"metadata\": {\n                \"summary\": TEST_SUMMARY,\n                \"title\": \"foo bar\",\n                \"author\": Author(\"Blogger\", DEFAULT_CONFIG),\n            },\n            \"source_path\": \"/path/to/file/foo.ext\",\n        }\n        self._disable_limit_filter()\n\n    def tearDown(self):\n        locale.setlocale(locale.LC_ALL, self.old_locale)\n        self._enable_limit_filter()\n\n    def _disable_limit_filter(self):\n        logger.disable_filter()\n\n    def _enable_limit_filter(self):\n        logger.enable_filter()\n\n    def _copy_page_kwargs(self):\n        # copy page_kwargs\n        page_kwargs = dict(self.page_kwargs)\n        for key, val in page_kwargs.items():\n            if not isinstance(val, dict):\n                break\n            page_kwargs[key] = {subkey: val[subkey] for subkey in val}\n\n        return page_kwargs\n\n\nclass TestPage(TestBase):\n    def test_use_args(self):\n        # Creating a page with arguments passed to the constructor should use\n        # them to initialise object's attributes.\n        metadata = {\n            \"foo\": \"bar\",\n            \"foobar\": \"baz\",\n            \"title\": \"foobar\",\n        }\n        page = Page(TEST_CONTENT, metadata=metadata, context={\"localsiteurl\": \"\"})\n        for key, value in metadata.items():\n            self.assertTrue(hasattr(page, key))\n            self.assertEqual(value, getattr(page, key))\n        self.assertEqual(page.content, TEST_CONTENT)\n\n    def test_mandatory_properties(self):\n        # If the title is not set, must throw an exception.\n        page = Page(\"content\")\n        self.assertFalse(page._has_valid_mandatory_properties())\n        self.assertLogCountEqual(\n            count=1,\n            msg=\"Skipping .*: could not find information about 'title'\",\n            level=logging.ERROR,\n        )\n        page = Page(\"content\", metadata={\"title\": \"foobar\"})\n        self.assertTrue(page._has_valid_mandatory_properties())\n\n    def test_summary_from_metadata(self):\n        # If a :summary: metadata is given, it should be used\n        page = Page(**self.page_kwargs)\n        self.assertEqual(page.summary, TEST_SUMMARY)\n\n    def test_summary_max_length(self):\n        # If a :SUMMARY_MAX_LENGTH: is set, and there is no other summary,\n        # generated summary should not exceed the given length.\n        page_kwargs = self._copy_page_kwargs()\n        settings = get_settings()\n        page_kwargs[\"settings\"] = settings\n        del page_kwargs[\"metadata\"][\"summary\"]\n        settings[\"SUMMARY_MAX_LENGTH\"] = None\n        page = Page(**page_kwargs)\n        self.assertEqual(page.summary, TEST_CONTENT)\n        settings[\"SUMMARY_MAX_LENGTH\"] = 10\n        page = Page(**page_kwargs)\n        self.assertEqual(page.summary, truncate_html_words(TEST_CONTENT, 10))\n        settings[\"SUMMARY_MAX_LENGTH\"] = 0\n        page = Page(**page_kwargs)\n        self.assertEqual(page.summary, \"\")\n\n    def test_summary_paragraph(self):\n        # If SUMMARY_MAX_PARAGRAPHS is set, the generated summary should\n        # not exceed the given paragraph count.\n        page_kwargs = self._copy_page_kwargs()\n        settings = get_settings()\n        page_kwargs[\"settings\"] = settings\n        del page_kwargs[\"metadata\"][\"summary\"]\n        settings[\"SUMMARY_MAX_PARAGRAPHS\"] = 1\n        settings[\"SUMMARY_MAX_LENGTH\"] = None\n        page = Page(**page_kwargs)\n        self.assertEqual(page.summary, TEST_CONTENT_FIRST_PARAGRAPH)\n\n    def test_summary_paragraph_max_length(self):\n        # If both SUMMARY_MAX_PARAGRAPHS and SUMMARY_MAX_LENGTH are set,\n        # the generated summary should not exceed the given paragraph count and\n        # not exceed the given length.\n        page_kwargs = self._copy_page_kwargs()\n        settings = get_settings()\n        page_kwargs[\"settings\"] = settings\n        del page_kwargs[\"metadata\"][\"summary\"]\n        settings[\"SUMMARY_MAX_PARAGRAPHS\"] = 1\n        settings[\"SUMMARY_MAX_LENGTH\"] = 10\n        page = Page(**page_kwargs)\n        self.assertEqual(\n            page.summary, truncate_html_words(TEST_CONTENT_FIRST_PARAGRAPH, 10)\n        )\n\n    def test_summary_paragraph_long_max_length(self):\n        # If both SUMMARY_MAX_PARAGRAPHS and SUMMARY_MAX_LENGTH are set,\n        # and the first SUMMARY_MAX_PARAGRAPHS paragraphs have fewer words\n        # than SUMMARY_MAX_LENGTH, the generated summary should still only\n        # contain the given number of paragraphs.\n        page_kwargs = self._copy_page_kwargs()\n        settings = get_settings()\n        page_kwargs[\"settings\"] = settings\n        del page_kwargs[\"metadata\"][\"summary\"]\n        settings[\"SUMMARY_MAX_PARAGRAPHS\"] = 1\n        settings[\"SUMMARY_MAX_LENGTH\"] = 50\n        page = Page(**page_kwargs)\n        self.assertEqual(\n            page.summary, truncate_html_words(TEST_CONTENT_FIRST_PARAGRAPH, 50)\n        )\n\n    def test_summary_end_suffix(self):\n        # If a :SUMMARY_END_SUFFIX: is set, and there is no other summary,\n        # generated summary should contain the specified marker at the end.\n        page_kwargs = self._copy_page_kwargs()\n        settings = get_settings()\n        page_kwargs[\"settings\"] = settings\n        del page_kwargs[\"metadata\"][\"summary\"]\n        settings[\"SUMMARY_END_SUFFIX\"] = \"test_marker\"\n        settings[\"SUMMARY_MAX_LENGTH\"] = 10\n        page = Page(**page_kwargs)\n        self.assertEqual(\n            page.summary, truncate_html_words(TEST_CONTENT, 10, \"test_marker\")\n        )\n        self.assertIn(\"test_marker\", page.summary)\n\n    def test_summary_get_summary_warning(self):\n        \"\"\"calling ._get_summary() should issue a warning\"\"\"\n        page_kwargs = self._copy_page_kwargs()\n        page = Page(**page_kwargs)\n        self.assertEqual(page.summary, TEST_SUMMARY)\n        self.assertEqual(page._get_summary(), TEST_SUMMARY)\n        self.assertLogCountEqual(\n            count=1,\n            msg=r\"_get_summary\\(\\) has been deprecated since 3\\.6\\.4\\. \"\n            \"Use the summary decorator instead\",\n            level=logging.WARNING,\n        )\n\n    def test_slug(self):\n        page_kwargs = self._copy_page_kwargs()\n        settings = get_settings()\n        page_kwargs[\"settings\"] = settings\n        settings[\"SLUGIFY_SOURCE\"] = \"title\"\n        page = Page(**page_kwargs)\n        self.assertEqual(page.slug, \"foo-bar\")\n        settings[\"SLUGIFY_SOURCE\"] = \"basename\"\n        page = Page(**page_kwargs)\n        self.assertEqual(page.slug, \"foo\")\n\n        # test slug from title with unicode and case\n\n        inputs = (\n            # (title, expected, preserve_case, use_unicode)\n            (\"指導書\", \"zhi-dao-shu\", False, False),\n            (\"指導書\", \"Zhi-Dao-Shu\", True, False),\n            (\"指導書\", \"指導書\", False, True),\n            (\"指導書\", \"指導書\", True, True),\n            (\"Çığ\", \"cig\", False, False),\n            (\"Çığ\", \"Cig\", True, False),\n            (\"Çığ\", \"çığ\", False, True),\n            (\"Çığ\", \"Çığ\", True, True),\n        )\n\n        settings = get_settings()\n        page_kwargs = self._copy_page_kwargs()\n        page_kwargs[\"settings\"] = settings\n\n        for title, expected, preserve_case, use_unicode in inputs:\n            settings[\"SLUGIFY_PRESERVE_CASE\"] = preserve_case\n            settings[\"SLUGIFY_USE_UNICODE\"] = use_unicode\n            page_kwargs[\"metadata\"][\"title\"] = title\n            page = Page(**page_kwargs)\n            self.assertEqual(page.slug, expected, (title, preserve_case, use_unicode))\n\n    def test_defaultlang(self):\n        # If no lang is given, default to the default one.\n        page = Page(**self.page_kwargs)\n        self.assertEqual(page.lang, DEFAULT_CONFIG[\"DEFAULT_LANG\"])\n\n        # it is possible to specify the lang in the metadata infos\n        self.page_kwargs[\"metadata\"].update(\n            {\n                \"lang\": \"fr\",\n            }\n        )\n        page = Page(**self.page_kwargs)\n        self.assertEqual(page.lang, \"fr\")\n\n    def test_save_as(self):\n        # If a lang is not the default lang, save_as should be set\n        # accordingly.\n\n        # if a title is defined, save_as should be set\n        page = Page(**self.page_kwargs)\n        self.assertEqual(page.save_as, \"pages/foo-bar.html\")\n\n        # if a language is defined, save_as should include it accordingly\n        self.page_kwargs[\"metadata\"].update(\n            {\n                \"lang\": \"fr\",\n            }\n        )\n        page = Page(**self.page_kwargs)\n        self.assertEqual(page.save_as, \"pages/foo-bar-fr.html\")\n\n    def test_relative_source_path(self):\n        # 'relative_source_path' should be the relative path\n        # from 'PATH' to 'source_path'\n        page_kwargs = self._copy_page_kwargs()\n\n        # If 'source_path' is None, 'relative_source_path' should\n        # also return None\n        page_kwargs[\"source_path\"] = None\n        page = Page(**page_kwargs)\n        self.assertIsNone(page.relative_source_path)\n\n        page_kwargs = self._copy_page_kwargs()\n        settings = get_settings()\n        full_path = page_kwargs[\"source_path\"]\n\n        settings[\"PATH\"] = os.path.dirname(full_path)\n        page_kwargs[\"settings\"] = settings\n        page = Page(**page_kwargs)\n\n        # if 'source_path' is set, 'relative_source_path' should\n        # return the relative path from 'PATH' to 'source_path'\n        self.assertEqual(\n            page.relative_source_path,\n            os.path.relpath(full_path, os.path.dirname(full_path)),\n        )\n\n    def test_metadata_url_format(self):\n        # Arbitrary metadata should be passed through url_format()\n        page = Page(**self.page_kwargs)\n        self.assertIn(\"summary\", page.url_format.keys())\n        page.metadata[\"directory\"] = \"test-dir\"\n        page.settings = get_settings(PAGE_SAVE_AS=\"{directory}/{slug}\")\n        self.assertEqual(page.save_as, \"test-dir/foo-bar\")\n\n    def test_datetime(self):\n        # If DATETIME is set to a tuple, it should be used to override LOCALE\n        dt = datetime.datetime(2015, 9, 13)\n\n        page_kwargs = self._copy_page_kwargs()\n\n        # set its date to dt\n        page_kwargs[\"metadata\"][\"date\"] = dt\n        page = Page(**page_kwargs)\n\n        # page.locale_date is a unicode string in both python2 and python3\n        dt_date = dt.strftime(DEFAULT_CONFIG[\"DEFAULT_DATE_FORMAT\"])\n\n        self.assertEqual(page.locale_date, dt_date)\n        page_kwargs[\"settings\"] = get_settings()\n\n        # I doubt this can work on all platforms ...\n        if platform == \"win32\":\n            the_locale = \"jpn\"\n        else:\n            the_locale = \"ja_JP.utf8\"\n        page_kwargs[\"settings\"][\"DATE_FORMATS\"] = {\"jp\": (the_locale, \"%Y-%m-%d(%a)\")}\n        page_kwargs[\"metadata\"][\"lang\"] = \"jp\"\n\n        try:\n            page = Page(**page_kwargs)\n            self.assertEqual(page.locale_date, \"2015-09-13(\\u65e5)\")\n        except locale.Error:\n            # The constructor of ``Page`` will try to set the locale to\n            # ``ja_JP.utf8``. But this attempt will failed when there is no\n            # such locale in the system. You can see which locales there are\n            # in your system with ``locale -a`` command.\n            #\n            # Until we find some other method to test this functionality, we\n            # will simply skip this test.\n            unittest.skip(f\"There is no locale {the_locale} in this system.\")\n\n    def test_template(self):\n        # Pages default to page, metadata overwrites\n        default_page = Page(**self.page_kwargs)\n        self.assertEqual(\"page\", default_page.template)\n        page_kwargs = self._copy_page_kwargs()\n        page_kwargs[\"metadata\"][\"template\"] = \"custom\"\n        custom_page = Page(**page_kwargs)\n        self.assertEqual(\"custom\", custom_page.template)\n\n    def test_signal(self):\n        def receiver_test_function(_sender):\n            receiver_test_function.has_been_called = True\n\n        receiver_test_function.has_been_called = False\n\n        content_object_init.connect(receiver_test_function)\n        self.assertIn(receiver_test_function, content_object_init.receivers_for(Page))\n\n        self.assertFalse(receiver_test_function.has_been_called)\n        Page(**self.page_kwargs)\n        self.assertTrue(receiver_test_function.has_been_called)\n\n    def test_get_content(self):\n        # Test that the content is updated with the relative links to\n        # filenames, tags and categories.\n        settings = get_settings()\n        args = self.page_kwargs.copy()\n        args[\"settings\"] = settings\n\n        # Tag\n        args[\"content\"] = 'A simple test, with a <a href=\"|tag|tagname\">link</a>'\n        page = Page(**args)\n        content = page.get_content(\"http://notmyidea.org\")\n        self.assertEqual(\n            content,\n            (\n                \"A simple test, with a \"\n                '<a href=\"http://notmyidea.org/tag/tagname.html\">link</a>'\n            ),\n        )\n\n        # Category\n        args[\"content\"] = 'A simple test, with a <a href=\"|category|category\">link</a>'\n        page = Page(**args)\n        content = page.get_content(\"http://notmyidea.org\")\n        self.assertEqual(\n            content,\n            (\n                \"A simple test, with a \"\n                '<a href=\"http://notmyidea.org/category/category.html\">link</a>'\n            ),\n        )\n\n    def test_intrasite_link(self):\n        cls_name = \"_DummyArticle\"\n        article = type(cls_name, (object,), {\"url\": \"article.html\"})\n\n        args = self.page_kwargs.copy()\n        args[\"settings\"] = get_settings()\n        args[\"source_path\"] = \"content\"\n        args[\"context\"][\"generated_content\"] = {\"article.rst\": article}\n\n        # Classic intrasite link via filename\n        args[\"content\"] = (\n            'A simple test, with a <a href=\"|filename|article.rst\">link</a>'\n        )\n        content = Page(**args).get_content(\"http://notmyidea.org\")\n        self.assertEqual(\n            content,\n            \"A simple test, with a \"\n            '<a href=\"http://notmyidea.org/article.html\">link</a>',\n        )\n\n        # fragment\n        args[\"content\"] = (\n            'A simple test, with a <a href=\"|filename|article.rst#section-2\">link</a>'\n        )\n        content = Page(**args).get_content(\"http://notmyidea.org\")\n        self.assertEqual(\n            content,\n            \"A simple test, with a \"\n            '<a href=\"http://notmyidea.org/article.html#section-2\">link</a>',\n        )\n\n        # query\n        args[\"content\"] = (\n            \"A simple test, with a \"\n            '<a href=\"|filename|article.rst'\n            '?utm_whatever=234&highlight=word\">link</a>'\n        )\n        content = Page(**args).get_content(\"http://notmyidea.org\")\n        self.assertEqual(\n            content,\n            \"A simple test, with a \"\n            '<a href=\"http://notmyidea.org/article.html'\n            '?utm_whatever=234&highlight=word\">link</a>',\n        )\n\n        # combination\n        args[\"content\"] = (\n            \"A simple test, with a \"\n            '<a href=\"|filename|article.rst'\n            '?utm_whatever=234&highlight=word#section-2\">link</a>'\n        )\n        content = Page(**args).get_content(\"http://notmyidea.org\")\n        self.assertEqual(\n            content,\n            \"A simple test, with a \"\n            '<a href=\"http://notmyidea.org/article.html'\n            '?utm_whatever=234&highlight=word#section-2\">link</a>',\n        )\n\n        # also test for summary in metadata\n        parsed = (\n            'A simple summary test, with a <a href=\"|filename|article.rst\">link</a>'\n        )\n        linked = (\n            \"A simple summary test, with a \"\n            '<a href=\"http://notmyidea.org/article.html\">link</a>'\n        )\n        args[\"settings\"][\"FORMATTED_FIELDS\"] = [\"summary\", \"custom\"]\n        args[\"metadata\"][\"summary\"] = parsed\n        args[\"metadata\"][\"custom\"] = parsed\n        args[\"context\"][\"localsiteurl\"] = \"http://notmyidea.org\"\n        p = Page(**args)\n        # This is called implicitly from all generators and Pelican.run() once\n        # all files are processed. Here we process just one page so it needs\n        # to be called explicitly.\n        p.refresh_metadata_intersite_links()\n        self.assertEqual(p.summary, linked)\n        self.assertEqual(p.custom, linked)\n\n    def test_intrasite_link_more(self):\n        cls_name = \"_DummyAsset\"\n\n        args = self.page_kwargs.copy()\n        args[\"settings\"] = get_settings()\n        args[\"source_path\"] = \"content\"\n        args[\"context\"][\"static_content\"] = {\n            \"images/poster.jpg\": type(\n                cls_name, (object,), {\"url\": \"images/poster.jpg\"}\n            ),\n            \"assets/video.mp4\": type(cls_name, (object,), {\"url\": \"assets/video.mp4\"}),\n            \"images/graph.svg\": type(cls_name, (object,), {\"url\": \"images/graph.svg\"}),\n        }\n        args[\"context\"][\"generated_content\"] = {\n            \"reference.rst\": type(cls_name, (object,), {\"url\": \"reference.html\"}),\n        }\n\n        # video.poster\n        args[\"content\"] = (\n            \"There is a video with poster \"\n            '<video controls poster=\"{static}/images/poster.jpg\">'\n            '<source src=\"|static|/assets/video.mp4\" type=\"video/mp4\">'\n            \"</video>\"\n        )\n        content = Page(**args).get_content(\"http://notmyidea.org\")\n        self.assertEqual(\n            content,\n            \"There is a video with poster \"\n            '<video controls poster=\"http://notmyidea.org/images/poster.jpg\">'\n            '<source src=\"http://notmyidea.org/assets/video.mp4\"'\n            ' type=\"video/mp4\">'\n            \"</video>\",\n        )\n\n        # object.data\n        args[\"content\"] = (\n            \"There is a svg object \"\n            '<object data=\"{static}/images/graph.svg\"'\n            ' type=\"image/svg+xml\">'\n            \"</object>\"\n        )\n        content = Page(**args).get_content(\"http://notmyidea.org\")\n        self.assertEqual(\n            content,\n            \"There is a svg object \"\n            '<object data=\"http://notmyidea.org/images/graph.svg\"'\n            ' type=\"image/svg+xml\">'\n            \"</object>\",\n        )\n\n        # blockquote.cite\n        args[\"content\"] = (\n            \"There is a blockquote with cite attribute \"\n            '<blockquote cite=\"{filename}reference.rst\">blah blah</blockquote>'\n        )\n        content = Page(**args).get_content(\"http://notmyidea.org\")\n        self.assertEqual(\n            content,\n            \"There is a blockquote with cite attribute \"\n            '<blockquote cite=\"http://notmyidea.org/reference.html\">'\n            \"blah blah\"\n            \"</blockquote>\",\n        )\n\n    def test_intrasite_link_absolute(self):\n        \"\"\"Test that absolute URLs are merged properly.\"\"\"\n\n        args = self.page_kwargs.copy()\n        args[\"settings\"] = get_settings(\n            STATIC_URL=\"http://static.cool.site/{path}\",\n            ARTICLE_URL=\"http://blog.cool.site/{slug}.html\",\n        )\n        args[\"source_path\"] = \"content\"\n        args[\"context\"][\"static_content\"] = {\n            \"images/poster.jpg\": Static(\n                \"\", settings=args[\"settings\"], source_path=\"images/poster.jpg\"\n            ),\n        }\n        args[\"context\"][\"generated_content\"] = {\n            \"article.rst\": Article(\n                \"\",\n                settings=args[\"settings\"],\n                metadata={\"slug\": \"article\", \"title\": \"Article\"},\n            )\n        }\n\n        # Article link will go to blog\n        args[\"content\"] = '<a href=\"{filename}article.rst\">Article</a>'\n        content = Page(**args).get_content(\"http://cool.site\")\n        self.assertEqual(\n            content, '<a href=\"http://blog.cool.site/article.html\">Article</a>'\n        )\n\n        # Page link will go to the main site\n        args[\"content\"] = '<a href=\"{index}\">Index</a>'\n        content = Page(**args).get_content(\"http://cool.site\")\n        self.assertEqual(content, '<a href=\"http://cool.site/index.html\">Index</a>')\n\n        # Image link will go to static\n        args[\"content\"] = '<img src=\"{static}/images/poster.jpg\"/>'\n        content = Page(**args).get_content(\"http://cool.site\")\n        self.assertEqual(\n            content, '<img src=\"http://static.cool.site/images/poster.jpg\"/>'\n        )\n\n        # Image link will go to static\n        args[\"content\"] = '<meta content=\"{static}/images/poster.jpg\"/>'\n        content = Page(**args).get_content(\"http://cool.site\")\n        self.assertEqual(\n            content, '<meta content=\"http://static.cool.site/images/poster.jpg\"/>'\n        )\n\n    def test_intrasite_link_escape(self):\n        article = type(\"_DummyArticle\", (object,), {\"url\": \"article-spaces.html\"})\n        asset = type(\"_DummyAsset\", (object,), {\"url\": \"name@example.com\"})\n\n        args = self.page_kwargs.copy()\n        args[\"settings\"] = get_settings()\n        args[\"source_path\"] = \"content\"\n        args[\"context\"][\"generated_content\"] = {\"article spaces.rst\": article}\n        args[\"context\"][\"static_content\"] = {\"name@example.com\": asset}\n\n        expected_output = (\n            \"A simple test with a \"\n            '<a href=\"http://notmyidea.org/article-spaces.html#anchor\">link</a> '\n            '<a href=\"http://notmyidea.org/name@example.com#anchor\">file</a>'\n        )\n\n        # not escaped\n        args[\"content\"] = (\n            \"A simple test with a \"\n            '<a href=\"{filename}article spaces.rst#anchor\">link</a> '\n            '<a href=\"{static}name@example.com#anchor\">file</a>'\n        )\n        content = Page(**args).get_content(\"http://notmyidea.org\")\n        self.assertEqual(content, expected_output)\n\n        # html escaped\n        args[\"content\"] = (\n            \"A simple test with a \"\n            '<a href=\"{filename}article spaces.rst#anchor\">link</a> '\n            '<a href=\"{static}name&#64;example.com#anchor\">file</a>'\n        )\n        content = Page(**args).get_content(\"http://notmyidea.org\")\n        self.assertEqual(content, expected_output)\n\n        # url escaped\n        args[\"content\"] = (\n            \"A simple test with a \"\n            '<a href=\"{filename}article%20spaces.rst#anchor\">link</a> '\n            '<a href=\"{static}name%40example.com#anchor\">file</a>'\n        )\n        content = Page(**args).get_content(\"http://notmyidea.org\")\n        self.assertEqual(content, expected_output)\n\n        # html and url escaped\n        args[\"content\"] = (\n            \"A simple test with a \"\n            '<a href=\"{filename}article%20spaces.rst#anchor\">link</a> '\n            '<a href=\"{static}name&#64;example.com#anchor\">file</a>'\n        )\n        content = Page(**args).get_content(\"http://notmyidea.org\")\n        self.assertEqual(content, expected_output)\n\n    def test_intrasite_link_markdown_spaces(self):\n        cls_name = \"_DummyArticle\"\n        article = type(cls_name, (object,), {\"url\": \"article-spaces.html\"})\n\n        args = self.page_kwargs.copy()\n        args[\"settings\"] = get_settings()\n        args[\"source_path\"] = \"content\"\n        args[\"context\"][\"generated_content\"] = {\"article spaces.rst\": article}\n\n        # An intrasite link via filename with %20 as a space\n        args[\"content\"] = (\n            'A simple test, with a <a href=\"|filename|article%20spaces.rst\">link</a>'\n        )\n        content = Page(**args).get_content(\"http://notmyidea.org\")\n        self.assertEqual(\n            content,\n            \"A simple test, with a \"\n            '<a href=\"http://notmyidea.org/article-spaces.html\">link</a>',\n        )\n\n    def test_intrasite_link_source_and_generated(self):\n        \"\"\"Test linking both to the source and the generated article\"\"\"\n        cls_name = \"_DummyAsset\"\n\n        args = self.page_kwargs.copy()\n        args[\"settings\"] = get_settings()\n        args[\"source_path\"] = \"content\"\n        args[\"context\"][\"generated_content\"] = {\n            \"article.rst\": type(cls_name, (object,), {\"url\": \"article.html\"})\n        }\n        args[\"context\"][\"static_content\"] = {\n            \"article.rst\": type(cls_name, (object,), {\"url\": \"article.rst\"})\n        }\n\n        args[\"content\"] = (\n            \"A simple test, with a link to an\"\n            '<a href=\"{filename}article.rst\">article</a> and its'\n            '<a href=\"{static}article.rst\">source</a>'\n        )\n        content = Page(**args).get_content(\"http://notmyidea.org\")\n        self.assertEqual(\n            content,\n            \"A simple test, with a link to an\"\n            '<a href=\"http://notmyidea.org/article.html\">article</a> and its'\n            '<a href=\"http://notmyidea.org/article.rst\">source</a>',\n        )\n\n    def test_intrasite_link_to_static_content_with_filename(self):\n        \"\"\"Test linking to a static resource with deprecated {filename}\"\"\"\n        cls_name = \"_DummyAsset\"\n\n        args = self.page_kwargs.copy()\n        args[\"settings\"] = get_settings()\n        args[\"source_path\"] = \"content\"\n        args[\"context\"][\"static_content\"] = {\n            \"poster.jpg\": type(cls_name, (object,), {\"url\": \"images/poster.jpg\"})\n        }\n\n        args[\"content\"] = (\n            'A simple test, with a link to a<a href=\"{filename}poster.jpg\">poster</a>'\n        )\n        content = Page(**args).get_content(\"http://notmyidea.org\")\n        self.assertEqual(\n            content,\n            \"A simple test, with a link to a\"\n            '<a href=\"http://notmyidea.org/images/poster.jpg\">poster</a>',\n        )\n\n    def test_multiple_authors(self):\n        \"\"\"Test article with multiple authors.\"\"\"\n        args = self.page_kwargs.copy()\n        content = Page(**args)\n        assert content.authors == [content.author]\n        args[\"metadata\"].pop(\"author\")\n        args[\"metadata\"][\"authors\"] = [\n            Author(\"First Author\", DEFAULT_CONFIG),\n            Author(\"Second Author\", DEFAULT_CONFIG),\n        ]\n        content = Page(**args)\n        assert content.authors\n        assert content.author == content.authors[0]\n\n\nclass TestArticle(TestBase):\n    def test_template(self):\n        # Articles default to article, metadata overwrites\n        default_article = Article(**self.page_kwargs)\n        self.assertEqual(\"article\", default_article.template)\n        article_kwargs = self._copy_page_kwargs()\n        article_kwargs[\"metadata\"][\"template\"] = \"custom\"\n        custom_article = Article(**article_kwargs)\n        self.assertEqual(\"custom\", custom_article.template)\n\n    def test_slugify_category_author(self):\n        settings = get_settings()\n        settings[\"SLUG_REGEX_SUBSTITUTIONS\"] = [\n            (r\"C#\", \"csharp\"),\n            (r\"[^\\w\\s-]\", \"\"),\n            (r\"(?u)\\A\\s*\", \"\"),\n            (r\"(?u)\\s*\\Z\", \"\"),\n            (r\"[-\\s]+\", \"-\"),\n        ]\n        settings[\"ARTICLE_URL\"] = \"{author}/{category}/{slug}/\"\n        settings[\"ARTICLE_SAVE_AS\"] = \"{author}/{category}/{slug}/index.html\"\n        article_kwargs = self._copy_page_kwargs()\n        article_kwargs[\"metadata\"][\"author\"] = Author(\"O'Brien\", settings)\n        article_kwargs[\"metadata\"][\"category\"] = Category(\"C# & stuff\", settings)\n        article_kwargs[\"metadata\"][\"title\"] = \"fnord\"\n        article_kwargs[\"settings\"] = settings\n        article = Article(**article_kwargs)\n        self.assertEqual(article.url, \"obrien/csharp-stuff/fnord/\")\n        self.assertEqual(article.save_as, \"obrien/csharp-stuff/fnord/index.html\")\n\n    def test_slugify_with_author_substitutions(self):\n        settings = get_settings()\n        settings[\"AUTHOR_REGEX_SUBSTITUTIONS\"] = [\n            (\"Alexander Todorov\", \"atodorov\"),\n            (\"Krasimir Tsonev\", \"krasimir\"),\n            (r\"[^\\w\\s-]\", \"\"),\n            (r\"(?u)\\A\\s*\", \"\"),\n            (r\"(?u)\\s*\\Z\", \"\"),\n            (r\"[-\\s]+\", \"-\"),\n        ]\n        settings[\"ARTICLE_URL\"] = \"blog/{author}/{slug}/\"\n        settings[\"ARTICLE_SAVE_AS\"] = \"blog/{author}/{slug}/index.html\"\n        article_kwargs = self._copy_page_kwargs()\n        article_kwargs[\"metadata\"][\"author\"] = Author(\"Alexander Todorov\", settings)\n        article_kwargs[\"metadata\"][\"title\"] = \"fnord\"\n        article_kwargs[\"settings\"] = settings\n        article = Article(**article_kwargs)\n        self.assertEqual(article.url, \"blog/atodorov/fnord/\")\n        self.assertEqual(article.save_as, \"blog/atodorov/fnord/index.html\")\n\n    def test_slugify_category_with_dots(self):\n        settings = get_settings()\n        settings[\"CATEGORY_REGEX_SUBSTITUTIONS\"] = [\n            (\"Fedora QA\", \"fedora.qa\"),\n        ]\n        settings[\"ARTICLE_URL\"] = \"{category}/{slug}/\"\n        article_kwargs = self._copy_page_kwargs()\n        article_kwargs[\"metadata\"][\"category\"] = Category(\"Fedora QA\", settings)\n        article_kwargs[\"metadata\"][\"title\"] = \"This Week in Fedora QA\"\n        article_kwargs[\"settings\"] = settings\n        article = Article(**article_kwargs)\n        self.assertEqual(article.url, \"fedora.qa/this-week-in-fedora-qa/\")\n\n    def test_valid_save_as_detects_breakout(self):\n        settings = get_settings()\n        article_kwargs = self._copy_page_kwargs()\n        article_kwargs[\"metadata\"][\"slug\"] = \"../foo\"\n        article_kwargs[\"settings\"] = settings\n        article = Article(**article_kwargs)\n        self.assertFalse(article._has_valid_save_as())\n\n    def test_valid_save_as_detects_breakout_to_root(self):\n        settings = get_settings()\n        article_kwargs = self._copy_page_kwargs()\n        article_kwargs[\"metadata\"][\"slug\"] = \"/foo\"\n        article_kwargs[\"settings\"] = settings\n        article = Article(**article_kwargs)\n        self.assertFalse(article._has_valid_save_as())\n\n    def test_valid_save_as_passes_valid(self):\n        settings = get_settings()\n        article_kwargs = self._copy_page_kwargs()\n        article_kwargs[\"metadata\"][\"slug\"] = \"foo\"\n        article_kwargs[\"settings\"] = settings\n        article = Article(**article_kwargs)\n        self.assertTrue(article._has_valid_save_as())\n\n\nclass TestStatic(LoggedTestCase):\n    def setUp(self):\n        super().setUp()\n        self.settings = get_settings(\n            STATIC_SAVE_AS=\"{path}\",\n            STATIC_URL=\"{path}\",\n            PAGE_SAVE_AS=os.path.join(\"outpages\", \"{slug}.html\"),\n            PAGE_URL=\"outpages/{slug}.html\",\n        )\n        self.context = get_context(self.settings)\n\n        self.static = Static(\n            content=None,\n            metadata={},\n            settings=self.settings,\n            source_path=posix_join(\"dir\", \"foo.jpg\"),\n            context=self.context,\n        )\n\n        self.context[\"static_content\"][self.static.source_path] = self.static\n\n    def tearDown(self):\n        pass\n\n    def test_attach_to_same_dir(self):\n        \"\"\"attach_to() overrides a static file's save_as and url.\"\"\"\n        page = Page(\n            content=\"fake page\",\n            metadata={\"title\": \"fakepage\"},\n            settings=self.settings,\n            source_path=os.path.join(\"dir\", \"fakepage.md\"),\n        )\n        self.static.attach_to(page)\n\n        expected_save_as = os.path.join(\"outpages\", \"foo.jpg\")\n        self.assertEqual(self.static.save_as, expected_save_as)\n        self.assertEqual(self.static.url, path_to_url(expected_save_as))\n\n    def test_attach_to_parent_dir(self):\n        \"\"\"attach_to() preserves dirs inside the linking document dir.\"\"\"\n        page = Page(\n            content=\"fake page\",\n            metadata={\"title\": \"fakepage\"},\n            settings=self.settings,\n            source_path=\"fakepage.md\",\n        )\n        self.static.attach_to(page)\n\n        expected_save_as = os.path.join(\"outpages\", \"dir\", \"foo.jpg\")\n        self.assertEqual(self.static.save_as, expected_save_as)\n        self.assertEqual(self.static.url, path_to_url(expected_save_as))\n\n    def test_attach_to_other_dir(self):\n        \"\"\"attach_to() ignores dirs outside the linking document dir.\"\"\"\n        page = Page(\n            content=\"fake page\",\n            metadata={\"title\": \"fakepage\"},\n            settings=self.settings,\n            source_path=os.path.join(\"dir\", \"otherdir\", \"fakepage.md\"),\n        )\n        self.static.attach_to(page)\n\n        expected_save_as = os.path.join(\"outpages\", \"foo.jpg\")\n        self.assertEqual(self.static.save_as, expected_save_as)\n        self.assertEqual(self.static.url, path_to_url(expected_save_as))\n\n    def test_attach_to_ignores_subsequent_calls(self):\n        \"\"\"attach_to() does nothing when called a second time.\"\"\"\n        page = Page(\n            content=\"fake page\",\n            metadata={\"title\": \"fakepage\"},\n            settings=self.settings,\n            source_path=os.path.join(\"dir\", \"fakepage.md\"),\n        )\n\n        self.static.attach_to(page)\n\n        otherdir_settings = self.settings.copy()\n        otherdir_settings.update(\n            {\n                \"PAGE_SAVE_AS\": os.path.join(\"otherpages\", \"{slug}.html\"),\n                \"PAGE_URL\": \"otherpages/{slug}.html\",\n            }\n        )\n        otherdir_page = Page(\n            content=\"other page\",\n            metadata={\"title\": \"otherpage\"},\n            settings=otherdir_settings,\n            source_path=os.path.join(\"dir\", \"otherpage.md\"),\n        )\n\n        self.static.attach_to(otherdir_page)\n\n        otherdir_save_as = os.path.join(\"otherpages\", \"foo.jpg\")\n        self.assertNotEqual(self.static.save_as, otherdir_save_as)\n        self.assertNotEqual(self.static.url, path_to_url(otherdir_save_as))\n\n    def test_attach_to_does_nothing_after_save_as_referenced(self):\n        \"\"\"attach_to() does nothing if the save_as was already referenced.\n        (For example, by a {static} link an a document processed earlier.)\n        \"\"\"\n        original_save_as = self.static.save_as\n\n        page = Page(\n            content=\"fake page\",\n            metadata={\"title\": \"fakepage\"},\n            settings=self.settings,\n            source_path=os.path.join(\"dir\", \"fakepage.md\"),\n        )\n        self.static.attach_to(page)\n\n        self.assertEqual(self.static.save_as, original_save_as)\n        self.assertEqual(self.static.url, path_to_url(original_save_as))\n\n    def test_attach_to_does_nothing_after_url_referenced(self):\n        \"\"\"attach_to() does nothing if the url was already referenced.\n        (For example, by a {static} link an a document processed earlier.)\n        \"\"\"\n        original_url = self.static.url\n\n        page = Page(\n            content=\"fake page\",\n            metadata={\"title\": \"fakepage\"},\n            settings=self.settings,\n            source_path=os.path.join(\"dir\", \"fakepage.md\"),\n        )\n        self.static.attach_to(page)\n\n        self.assertEqual(self.static.save_as, self.static.source_path)\n        self.assertEqual(self.static.url, original_url)\n\n    def test_attach_to_does_not_override_an_override(self):\n        \"\"\"attach_to() does not override paths that were overridden elsewhere.\n        (For example, by the user with EXTRA_PATH_METADATA)\n        \"\"\"\n        customstatic = Static(\n            content=None,\n            metadata={\"save_as\": \"customfoo.jpg\", \"url\": \"customfoo.jpg\"},\n            settings=self.settings,\n            source_path=os.path.join(\"dir\", \"foo.jpg\"),\n            context=self.settings.copy(),\n        )\n\n        page = Page(\n            content=\"fake page\",\n            metadata={\"title\": \"fakepage\"},\n            settings=self.settings,\n            source_path=os.path.join(\"dir\", \"fakepage.md\"),\n        )\n\n        customstatic.attach_to(page)\n\n        self.assertEqual(customstatic.save_as, \"customfoo.jpg\")\n        self.assertEqual(customstatic.url, \"customfoo.jpg\")\n\n    def test_attach_link_syntax(self):\n        \"\"\"{attach} link syntax triggers output path override & url replacement.\"\"\"\n        html = '<a href=\"{attach}../foo.jpg\">link</a>'\n        page = Page(\n            content=html,\n            metadata={\"title\": \"fakepage\"},\n            settings=self.settings,\n            source_path=os.path.join(\"dir\", \"otherdir\", \"fakepage.md\"),\n            context=self.context,\n        )\n        content = page.get_content(\"\")\n\n        self.assertNotEqual(\n            content, html, \"{attach} link syntax did not trigger URL replacement.\"\n        )\n\n        expected_save_as = os.path.join(\"outpages\", \"foo.jpg\")\n        self.assertEqual(self.static.save_as, expected_save_as)\n        self.assertEqual(self.static.url, path_to_url(expected_save_as))\n\n    def test_tag_link_syntax(self):\n        \"{tag} link syntax triggers url replacement.\"\n\n        html = '<a href=\"{tag}foo\">link</a>'\n        page = Page(\n            content=html,\n            metadata={\"title\": \"fakepage\"},\n            settings=self.settings,\n            source_path=os.path.join(\"dir\", \"otherdir\", \"fakepage.md\"),\n            context=self.context,\n        )\n        content = page.get_content(\"\")\n\n        self.assertNotEqual(content, html)\n\n    def test_category_link_syntax(self):\n        \"{category} link syntax triggers url replacement.\"\n\n        html = '<a href=\"{category}foo\">link</a>'\n        page = Page(\n            content=html,\n            metadata={\"title\": \"fakepage\"},\n            settings=self.settings,\n            source_path=os.path.join(\"dir\", \"otherdir\", \"fakepage.md\"),\n            context=self.context,\n        )\n        content = page.get_content(\"\")\n\n        self.assertNotEqual(content, html)\n\n    def test_author_link_syntax(self):\n        \"{author} link syntax triggers url replacement.\"\n\n        html = '<a href=\"{author}foo\">link</a>'\n        page = Page(\n            content=html,\n            metadata={\"title\": \"fakepage\"},\n            settings=self.settings,\n            source_path=os.path.join(\"dir\", \"otherdir\", \"fakepage.md\"),\n            context=self.context,\n        )\n        content = page.get_content(\"\")\n\n        self.assertNotEqual(content, html)\n\n    def test_index_link_syntax(self):\n        \"{index} link syntax triggers url replacement.\"\n\n        html = '<a href=\"{index}\">link</a>'\n        page = Page(\n            content=html,\n            metadata={\"title\": \"fakepage\"},\n            settings=self.settings,\n            source_path=os.path.join(\"dir\", \"otherdir\", \"fakepage.md\"),\n            context=self.context,\n        )\n        content = page.get_content(\"\")\n\n        self.assertNotEqual(content, html)\n\n        expected_html = (\n            '<a href=\"'\n            + \"/\".join((self.settings[\"SITEURL\"], self.settings[\"INDEX_SAVE_AS\"]))\n            + '\">link</a>'\n        )\n        self.assertEqual(content, expected_html)\n\n    def test_unknown_link_syntax(self):\n        \"{unknown} link syntax should trigger warning.\"\n\n        html = '<a href=\"{unknown}foo\">link</a>'\n        page = Page(\n            content=html,\n            metadata={\"title\": \"fakepage\"},\n            settings=self.settings,\n            source_path=os.path.join(\"dir\", \"otherdir\", \"fakepage.md\"),\n            context=self.context,\n        )\n        content = page.get_content(\"\")\n\n        self.assertEqual(content, html)\n        self.assertLogCountEqual(\n            count=1,\n            msg=\"Replacement Indicator 'unknown' not recognized in '{unknown}foo', \"\n            \"skipping replacement\",\n            level=logging.WARNING,\n        )\n\n    def test_link_to_unknown_file(self):\n        \"{filename} link to unknown file should trigger warning.\"\n\n        html = '<a href=\"{filename}foo\">link</a>'\n        page = Page(\n            content=html,\n            metadata={\"title\": \"fakepage\"},\n            settings=self.settings,\n            source_path=os.path.join(\"dir\", \"otherdir\", \"fakepage.md\"),\n            context=self.context,\n        )\n        content = page.get_content(\"\")\n\n        self.assertEqual(content, html)\n        self.assertLogCountEqual(\n            count=1,\n            msg=\"Unable to find 'foo', skipping url replacement.\",\n            level=logging.WARNING,\n        )\n\n    def test_index_link_syntax_with_spaces(self):\n        \"\"\"{index} link syntax triggers url replacement\n        with spaces around the equal sign.\"\"\"\n\n        html = '<a href = \"{index}\">link</a>'\n        page = Page(\n            content=html,\n            metadata={\"title\": \"fakepage\"},\n            settings=self.settings,\n            source_path=os.path.join(\"dir\", \"otherdir\", \"fakepage.md\"),\n            context=self.context,\n        )\n        content = page.get_content(\"\")\n\n        self.assertNotEqual(content, html)\n\n        expected_html = (\n            '<a href = \"'\n            + \"/\".join((self.settings[\"SITEURL\"], self.settings[\"INDEX_SAVE_AS\"]))\n            + '\">link</a>'\n        )\n        self.assertEqual(content, expected_html)\n\n    def test_not_save_as_draft(self):\n        \"\"\"Static.save_as is not affected by draft status.\"\"\"\n\n        static = Static(\n            content=None,\n            metadata={\n                \"status\": \"draft\",\n            },\n            settings=self.settings,\n            source_path=os.path.join(\"dir\", \"foo.jpg\"),\n            context=self.settings.copy(),\n        )\n\n        expected_save_as = posixize_path(os.path.join(\"dir\", \"foo.jpg\"))\n        self.assertEqual(static.status, \"draft\")\n        self.assertEqual(static.save_as, expected_save_as)\n        self.assertEqual(static.url, path_to_url(expected_save_as))\n"
  },
  {
    "path": "pelican/tests/test_generators.py",
    "content": "import os\nfrom shutil import copy, rmtree\nfrom tempfile import mkdtemp\nfrom unittest.mock import MagicMock\n\nfrom pelican.generators import (\n    ArticlesGenerator,\n    Generator,\n    PagesGenerator,\n    PelicanTemplateNotFound,\n    StaticGenerator,\n    TemplatePagesGenerator,\n)\nfrom pelican.tests.support import (\n    TestCaseWithCLocale,\n    can_symlink,\n    get_context,\n    get_settings,\n    unittest,\n)\nfrom pelican.writers import Writer\n\nCUR_DIR = os.path.dirname(__file__)\nCONTENT_DIR = os.path.join(CUR_DIR, \"content\")\n\n\nclass TestGenerator(TestCaseWithCLocale):\n    def setUp(self):\n        super().setUp()\n        self.settings = get_settings()\n        self.settings[\"READERS\"] = {\"asc\": None}\n        self.generator = Generator(\n            self.settings.copy(), self.settings, CUR_DIR, self.settings[\"THEME\"], None\n        )\n\n    def test_include_path(self):\n        self.settings[\"IGNORE_FILES\"] = {\"ignored1.rst\", \"ignored2.rst\"}\n\n        filename = os.path.join(CUR_DIR, \"content\", \"article.rst\")\n        include_path = self.generator._include_path\n        self.assertTrue(include_path(filename))\n        self.assertTrue(include_path(filename, extensions=(\"rst\",)))\n        self.assertFalse(include_path(filename, extensions=(\"md\",)))\n\n        ignored_file = os.path.join(CUR_DIR, \"content\", \"ignored1.rst\")\n        self.assertFalse(include_path(ignored_file))\n\n    def test_get_files_exclude(self):\n        \"\"\"Test that Generator.get_files() properly excludes directories.\"\"\"\n        # We use our own Generator so we can give it our own content path\n        generator = Generator(\n            context=self.settings.copy(),\n            settings=self.settings,\n            path=os.path.join(CUR_DIR, \"nested_content\"),\n            theme=self.settings[\"THEME\"],\n            output_path=None,\n        )\n\n        filepaths = generator.get_files(paths=[\"maindir\"])\n        found_files = {os.path.basename(f) for f in filepaths}\n        expected_files = {\"maindir.md\", \"subdir.md\"}\n        self.assertFalse(\n            expected_files - found_files, \"get_files() failed to find one or more files\"\n        )\n\n        # Test string as `paths` argument rather than list\n        filepaths = generator.get_files(paths=\"maindir\")\n        found_files = {os.path.basename(f) for f in filepaths}\n        expected_files = {\"maindir.md\", \"subdir.md\"}\n        self.assertFalse(\n            expected_files - found_files, \"get_files() failed to find one or more files\"\n        )\n\n        filepaths = generator.get_files(paths=[\"\"], exclude=[\"maindir\"])\n        found_files = {os.path.basename(f) for f in filepaths}\n        self.assertNotIn(\n            \"maindir.md\",\n            found_files,\n            \"get_files() failed to exclude a top-level directory\",\n        )\n        self.assertNotIn(\n            \"subdir.md\",\n            found_files,\n            \"get_files() failed to exclude a subdir of an excluded directory\",\n        )\n\n        filepaths = generator.get_files(\n            paths=[\"\"], exclude=[os.path.join(\"maindir\", \"subdir\")]\n        )\n        found_files = {os.path.basename(f) for f in filepaths}\n        self.assertNotIn(\n            \"subdir.md\", found_files, \"get_files() failed to exclude a subdirectory\"\n        )\n\n        filepaths = generator.get_files(paths=[\"\"], exclude=[\"subdir\"])\n        found_files = {os.path.basename(f) for f in filepaths}\n        self.assertIn(\n            \"subdir.md\",\n            found_files,\n            \"get_files() excluded a subdirectory by name, ignoring its path\",\n        )\n\n    def test_custom_jinja_environment(self):\n        \"\"\"\n        Test that setting the JINJA_ENVIRONMENT\n        properly gets set from the settings config\n        \"\"\"\n        settings = get_settings()\n        comment_start_string = \"abc\"\n        comment_end_string = \"/abc\"\n        settings[\"JINJA_ENVIRONMENT\"] = {\n            \"comment_start_string\": comment_start_string,\n            \"comment_end_string\": comment_end_string,\n        }\n        generator = Generator(\n            settings.copy(), settings, CUR_DIR, settings[\"THEME\"], None\n        )\n        self.assertEqual(comment_start_string, generator.env.comment_start_string)\n        self.assertEqual(comment_end_string, generator.env.comment_end_string)\n\n    def test_theme_overrides(self):\n        \"\"\"\n        Test that the THEME_TEMPLATES_OVERRIDES configuration setting is\n        utilized correctly in the Generator.\n        \"\"\"\n        override_dirs = (\n            os.path.join(CUR_DIR, \"theme_overrides\", \"level1\"),\n            os.path.join(CUR_DIR, \"theme_overrides\", \"level2\"),\n        )\n        self.settings[\"THEME_TEMPLATES_OVERRIDES\"] = override_dirs\n        generator = Generator(\n            context=self.settings.copy(),\n            settings=self.settings,\n            path=CUR_DIR,\n            theme=self.settings[\"THEME\"],\n            output_path=None,\n        )\n\n        filename = generator.get_template(\"article\").filename\n        self.assertEqual(override_dirs[0], os.path.dirname(filename))\n        self.assertEqual(\"article.html\", os.path.basename(filename))\n\n        filename = generator.get_template(\"authors\").filename\n        self.assertEqual(override_dirs[1], os.path.dirname(filename))\n        self.assertEqual(\"authors.html\", os.path.basename(filename))\n\n        filename = generator.get_template(\"taglist\").filename\n        self.assertEqual(\n            os.path.join(self.settings[\"THEME\"], \"templates\"), os.path.dirname(filename)\n        )\n        self.assertNotIn(os.path.dirname(filename), override_dirs)\n        self.assertEqual(\"taglist.html\", os.path.basename(filename))\n\n    def test_simple_prefix(self):\n        \"\"\"\n        Test `!simple` theme prefix.\n        \"\"\"\n        filename = self.generator.get_template(\"!simple/authors\").filename\n        expected_path = os.path.join(\n            os.path.dirname(CUR_DIR), \"themes\", \"simple\", \"templates\"\n        )\n        self.assertEqual(expected_path, os.path.dirname(filename))\n        self.assertEqual(\"authors.html\", os.path.basename(filename))\n\n    def test_theme_prefix(self):\n        \"\"\"\n        Test `!theme` theme prefix.\n        \"\"\"\n        filename = self.generator.get_template(\"!theme/authors\").filename\n        expected_path = os.path.join(\n            os.path.dirname(CUR_DIR), \"themes\", \"notmyidea\", \"templates\"\n        )\n        self.assertEqual(expected_path, os.path.dirname(filename))\n        self.assertEqual(\"authors.html\", os.path.basename(filename))\n\n    def test_bad_prefix(self):\n        \"\"\"\n        Test unknown/bad theme prefix throws exception.\n        \"\"\"\n        self.assertRaises(\n            PelicanTemplateNotFound, self.generator.get_template, \"!UNKNOWN/authors\"\n        )\n\n\nclass TestArticlesGenerator(unittest.TestCase):\n    @classmethod\n    def setUpClass(cls):\n        settings = get_settings()\n        settings[\"DEFAULT_CATEGORY\"] = \"Default\"\n        settings[\"DEFAULT_DATE\"] = (1970, 1, 1)\n        settings[\"READERS\"] = {\"asc\": None}\n        settings[\"CACHE_CONTENT\"] = False\n        context = get_context(settings)\n\n        cls.generator = ArticlesGenerator(\n            context=context,\n            settings=settings,\n            path=CONTENT_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        cls.generator.generate_context()\n        cls.articles = cls.distill_articles(cls.generator.articles)\n        cls.drafts = cls.distill_articles(cls.generator.drafts)\n        cls.hidden_articles = cls.distill_articles(cls.generator.hidden_articles)\n\n    def setUp(self):\n        self.temp_cache = mkdtemp(prefix=\"pelican_cache.\")\n\n    def tearDown(self):\n        rmtree(self.temp_cache)\n\n    @staticmethod\n    def distill_articles(articles):\n        return [\n            [article.title, article.status, article.category.name, article.template]\n            for article in articles\n        ]\n\n    def test_generate_feeds(self):\n        settings = get_settings()\n        settings[\"CACHE_PATH\"] = self.temp_cache\n        generator = ArticlesGenerator(\n            context=settings,\n            settings=settings,\n            path=None,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        writer = MagicMock()\n        generator.generate_feeds(writer)\n        writer.write_feed.assert_called_with(\n            [], settings, \"feeds/all.atom.xml\", \"feeds/all.atom.xml\"\n        )\n\n        generator = ArticlesGenerator(\n            context=settings,\n            settings=get_settings(FEED_ALL_ATOM=None),\n            path=None,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        writer = MagicMock()\n        generator.generate_feeds(writer)\n        self.assertFalse(writer.write_feed.called)\n\n    def test_generate_feeds_override_url(self):\n        settings = get_settings()\n        settings[\"CACHE_PATH\"] = self.temp_cache\n        settings[\"FEED_ALL_ATOM_URL\"] = \"feeds/atom/all/\"\n        generator = ArticlesGenerator(\n            context=settings,\n            settings=settings,\n            path=None,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        writer = MagicMock()\n        generator.generate_feeds(writer)\n        writer.write_feed.assert_called_with(\n            [], settings, \"feeds/all.atom.xml\", \"feeds/atom/all/\"\n        )\n\n    def test_generate_context(self):\n        articles_expected = [\n            [\"A title\", \"published\", \"medium_posts\", \"article\"],\n            [\"Article title\", \"published\", \"Default\", \"article\"],\n            [\n                \"Article with markdown and summary metadata multi\",\n                \"published\",\n                \"Default\",\n                \"article\",\n            ],\n            [\n                \"Article with markdown and nested summary metadata\",\n                \"published\",\n                \"Default\",\n                \"article\",\n            ],\n            [\n                \"Article with markdown and summary metadata single\",\n                \"published\",\n                \"Default\",\n                \"article\",\n            ],\n            [\n                \"Article with markdown containing footnotes\",\n                \"published\",\n                \"Default\",\n                \"article\",\n            ],\n            [\"Article with template\", \"published\", \"Default\", \"custom\"],\n            [\"Metadata tags as list!\", \"published\", \"Default\", \"article\"],\n            [\"Rst with filename metadata\", \"published\", \"yeah\", \"article\"],\n            [\"One -, two --, three --- dashes!\", \"published\", \"Default\", \"article\"],\n            [\"One -, two --, three --- dashes!\", \"published\", \"Default\", \"article\"],\n            [\"Test Markdown extensions\", \"published\", \"Default\", \"article\"],\n            [\"Test markdown File\", \"published\", \"test\", \"article\"],\n            [\"Test md File\", \"published\", \"test\", \"article\"],\n            [\"Test mdown File\", \"published\", \"test\", \"article\"],\n            [\"Test metadata duplicates\", \"published\", \"test\", \"article\"],\n            [\"Test mkd File\", \"published\", \"test\", \"article\"],\n            [\"This is a super article !\", \"published\", \"Yeah\", \"article\"],\n            [\"This is a super article !\", \"published\", \"Yeah\", \"article\"],\n            [\n                \"Article with Nonconformant HTML meta tags\",\n                \"published\",\n                \"Default\",\n                \"article\",\n            ],\n            [\"This is a super article !\", \"published\", \"yeah\", \"article\"],\n            [\"This is a super article !\", \"published\", \"yeah\", \"article\"],\n            [\"This is a super article !\", \"published\", \"yeah\", \"article\"],\n            [\"This is a super article !\", \"published\", \"yeah\", \"article\"],\n            [\"This is a super article !\", \"published\", \"yeah\", \"article\"],\n            [\"This is a super article !\", \"published\", \"yeah\", \"article\"],\n            [\"This is a super article !\", \"published\", \"yeah\", \"article\"],\n            [\"This is a super article !\", \"published\", \"yeah\", \"article\"],\n            [\"This is a super article !\", \"published\", \"Default\", \"article\"],\n            [\"Article with an inline SVG\", \"published\", \"Default\", \"article\"],\n            [\"Article with markdown and empty tags\", \"published\", \"Default\", \"article\"],\n            [\"This is an article with category !\", \"published\", \"yeah\", \"article\"],\n            [\n                \"This is an article with multiple authors!\",\n                \"published\",\n                \"Default\",\n                \"article\",\n            ],\n            [\n                \"This is an article with multiple authors!\",\n                \"published\",\n                \"Default\",\n                \"article\",\n            ],\n            [\n                \"This is an article with multiple authors in list format!\",\n                \"published\",\n                \"Default\",\n                \"article\",\n            ],\n            [\n                \"This is an article with multiple authors in lastname, \"\n                \"firstname format!\",\n                \"published\",\n                \"Default\",\n                \"article\",\n            ],\n            [\n                \"This is an article without category !\",\n                \"published\",\n                \"Default\",\n                \"article\",\n            ],\n            [\n                \"This is an article without category !\",\n                \"published\",\n                \"TestCategory\",\n                \"article\",\n            ],\n            [\n                \"An Article With Code Block To Test Typogrify Ignore\",\n                \"published\",\n                \"Default\",\n                \"article\",\n            ],\n            [\n                \"マックOS X 10.8でパイソンとVirtualenvをインストールと設定\",\n                \"published\",\n                \"指導書\",\n                \"article\",\n            ],\n        ]\n        self.assertEqual(sorted(articles_expected), sorted(self.articles))\n\n    def test_articles_draft(self):\n        draft_articles_expected = [\n            [\"Draft article\", \"draft\", \"Default\", \"article\"],\n        ]\n        self.assertEqual(sorted(draft_articles_expected), sorted(self.drafts))\n\n    def test_articles_hidden(self):\n        hidden_articles_expected = [\n            [\"Hidden article\", \"hidden\", \"Default\", \"article\"],\n        ]\n        self.assertEqual(sorted(hidden_articles_expected), sorted(self.hidden_articles))\n\n    def test_generate_categories(self):\n        # test for name\n        # categories are grouped by slug; if two categories have the same slug\n        # but different names they will be grouped together, the first one in\n        # terms of process order will define the name for that category\n        categories = [cat.name for cat, _ in self.generator.categories]\n        categories_alternatives = (\n            sorted(\n                [\"Default\", \"TestCategory\", \"medium_posts\", \"Yeah\", \"test\", \"指導書\"]\n            ),\n            sorted(\n                [\"Default\", \"TestCategory\", \"medium_posts\", \"yeah\", \"test\", \"指導書\"]\n            ),\n        )\n        self.assertIn(sorted(categories), categories_alternatives)\n        # test for slug\n        categories = [cat.slug for cat, _ in self.generator.categories]\n        categories_expected = [\n            \"default\",\n            \"testcategory\",\n            \"medium_posts\",\n            \"yeah\",\n            \"test\",\n            \"zhi-dao-shu\",\n        ]\n        self.assertEqual(sorted(categories), sorted(categories_expected))\n\n    def test_do_not_use_folder_as_category(self):\n        settings = get_settings()\n        settings[\"DEFAULT_CATEGORY\"] = \"Default\"\n        settings[\"DEFAULT_DATE\"] = (1970, 1, 1)\n        settings[\"USE_FOLDER_AS_CATEGORY\"] = False\n        settings[\"CACHE_PATH\"] = self.temp_cache\n        settings[\"READERS\"] = {\"asc\": None}\n        context = get_context(settings)\n        generator = ArticlesGenerator(\n            context=context,\n            settings=settings,\n            path=CONTENT_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        generator.generate_context()\n        # test for name\n        # categories are grouped by slug; if two categories have the same slug\n        # but different names they will be grouped together, the first one in\n        # terms of process order will define the name for that category\n        categories = [cat.name for cat, _ in generator.categories]\n        categories_alternatives = (\n            sorted([\"Default\", \"Yeah\", \"test\", \"指導書\"]),\n            sorted([\"Default\", \"yeah\", \"test\", \"指導書\"]),\n        )\n        self.assertIn(sorted(categories), categories_alternatives)\n        # test for slug\n        categories = [cat.slug for cat, _ in generator.categories]\n        categories_expected = [\"default\", \"yeah\", \"test\", \"zhi-dao-shu\"]\n        self.assertEqual(sorted(categories), sorted(categories_expected))\n\n    def test_direct_templates_save_as_url_default(self):\n        settings = get_settings()\n        settings[\"CACHE_PATH\"] = self.temp_cache\n        context = get_context(settings)\n        generator = ArticlesGenerator(\n            context=context,\n            settings=settings,\n            path=None,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        write = MagicMock()\n        generator.generate_direct_templates(write)\n        write.assert_called_with(\n            \"archives.html\",\n            generator.get_template(\"archives\"),\n            context,\n            articles=generator.articles,\n            dates=generator.dates,\n            blog=True,\n            template_name=\"archives\",\n            page_name=\"archives\",\n            url=\"archives.html\",\n        )\n\n    def test_direct_templates_save_as_url_modified(self):\n        settings = get_settings()\n        settings[\"DIRECT_TEMPLATES\"] = [\"archives\"]\n        settings[\"ARCHIVES_SAVE_AS\"] = \"archives/index.html\"\n        settings[\"ARCHIVES_URL\"] = \"archives/\"\n        settings[\"CACHE_PATH\"] = self.temp_cache\n        generator = ArticlesGenerator(\n            context=settings,\n            settings=settings,\n            path=None,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        write = MagicMock()\n        generator.generate_direct_templates(write)\n        write.assert_called_with(\n            \"archives/index.html\",\n            generator.get_template(\"archives\"),\n            settings,\n            articles=generator.articles,\n            dates=generator.dates,\n            blog=True,\n            template_name=\"archives\",\n            page_name=\"archives/index\",\n            url=\"archives/\",\n        )\n\n    def test_direct_templates_save_as_false(self):\n        settings = get_settings()\n        settings[\"DIRECT_TEMPLATES\"] = [\"archives\"]\n        settings[\"ARCHIVES_SAVE_AS\"] = False\n        settings[\"CACHE_PATH\"] = self.temp_cache\n        generator = ArticlesGenerator(\n            context=settings,\n            settings=settings,\n            path=None,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        write = MagicMock()\n        generator.generate_direct_templates(write)\n        self.assertEqual(write.call_count, 0)\n\n    def test_per_article_template(self):\n        \"\"\"\n        Custom template articles get the field but standard/unset are None\n        \"\"\"\n        custom_template = [\"Article with template\", \"published\", \"Default\", \"custom\"]\n        standard_template = [\n            \"This is a super article !\",\n            \"published\",\n            \"Yeah\",\n            \"article\",\n        ]\n        self.assertIn(custom_template, self.articles)\n        self.assertIn(standard_template, self.articles)\n\n    def test_period_archives_context(self):\n        \"\"\"Test correctness of the period_archives context values.\"\"\"\n\n        settings = get_settings()\n        settings[\"CACHE_PATH\"] = self.temp_cache\n\n        # No period archives enabled:\n        context = get_context(settings)\n        generator = ArticlesGenerator(\n            context=context,\n            settings=settings,\n            path=CONTENT_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        generator.generate_context()\n        period_archives = generator.context[\"period_archives\"]\n        self.assertEqual(len(period_archives.items()), 0)\n\n        # Year archives enabled:\n        settings[\"YEAR_ARCHIVE_SAVE_AS\"] = \"posts/{date:%Y}/index.html\"\n        settings[\"YEAR_ARCHIVE_URL\"] = \"posts/{date:%Y}/\"\n        context = get_context(settings)\n        generator = ArticlesGenerator(\n            context=context,\n            settings=settings,\n            path=CONTENT_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        generator.generate_context()\n        period_archives = generator.context[\"period_archives\"]\n        abbreviated_archives = {\n            granularity: {period[\"period\"] for period in periods}\n            for granularity, periods in period_archives.items()\n        }\n        self.maxDiff = None\n        expected = {\"year\": {(1970,), (2010,), (2012,), (2014,), (2017,)}}\n        self.assertEqual(expected, abbreviated_archives)\n\n        # Month archives enabled:\n        settings[\"MONTH_ARCHIVE_SAVE_AS\"] = \"posts/{date:%Y}/{date:%b}/index.html\"\n        settings[\"MONTH_ARCHIVE_URL\"] = \"posts/{date:%Y}/{date:%b}/\"\n        context = get_context(settings)\n        generator = ArticlesGenerator(\n            context=context,\n            settings=settings,\n            path=CONTENT_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        generator.generate_context()\n        period_archives = generator.context[\"period_archives\"]\n        abbreviated_archives = {\n            granularity: {period[\"period\"] for period in periods}\n            for granularity, periods in period_archives.items()\n        }\n        expected = {\n            \"year\": {(1970,), (2010,), (2012,), (2014,), (2017,)},\n            \"month\": {\n                (1970, \"January\"),\n                (2010, \"December\"),\n                (2012, \"December\"),\n                (2012, \"November\"),\n                (2012, \"October\"),\n                (2014, \"February\"),\n                (2017, \"April\"),\n            },\n        }\n        self.assertEqual(expected, abbreviated_archives)\n\n        # Day archives enabled:\n        settings[\"DAY_ARCHIVE_SAVE_AS\"] = (\n            \"posts/{date:%Y}/{date:%b}/{date:%d}/index.html\"\n        )\n        settings[\"DAY_ARCHIVE_URL\"] = \"posts/{date:%Y}/{date:%b}/{date:%d}/\"\n        context = get_context(settings)\n        generator = ArticlesGenerator(\n            context=context,\n            settings=settings,\n            path=CONTENT_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        generator.generate_context()\n        period_archives = generator.context[\"period_archives\"]\n        abbreviated_archives = {\n            granularity: {period[\"period\"] for period in periods}\n            for granularity, periods in period_archives.items()\n        }\n        expected = {\n            \"year\": {(1970,), (2010,), (2012,), (2014,), (2017,)},\n            \"month\": {\n                (1970, \"January\"),\n                (2010, \"December\"),\n                (2012, \"December\"),\n                (2012, \"November\"),\n                (2012, \"October\"),\n                (2014, \"February\"),\n                (2017, \"April\"),\n            },\n            \"day\": {\n                (1970, \"January\", 1),\n                (2010, \"December\", 2),\n                (2012, \"December\", 20),\n                (2012, \"November\", 29),\n                (2012, \"October\", 30),\n                (2012, \"October\", 31),\n                (2014, \"February\", 9),\n                (2017, \"April\", 21),\n            },\n        }\n        self.assertEqual(expected, abbreviated_archives)\n\n        # Further item values tests\n        filtered_archives = [\n            p for p in period_archives[\"day\"] if p[\"period\"] == (2014, \"February\", 9)\n        ]\n        self.assertEqual(len(filtered_archives), 1)\n        sample_archive = filtered_archives[0]\n        self.assertEqual(sample_archive[\"period_num\"], (2014, 2, 9))\n        self.assertEqual(sample_archive[\"save_as\"], \"posts/2014/Feb/09/index.html\")\n        self.assertEqual(sample_archive[\"url\"], \"posts/2014/Feb/09/\")\n        articles = [\n            d\n            for d in generator.articles\n            if d.date.year == 2014 and d.date.month == 2 and d.date.day == 9\n        ]\n        self.assertEqual(len(sample_archive[\"articles\"]), len(articles))\n        dates = [\n            d\n            for d in generator.dates\n            if d.date.year == 2014 and d.date.month == 2 and d.date.day == 9\n        ]\n        self.assertEqual(len(sample_archive[\"dates\"]), len(dates))\n        self.assertEqual(sample_archive[\"dates\"][0].title, dates[0].title)\n        self.assertEqual(sample_archive[\"dates\"][0].date, dates[0].date)\n\n    def test_period_in_timeperiod_archive(self):\n        \"\"\"\n        Test that the context of a generated period_archive is passed\n        'period' : a tuple of year, month, day according to the time period\n        \"\"\"\n        settings = get_settings()\n\n        settings[\"YEAR_ARCHIVE_SAVE_AS\"] = \"posts/{date:%Y}/index.html\"\n        settings[\"YEAR_ARCHIVE_URL\"] = \"posts/{date:%Y}/\"\n        settings[\"CACHE_PATH\"] = self.temp_cache\n        context = get_context(settings)\n        generator = ArticlesGenerator(\n            context=context,\n            settings=settings,\n            path=CONTENT_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        generator.generate_context()\n        write = MagicMock()\n        generator.generate_period_archives(write)\n        dates = [d for d in generator.dates if d.date.year == 1970]\n        articles = [d for d in generator.articles if d.date.year == 1970]\n        self.assertEqual(len(dates), 1)\n        # among other things it must have at least been called with this\n        context[\"period\"] = (1970,)\n        context[\"period_num\"] = (1970,)\n        write.assert_called_with(\n            \"posts/1970/index.html\",\n            generator.get_template(\"period_archives\"),\n            context,\n            blog=True,\n            articles=articles,\n            dates=dates,\n            template_name=\"period_archives\",\n            url=\"posts/1970/\",\n            all_articles=generator.articles,\n        )\n\n        settings[\"MONTH_ARCHIVE_SAVE_AS\"] = \"posts/{date:%Y}/{date:%b}/index.html\"\n        settings[\"MONTH_ARCHIVE_URL\"] = \"posts/{date:%Y}/{date:%b}/\"\n        context = get_context(settings)\n        generator = ArticlesGenerator(\n            context=context,\n            settings=settings,\n            path=CONTENT_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        generator.generate_context()\n        write = MagicMock()\n        generator.generate_period_archives(write)\n        dates = [\n            d for d in generator.dates if d.date.year == 1970 and d.date.month == 1\n        ]\n        articles = [\n            d for d in generator.articles if d.date.year == 1970 and d.date.month == 1\n        ]\n        self.assertEqual(len(dates), 1)\n        context[\"period\"] = (1970, \"January\")\n        context[\"period_num\"] = (1970, 1)\n        # among other things it must have at least been called with this\n        write.assert_called_with(\n            \"posts/1970/Jan/index.html\",\n            generator.get_template(\"period_archives\"),\n            context,\n            blog=True,\n            articles=articles,\n            dates=dates,\n            template_name=\"period_archives\",\n            url=\"posts/1970/Jan/\",\n            all_articles=generator.articles,\n        )\n\n        settings[\"DAY_ARCHIVE_SAVE_AS\"] = (\n            \"posts/{date:%Y}/{date:%b}/{date:%d}/index.html\"\n        )\n        settings[\"DAY_ARCHIVE_URL\"] = \"posts/{date:%Y}/{date:%b}/{date:%d}/\"\n        context = get_context(settings)\n        generator = ArticlesGenerator(\n            context=context,\n            settings=settings,\n            path=CONTENT_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        generator.generate_context()\n        write = MagicMock()\n        generator.generate_period_archives(write)\n        dates = [\n            d\n            for d in generator.dates\n            if d.date.year == 1970 and d.date.month == 1 and d.date.day == 1\n        ]\n        articles = [\n            d\n            for d in generator.articles\n            if d.date.year == 1970 and d.date.month == 1 and d.date.day == 1\n        ]\n        self.assertEqual(len(dates), 1)\n        context[\"period\"] = (1970, \"January\", 1)\n        context[\"period_num\"] = (1970, 1, 1)\n        # among other things it must have at least been called with this\n        write.assert_called_with(\n            \"posts/1970/Jan/01/index.html\",\n            generator.get_template(\"period_archives\"),\n            context,\n            blog=True,\n            articles=articles,\n            dates=dates,\n            template_name=\"period_archives\",\n            url=\"posts/1970/Jan/01/\",\n            all_articles=generator.articles,\n        )\n\n    def test_nonexistent_template(self):\n        \"\"\"Attempt to load a non-existent template\"\"\"\n        settings = get_settings()\n        context = get_context(settings)\n        generator = ArticlesGenerator(\n            context=context,\n            settings=settings,\n            path=None,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        self.assertRaises(Exception, generator.get_template, \"not_a_template\")\n\n    def test_generate_authors(self):\n        \"\"\"Check authors generation.\"\"\"\n        authors = [author.name for author, _ in self.generator.authors]\n        authors_expected = sorted(\n            [\n                \"Alexis Métaireau\",\n                \"Author, First\",\n                \"Author, Second\",\n                \"First Author\",\n                \"Second Author\",\n            ]\n        )\n        self.assertEqual(sorted(authors), authors_expected)\n        # test for slug\n        authors = [author.slug for author, _ in self.generator.authors]\n        authors_expected = [\n            \"alexis-metaireau\",\n            \"author-first\",\n            \"author-second\",\n            \"first-author\",\n            \"second-author\",\n        ]\n        self.assertEqual(sorted(authors), sorted(authors_expected))\n\n    def test_standard_metadata_in_default_metadata(self):\n        settings = get_settings()\n        settings[\"CACHE_CONTENT\"] = False\n        settings[\"DEFAULT_CATEGORY\"] = \"Default\"\n        settings[\"DEFAULT_DATE\"] = (1970, 1, 1)\n        settings[\"DEFAULT_METADATA\"] = (\n            (\"author\", \"Blogger\"),\n            # category will be ignored in favor of\n            # DEFAULT_CATEGORY\n            (\"category\", \"Random\"),\n            (\"tags\", \"general, untagged\"),\n        )\n        context = get_context(settings)\n        generator = ArticlesGenerator(\n            context=context,\n            settings=settings,\n            path=CONTENT_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        generator.generate_context()\n\n        authors = sorted([author.name for author, _ in generator.authors])\n        authors_expected = sorted(\n            [\n                \"Alexis Métaireau\",\n                \"Blogger\",\n                \"Author, First\",\n                \"Author, Second\",\n                \"First Author\",\n                \"Second Author\",\n            ]\n        )\n        self.assertEqual(authors, authors_expected)\n\n        categories = sorted([category.name for category, _ in generator.categories])\n        categories_expected = [\n            sorted(\n                [\"Default\", \"TestCategory\", \"medium_posts\", \"yeah\", \"test\", \"指導書\"]\n            ),\n            sorted(\n                [\"Default\", \"TestCategory\", \"medium_posts\", \"Yeah\", \"test\", \"指導書\"]\n            ),\n        ]\n        self.assertIn(categories, categories_expected)\n\n        tags = sorted([tag.name for tag in generator.tags])\n        tags_expected = sorted(\n            [\"bar\", \"foo\", \"foobar\", \"general\", \"untagged\", \"パイソン\", \"マック\"]\n        )\n        self.assertEqual(tags, tags_expected)\n\n    def test_article_order_by(self):\n        settings = get_settings()\n        settings[\"DEFAULT_CATEGORY\"] = \"Default\"\n        settings[\"DEFAULT_DATE\"] = (1970, 1, 1)\n        settings[\"ARTICLE_ORDER_BY\"] = \"title\"\n        context = get_context(settings)\n\n        generator = ArticlesGenerator(\n            context=context,\n            settings=settings,\n            path=CONTENT_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        generator.generate_context()\n\n        expected = [\n            \"A title\",\n            \"An Article With Code Block To Test Typogrify Ignore\",\n            \"Article title\",\n            \"Article with Nonconformant HTML meta tags\",\n            \"Article with an inline SVG\",\n            \"Article with markdown and empty tags\",\n            \"Article with markdown and nested summary metadata\",\n            \"Article with markdown and summary metadata multi\",\n            \"Article with markdown and summary metadata single\",\n            \"Article with markdown containing footnotes\",\n            \"Article with template\",\n            \"Metadata tags as list!\",\n            \"One -, two --, three --- dashes!\",\n            \"One -, two --, three --- dashes!\",\n            \"Rst with filename metadata\",\n            \"Test Markdown extensions\",\n            \"Test markdown File\",\n            \"Test md File\",\n            \"Test mdown File\",\n            \"Test metadata duplicates\",\n            \"Test mkd File\",\n            \"This is a super article !\",\n            \"This is a super article !\",\n            \"This is a super article !\",\n            \"This is a super article !\",\n            \"This is a super article !\",\n            \"This is a super article !\",\n            \"This is a super article !\",\n            \"This is a super article !\",\n            \"This is a super article !\",\n            \"This is a super article !\",\n            \"This is a super article !\",\n            \"This is an article with category !\",\n            (\"This is an article with multiple authors in lastname, firstname format!\"),\n            \"This is an article with multiple authors in list format!\",\n            \"This is an article with multiple authors!\",\n            \"This is an article with multiple authors!\",\n            \"This is an article without category !\",\n            \"This is an article without category !\",\n            \"マックOS X 10.8でパイソンとVirtualenvをインストールと設定\",\n        ]\n\n        articles = [article.title for article in generator.articles]\n        self.assertEqual(articles, expected)\n\n        # reversed title\n        settings = get_settings()\n        settings[\"DEFAULT_CATEGORY\"] = \"Default\"\n        settings[\"DEFAULT_DATE\"] = (1970, 1, 1)\n        settings[\"ARTICLE_ORDER_BY\"] = \"reversed-title\"\n        context = get_context(settings)\n\n        generator = ArticlesGenerator(\n            context=context,\n            settings=settings,\n            path=CONTENT_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        generator.generate_context()\n\n        articles = [article.title for article in generator.articles]\n        self.assertEqual(articles, list(reversed(expected)))\n\n\nclass TestPageGenerator(unittest.TestCase):\n    # Note: Every time you want to test for a new field; Make sure the test\n    # pages in \"TestPages\" have all the fields Add it to distilled in\n    # distill_pages Then update the assertEqual in test_generate_context\n    # to match expected\n\n    def setUp(self):\n        self.temp_cache = mkdtemp(prefix=\"pelican_cache.\")\n\n    def tearDown(self):\n        rmtree(self.temp_cache)\n\n    def distill_pages(self, pages):\n        return [[page.title, page.status, page.template] for page in pages]\n\n    def test_generate_context(self):\n        settings = get_settings()\n        settings[\"CACHE_PATH\"] = self.temp_cache\n        settings[\"PAGE_PATHS\"] = [\"TestPages\"]  # relative to CUR_DIR\n        settings[\"DEFAULT_DATE\"] = (1970, 1, 1)\n        context = get_context(settings)\n\n        generator = PagesGenerator(\n            context=context,\n            settings=settings,\n            path=CUR_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        generator.generate_context()\n        pages = self.distill_pages(generator.pages)\n        hidden_pages = self.distill_pages(generator.hidden_pages)\n        draft_pages = self.distill_pages(generator.draft_pages)\n\n        pages_expected = [\n            [\"This is a test page\", \"published\", \"page\"],\n            [\"This is a markdown test page\", \"published\", \"page\"],\n            [\"This is a test page with a preset template\", \"published\", \"custom\"],\n            [\"Page with a bunch of links\", \"published\", \"page\"],\n            [\"Page with static links\", \"published\", \"page\"],\n            [\"A Page (Test) for sorting\", \"published\", \"page\"],\n        ]\n        hidden_pages_expected = [\n            [\"This is a test hidden page\", \"hidden\", \"page\"],\n            [\"This is a markdown test hidden page\", \"hidden\", \"page\"],\n            [\"This is a test hidden page with a custom template\", \"hidden\", \"custom\"],\n        ]\n        draft_pages_expected = [\n            [\"This is a test draft page\", \"draft\", \"page\"],\n            [\"This is a markdown test draft page\", \"draft\", \"page\"],\n            [\"This is a test draft page with a custom template\", \"draft\", \"custom\"],\n        ]\n\n        self.assertEqual(sorted(pages_expected), sorted(pages))\n        self.assertEqual(\n            sorted(pages_expected),\n            sorted(self.distill_pages(generator.context[\"pages\"])),\n        )\n        self.assertEqual(sorted(hidden_pages_expected), sorted(hidden_pages))\n        self.assertEqual(sorted(draft_pages_expected), sorted(draft_pages))\n        self.assertEqual(\n            sorted(hidden_pages_expected),\n            sorted(self.distill_pages(generator.context[\"hidden_pages\"])),\n        )\n        self.assertEqual(\n            sorted(draft_pages_expected),\n            sorted(self.distill_pages(generator.context[\"draft_pages\"])),\n        )\n\n    def test_generate_sorted(self):\n        settings = get_settings()\n        settings[\"PAGE_PATHS\"] = [\"TestPages\"]  # relative to CUR_DIR\n        settings[\"CACHE_PATH\"] = self.temp_cache\n        settings[\"DEFAULT_DATE\"] = (1970, 1, 1)\n        context = get_context(settings)\n\n        # default sort (filename)\n        pages_expected_sorted_by_filename = [\n            [\"This is a test page\", \"published\", \"page\"],\n            [\"This is a markdown test page\", \"published\", \"page\"],\n            [\"A Page (Test) for sorting\", \"published\", \"page\"],\n            [\"Page with a bunch of links\", \"published\", \"page\"],\n            [\"Page with static links\", \"published\", \"page\"],\n            [\"This is a test page with a preset template\", \"published\", \"custom\"],\n        ]\n        generator = PagesGenerator(\n            context=context,\n            settings=settings,\n            path=CUR_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        generator.generate_context()\n        pages = self.distill_pages(generator.pages)\n        self.assertEqual(pages_expected_sorted_by_filename, pages)\n\n        # sort by title\n        pages_expected_sorted_by_title = [\n            [\"A Page (Test) for sorting\", \"published\", \"page\"],\n            [\"Page with a bunch of links\", \"published\", \"page\"],\n            [\"Page with static links\", \"published\", \"page\"],\n            [\"This is a markdown test page\", \"published\", \"page\"],\n            [\"This is a test page\", \"published\", \"page\"],\n            [\"This is a test page with a preset template\", \"published\", \"custom\"],\n        ]\n        settings[\"PAGE_ORDER_BY\"] = \"title\"\n        context = get_context(settings)\n        generator = PagesGenerator(\n            context=context.copy(),\n            settings=settings,\n            path=CUR_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        generator.generate_context()\n        pages = self.distill_pages(generator.pages)\n        self.assertEqual(pages_expected_sorted_by_title, pages)\n\n        # sort by title reversed\n        pages_expected_sorted_by_title = [\n            [\"This is a test page with a preset template\", \"published\", \"custom\"],\n            [\"This is a test page\", \"published\", \"page\"],\n            [\"This is a markdown test page\", \"published\", \"page\"],\n            [\"Page with static links\", \"published\", \"page\"],\n            [\"Page with a bunch of links\", \"published\", \"page\"],\n            [\"A Page (Test) for sorting\", \"published\", \"page\"],\n        ]\n        settings[\"PAGE_ORDER_BY\"] = \"reversed-title\"\n        context = get_context(settings)\n        generator = PagesGenerator(\n            context=context,\n            settings=settings,\n            path=CUR_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        generator.generate_context()\n        pages = self.distill_pages(generator.pages)\n        self.assertEqual(pages_expected_sorted_by_title, pages)\n\n    def test_tag_and_category_links_on_generated_pages(self):\n        \"\"\"\n        Test to ensure links of the form {tag}tagname and {category}catname\n        are generated correctly on pages\n        \"\"\"\n        settings = get_settings()\n        settings[\"PAGE_PATHS\"] = [\"TestPages\"]  # relative to CUR_DIR\n        settings[\"CACHE_PATH\"] = self.temp_cache\n        settings[\"DEFAULT_DATE\"] = (1970, 1, 1)\n        context = get_context(settings)\n\n        generator = PagesGenerator(\n            context=context,\n            settings=settings,\n            path=CUR_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        generator.generate_context()\n        pages_by_title = {p.title: p for p in generator.pages}\n\n        test_content = pages_by_title[\"Page with a bunch of links\"].content\n        self.assertIn('<a href=\"/category/yeah.html\">', test_content)\n        self.assertIn('<a href=\"/tag/matsuku.html\">', test_content)\n\n    def test_static_and_attach_links_on_generated_pages(self):\n        \"\"\"\n        Test to ensure links of the form {static}filename and {attach}filename\n        are included in context['static_links']\n        \"\"\"\n        settings = get_settings()\n        settings[\"PAGE_PATHS\"] = [\"TestPages/page_with_static_links.md\"]\n        settings[\"CACHE_PATH\"] = self.temp_cache\n        settings[\"DEFAULT_DATE\"] = (1970, 1, 1)\n        context = get_context(settings)\n\n        generator = PagesGenerator(\n            context=context,\n            settings=settings,\n            path=CUR_DIR,\n            theme=settings[\"THEME\"],\n            output_path=None,\n        )\n        generator.generate_context()\n\n        self.assertIn(\"pelican/tests/TestPages/image0.jpg\", context[\"static_links\"])\n        self.assertIn(\"pelican/tests/TestPages/image1.jpg\", context[\"static_links\"])\n\n\nclass TestTemplatePagesGenerator(TestCaseWithCLocale):\n    TEMPLATE_CONTENT = \"foo: {{ foo }}\"\n\n    def setUp(self):\n        super().setUp()\n        self.temp_content = mkdtemp(prefix=\"pelicantests.\")\n        self.temp_output = mkdtemp(prefix=\"pelicantests.\")\n\n    def tearDown(self):\n        rmtree(self.temp_content)\n        rmtree(self.temp_output)\n\n    def test_generate_output(self):\n        settings = get_settings()\n        settings[\"STATIC_PATHS\"] = [\"static\"]\n        settings[\"TEMPLATE_PAGES\"] = {\"template/source.html\": \"generated/file.html\"}\n\n        generator = TemplatePagesGenerator(\n            context={\"foo\": \"bar\"},\n            settings=settings,\n            path=self.temp_content,\n            theme=\"\",\n            output_path=self.temp_output,\n        )\n\n        # create a dummy template file\n        template_dir = os.path.join(self.temp_content, \"template\")\n        template_path = os.path.join(template_dir, \"source.html\")\n        os.makedirs(template_dir)\n        with open(template_path, \"w\") as template_file:\n            template_file.write(self.TEMPLATE_CONTENT)\n\n        writer = Writer(self.temp_output, settings=settings)\n        generator.generate_output(writer)\n\n        output_path = os.path.join(self.temp_output, \"generated\", \"file.html\")\n\n        # output file has been generated\n        self.assertTrue(os.path.exists(output_path))\n\n        # output content is correct\n        with open(output_path) as output_file:\n            self.assertEqual(output_file.read(), \"foo: bar\")\n\n\nclass TestStaticGenerator(unittest.TestCase):\n    def setUp(self):\n        self.content_path = os.path.join(CUR_DIR, \"mixed_content\")\n        self.temp_content = mkdtemp(prefix=\"testcontent.\")\n        self.temp_output = mkdtemp(prefix=\"testoutput.\")\n        self.settings = get_settings()\n        self.settings[\"PATH\"] = self.temp_content\n        self.settings[\"STATIC_PATHS\"] = [\"static\"]\n        self.settings[\"OUTPUT_PATH\"] = self.temp_output\n        os.mkdir(os.path.join(self.temp_content, \"static\"))\n        self.startfile = os.path.join(self.temp_content, \"static\", \"staticfile\")\n        self.endfile = os.path.join(self.temp_output, \"static\", \"staticfile\")\n        self.generator = StaticGenerator(\n            context=get_context(),\n            settings=self.settings,\n            path=self.temp_content,\n            theme=\"\",\n            output_path=self.temp_output,\n        )\n\n    def tearDown(self):\n        rmtree(self.temp_content)\n        rmtree(self.temp_output)\n\n    def set_ancient_mtime(self, path, timestamp=1):\n        os.utime(path, (timestamp, timestamp))\n\n    def test_theme_static_paths_dirs(self):\n        \"\"\"Test that StaticGenerator properly copies also files mentioned in\n        TEMPLATE_STATIC_PATHS, not just directories.\"\"\"\n        settings = get_settings(PATH=self.content_path)\n        context = get_context(settings, staticfiles=[])\n\n        StaticGenerator(\n            context=context,\n            settings=settings,\n            path=settings[\"PATH\"],\n            output_path=self.temp_output,\n            theme=settings[\"THEME\"],\n        ).generate_output(None)\n\n        # The content of dirs listed in THEME_STATIC_PATHS (defaulting to\n        # \"static\") is put into the output\n        self.assertTrue(os.path.isdir(os.path.join(self.temp_output, \"theme/css/\")))\n        self.assertTrue(os.path.isdir(os.path.join(self.temp_output, \"theme/fonts/\")))\n\n    def test_theme_static_paths_files(self):\n        \"\"\"Test that StaticGenerator properly copies also files mentioned in\n        TEMPLATE_STATIC_PATHS, not just directories.\"\"\"\n        settings = get_settings(\n            PATH=self.content_path,\n            THEME_STATIC_PATHS=[\"static/css/fonts.css\", \"static/fonts/\"],\n        )\n        context = get_context(settings, staticfiles=[])\n\n        StaticGenerator(\n            context=context,\n            settings=settings,\n            path=settings[\"PATH\"],\n            output_path=self.temp_output,\n            theme=settings[\"THEME\"],\n        ).generate_output(None)\n\n        # Only the content of dirs and files listed in THEME_STATIC_PATHS are\n        # put into the output, not everything from static/\n        self.assertFalse(os.path.isdir(os.path.join(self.temp_output, \"theme/css/\")))\n        self.assertFalse(os.path.isdir(os.path.join(self.temp_output, \"theme/fonts/\")))\n\n        self.assertTrue(\n            os.path.isfile(\n                os.path.join(self.temp_output, \"theme/Yanone_Kaffeesatz_400.eot\")\n            )\n        )\n        self.assertTrue(\n            os.path.isfile(\n                os.path.join(self.temp_output, \"theme/Yanone_Kaffeesatz_400.svg\")\n            )\n        )\n        self.assertTrue(\n            os.path.isfile(\n                os.path.join(self.temp_output, \"theme/Yanone_Kaffeesatz_400.ttf\")\n            )\n        )\n        self.assertTrue(\n            os.path.isfile(\n                os.path.join(self.temp_output, \"theme/Yanone_Kaffeesatz_400.woff\")\n            )\n        )\n        self.assertTrue(\n            os.path.isfile(\n                os.path.join(self.temp_output, \"theme/Yanone_Kaffeesatz_400.woff2\")\n            )\n        )\n        self.assertTrue(\n            os.path.isfile(os.path.join(self.temp_output, \"theme/font.css\"))\n        )\n        self.assertTrue(\n            os.path.isfile(os.path.join(self.temp_output, \"theme/fonts.css\"))\n        )\n\n    def test_static_excludes(self):\n        \"\"\"Test that StaticGenerator respects STATIC_EXCLUDES.\"\"\"\n        settings = get_settings(\n            STATIC_EXCLUDES=[\"subdir\"],\n            PATH=self.content_path,\n            STATIC_PATHS=[\"\"],\n        )\n        context = get_context(settings)\n\n        StaticGenerator(\n            context=context,\n            settings=settings,\n            path=settings[\"PATH\"],\n            output_path=self.temp_output,\n            theme=settings[\"THEME\"],\n        ).generate_context()\n\n        staticnames = [os.path.basename(c.source_path) for c in context[\"staticfiles\"]]\n\n        self.assertNotIn(\n            \"subdir_fake_image.jpg\",\n            staticnames,\n            \"StaticGenerator processed a file in a STATIC_EXCLUDES directory\",\n        )\n        self.assertIn(\n            \"fake_image.jpg\",\n            staticnames,\n            \"StaticGenerator skipped a file that it should have included\",\n        )\n\n    def test_static_exclude_sources(self):\n        \"\"\"Test that StaticGenerator respects STATIC_EXCLUDE_SOURCES.\"\"\"\n\n        settings = get_settings(\n            STATIC_EXCLUDE_SOURCES=True,\n            PATH=self.content_path,\n            PAGE_PATHS=[\"\"],\n            STATIC_PATHS=[\"\"],\n            CACHE_CONTENT=False,\n        )\n        context = get_context(settings)\n\n        for generator_class in (PagesGenerator, StaticGenerator):\n            generator_class(\n                context=context,\n                settings=settings,\n                path=settings[\"PATH\"],\n                output_path=self.temp_output,\n                theme=settings[\"THEME\"],\n            ).generate_context()\n\n        staticnames = [os.path.basename(c.source_path) for c in context[\"staticfiles\"]]\n\n        self.assertFalse(\n            any(name.endswith(\".md\") for name in staticnames),\n            \"STATIC_EXCLUDE_SOURCES=True failed to exclude a markdown file\",\n        )\n\n        settings.update(STATIC_EXCLUDE_SOURCES=False)\n        context = get_context(settings)\n\n        for generator_class in (PagesGenerator, StaticGenerator):\n            generator_class(\n                context=context,\n                settings=settings,\n                path=settings[\"PATH\"],\n                output_path=self.temp_output,\n                theme=settings[\"THEME\"],\n            ).generate_context()\n\n        staticnames = [os.path.basename(c.source_path) for c in context[\"staticfiles\"]]\n\n        self.assertTrue(\n            any(name.endswith(\".md\") for name in staticnames),\n            \"STATIC_EXCLUDE_SOURCES=False failed to include a markdown file\",\n        )\n\n    def test_static_links(self):\n        \"\"\"Test that StaticGenerator uses files in static_links\"\"\"\n        settings = get_settings(\n            STATIC_EXCLUDES=[\"subdir\"],\n            PATH=self.content_path,\n            STATIC_PATHS=[],\n        )\n        context = get_context(settings)\n        context[\"static_links\"] |= {\"short_page.md\", \"subdir_fake_image.jpg\"}\n\n        StaticGenerator(\n            context=context,\n            settings=settings,\n            path=settings[\"PATH\"],\n            output_path=self.temp_output,\n            theme=settings[\"THEME\"],\n        ).generate_context()\n\n        staticfiles_names = [\n            os.path.basename(c.source_path) for c in context[\"staticfiles\"]\n        ]\n\n        static_content_names = [os.path.basename(c) for c in context[\"static_content\"]]\n\n        self.assertIn(\n            \"short_page.md\",\n            staticfiles_names,\n            \"StaticGenerator skipped a file that it should have included\",\n        )\n        self.assertIn(\n            \"short_page.md\",\n            static_content_names,\n            \"StaticGenerator skipped a file that it should have included\",\n        )\n        self.assertIn(\n            \"subdir_fake_image.jpg\",\n            staticfiles_names,\n            \"StaticGenerator skipped a file that it should have included\",\n        )\n        self.assertIn(\n            \"subdir_fake_image.jpg\",\n            static_content_names,\n            \"StaticGenerator skipped a file that it should have included\",\n        )\n\n    def test_copy_one_file(self):\n        with open(self.startfile, \"w\") as f:\n            f.write(\"staticcontent\")\n        self.generator.generate_context()\n        self.generator.generate_output(None)\n        with open(self.endfile) as f:\n            self.assertEqual(f.read(), \"staticcontent\")\n\n    def test_file_update_required_when_dest_does_not_exist(self):\n        staticfile = MagicMock()\n        staticfile.source_path = self.startfile\n        staticfile.save_as = self.endfile\n        with open(staticfile.source_path, \"w\") as f:\n            f.write(\"a\")\n        update_required = self.generator._file_update_required(staticfile)\n        self.assertTrue(update_required)\n\n    def test_dest_and_source_mtimes_are_equal(self):\n        staticfile = MagicMock()\n        staticfile.source_path = self.startfile\n        staticfile.save_as = self.endfile\n        self.settings[\"STATIC_CHECK_IF_MODIFIED\"] = True\n        with open(staticfile.source_path, \"w\") as f:\n            f.write(\"a\")\n        os.mkdir(os.path.join(self.temp_output, \"static\"))\n        copy(staticfile.source_path, staticfile.save_as)\n        isnewer = self.generator._source_is_newer(staticfile)\n        self.assertFalse(isnewer)\n\n    def test_source_is_newer(self):\n        staticfile = MagicMock()\n        staticfile.source_path = self.startfile\n        staticfile.save_as = self.endfile\n        with open(staticfile.source_path, \"w\") as f:\n            f.write(\"a\")\n        os.mkdir(os.path.join(self.temp_output, \"static\"))\n        copy(staticfile.source_path, staticfile.save_as)\n        self.set_ancient_mtime(staticfile.save_as)\n        isnewer = self.generator._source_is_newer(staticfile)\n        self.assertTrue(isnewer)\n\n    def test_skip_file_when_source_is_not_newer(self):\n        self.settings[\"STATIC_CHECK_IF_MODIFIED\"] = True\n        with open(self.startfile, \"w\") as f:\n            f.write(\"staticcontent\")\n        os.mkdir(os.path.join(self.temp_output, \"static\"))\n        with open(self.endfile, \"w\") as f:\n            f.write(\"staticcontent\")\n        expected = os.path.getmtime(self.endfile)\n        self.set_ancient_mtime(self.startfile)\n        self.generator.generate_context()\n        self.generator.generate_output(None)\n        self.assertEqual(os.path.getmtime(self.endfile), expected)\n\n    def test_dont_link_by_default(self):\n        with open(self.startfile, \"w\") as f:\n            f.write(\"staticcontent\")\n        self.generator.generate_context()\n        self.generator.generate_output(None)\n        self.assertFalse(os.path.samefile(self.startfile, self.endfile))\n\n    def test_output_file_is_linked_to_source(self):\n        self.settings[\"STATIC_CREATE_LINKS\"] = True\n        with open(self.startfile, \"w\") as f:\n            f.write(\"staticcontent\")\n        self.generator.generate_context()\n        self.generator.generate_output(None)\n        self.assertTrue(os.path.samefile(self.startfile, self.endfile))\n\n    def test_output_file_exists_and_is_newer(self):\n        self.settings[\"STATIC_CREATE_LINKS\"] = True\n        with open(self.startfile, \"w\") as f:\n            f.write(\"staticcontent\")\n        os.mkdir(os.path.join(self.temp_output, \"static\"))\n        with open(self.endfile, \"w\") as f:\n            f.write(\"othercontent\")\n        self.generator.generate_context()\n        self.generator.generate_output(None)\n        self.assertTrue(os.path.samefile(self.startfile, self.endfile))\n\n    @unittest.skipUnless(can_symlink(), \"No symlink privilege\")\n    def test_can_symlink_when_hardlink_not_possible(self):\n        self.settings[\"STATIC_CREATE_LINKS\"] = True\n        with open(self.startfile, \"w\") as f:\n            f.write(\"staticcontent\")\n        os.mkdir(os.path.join(self.temp_output, \"static\"))\n        self.generator.fallback_to_symlinks = True\n        self.generator.generate_context()\n        self.generator.generate_output(None)\n        self.assertTrue(os.path.islink(self.endfile))\n\n    @unittest.skipUnless(can_symlink(), \"No symlink privilege\")\n    def test_existing_symlink_is_considered_up_to_date(self):\n        self.settings[\"STATIC_CREATE_LINKS\"] = True\n        with open(self.startfile, \"w\") as f:\n            f.write(\"staticcontent\")\n        os.mkdir(os.path.join(self.temp_output, \"static\"))\n        os.symlink(self.startfile, self.endfile)\n        staticfile = MagicMock()\n        staticfile.source_path = self.startfile\n        staticfile.save_as = self.endfile\n        requires_update = self.generator._file_update_required(staticfile)\n        self.assertFalse(requires_update)\n\n    @unittest.skipUnless(can_symlink(), \"No symlink privilege\")\n    def test_invalid_symlink_is_overwritten(self):\n        self.settings[\"STATIC_CREATE_LINKS\"] = True\n        with open(self.startfile, \"w\") as f:\n            f.write(\"staticcontent\")\n        os.mkdir(os.path.join(self.temp_output, \"static\"))\n        os.symlink(\"invalid\", self.endfile)\n        staticfile = MagicMock()\n        staticfile.source_path = self.startfile\n        staticfile.save_as = self.endfile\n        requires_update = self.generator._file_update_required(staticfile)\n        self.assertTrue(requires_update)\n        self.generator.fallback_to_symlinks = True\n        self.generator.generate_context()\n        self.generator.generate_output(None)\n        self.assertTrue(os.path.islink(self.endfile))\n        self.assertEqual(\n            os.path.realpath(self.endfile), os.path.realpath(self.startfile)\n        )\n\n    def test_delete_existing_file_before_mkdir(self):\n        with open(self.startfile, \"w\") as f:\n            f.write(\"staticcontent\")\n        with open(os.path.join(self.temp_output, \"static\"), \"w\") as f:\n            f.write(\"This file should be a directory\")\n        self.generator.generate_context()\n        self.generator.generate_output(None)\n        self.assertTrue(os.path.isdir(os.path.join(self.temp_output, \"static\")))\n        self.assertTrue(os.path.isfile(self.endfile))\n\n\nclass TestJinja2Environment(TestCaseWithCLocale):\n    def setUp(self):\n        self.temp_content = mkdtemp(prefix=\"pelicantests.\")\n        self.temp_output = mkdtemp(prefix=\"pelicantests.\")\n\n    def tearDown(self):\n        rmtree(self.temp_content)\n        rmtree(self.temp_output)\n\n    def _test_jinja2_helper(self, additional_settings, content, expected):\n        settings = get_settings()\n        settings[\"STATIC_PATHS\"] = [\"static\"]\n        settings[\"TEMPLATE_PAGES\"] = {\"template/source.html\": \"generated/file.html\"}\n        settings.update(additional_settings)\n\n        generator = TemplatePagesGenerator(\n            context={\"foo\": \"foo\", \"bar\": \"bar\"},\n            settings=settings,\n            path=self.temp_content,\n            theme=\"\",\n            output_path=self.temp_output,\n        )\n\n        # create a dummy template file\n        template_dir = os.path.join(self.temp_content, \"template\")\n        template_path = os.path.join(template_dir, \"source.html\")\n        os.makedirs(template_dir)\n        with open(template_path, \"w\") as template_file:\n            template_file.write(content)\n\n        writer = Writer(self.temp_output, settings=settings)\n        generator.generate_output(writer)\n\n        output_path = os.path.join(self.temp_output, \"generated\", \"file.html\")\n\n        # output file has been generated\n        self.assertTrue(os.path.exists(output_path))\n\n        # output content is correct\n        with open(output_path) as output_file:\n            self.assertEqual(output_file.read(), expected)\n\n    def test_jinja2_filter(self):\n        \"\"\"JINJA_FILTERS adds custom filters to Jinja2 environment\"\"\"\n        content = \"foo: {{ foo|custom_filter }}, bar: {{ bar|custom_filter }}\"\n        settings = {\"JINJA_FILTERS\": {\"custom_filter\": lambda x: x.upper()}}\n        expected = \"foo: FOO, bar: BAR\"\n\n        self._test_jinja2_helper(settings, content, expected)\n\n    def test_jinja2_filter_plugin_enabled(self):\n        \"\"\"JINJA_FILTERS adds custom filters to Jinja2 environment\"\"\"\n        settings = {\"PLUGINS\": [\"legacy_plugin\", \"pelican.plugins.ns_plugin\"]}\n        jinja_template = (\n            \"{plugin}: \"\n            \"{{% if '{plugin}' is plugin_enabled %}}yes\"\n            \"{{% else %}}no{{% endif %}}\"\n        )\n        content = \" / \".join(\n            (\n                jinja_template.format(plugin=\"ns_plugin\"),\n                jinja_template.format(plugin=\"pelican.plugins.ns_plugin\"),\n                jinja_template.format(plugin=\"legacy_plugin\"),\n                jinja_template.format(plugin=\"unknown\"),\n            )\n        )\n        expected = (\n            \"ns_plugin: yes / \"\n            \"pelican.plugins.ns_plugin: yes / \"\n            \"legacy_plugin: yes / \"\n            \"unknown: no\"\n        )\n\n        self._test_jinja2_helper(settings, content, expected)\n\n    def test_jinja2_test(self):\n        \"\"\"JINJA_TESTS adds custom tests to Jinja2 environment\"\"\"\n        content = \"foo {{ foo is custom_test }}, bar {{ bar is custom_test }}\"\n        settings = {\"JINJA_TESTS\": {\"custom_test\": lambda x: x == \"bar\"}}\n        expected = \"foo False, bar True\"\n\n        self._test_jinja2_helper(settings, content, expected)\n\n    def test_jinja2_global(self):\n        \"\"\"JINJA_GLOBALS adds custom globals to Jinja2 environment\"\"\"\n        content = \"{{ custom_global }}\"\n        settings = {\"JINJA_GLOBALS\": {\"custom_global\": \"foobar\"}}\n        expected = \"foobar\"\n\n        self._test_jinja2_helper(settings, content, expected)\n\n    def test_jinja2_extension(self):\n        \"\"\"JINJA_ENVIRONMENT adds extensions to Jinja2 environment\"\"\"\n        content = \"{% set stuff = [] %}{% do stuff.append(1) %}{{ stuff }}\"\n        settings = {\"JINJA_ENVIRONMENT\": {\"extensions\": [\"jinja2.ext.do\"]}}\n        expected = \"[1]\"\n\n        self._test_jinja2_helper(settings, content, expected)\n"
  },
  {
    "path": "pelican/tests/test_importer.py",
    "content": "import os\nimport re\nfrom posixpath import join as posix_join\nfrom unittest.mock import patch\n\nfrom pelican.settings import DEFAULT_CONFIG\nfrom pelican.tests.support import (\n    TestCaseWithCLocale,\n    mute,\n    skipIfNoExecutable,\n    temporary_folder,\n    unittest,\n)\nfrom pelican.tools.pelican_import import (\n    blogger2fields,\n    build_header,\n    build_markdown_header,\n    decode_wp_content,\n    download_attachments,\n    fields2pelican,\n    get_attachments,\n    medium_slug,\n    mediumpost2fields,\n    mediumposts2fields,\n    strip_medium_post_content,\n    tumblr2fields,\n    wp2fields,\n)\nfrom pelican.utils import path_to_file_url, slugify\n\nCUR_DIR = os.path.abspath(os.path.dirname(__file__))\nBLOGGER_XML_SAMPLE = os.path.join(CUR_DIR, \"content\", \"bloggerexport.xml\")\nWORDPRESS_XML_SAMPLE = os.path.join(CUR_DIR, \"content\", \"wordpressexport.xml\")\nWORDPRESS_ENCODED_CONTENT_SAMPLE = os.path.join(\n    CUR_DIR, \"content\", \"wordpress_content_encoded\"\n)\nWORDPRESS_DECODED_CONTENT_SAMPLE = os.path.join(\n    CUR_DIR, \"content\", \"wordpress_content_decoded\"\n)\n\ntry:\n    from bs4 import BeautifulSoup\nexcept ImportError:\n    BeautifulSoup = False\n\ntry:\n    import bs4.builder._lxml as LXML\nexcept ImportError:\n    LXML = False\n\n\n@skipIfNoExecutable([\"pandoc\", \"--version\"])\n@unittest.skipUnless(BeautifulSoup, \"Needs BeautifulSoup module\")\nclass TestBloggerXmlImporter(TestCaseWithCLocale):\n    def setUp(self):\n        super().setUp()\n        self.posts = blogger2fields(BLOGGER_XML_SAMPLE)\n\n    def test_recognise_kind_and_title(self):\n        \"\"\"Check that importer only outputs pages, articles and comments,\n        that these are correctly identified and that titles are correct.\n        \"\"\"\n        test_posts = list(self.posts)\n        kinds = {x[8] for x in test_posts}\n        self.assertEqual({\"page\", \"article\", \"comment\"}, kinds)\n        page_titles = {x[0] for x in test_posts if x[8] == \"page\"}\n        self.assertEqual({\"Test page\", \"Test page 2\"}, page_titles)\n        article_titles = {x[0] for x in test_posts if x[8] == \"article\"}\n        self.assertEqual(\n            {\"Black as Egypt's Night\", \"The Steel Windpipe\"}, article_titles\n        )\n        comment_titles = {x[0] for x in test_posts if x[8] == \"comment\"}\n        self.assertEqual(\n            {\"Mishka, always a pleasure to read your adventures!...\"}, comment_titles\n        )\n\n    def test_recognise_status_with_correct_filename(self):\n        \"\"\"Check that importerer outputs only statuses 'published' and 'draft',\n        that these are correctly identified and that filenames are correct.\n        \"\"\"\n        test_posts = list(self.posts)\n        statuses = {x[7] for x in test_posts}\n        self.assertEqual({\"published\", \"draft\"}, statuses)\n\n        draft_filenames = {x[2] for x in test_posts if x[7] == \"draft\"}\n        # draft filenames are id-based\n        self.assertEqual(\n            {\"page-4386962582497458967\", \"post-1276418104709695660\"}, draft_filenames\n        )\n\n        published_filenames = {x[2] for x in test_posts if x[7] == \"published\"}\n        # published filenames are url-based, except comments\n        self.assertEqual(\n            {\"the-steel-windpipe\", \"test-page\", \"post-5590533389087749201\"},\n            published_filenames,\n        )\n\n\n@skipIfNoExecutable([\"pandoc\", \"--version\"])\n@unittest.skipUnless(BeautifulSoup, \"Needs BeautifulSoup module\")\nclass TestWordpressXmlImporter(TestCaseWithCLocale):\n    def setUp(self):\n        super().setUp()\n        self.posts = wp2fields(WORDPRESS_XML_SAMPLE)\n        self.custposts = wp2fields(WORDPRESS_XML_SAMPLE, True)\n\n    def test_ignore_empty_posts(self):\n        self.assertTrue(self.posts)\n        for (\n            title,\n            _content,\n            _fname,\n            _date,\n            _author,\n            _categ,\n            _tags,\n            _status,\n            _kind,\n            _format,\n        ) in self.posts:\n            self.assertTrue(title.strip())\n\n    def test_recognise_page_kind(self):\n        \"\"\"Check that we recognise pages in wordpress, as opposed to posts\"\"\"\n        self.assertTrue(self.posts)\n        # Collect (title, filename, kind) of non-empty posts recognised as page\n        pages_data = []\n        for (\n            title,\n            _content,\n            fname,\n            _date,\n            _author,\n            _categ,\n            _tags,\n            _status,\n            kind,\n            _format,\n        ) in self.posts:\n            if kind == \"page\":\n                pages_data.append((title, fname))\n        self.assertEqual(2, len(pages_data))\n        self.assertEqual((\"Page\", \"contact\"), pages_data[0])\n        self.assertEqual((\"Empty Page\", \"empty\"), pages_data[1])\n\n    def test_dirpage_directive_for_page_kind(self):\n        silent_f2p = mute(True)(fields2pelican)\n        test_post = filter(lambda p: p[0].startswith(\"Empty Page\"), self.posts)\n        with temporary_folder() as temp:\n            fname = next(iter(silent_f2p(test_post, \"markdown\", temp, dirpage=True)))\n            self.assertTrue(fname.endswith(f\"pages{os.path.sep}empty.md\"))\n\n    def test_dircat(self):\n        silent_f2p = mute(True)(fields2pelican)\n        test_posts = [\n            post\n            for post in self.posts\n            # check post has a category\n            if len(post[5]) > 0\n        ]\n        with temporary_folder() as temp:\n            fnames = list(silent_f2p(test_posts, \"markdown\", temp, dircat=True))\n        subs = DEFAULT_CONFIG[\"SLUG_REGEX_SUBSTITUTIONS\"]\n        index = 0\n        for post in test_posts:\n            name = post[2]\n            category = slugify(post[5][0], regex_subs=subs, preserve_case=True)\n            name += \".md\"\n            filename = os.path.join(category, name)\n            out_name = fnames[index]\n            self.assertTrue(out_name.endswith(filename))\n            index += 1\n\n    def test_unless_custom_post_all_items_should_be_pages_or_posts(self):\n        self.assertTrue(self.posts)\n        pages_data = []\n        for (\n            title,\n            _content,\n            fname,\n            _date,\n            _author,\n            _categ,\n            _tags,\n            _status,\n            kind,\n            _format,\n        ) in self.posts:\n            if kind in {\"page\", \"article\"}:\n                pass\n            else:\n                pages_data.append((title, fname))\n        self.assertEqual(0, len(pages_data))\n\n    def test_recognise_custom_post_type(self):\n        self.assertTrue(self.custposts)\n        cust_data = []\n        for (\n            title,\n            _content,\n            _fname,\n            _date,\n            _author,\n            _categ,\n            _tags,\n            _status,\n            kind,\n            _format,\n        ) in self.custposts:\n            if kind in {\"page\", \"article\"}:\n                pass\n            else:\n                cust_data.append((title, kind))\n        self.assertEqual(3, len(cust_data))\n        self.assertEqual((\"A custom post in category 4\", \"custom1\"), cust_data[0])\n        self.assertEqual((\"A custom post in category 5\", \"custom1\"), cust_data[1])\n        self.assertEqual(\n            (\"A 2nd custom post type also in category 5\", \"custom2\"), cust_data[2]\n        )\n\n    def test_custom_posts_put_in_own_dir(self):\n        silent_f2p = mute(True)(fields2pelican)\n        test_posts = []\n        for post in self.custposts:\n            # check post kind\n            if post[8] == \"article\" or post[8] == \"page\":\n                pass\n            else:\n                test_posts.append(post)\n        with temporary_folder() as temp:\n            fnames = list(silent_f2p(test_posts, \"markdown\", temp, wp_custpost=True))\n        index = 0\n        for post in test_posts:\n            name = post[2]\n            kind = post[8]\n            name += \".md\"\n            filename = os.path.join(kind, name)\n            out_name = fnames[index]\n            self.assertTrue(out_name.endswith(filename))\n            index += 1\n\n    def test_custom_posts_put_in_own_dir_and_catagory_sub_dir(self):\n        silent_f2p = mute(True)(fields2pelican)\n        test_posts = []\n        for post in self.custposts:\n            # check post kind\n            if post[8] == \"article\" or post[8] == \"page\":\n                pass\n            else:\n                test_posts.append(post)\n        with temporary_folder() as temp:\n            fnames = list(\n                silent_f2p(test_posts, \"markdown\", temp, wp_custpost=True, dircat=True)\n            )\n        subs = DEFAULT_CONFIG[\"SLUG_REGEX_SUBSTITUTIONS\"]\n        index = 0\n        for post in test_posts:\n            name = post[2]\n            kind = post[8]\n            category = slugify(post[5][0], regex_subs=subs, preserve_case=True)\n            name += \".md\"\n            filename = os.path.join(kind, category, name)\n            out_name = fnames[index]\n            self.assertTrue(out_name.endswith(filename))\n            index += 1\n\n    def test_wp_custpost_true_dirpage_false(self):\n        # pages should only be put in their own directory when dirpage = True\n        silent_f2p = mute(True)(fields2pelican)\n        test_posts = [\n            post\n            for post in self.custposts\n            # check post kind\n            if post[8] == \"page\"\n        ]\n        with temporary_folder() as temp:\n            fnames = list(\n                silent_f2p(\n                    test_posts, \"markdown\", temp, wp_custpost=True, dirpage=False\n                )\n            )\n        index = 0\n        for post in test_posts:\n            name = post[2]\n            name += \".md\"\n            filename = os.path.join(\"pages\", name)\n            out_name = fnames[index]\n            self.assertFalse(out_name.endswith(filename))\n\n    def test_can_toggle_raw_html_code_parsing(self):\n        test_posts = list(self.posts)\n\n        def r(f):\n            with open(f, encoding=\"utf-8\") as infile:\n                return infile.read()\n\n        silent_f2p = mute(True)(fields2pelican)\n\n        with temporary_folder() as temp:\n            rst_files = (r(f) for f in silent_f2p(test_posts, \"markdown\", temp))\n            self.assertTrue(any(\"<iframe\" in rst for rst in rst_files))\n            rst_files = (\n                r(f) for f in silent_f2p(test_posts, \"markdown\", temp, strip_raw=True)\n            )\n            self.assertFalse(any(\"<iframe\" in rst for rst in rst_files))\n            # no effect in rst\n            rst_files = (r(f) for f in silent_f2p(test_posts, \"rst\", temp))\n            self.assertFalse(any(\"<iframe\" in rst for rst in rst_files))\n            rst_files = (\n                r(f) for f in silent_f2p(test_posts, \"rst\", temp, strip_raw=True)\n            )\n            self.assertFalse(any(\"<iframe\" in rst for rst in rst_files))\n\n    def test_decode_html_entities_in_titles(self):\n        test_posts = [post for post in self.posts if post[2] == \"html-entity-test\"]\n        self.assertEqual(len(test_posts), 1)\n\n        post = test_posts[0]\n        title = post[0]\n        self.assertTrue(\n            title,\n            \"A normal post with some <html> entities in \"\n            \"the title. You can't miss them.\",\n        )\n        self.assertNotIn(\"&\", title)\n\n    def test_decode_wp_content_returns_empty(self):\n        \"\"\"Check that given an empty string we return an empty string.\"\"\"\n        self.assertEqual(decode_wp_content(\"\"), \"\")\n\n    def test_decode_wp_content(self):\n        \"\"\"Check that we can decode a wordpress content string.\"\"\"\n        with open(WORDPRESS_ENCODED_CONTENT_SAMPLE) as encoded_file:\n            encoded_content = encoded_file.read()\n            with open(WORDPRESS_DECODED_CONTENT_SAMPLE) as decoded_file:\n                decoded_content = decoded_file.read()\n                self.assertEqual(\n                    decode_wp_content(encoded_content, br=False), decoded_content\n                )\n\n    def test_preserve_verbatim_formatting(self):\n        def r(f):\n            with open(f, encoding=\"utf-8\") as infile:\n                return infile.read()\n\n        silent_f2p = mute(True)(fields2pelican)\n        test_post = filter(lambda p: p[0].startswith(\"Code in List\"), self.posts)\n        with temporary_folder() as temp:\n            md = next(r(f) for f in silent_f2p(test_post, \"markdown\", temp))\n            self.assertTrue(re.search(r\"\\s+a = \\[1, 2, 3\\]\", md))\n            self.assertTrue(re.search(r\"\\s+b = \\[4, 5, 6\\]\", md))\n\n            for_line = re.search(r\"\\s+for i in zip\\(a, b\\):\", md).group(0)\n            print_line = re.search(r\"\\s+print i\", md).group(0)\n            self.assertTrue(for_line.rindex(\"for\") < print_line.rindex(\"print\"))\n\n    def test_code_in_list(self):\n        def r(f):\n            with open(f, encoding=\"utf-8\") as infile:\n                return infile.read()\n\n        silent_f2p = mute(True)(fields2pelican)\n        test_post = filter(lambda p: p[0].startswith(\"Code in List\"), self.posts)\n        with temporary_folder() as temp:\n            md = next(r(f) for f in silent_f2p(test_post, \"markdown\", temp))\n            sample_line = re.search(r\"- This is a code sample\", md).group(0)\n            code_line = re.search(r\"\\s+a = \\[1, 2, 3\\]\", md).group(0)\n            self.assertTrue(sample_line.rindex(\"This\") < code_line.rindex(\"a\"))\n\n    def test_dont_use_smart_quotes(self):\n        def r(f):\n            with open(f, encoding=\"utf-8\") as infile:\n                return infile.read()\n\n        silent_f2p = mute(True)(fields2pelican)\n        test_post = filter(lambda p: p[0].startswith(\"Post with raw data\"), self.posts)\n        with temporary_folder() as temp:\n            md = next(r(f) for f in silent_f2p(test_post, \"markdown\", temp))\n            escaped_quotes = re.search(r'\\\\[\\'\"“”‘’]', md)  # noqa: RUF001\n            self.assertFalse(escaped_quotes)\n\n    def test_convert_caption_to_figure(self):\n        def r(f):\n            with open(f, encoding=\"utf-8\") as infile:\n                return infile.read()\n\n        silent_f2p = mute(True)(fields2pelican)\n        test_post = filter(lambda p: p[0].startswith(\"Caption on image\"), self.posts)\n        with temporary_folder() as temp:\n            md = next(r(f) for f in silent_f2p(test_post, \"markdown\", temp))\n\n        caption = re.search(r\"\\[caption\", md)\n        self.assertFalse(caption)\n\n        for occurence in [\n            \"/theme/img/xpelican.png.pagespeed.ic.Rjep0025-y.png\",\n            \"/theme/img/xpelican-3.png.pagespeed.ic.m-NAIdRCOM.png\",\n            \"/theme/img/xpelican.png.pagespeed.ic.Rjep0025-y.png\",\n            \"This is a pelican\",\n            \"This also a pelican\",\n            \"Yet another pelican\",\n        ]:\n            # pandoc 2.x converts into ![text](src)\n            # pandoc 3.x converts into <figure>src<figcaption>text</figcaption></figure>\n            self.assertIn(occurence, md)\n\n\nclass TestBuildHeader(unittest.TestCase):\n    def test_build_header(self):\n        header = build_header(\"test\", None, None, None, None, None)\n        self.assertEqual(header, \"test\\n####\\n\\n\")\n\n    def test_build_header_with_fields(self):\n        header_data = [\n            \"Test Post\",\n            \"2014-11-04\",\n            \"Alexis Métaireau\",\n            [\"Programming\"],\n            [\"Pelican\", \"Python\"],\n            \"test-post\",\n        ]\n\n        expected_docutils = \"\\n\".join(\n            [\n                \"Test Post\",\n                \"#########\",\n                \":date: 2014-11-04\",\n                \":author: Alexis Métaireau\",\n                \":category: Programming\",\n                \":tags: Pelican, Python\",\n                \":slug: test-post\",\n                \"\\n\",\n            ]\n        )\n\n        expected_md = \"\\n\".join(\n            [\n                \"Title: Test Post\",\n                \"Date: 2014-11-04\",\n                \"Author: Alexis Métaireau\",\n                \"Category: Programming\",\n                \"Tags: Pelican, Python\",\n                \"Slug: test-post\",\n                \"\\n\",\n            ]\n        )\n\n        self.assertEqual(build_header(*header_data), expected_docutils)\n        self.assertEqual(build_markdown_header(*header_data), expected_md)\n\n    def test_build_header_with_east_asian_characters(self):\n        header = build_header(\n            \"これは広い幅の文字だけで構成されたタイトルです\",\n            None,\n            None,\n            None,\n            None,\n            None,\n        )\n\n        self.assertEqual(\n            header,\n            (\n                \"これは広い幅の文字だけで構成されたタイトルです\\n\"\n                \"##############################################\"\n                \"\\n\\n\"\n            ),\n        )\n\n    def test_galleries_added_to_header(self):\n        header = build_header(\n            \"test\",\n            None,\n            None,\n            None,\n            None,\n            None,\n            attachments=[\"output/test1\", \"output/test2\"],\n        )\n        self.assertEqual(\n            header, (\"test\\n####\\n:attachments: output/test1, output/test2\\n\\n\")\n        )\n\n    def test_galleries_added_to_markdown_header(self):\n        header = build_markdown_header(\n            \"test\",\n            None,\n            None,\n            None,\n            None,\n            None,\n            attachments=[\"output/test1\", \"output/test2\"],\n        )\n        self.assertEqual(\n            header, \"Title: test\\nAttachments: output/test1, output/test2\\n\\n\"\n        )\n\n\n@unittest.skipUnless(BeautifulSoup, \"Needs BeautifulSoup module\")\n@unittest.skipUnless(LXML, \"Needs lxml module\")\nclass TestWordpressXMLAttachements(TestCaseWithCLocale):\n    def setUp(self):\n        super().setUp()\n        self.attachments = get_attachments(WORDPRESS_XML_SAMPLE)\n\n    def test_recognise_attachments(self):\n        self.assertTrue(self.attachments)\n        self.assertEqual(3, len(self.attachments.keys()))\n\n    def test_attachments_associated_with_correct_post(self):\n        self.assertTrue(self.attachments)\n        for post in self.attachments.keys():\n            if post is None:\n                expected = {\n                    (\n                        \"https://upload.wikimedia.org/wikipedia/commons/\"\n                        \"thumb/2/2c/Pelican_lakes_entrance02.jpg/\"\n                        \"240px-Pelican_lakes_entrance02.jpg\"\n                    )\n                }\n                self.assertEqual(self.attachments[post], expected)\n            elif post == \"with-excerpt\":\n                expected_invalid = (\n                    \"http://thisurlisinvalid.notarealdomain/not_an_image.jpg\"\n                )\n                expected_pelikan = (\n                    \"http://en.wikipedia.org/wiki/File:Pelikan_Walvis_Bay.jpg\"\n                )\n                self.assertEqual(\n                    self.attachments[post], {expected_invalid, expected_pelikan}\n                )\n            elif post == \"with-tags\":\n                expected_invalid = \"http://thisurlisinvalid.notarealdomain\"\n                self.assertEqual(self.attachments[post], {expected_invalid})\n            else:\n                self.fail(f\"all attachments should match to a filename or None, {post}\")\n\n    def test_download_attachments(self):\n        real_file = os.path.join(CUR_DIR, \"content/article.rst\")\n        good_url = path_to_file_url(real_file)\n        bad_url = \"http://localhost:1/not_a_file.txt\"\n        silent_da = mute()(download_attachments)\n        with temporary_folder() as temp:\n            locations = list(silent_da(temp, [good_url, bad_url]))\n            self.assertEqual(1, len(locations))\n            directory = locations[0]\n            self.assertTrue(\n                directory.endswith(posix_join(\"content\", \"article.rst\")), directory\n            )\n\n\nclass TestTumblrImporter(TestCaseWithCLocale):\n    @patch(\"pelican.tools.pelican_import._get_tumblr_posts\")\n    def test_posts(self, get):\n        def get_posts(_api_key, _blogname, offset=0):\n            if offset > 0:\n                return []\n\n            return [\n                {\n                    \"type\": \"photo\",\n                    \"blog_name\": \"testy\",\n                    \"date\": \"2019-11-07 21:26:40 UTC\",\n                    \"timestamp\": 1573162000,\n                    \"format\": \"html\",\n                    \"slug\": \"a-slug\",\n                    \"tags\": [\"economics\"],\n                    \"state\": \"published\",\n                    \"photos\": [\n                        {\n                            \"caption\": \"\",\n                            \"original_size\": {\n                                \"url\": \"https://..fccdc2360ba7182a.jpg\",\n                                \"width\": 634,\n                                \"height\": 789,\n                            },\n                        }\n                    ],\n                }\n            ]\n\n        get.side_effect = get_posts\n\n        posts = list(tumblr2fields(\"api_key\", \"blogname\"))\n        self.assertEqual(\n            [\n                (\n                    \"Photo\",\n                    '<img alt=\"\" src=\"https://..fccdc2360ba7182a.jpg\" />\\n',\n                    \"2019-11-07-a-slug\",\n                    \"2019-11-07 21:26:40+0000\",\n                    \"testy\",\n                    [\"photo\"],\n                    [\"economics\"],\n                    \"published\",\n                    \"article\",\n                    \"html\",\n                )\n            ],\n            posts,\n            posts,\n        )\n\n    @patch(\"pelican.tools.pelican_import._get_tumblr_posts\")\n    def test_video_embed(self, get):\n        def get_posts(_api_key, _blogname, offset=0):\n            if offset > 0:\n                return []\n\n            return [\n                {\n                    \"type\": \"video\",\n                    \"blog_name\": \"testy\",\n                    \"slug\": \"the-slug\",\n                    \"date\": \"2017-07-07 20:31:41 UTC\",\n                    \"timestamp\": 1499459501,\n                    \"state\": \"published\",\n                    \"format\": \"html\",\n                    \"tags\": [],\n                    \"source_url\": \"https://href.li/?https://www.youtube.com/a\",\n                    \"source_title\": \"youtube.com\",\n                    \"caption\": \"<p>Caption</p>\",\n                    \"player\": [\n                        {\"width\": 250, \"embed_code\": \"<iframe>1</iframe>\"},\n                        {\"width\": 400, \"embed_code\": \"<iframe>2</iframe>\"},\n                        {\"width\": 500, \"embed_code\": \"<iframe>3</iframe>\"},\n                    ],\n                    \"video_type\": \"youtube\",\n                }\n            ]\n\n        get.side_effect = get_posts\n\n        posts = list(tumblr2fields(\"api_key\", \"blogname\"))\n        self.assertEqual(\n            [\n                (\n                    \"youtube.com\",\n                    '<p><a href=\"https://href.li/?'\n                    'https://www.youtube.com/a\">via</a></p>\\n<p>Caption</p>'\n                    \"<iframe>1</iframe>\\n\"\n                    \"<iframe>2</iframe>\\n\"\n                    \"<iframe>3</iframe>\\n\",\n                    \"2017-07-07-the-slug\",\n                    \"2017-07-07 20:31:41+0000\",\n                    \"testy\",\n                    [\"video\"],\n                    [],\n                    \"published\",\n                    \"article\",\n                    \"html\",\n                )\n            ],\n            posts,\n            posts,\n        )\n\n    @patch(\"pelican.tools.pelican_import._get_tumblr_posts\")\n    def test_broken_video_embed(self, get):\n        def get_posts(_api_key, _blogname, offset=0):\n            if offset > 0:\n                return []\n\n            return [\n                {\n                    \"type\": \"video\",\n                    \"blog_name\": \"testy\",\n                    \"slug\": \"the-slug\",\n                    \"date\": \"2016-08-14 16:37:35 UTC\",\n                    \"timestamp\": 1471192655,\n                    \"state\": \"published\",\n                    \"format\": \"html\",\n                    \"tags\": [\"interviews\"],\n                    \"source_url\": \"https://href.li/?https://www.youtube.com/watch?v=b\",\n                    \"source_title\": \"youtube.com\",\n                    \"caption\": \"<p>Caption</p>\",\n                    \"player\": [\n                        {\n                            \"width\": 250,\n                            # If video is gone, embed_code is False\n                            \"embed_code\": False,\n                        },\n                        {\"width\": 400, \"embed_code\": False},\n                        {\"width\": 500, \"embed_code\": False},\n                    ],\n                    \"video_type\": \"youtube\",\n                }\n            ]\n\n        get.side_effect = get_posts\n\n        posts = list(tumblr2fields(\"api_key\", \"blogname\"))\n        self.assertEqual(\n            [\n                (\n                    \"youtube.com\",\n                    '<p><a href=\"https://href.li/?https://www.youtube.com/watch?'\n                    'v=b\">via</a></p>\\n<p>Caption</p>'\n                    \"<p>(This video isn't available anymore.)</p>\\n\",\n                    \"2016-08-14-the-slug\",\n                    \"2016-08-14 16:37:35+0000\",\n                    \"testy\",\n                    [\"video\"],\n                    [\"interviews\"],\n                    \"published\",\n                    \"article\",\n                    \"html\",\n                )\n            ],\n            posts,\n            posts,\n        )\n\n\nclass TestMediumImporter(TestCaseWithCLocale):\n    def setUp(self):\n        super().setUp()\n        self.test_content_root = \"pelican/tests/content\"\n        # The content coming out of parsing is similar, but not the same.\n        # Beautiful soup rearranges the order of attributes, for example.\n        # So, we keep a copy of the content for the test.\n        content_filename = f\"{self.test_content_root}/medium_post_content.txt\"\n        with open(content_filename, encoding=\"utf-8\") as the_content_file:\n            # Many editors and scripts add a final newline, so live with that\n            # in our test\n            the_content = the_content_file.read()\n            assert the_content[-1] == \"\\n\"\n            the_content = the_content[:-1]\n        self.post_tuple = (\n            \"A title\",\n            the_content,\n            # slug:\n            \"2017-04-21-medium-post\",\n            \"2017-04-21 17:11\",\n            \"User Name\",\n            None,\n            (),\n            \"published\",\n            \"article\",\n            \"html\",\n        )\n\n    def test_mediumpost2field(self):\n        \"\"\"Parse one post\"\"\"\n        post_filename = f\"{self.test_content_root}/medium_posts/2017-04-21_-medium-post--d1bf01d62ba3.html\"\n        val = mediumpost2fields(post_filename)\n        self.assertEqual(self.post_tuple, val, val)\n\n    def test_mediumposts2field(self):\n        \"\"\"Parse all posts in an export directory\"\"\"\n        posts = list(mediumposts2fields(f\"{self.test_content_root}/medium_posts\"))\n        self.assertEqual(1, len(posts))\n        self.assertEqual(self.post_tuple, posts[0])\n\n    def test_strip_content(self):\n        \"\"\"Strip out unhelpful tags\"\"\"\n        html_doc = (\n            \"<section>This keeps <i>lots</i> of <b>tags</b>, but not \"\n            \"the <section>section</section> tags</section>\"\n        )\n        soup = BeautifulSoup(html_doc, \"html.parser\")\n        self.assertEqual(\n            \"This keeps <i>lots</i> of <b>tags</b>, but not the section tags\",\n            strip_medium_post_content(soup),\n        )\n\n    def test_medium_slug(self):\n        # Remove hex stuff at the end\n        self.assertEqual(\n            \"2017-04-27_A-long-title\",\n            medium_slug(\n                \"medium-export/posts/2017-04-27_A-long-title--2971442227dd.html\"\n            ),\n        )\n        # Remove \"--DRAFT\" at the end\n        self.assertEqual(\n            \"2017-04-27_A-long-title\",\n            medium_slug(\"medium-export/posts/2017-04-27_A-long-title--DRAFT.html\"),\n        )\n        # Remove both (which happens)\n        self.assertEqual(\n            \"draft_How-to-do\", medium_slug(\"draft_How-to-do--DRAFT--87225c81dddd.html\")\n        )\n        # If no hex stuff, leave it alone\n        self.assertEqual(\n            \"2017-04-27_A-long-title\",\n            medium_slug(\"medium-export/posts/2017-04-27_A-long-title.html\"),\n        )\n"
  },
  {
    "path": "pelican/tests/test_log.py",
    "content": "import logging\nimport unittest\nfrom collections import defaultdict\nfrom contextlib import contextmanager\n\nfrom pelican import log\nfrom pelican.tests.support import LogCountHandler\n\n\nclass TestLog(unittest.TestCase):\n    def setUp(self):\n        super().setUp()\n        self.logger = logging.getLogger(__name__)\n        self.handler = LogCountHandler()\n        self.logger.addHandler(self.handler)\n\n    def tearDown(self):\n        self._reset_limit_filter()\n        super().tearDown()\n\n    def _reset_limit_filter(self):\n        log.LimitFilter._ignore = set()\n        log.LimitFilter._raised_messages = set()\n        log.LimitFilter._threshold = 5\n        log.LimitFilter._group_count = defaultdict(int)\n\n    @contextmanager\n    def reset_logger(self):\n        try:\n            yield None\n        finally:\n            self._reset_limit_filter()\n            self.handler.flush()\n\n    def test_log_filter(self):\n        def do_logging():\n            for i in range(5):\n                self.logger.warning(\"Log %s\", i)\n                self.logger.warning(\"Another log %s\", i)\n\n        # no filter\n        with self.reset_logger():\n            do_logging()\n            self.assertEqual(self.handler.count_logs(\"Log \\\\d\", logging.WARNING), 5)\n            self.assertEqual(\n                self.handler.count_logs(\"Another log \\\\d\", logging.WARNING), 5\n            )\n\n        # filter by template\n        with self.reset_logger():\n            log.LimitFilter._ignore.add((logging.WARNING, \"Log %s\"))\n            do_logging()\n            self.assertEqual(self.handler.count_logs(\"Log \\\\d\", logging.WARNING), 0)\n            self.assertEqual(\n                self.handler.count_logs(\"Another log \\\\d\", logging.WARNING), 5\n            )\n\n        # filter by exact message\n        with self.reset_logger():\n            log.LimitFilter._ignore.add((logging.WARNING, \"Log 3\"))\n            do_logging()\n            self.assertEqual(self.handler.count_logs(\"Log \\\\d\", logging.WARNING), 4)\n            self.assertEqual(\n                self.handler.count_logs(\"Another log \\\\d\", logging.WARNING), 5\n            )\n\n        # filter by both\n        with self.reset_logger():\n            log.LimitFilter._ignore.add((logging.WARNING, \"Log 3\"))\n            log.LimitFilter._ignore.add((logging.WARNING, \"Another log %s\"))\n            do_logging()\n            self.assertEqual(self.handler.count_logs(\"Log \\\\d\", logging.WARNING), 4)\n            self.assertEqual(\n                self.handler.count_logs(\"Another log \\\\d\", logging.WARNING), 0\n            )\n"
  },
  {
    "path": "pelican/tests/test_paginator.py",
    "content": "import locale\n\nfrom jinja2.utils import generate_lorem_ipsum\n\nfrom pelican.contents import Article, Author\nfrom pelican.paginator import PaginationRule, Paginator\nfrom pelican.settings import DEFAULT_CONFIG\nfrom pelican.tests.support import get_settings, unittest\n\n# generate one paragraph, enclosed with <p>\nTEST_CONTENT = str(generate_lorem_ipsum(n=1))\nTEST_SUMMARY = generate_lorem_ipsum(n=1, html=False)\n\n\nclass TestPage(unittest.TestCase):\n    def setUp(self):\n        super().setUp()\n        self.old_locale = locale.setlocale(locale.LC_ALL)\n        locale.setlocale(locale.LC_ALL, \"C\")\n        self.page_kwargs = {\n            \"content\": TEST_CONTENT,\n            \"context\": {\n                \"localsiteurl\": \"\",\n            },\n            \"metadata\": {\n                \"summary\": TEST_SUMMARY,\n                \"title\": \"foo bar\",\n            },\n            \"source_path\": \"/path/to/file/foo.ext\",\n        }\n\n    def tearDown(self):\n        locale.setlocale(locale.LC_ALL, self.old_locale)\n\n    def test_save_as_preservation(self):\n        settings = get_settings()\n        # fix up pagination rules\n        pagination_rules = [\n            PaginationRule(*r)\n            for r in settings.get(\n                \"PAGINATION_PATTERNS\",\n                DEFAULT_CONFIG[\"PAGINATION_PATTERNS\"],\n            )\n        ]\n        settings[\"PAGINATION_PATTERNS\"] = sorted(\n            pagination_rules,\n            key=lambda r: r[0],\n        )\n\n        self.page_kwargs[\"metadata\"][\"author\"] = Author(\"Blogger\", settings)\n        object_list = [Article(**self.page_kwargs), Article(**self.page_kwargs)]\n        paginator = Paginator(\"foobar.foo\", \"foobar/foo\", object_list, settings)\n        page = paginator.page(1)\n        self.assertEqual(page.save_as, \"foobar.foo\")\n\n    def test_custom_pagination_pattern(self):\n        settings = get_settings()\n        settings[\"PAGINATION_PATTERNS\"] = [\n            PaginationRule(*r)\n            for r in [\n                (1, \"/{url}\", \"{base_name}/index.html\"),\n                (2, \"/{url}{number}/\", \"{base_name}/{number}/index.html\"),\n            ]\n        ]\n\n        self.page_kwargs[\"metadata\"][\"author\"] = Author(\"Blogger\", settings)\n        object_list = [Article(**self.page_kwargs), Article(**self.page_kwargs)]\n        paginator = Paginator(\n            \"blog/index.html\", \"//blog.my.site/\", object_list, settings, 1\n        )\n        # The URL *has to* stay absolute (with // in the front), so verify that\n        page1 = paginator.page(1)\n        self.assertEqual(page1.save_as, \"blog/index.html\")\n        self.assertEqual(page1.url, \"//blog.my.site/\")\n        page2 = paginator.page(2)\n        self.assertEqual(page2.save_as, \"blog/2/index.html\")\n        self.assertEqual(page2.url, \"//blog.my.site/2/\")\n\n    def test_custom_pagination_pattern_last_page(self):\n        settings = get_settings()\n        settings[\"PAGINATION_PATTERNS\"] = [\n            PaginationRule(*r)\n            for r in [\n                (1, \"/{url}1/\", \"{base_name}/1/index.html\"),\n                (2, \"/{url}{number}/\", \"{base_name}/{number}/index.html\"),\n                (-1, \"/{url}\", \"{base_name}/index.html\"),\n            ]\n        ]\n\n        self.page_kwargs[\"metadata\"][\"author\"] = Author(\"Blogger\", settings)\n        object_list = [\n            Article(**self.page_kwargs),\n            Article(**self.page_kwargs),\n            Article(**self.page_kwargs),\n        ]\n        paginator = Paginator(\n            \"blog/index.html\", \"//blog.my.site/\", object_list, settings, 1\n        )\n        # The URL *has to* stay absolute (with // in the front), so verify that\n        page1 = paginator.page(1)\n        self.assertEqual(page1.save_as, \"blog/1/index.html\")\n        self.assertEqual(page1.url, \"//blog.my.site/1/\")\n        page2 = paginator.page(2)\n        self.assertEqual(page2.save_as, \"blog/2/index.html\")\n        self.assertEqual(page2.url, \"//blog.my.site/2/\")\n        page3 = paginator.page(3)\n        self.assertEqual(page3.save_as, \"blog/index.html\")\n        self.assertEqual(page3.url, \"//blog.my.site/\")\n"
  },
  {
    "path": "pelican/tests/test_pelican.py",
    "content": "import contextlib\nimport io\nimport locale\nimport logging\nimport os\nimport subprocess\nimport sys\nimport unittest\nfrom collections.abc import Sequence\nfrom shutil import rmtree\nfrom tempfile import TemporaryDirectory, mkdtemp\nfrom unittest.mock import PropertyMock, patch\n\nfrom rich.console import Console\n\nimport pelican.readers\nfrom pelican import Pelican, __version__, main\nfrom pelican.generators import StaticGenerator\nfrom pelican.settings import read_settings\nfrom pelican.tests.support import (\n    LoggedTestCase,\n    diff_subproc,\n    locale_available,\n    mute,\n    skipIfNoExecutable,\n)\n\nCURRENT_DIR = os.path.dirname(os.path.abspath(__file__))\nSAMPLES_PATH = os.path.abspath(\n    os.path.join(CURRENT_DIR, os.pardir, os.pardir, \"samples\")\n)\nOUTPUT_PATH = os.path.abspath(os.path.join(CURRENT_DIR, \"output\"))\n\nINPUT_PATH = os.path.join(SAMPLES_PATH, \"content\")\nSAMPLE_CONFIG = os.path.join(SAMPLES_PATH, \"pelican.conf.py\")\nSAMPLE_FR_CONFIG = os.path.join(SAMPLES_PATH, \"pelican.conf_FR.py\")\n\n\ndef recursiveDiff(dcmp):\n    diff = {\n        \"diff_files\": [os.path.join(dcmp.right, f) for f in dcmp.diff_files],\n        \"left_only\": [os.path.join(dcmp.right, f) for f in dcmp.left_only],\n        \"right_only\": [os.path.join(dcmp.right, f) for f in dcmp.right_only],\n    }\n    for sub_dcmp in dcmp.subdirs.values():\n        for k, v in recursiveDiff(sub_dcmp).items():\n            diff[k] += v\n    return diff\n\n\nclass TestPelican(LoggedTestCase):\n    # general functional testing for pelican. Basically, this test case tries\n    # to run pelican in different situations and see how it behaves\n\n    def setUp(self):\n        super().setUp()\n        self.temp_path = mkdtemp(prefix=\"pelicantests.\")\n        self.temp_cache = mkdtemp(prefix=\"pelican_cache.\")\n        self.maxDiff = None\n        self.old_locale = locale.setlocale(locale.LC_ALL)\n        locale.setlocale(locale.LC_ALL, \"C\")\n\n    def tearDown(self):\n        read_settings()  # cleanup PYGMENTS_RST_OPTIONS\n        rmtree(self.temp_path)\n        rmtree(self.temp_cache)\n        locale.setlocale(locale.LC_ALL, self.old_locale)\n        super().tearDown()\n\n    def assertDirsEqual(self, left_path, right_path, msg=None):\n        \"\"\"\n        Check if the files are the same (ignoring whitespace) below both paths.\n        \"\"\"\n        proc = diff_subproc(left_path, right_path)\n\n        out, err = proc.communicate()\n        if proc.returncode != 0:\n            msg = self._formatMessage(\n                msg,\n                f\"{left_path} and {right_path} differ:\\nstdout:\\n{out}\\nstderr\\n{err}\",\n            )\n            raise self.failureException(msg)\n\n    def test_order_of_generators(self):\n        # StaticGenerator must run last, so it can identify files that\n        # were skipped by the other generators, and so static files can\n        # have their output paths overridden by the {attach} link syntax.\n\n        pelican = Pelican(settings=read_settings(path=None))\n        generator_classes = pelican._get_generator_classes()\n\n        self.assertTrue(\n            generator_classes[-1] is StaticGenerator,\n            \"StaticGenerator must be the last generator, but it isn't!\",\n        )\n        self.assertIsInstance(\n            generator_classes,\n            Sequence,\n            \"_get_generator_classes() must return a Sequence to preserve order\",\n        )\n\n    @skipIfNoExecutable([\"git\", \"--version\"])\n    def test_basic_generation_works(self):\n        # when running pelican without settings, it should pick up the default\n        # ones and generate correct output without raising any exception\n        settings = read_settings(\n            path=None,\n            override={\n                \"PATH\": INPUT_PATH,\n                \"OUTPUT_PATH\": self.temp_path,\n                \"CACHE_PATH\": self.temp_cache,\n                \"LOCALE\": locale.normalize(\"en_US\"),\n            },\n        )\n        pelican = Pelican(settings=settings)\n        mute(True)(pelican.run)()\n        self.assertDirsEqual(self.temp_path, os.path.join(OUTPUT_PATH, \"basic\"))\n        self.assertLogCountEqual(\n            count=1,\n            msg=\"Unable to find.*skipping url replacement\",\n            level=logging.WARNING,\n        )\n\n    @skipIfNoExecutable([\"git\", \"--version\"])\n    def test_custom_generation_works(self):\n        # the same thing with a specified set of settings should work\n        settings = read_settings(\n            path=SAMPLE_CONFIG,\n            override={\n                \"PATH\": INPUT_PATH,\n                \"OUTPUT_PATH\": self.temp_path,\n                \"CACHE_PATH\": self.temp_cache,\n                \"LOCALE\": locale.normalize(\"en_US.UTF-8\"),\n            },\n        )\n        pelican = Pelican(settings=settings)\n        mute(True)(pelican.run)()\n        self.assertDirsEqual(self.temp_path, os.path.join(OUTPUT_PATH, \"custom\"))\n\n    @skipIfNoExecutable([\"git\", \"--version\"])\n    @unittest.skipUnless(\n        locale_available(\"fr_FR.UTF-8\") or locale_available(\"French\"),\n        \"French locale needed\",\n    )\n    def test_custom_locale_generation_works(self):\n        \"\"\"Test that generation with fr_FR.UTF-8 locale works\"\"\"\n        if sys.platform == \"win32\":\n            our_locale = \"French\"\n        else:\n            our_locale = \"fr_FR.UTF-8\"\n\n        settings = read_settings(\n            path=SAMPLE_FR_CONFIG,\n            override={\n                \"PATH\": INPUT_PATH,\n                \"OUTPUT_PATH\": self.temp_path,\n                \"CACHE_PATH\": self.temp_cache,\n                \"LOCALE\": our_locale,\n            },\n        )\n        pelican = Pelican(settings=settings)\n        mute(True)(pelican.run)()\n        self.assertDirsEqual(self.temp_path, os.path.join(OUTPUT_PATH, \"custom_locale\"))\n\n    def test_theme_static_paths_copy(self):\n        # the same thing with a specified set of settings should work\n        settings = read_settings(\n            path=SAMPLE_CONFIG,\n            override={\n                \"PATH\": INPUT_PATH,\n                \"OUTPUT_PATH\": self.temp_path,\n                \"CACHE_PATH\": self.temp_cache,\n                \"THEME_STATIC_PATHS\": [\n                    os.path.join(SAMPLES_PATH, \"very\"),\n                    os.path.join(SAMPLES_PATH, \"kinda\"),\n                    os.path.join(SAMPLES_PATH, \"theme_standard\"),\n                ],\n            },\n        )\n        pelican = Pelican(settings=settings)\n        mute(True)(pelican.run)()\n        theme_output = os.path.join(self.temp_path, \"theme\")\n        extra_path = os.path.join(theme_output, \"exciting\", \"new\", \"files\")\n\n        for file in [\"a_stylesheet\", \"a_template\"]:\n            self.assertTrue(os.path.exists(os.path.join(theme_output, file)))\n\n        for file in [\"wow!\", \"boom!\", \"bap!\", \"zap!\"]:\n            self.assertTrue(os.path.exists(os.path.join(extra_path, file)))\n\n    def test_theme_static_paths_copy_single_file(self):\n        # the same thing with a specified set of settings should work\n        settings = read_settings(\n            path=SAMPLE_CONFIG,\n            override={\n                \"PATH\": INPUT_PATH,\n                \"OUTPUT_PATH\": self.temp_path,\n                \"CACHE_PATH\": self.temp_cache,\n                \"THEME_STATIC_PATHS\": [os.path.join(SAMPLES_PATH, \"theme_standard\")],\n            },\n        )\n\n        pelican = Pelican(settings=settings)\n        mute(True)(pelican.run)()\n        theme_output = os.path.join(self.temp_path, \"theme\")\n\n        for file in [\"a_stylesheet\", \"a_template\"]:\n            self.assertTrue(os.path.exists(os.path.join(theme_output, file)))\n\n    def test_cyclic_intersite_links_no_warnings(self):\n        settings = read_settings(\n            path=None,\n            override={\n                \"PATH\": os.path.join(CURRENT_DIR, \"cyclic_intersite_links\"),\n                \"OUTPUT_PATH\": self.temp_path,\n                \"CACHE_PATH\": self.temp_cache,\n            },\n        )\n        pelican = Pelican(settings=settings)\n        mute(True)(pelican.run)()\n        # There are four different intersite links:\n        # - one pointing to the second article from first and third\n        # - one pointing to the first article from second and third\n        # - one pointing to the third article from first and second\n        # - one pointing to a nonexistent from each\n        # If everything goes well, only the warning about the nonexistent\n        # article should be printed. Only two articles are not sufficient,\n        # since the first will always have _context['generated_content'] empty\n        # (thus skipping the link resolving) and the second will always have it\n        # non-empty, containing the first, thus always succeeding.\n        self.assertLogCountEqual(\n            count=1,\n            msg=\"Unable to find '.*\\\\.rst', skipping url replacement.\",\n            level=logging.WARNING,\n        )\n\n    def test_md_extensions_deprecation(self):\n        \"\"\"Test that a warning is issued if MD_EXTENSIONS is used\"\"\"\n        settings = read_settings(\n            path=None,\n            override={\n                \"PATH\": INPUT_PATH,\n                \"OUTPUT_PATH\": self.temp_path,\n                \"CACHE_PATH\": self.temp_cache,\n                \"MD_EXTENSIONS\": {},\n            },\n        )\n        pelican = Pelican(settings=settings)\n        mute(True)(pelican.run)()\n        self.assertLogCountEqual(\n            count=1,\n            msg=\"MD_EXTENSIONS is deprecated use MARKDOWN instead.\",\n            level=logging.WARNING,\n        )\n\n    def test_parse_errors(self):\n        # Verify that just an error is printed and the application doesn't\n        # abort, exit or something.\n        settings = read_settings(\n            path=None,\n            override={\n                \"PATH\": os.path.abspath(os.path.join(CURRENT_DIR, \"parse_error\")),\n                \"OUTPUT_PATH\": self.temp_path,\n                \"CACHE_PATH\": self.temp_cache,\n            },\n        )\n        pelican = Pelican(settings=settings)\n        mute(True)(pelican.run)()\n        self.assertLogCountEqual(\n            count=1, msg=\"Could not process .*parse_error.rst\", level=logging.ERROR\n        )\n\n    def test_module_load(self):\n        \"\"\"Test loading via python -m pelican --help displays the help\"\"\"\n        output = subprocess.check_output(\n            [sys.executable, \"-m\", \"pelican\", \"--help\"]\n        ).decode(\"ascii\", \"replace\")\n        assert \"usage:\" in output\n\n    def test_main_version(self):\n        \"\"\"Run main --version.\"\"\"\n        out = io.StringIO()\n        with contextlib.redirect_stdout(out):\n            with self.assertRaises(SystemExit):\n                main([\"--version\"])\n            self.assertEqual(f\"{__version__}\\n\", out.getvalue())\n\n    def test_main_help(self):\n        \"\"\"Run main --help.\"\"\"\n        out = io.StringIO()\n        with contextlib.redirect_stdout(out):\n            with self.assertRaises(SystemExit):\n                main([\"--help\"])\n            self.assertIn(\"A tool to generate a static blog\", out.getvalue())\n\n    def test_main_on_content(self):\n        \"\"\"Invoke main on simple_content directory.\"\"\"\n        out, err = io.StringIO(), io.StringIO()\n        with contextlib.redirect_stdout(out), contextlib.redirect_stderr(err):\n            with TemporaryDirectory() as temp_dir:\n                # Don't highlight anything.\n                # See https://rich.readthedocs.io/en/stable/highlighting.html\n                with patch(\"pelican.console\", new=Console(highlight=False)):\n                    main([\"-o\", temp_dir, \"pelican/tests/simple_content\"])\n            self.assertIn(\"Processed 1 article\", out.getvalue())\n            self.assertEqual(\"\", err.getvalue())\n\n    def test_main_on_content_markdown_disabled(self):\n        \"\"\"Invoke main on simple_content directory.\"\"\"\n        with patch.object(\n            pelican.readers.MarkdownReader, \"enabled\", new_callable=PropertyMock\n        ) as attr_mock:\n            attr_mock.return_value = False\n            out, err = io.StringIO(), io.StringIO()\n            with contextlib.redirect_stdout(out), contextlib.redirect_stderr(err):\n                with TemporaryDirectory() as temp_dir:\n                    # Don't highlight anything.\n                    # See https://rich.readthedocs.io/en/stable/highlighting.html\n                    with patch(\"pelican.console\", new=Console(highlight=False)):\n                        main([\"-o\", temp_dir, \"pelican/tests/simple_content\"])\n                self.assertIn(\"Processed 0 articles\", out.getvalue())\n                self.assertLogCountEqual(\n                    1,\n                    \".*article_with_md_extension.md: \"\n                    \"Could not import 'markdown.Markdown'. \"\n                    \"Have you installed the 'markdown' package?\",\n                )\n"
  },
  {
    "path": "pelican/tests/test_plugins.py",
    "content": "import os\nfrom contextlib import contextmanager\n\nfrom pelican.plugins._utils import (\n    get_namespace_plugins,\n    get_plugin_name,\n    load_plugins,\n    plugin_enabled,\n)\nfrom pelican.plugins.signals import signal\nfrom pelican.tests.dummy_plugins.normal_plugin import normal_plugin\nfrom pelican.tests.support import unittest\n\n\n@contextmanager\ndef tmp_namespace_path(path):\n    \"\"\"Context manager for temporarily appending namespace plugin packages\n\n    path: path containing the `pelican` folder\n\n    This modifies the `pelican.__path__` and lets the `pelican.plugins`\n    namespace package resolve it from that.\n    \"\"\"\n    # This avoids calls to internal `pelican.plugins.__path__._recalculate()`\n    # as it should not be necessary\n    import pelican  # noqa: PLC0415\n\n    old_path = pelican.__path__[:]\n    try:\n        pelican.__path__.append(os.path.join(path, \"pelican\"))\n        yield\n    finally:\n        pelican.__path__ = old_path\n\n\nclass PluginTest(unittest.TestCase):\n    _PLUGIN_FOLDER = os.path.join(\n        os.path.abspath(os.path.dirname(__file__)), \"dummy_plugins\"\n    )\n    _NS_PLUGIN_FOLDER = os.path.join(_PLUGIN_FOLDER, \"namespace_plugin\")\n    _NORMAL_PLUGIN_FOLDER = os.path.join(_PLUGIN_FOLDER, \"normal_plugin\")\n\n    def test_namespace_path_modification(self):\n        import pelican  # noqa: PLC0415\n        import pelican.plugins  # noqa: PLC0415\n\n        old_path = pelican.__path__[:]\n\n        # not existing path\n        path = os.path.join(self._PLUGIN_FOLDER, \"foo\")\n        with tmp_namespace_path(path):\n            self.assertIn(os.path.join(path, \"pelican\"), pelican.__path__)\n            # foo/pelican does not exist, so it won't propagate\n            self.assertNotIn(\n                os.path.join(path, \"pelican\", \"plugins\"), pelican.plugins.__path__\n            )\n        # verify that we restored path back\n        self.assertEqual(pelican.__path__, old_path)\n\n        # existing path\n        with tmp_namespace_path(self._NS_PLUGIN_FOLDER):\n            self.assertIn(\n                os.path.join(self._NS_PLUGIN_FOLDER, \"pelican\"), pelican.__path__\n            )\n            # /namespace_plugin/pelican exists, so it should be in\n            self.assertIn(\n                os.path.join(self._NS_PLUGIN_FOLDER, \"pelican\", \"plugins\"),\n                pelican.plugins.__path__,\n            )\n        self.assertEqual(pelican.__path__, old_path)\n\n    def test_get_namespace_plugins(self):\n        # existing namespace plugins\n        existing_ns_plugins = get_namespace_plugins()\n\n        # with plugin\n        with tmp_namespace_path(self._NS_PLUGIN_FOLDER):\n            ns_plugins = get_namespace_plugins()\n            self.assertEqual(len(ns_plugins), len(existing_ns_plugins) + 1)\n            self.assertIn(\"pelican.plugins.ns_plugin\", ns_plugins)\n            self.assertEqual(\n                ns_plugins[\"pelican.plugins.ns_plugin\"].NAME, \"namespace plugin\"\n            )\n\n        # should be back to existing namespace plugins outside `with`\n        ns_plugins = get_namespace_plugins()\n        self.assertEqual(ns_plugins, existing_ns_plugins)\n\n    def test_load_plugins(self):\n        def get_plugin_names(plugins):\n            return {get_plugin_name(p) for p in plugins}\n\n        # existing namespace plugins\n        existing_ns_plugins = load_plugins({})\n\n        with tmp_namespace_path(self._NS_PLUGIN_FOLDER):\n            # with no `PLUGINS` setting, load namespace plugins\n            plugins = load_plugins({})\n            self.assertEqual(len(plugins), len(existing_ns_plugins) + 1, plugins)\n            self.assertEqual(\n                {\"pelican.plugins.ns_plugin\"} | get_plugin_names(existing_ns_plugins),\n                get_plugin_names(plugins),\n            )\n\n            # disable namespace plugins with `PLUGINS = []`\n            SETTINGS = {\"PLUGINS\": []}\n            plugins = load_plugins(SETTINGS)\n            self.assertEqual(len(plugins), 0, plugins)\n\n            # with `PLUGINS`, load only specified plugins\n\n            # normal plugin\n            SETTINGS = {\n                \"PLUGINS\": [\"normal_plugin\"],\n                \"PLUGIN_PATHS\": [self._NORMAL_PLUGIN_FOLDER],\n            }\n            plugins = load_plugins(SETTINGS)\n            self.assertEqual(len(plugins), 1, plugins)\n            self.assertEqual({\"normal_plugin\"}, get_plugin_names(plugins))\n\n            # normal submodule/subpackage plugins\n            SETTINGS = {\n                \"PLUGINS\": [\n                    \"normal_submodule_plugin.subplugin\",\n                    \"normal_submodule_plugin.subpackage.subpackage\",\n                ],\n                \"PLUGIN_PATHS\": [self._NORMAL_PLUGIN_FOLDER],\n            }\n            plugins = load_plugins(SETTINGS)\n            self.assertEqual(len(plugins), 2, plugins)\n            self.assertEqual(\n                {\n                    \"normal_submodule_plugin.subplugin\",\n                    \"normal_submodule_plugin.subpackage.subpackage\",\n                },\n                get_plugin_names(plugins),\n            )\n\n            # ensure normal plugins are loaded only once\n            SETTINGS = {\n                \"PLUGINS\": [\"normal_plugin\"],\n                \"PLUGIN_PATHS\": [self._NORMAL_PLUGIN_FOLDER],\n            }\n            plugins = load_plugins(SETTINGS)\n            for plugin in load_plugins(SETTINGS):\n                # The second load_plugins() should return the same plugin\n                # objects as the first one\n                self.assertIn(plugin, plugins)\n\n            # namespace plugin short\n            SETTINGS = {\"PLUGINS\": [\"ns_plugin\"]}\n            plugins = load_plugins(SETTINGS)\n            self.assertEqual(len(plugins), 1, plugins)\n            self.assertEqual({\"pelican.plugins.ns_plugin\"}, get_plugin_names(plugins))\n\n            # namespace plugin long\n            SETTINGS = {\"PLUGINS\": [\"pelican.plugins.ns_plugin\"]}\n            plugins = load_plugins(SETTINGS)\n            self.assertEqual(len(plugins), 1, plugins)\n            self.assertEqual({\"pelican.plugins.ns_plugin\"}, get_plugin_names(plugins))\n\n            # normal and namespace plugin\n            SETTINGS = {\n                \"PLUGINS\": [\"normal_plugin\", \"ns_plugin\"],\n                \"PLUGIN_PATHS\": [self._NORMAL_PLUGIN_FOLDER],\n            }\n            plugins = load_plugins(SETTINGS)\n            self.assertEqual(len(plugins), 2, plugins)\n            self.assertEqual(\n                {\"normal_plugin\", \"pelican.plugins.ns_plugin\"},\n                get_plugin_names(plugins),\n            )\n\n    def test_get_plugin_name(self):\n        self.assertEqual(\n            get_plugin_name(normal_plugin),\n            \"pelican.tests.dummy_plugins.normal_plugin.normal_plugin\",\n        )\n\n        class NoopPlugin:\n            def register(self):\n                pass\n\n        self.assertEqual(\n            get_plugin_name(NoopPlugin),\n            \"PluginTest.test_get_plugin_name.<locals>.NoopPlugin\",\n        )\n        self.assertEqual(\n            get_plugin_name(NoopPlugin()),\n            \"PluginTest.test_get_plugin_name.<locals>.NoopPlugin\",\n        )\n\n    def test_plugin_enabled(self):\n        def get_plugin_names(plugins):\n            return [get_plugin_name(p) for p in plugins]\n\n        with tmp_namespace_path(self._NS_PLUGIN_FOLDER):\n            # with no `PLUGINS` setting, load namespace plugins\n            SETTINGS = {}\n            plugins = get_plugin_names(load_plugins(SETTINGS))\n            self.assertTrue(plugin_enabled(\"ns_plugin\", plugins))\n            self.assertTrue(plugin_enabled(\"pelican.plugins.ns_plugin\", plugins))\n            self.assertFalse(plugin_enabled(\"normal_plugin\", plugins))\n            self.assertFalse(plugin_enabled(\"unknown\", plugins))\n\n            # disable namespace plugins with `PLUGINS = []`\n            SETTINGS = {\"PLUGINS\": []}\n            plugins = get_plugin_names(load_plugins(SETTINGS))\n            self.assertFalse(plugin_enabled(\"ns_plugin\", plugins))\n            self.assertFalse(plugin_enabled(\"pelican.plugins.ns_plugin\", plugins))\n            self.assertFalse(plugin_enabled(\"normal_plugin\", plugins))\n            self.assertFalse(plugin_enabled(\"unknown\", plugins))\n\n            # with `PLUGINS`, load only specified plugins\n\n            # normal plugin\n            SETTINGS = {\n                \"PLUGINS\": [\"normal_plugin\"],\n                \"PLUGIN_PATHS\": [self._NORMAL_PLUGIN_FOLDER],\n            }\n            plugins = get_plugin_names(load_plugins(SETTINGS))\n            self.assertFalse(plugin_enabled(\"ns_plugin\", plugins))\n            self.assertFalse(plugin_enabled(\"pelican.plugins.ns_plugin\", plugins))\n            self.assertTrue(plugin_enabled(\"normal_plugin\", plugins))\n            self.assertFalse(plugin_enabled(\"unknown\", plugins))\n\n            # normal submodule/subpackage plugins\n            SETTINGS = {\n                \"PLUGINS\": [\n                    \"normal_submodule_plugin.subplugin\",\n                    \"normal_submodule_plugin.subpackage.subpackage\",\n                ],\n                \"PLUGIN_PATHS\": [self._NORMAL_PLUGIN_FOLDER],\n            }\n            plugins = get_plugin_names(load_plugins(SETTINGS))\n            self.assertFalse(plugin_enabled(\"ns_plugin\", plugins))\n            self.assertFalse(plugin_enabled(\"pelican.plugins.ns_plugin\", plugins))\n            self.assertFalse(plugin_enabled(\"normal_plugin\", plugins))\n            self.assertFalse(plugin_enabled(\"unknown\", plugins))\n\n            # namespace plugin short\n            SETTINGS = {\"PLUGINS\": [\"ns_plugin\"]}\n            plugins = get_plugin_names(load_plugins(SETTINGS))\n            self.assertTrue(plugin_enabled(\"ns_plugin\", plugins))\n            self.assertTrue(plugin_enabled(\"pelican.plugins.ns_plugin\", plugins))\n            self.assertFalse(plugin_enabled(\"normal_plugin\", plugins))\n            self.assertFalse(plugin_enabled(\"unknown\", plugins))\n\n            # namespace plugin long\n            SETTINGS = {\"PLUGINS\": [\"pelican.plugins.ns_plugin\"]}\n            plugins = get_plugin_names(load_plugins(SETTINGS))\n            self.assertTrue(plugin_enabled(\"ns_plugin\", plugins))\n            self.assertTrue(plugin_enabled(\"pelican.plugins.ns_plugin\", plugins))\n            self.assertFalse(plugin_enabled(\"normal_plugin\", plugins))\n            self.assertFalse(plugin_enabled(\"unknown\", plugins))\n\n            # normal and namespace plugin\n            SETTINGS = {\n                \"PLUGINS\": [\"normal_plugin\", \"ns_plugin\"],\n                \"PLUGIN_PATHS\": [self._NORMAL_PLUGIN_FOLDER],\n            }\n            plugins = get_plugin_names(load_plugins(SETTINGS))\n            self.assertTrue(plugin_enabled(\"ns_plugin\", plugins))\n            self.assertTrue(plugin_enabled(\"pelican.plugins.ns_plugin\", plugins))\n            self.assertTrue(plugin_enabled(\"normal_plugin\", plugins))\n            self.assertFalse(plugin_enabled(\"unknown\", plugins))\n\n    def test_blinker_is_ordered(self):\n        \"\"\"ensure that call order is connetion order\"\"\"\n        dummy_signal = signal(\"dummpy_signal\")\n\n        functions = []\n        expected = []\n        for i in range(50):\n            # function appends value of i to a list\n            def func(dummy_input, i=i):\n                dummy_input.append(i)\n\n            functions.append(func)\n            # we expect functions to be run in the connection order\n            dummy_signal.connect(func)\n            expected.append(i)\n\n        dummy_input = []\n        dummy_signal.send(dummy_input)\n        self.assertEqual(dummy_input, expected)\n"
  },
  {
    "path": "pelican/tests/test_readers.py",
    "content": "import os\nfrom unittest.mock import PropertyMock, patch\n\nfrom pelican import readers\nfrom pelican.tests.support import get_settings, unittest\nfrom pelican.utils import SafeDatetime\n\nCUR_DIR = os.path.dirname(__file__)\nCONTENT_PATH = os.path.join(CUR_DIR, \"content\")\n\n\ndef _path(*args):\n    return os.path.join(CONTENT_PATH, *args)\n\n\nclass ReaderTest(unittest.TestCase):\n    def read_file(self, path, **kwargs):\n        # Isolate from future API changes to readers.read_file\n\n        r = readers.Readers(settings=get_settings(**kwargs))\n        return r.read_file(base_path=CONTENT_PATH, path=path)\n\n    def assertDictHasSubset(self, dictionary, subset):\n        for key, value in subset.items():\n            if key in dictionary:\n                real_value = dictionary.get(key)\n                self.assertEqual(\n                    value,\n                    real_value,\n                    f\"Expected {key} to have value {value}, but was {real_value}\",\n                )\n            else:\n                self.fail(f\"Expected {key} to have value {value}, but was not in Dict\")\n\n    def test_markdown_disabled(self):\n        with patch.object(\n            readers.MarkdownReader, \"enabled\", new_callable=PropertyMock\n        ) as attr_mock:\n            attr_mock.return_value = False\n            readrs = readers.Readers(settings=get_settings())\n            self.assertEqual(\n                set(readers.MarkdownReader.file_extensions),\n                readrs.disabled_readers.keys(),\n            )\n            for val in readrs.disabled_readers.values():\n                self.assertEqual(readers.MarkdownReader, val.__class__)\n\n\nclass TestAssertDictHasSubset(ReaderTest):\n    def setUp(self):\n        self.dictionary = {\"key-a\": \"val-a\", \"key-b\": \"val-b\"}\n\n    def tearDown(self):\n        self.dictionary = None\n\n    def test_subset(self):\n        self.assertDictHasSubset(self.dictionary, {\"key-a\": \"val-a\"})\n\n    def test_equal(self):\n        self.assertDictHasSubset(self.dictionary, self.dictionary)\n\n    def test_fail_not_set(self):\n        self.assertRaisesRegex(\n            AssertionError,\n            r\"Expected.*key-c.*to have value.*val-c.*but was not in Dict\",\n            self.assertDictHasSubset,\n            self.dictionary,\n            {\"key-c\": \"val-c\"},\n        )\n\n    def test_fail_wrong_val(self):\n        self.assertRaisesRegex(\n            AssertionError,\n            r\"Expected .*key-a.* to have value .*val-b.* but was .*val-a.*\",\n            self.assertDictHasSubset,\n            self.dictionary,\n            {\"key-a\": \"val-b\"},\n        )\n\n\nclass DefaultReaderTest(ReaderTest):\n    def test_readfile_unknown_extension(self):\n        with self.assertRaises(TypeError):\n            self.read_file(path=\"article_with_metadata.unknownextension\")\n\n    def test_readfile_path_metadata_implicit_dates(self):\n        test_file = \"article_with_metadata_implicit_dates.html\"\n        page = self.read_file(path=test_file, DEFAULT_DATE=\"fs\")\n        expected = {\n            \"date\": SafeDatetime.fromtimestamp(os.stat(_path(test_file)).st_mtime),\n            \"modified\": SafeDatetime.fromtimestamp(os.stat(_path(test_file)).st_mtime),\n        }\n\n        self.assertDictHasSubset(page.metadata, expected)\n\n    def test_readfile_path_metadata_explicit_dates(self):\n        test_file = \"article_with_metadata_explicit_dates.html\"\n        page = self.read_file(path=test_file, DEFAULT_DATE=\"fs\")\n        expected = {\n            \"date\": SafeDatetime(2010, 12, 2, 10, 14),\n            \"modified\": SafeDatetime(2010, 12, 31, 23, 59),\n        }\n\n        self.assertDictHasSubset(page.metadata, expected)\n\n    def test_readfile_path_metadata_implicit_date_explicit_modified(self):\n        test_file = \"article_with_metadata_implicit_date_explicit_modified.html\"\n        page = self.read_file(path=test_file, DEFAULT_DATE=\"fs\")\n        expected = {\n            \"date\": SafeDatetime.fromtimestamp(os.stat(_path(test_file)).st_mtime),\n            \"modified\": SafeDatetime(2010, 12, 2, 10, 14),\n        }\n\n        self.assertDictHasSubset(page.metadata, expected)\n\n    def test_readfile_path_metadata_explicit_date_implicit_modified(self):\n        test_file = \"article_with_metadata_explicit_date_implicit_modified.html\"\n        page = self.read_file(path=test_file, DEFAULT_DATE=\"fs\")\n        expected = {\n            \"date\": SafeDatetime(2010, 12, 2, 10, 14),\n            \"modified\": SafeDatetime.fromtimestamp(os.stat(_path(test_file)).st_mtime),\n        }\n\n        self.assertDictHasSubset(page.metadata, expected)\n\n    def test_find_empty_alt(self):\n        with patch(\"pelican.readers.logger\") as log_mock:\n            content = [\n                '<img alt=\"\" src=\"test-image.png\" width=\"300px\" />',\n                '<img src=\"test-image.png\"  width=\"300px\" alt=\"\" />',\n            ]\n\n            for tag in content:\n                readers.find_empty_alt(tag, \"/test/path\")\n                log_mock.warning.assert_called_with(\n                    \"Empty alt attribute for image %s in %s\",\n                    \"test-image.png\",\n                    \"/test/path\",\n                    extra={\"limit_msg\": \"Other images have empty alt attributes\"},\n                )\n\n\nclass RstReaderTest(ReaderTest):\n    def test_article_with_metadata(self):\n        page = self.read_file(path=\"article_with_metadata.rst\")\n        expected = {\n            \"category\": \"yeah\",\n            \"author\": \"Alexis Métaireau\",\n            \"title\": \"This is a super article !\",\n            \"summary\": '<p class=\"first last\">Multi-line metadata should be'\n            \" supported\\nas well as <strong>inline\"\n            \" markup</strong> and stuff to &quot;typogrify\"\n            \"&quot;...</p>\\n\",\n            \"date\": SafeDatetime(2010, 12, 2, 10, 14),\n            \"modified\": SafeDatetime(2010, 12, 2, 10, 20),\n            \"tags\": [\"foo\", \"bar\", \"foobar\"],\n            \"custom_field\": \"http://notmyidea.org\",\n        }\n\n        self.assertDictHasSubset(page.metadata, expected)\n\n    def test_article_with_capitalized_metadata(self):\n        page = self.read_file(path=\"article_with_capitalized_metadata.rst\")\n        expected = {\n            \"category\": \"yeah\",\n            \"author\": \"Alexis Métaireau\",\n            \"title\": \"This is a super article !\",\n            \"summary\": '<p class=\"first last\">Multi-line metadata should be'\n            \" supported\\nas well as <strong>inline\"\n            \" markup</strong> and stuff to &quot;typogrify\"\n            \"&quot;...</p>\\n\",\n            \"date\": SafeDatetime(2010, 12, 2, 10, 14),\n            \"modified\": SafeDatetime(2010, 12, 2, 10, 20),\n            \"tags\": [\"foo\", \"bar\", \"foobar\"],\n            \"custom_field\": \"http://notmyidea.org\",\n        }\n\n        self.assertDictHasSubset(page.metadata, expected)\n\n    def test_article_with_filename_metadata(self):\n        page = self.read_file(\n            path=\"2012-11-29_rst_w_filename_meta#foo-bar.rst\", FILENAME_METADATA=None\n        )\n        expected = {\n            \"category\": \"yeah\",\n            \"author\": \"Alexis Métaireau\",\n            \"title\": \"Rst with filename metadata\",\n            \"reader\": \"rst\",\n        }\n        self.assertDictHasSubset(page.metadata, expected)\n\n        page = self.read_file(\n            path=\"2012-11-29_rst_w_filename_meta#foo-bar.rst\",\n            FILENAME_METADATA=r\"(?P<date>\\d{4}-\\d{2}-\\d{2}).*\",\n        )\n        expected = {\n            \"category\": \"yeah\",\n            \"author\": \"Alexis Métaireau\",\n            \"title\": \"Rst with filename metadata\",\n            \"date\": SafeDatetime(2012, 11, 29),\n            \"reader\": \"rst\",\n        }\n        self.assertDictHasSubset(page.metadata, expected)\n\n        page = self.read_file(\n            path=\"2012-11-29_rst_w_filename_meta#foo-bar.rst\",\n            FILENAME_METADATA=(\n                r\"(?P<date>\\d{4}-\\d{2}-\\d{2})\"\n                r\"_(?P<Slug>.*)\"\n                r\"#(?P<MyMeta>.*)-(?P<author>.*)\"\n            ),\n        )\n        expected = {\n            \"category\": \"yeah\",\n            \"author\": \"Alexis Métaireau\",\n            \"title\": \"Rst with filename metadata\",\n            \"date\": SafeDatetime(2012, 11, 29),\n            \"slug\": \"rst_w_filename_meta\",\n            \"mymeta\": \"foo\",\n            \"reader\": \"rst\",\n        }\n        self.assertDictHasSubset(page.metadata, expected)\n\n    def test_article_with_optional_filename_metadata(self):\n        page = self.read_file(\n            path=\"2012-11-29_rst_w_filename_meta#foo-bar.rst\",\n            FILENAME_METADATA=r\"(?P<date>\\d{4}-\\d{2}-\\d{2})?\",\n        )\n        expected = {\n            \"date\": SafeDatetime(2012, 11, 29),\n            \"reader\": \"rst\",\n        }\n        self.assertDictHasSubset(page.metadata, expected)\n\n        page = self.read_file(\n            path=\"article.rst\", FILENAME_METADATA=r\"(?P<date>\\d{4}-\\d{2}-\\d{2})?\"\n        )\n        expected = {\n            \"reader\": \"rst\",\n        }\n        self.assertDictHasSubset(page.metadata, expected)\n        self.assertNotIn(\"date\", page.metadata, \"Date should not be set.\")\n\n    def test_article_metadata_key_lowercase(self):\n        # Keys of metadata should be lowercase.\n        reader = readers.RstReader(settings=get_settings())\n        content, metadata = reader.read(_path(\"article_with_uppercase_metadata.rst\"))\n\n        self.assertIn(\"category\", metadata, \"Key should be lowercase.\")\n        self.assertEqual(\"Yeah\", metadata.get(\"category\"), \"Value keeps case.\")\n\n    def test_article_extra_path_metadata(self):\n        input_with_metadata = \"2012-11-29_rst_w_filename_meta#foo-bar.rst\"\n        page_metadata = self.read_file(\n            path=input_with_metadata,\n            FILENAME_METADATA=(\n                r\"(?P<date>\\d{4}-\\d{2}-\\d{2})\"\n                r\"_(?P<Slug>.*)\"\n                r\"#(?P<MyMeta>.*)-(?P<author>.*)\"\n            ),\n            EXTRA_PATH_METADATA={\n                input_with_metadata: {\"key-1a\": \"value-1a\", \"key-1b\": \"value-1b\"}\n            },\n        )\n        expected_metadata = {\n            \"category\": \"yeah\",\n            \"author\": \"Alexis Métaireau\",\n            \"title\": \"Rst with filename metadata\",\n            \"date\": SafeDatetime(2012, 11, 29),\n            \"slug\": \"rst_w_filename_meta\",\n            \"mymeta\": \"foo\",\n            \"reader\": \"rst\",\n            \"key-1a\": \"value-1a\",\n            \"key-1b\": \"value-1b\",\n        }\n        self.assertDictHasSubset(page_metadata.metadata, expected_metadata)\n\n        input_file_path_without_metadata = \"article.rst\"\n        page_without_metadata = self.read_file(\n            path=input_file_path_without_metadata,\n            EXTRA_PATH_METADATA={\n                input_file_path_without_metadata: {\"author\": \"Charlès Overwrite\"}\n            },\n        )\n        expected_without_metadata = {\n            \"category\": \"misc\",\n            \"author\": \"Charlès Overwrite\",\n            \"title\": \"Article title\",\n            \"reader\": \"rst\",\n        }\n        self.assertDictHasSubset(\n            page_without_metadata.metadata, expected_without_metadata\n        )\n\n    def test_article_extra_path_metadata_dont_overwrite(self):\n        # EXTRA_PATH_METADATA['author'] should get ignored\n        # since we don't overwrite already set values\n        input_file_path = \"2012-11-29_rst_w_filename_meta#foo-bar.rst\"\n        page = self.read_file(\n            path=input_file_path,\n            FILENAME_METADATA=(\n                r\"(?P<date>\\d{4}-\\d{2}-\\d{2})\"\n                r\"_(?P<Slug>.*)\"\n                r\"#(?P<MyMeta>.*)-(?P<orginalauthor>.*)\"\n            ),\n            EXTRA_PATH_METADATA={\n                input_file_path: {\"author\": \"Charlès Overwrite\", \"key-1b\": \"value-1b\"}\n            },\n        )\n        expected = {\n            \"category\": \"yeah\",\n            \"author\": \"Alexis Métaireau\",\n            \"title\": \"Rst with filename metadata\",\n            \"date\": SafeDatetime(2012, 11, 29),\n            \"slug\": \"rst_w_filename_meta\",\n            \"mymeta\": \"foo\",\n            \"reader\": \"rst\",\n            \"key-1b\": \"value-1b\",\n        }\n        self.assertDictHasSubset(page.metadata, expected)\n\n    def test_article_extra_path_metadata_recurse(self):\n        parent = \"TestCategory\"\n        notparent = \"TestCategory/article\"\n        path = \"TestCategory/article_without_category.rst\"\n\n        epm = {\n            parent: {\n                \"epmr_inherit\": parent,\n                \"epmr_override\": parent,\n            },\n            notparent: {\"epmr_bogus\": notparent},\n            path: {\n                \"epmr_override\": path,\n            },\n        }\n        expected_metadata = {\n            \"epmr_inherit\": parent,\n            \"epmr_override\": path,\n        }\n\n        page = self.read_file(path=path, EXTRA_PATH_METADATA=epm)\n        self.assertDictHasSubset(page.metadata, expected_metadata)\n\n        # Make sure vars aren't getting \"inherited\" by mistake...\n        path = \"article.rst\"\n        page = self.read_file(path=path, EXTRA_PATH_METADATA=epm)\n        for k in expected_metadata.keys():\n            self.assertNotIn(k, page.metadata)\n\n        # Same, but for edge cases where one file's name is a prefix of\n        # another.\n        path = \"TestCategory/article_without_category.rst\"\n        page = self.read_file(path=path, EXTRA_PATH_METADATA=epm)\n        for k in epm[notparent].keys():\n            self.assertNotIn(k, page.metadata)\n\n    def test_typogrify(self):\n        # if nothing is specified in the settings, the content should be\n        # unmodified\n        page = self.read_file(path=\"article.rst\")\n        expected = (\n            \"<p>THIS is some content. With some stuff to \"\n            \"&quot;typogrify&quot;...</p>\\n<p>Now with added \"\n            'support for <abbr title=\"three letter acronym\">'\n            \"TLA</abbr>.</p>\\n\"\n        )\n\n        self.assertEqual(page.content, expected)\n\n        try:\n            # otherwise, typogrify should be applied\n            page = self.read_file(path=\"article.rst\", TYPOGRIFY=True)\n            expected = (\n                '<p><span class=\"caps\">THIS</span> is some content. '\n                \"With some stuff to&nbsp;&#8220;typogrify&#8221;&#8230;</p>\\n\"\n                '<p>Now with added support for <abbr title=\"three letter '\n                'acronym\"><span class=\"caps\">TLA</span></abbr>.</p>\\n'\n            )\n\n            self.assertEqual(page.content, expected)\n        except ImportError:\n            return unittest.skip(\"need the typogrify distribution\")\n\n    def test_typogrify_summary(self):\n        # if nothing is specified in the settings, the summary should be\n        # unmodified\n        page = self.read_file(path=\"article_with_metadata.rst\")\n        expected = (\n            '<p class=\"first last\">Multi-line metadata should be'\n            \" supported\\nas well as <strong>inline\"\n            \" markup</strong> and stuff to &quot;typogrify\"\n            \"&quot;...</p>\\n\"\n        )\n\n        self.assertEqual(page.metadata[\"summary\"], expected)\n\n        try:\n            # otherwise, typogrify should be applied\n            page = self.read_file(path=\"article_with_metadata.rst\", TYPOGRIFY=True)\n            expected = (\n                '<p class=\"first last\">Multi-line metadata should be'\n                \" supported\\nas well as <strong>inline\"\n                \" markup</strong> and stuff to&nbsp;&#8220;typogrify\"\n                \"&#8221;&#8230;</p>\\n\"\n            )\n\n            self.assertEqual(page.metadata[\"summary\"], expected)\n        except ImportError:\n            return unittest.skip(\"need the typogrify distribution\")\n\n    def test_typogrify_ignore_filters(self):\n        try:\n            # typogrify should be able to ignore user specified filters.\n            page = self.read_file(\n                path=\"article_with_code_block.rst\",\n                TYPOGRIFY=True,\n                TYPOGRIFY_OMIT_FILTERS=[\"amp\"],\n            )\n            expected = (\n                \"<p>An article with some&nbsp;code</p>\\n\"\n                '<div class=\"highlight\"><pre><span></span>'\n                '<span class=\"n\">x</span>'\n                ' <span class=\"o\">&amp;</span>'\n                ' <span class=\"n\">y</span>\\n</pre></div>\\n'\n                \"<p>A block&nbsp;quote:</p>\\n<blockquote>\\nx \"\n                \"&amp; y</blockquote>\\n\"\n                \"<p>Normal:\\nx &amp;&nbsp;y</p>\\n\"\n            )\n            self.assertEqual(page.content, expected)\n\n            page = self.read_file(\n                path=\"article.rst\",\n                TYPOGRIFY=True,\n                TYPOGRIFY_OMIT_FILTERS=[\"smartypants\"],\n            )\n            expected = (\n                '<p><span class=\"caps\">THIS</span> is some content. '\n                \"With some stuff to&nbsp;&quot;typogrify&quot;...</p>\\n\"\n                '<p>Now with added support for <abbr title=\"three letter '\n                'acronym\"><span class=\"caps\">TLA</span></abbr>.</p>\\n'\n            )\n            self.assertEqual(page.content, expected)\n\n            page = self.read_file(\n                path=\"article.rst\",\n                TYPOGRIFY=True,\n                TYPOGRIFY_OMIT_FILTERS=[\"caps\"],\n            )\n            expected = (\n                \"<p>THIS is some content. \"\n                \"With some stuff to&nbsp;&#8220;typogrify&#8221;&#8230;</p>\\n\"\n                '<p>Now with added support for <abbr title=\"three letter '\n                'acronym\">TLA</abbr>.</p>\\n'\n            )\n            self.assertEqual(page.content, expected)\n\n            page = self.read_file(\n                path=\"article.rst\",\n                TYPOGRIFY=True,\n                TYPOGRIFY_OMIT_FILTERS=[\"initial_quotes\"],\n            )\n            expected = (\n                '<p><span class=\"caps\">THIS</span> is some content. '\n                \"With some stuff to&nbsp;&#8220;typogrify&#8221;&#8230;</p>\\n\"\n                '<p>Now with added support for <abbr title=\"three letter '\n                'acronym\"><span class=\"caps\">TLA</span></abbr>.</p>\\n'\n            )\n            self.assertEqual(page.content, expected)\n\n            page = self.read_file(\n                path=\"article.rst\",\n                TYPOGRIFY=True,\n                TYPOGRIFY_OMIT_FILTERS=[\"widont\"],\n            )\n            expected = (\n                '<p><span class=\"caps\">THIS</span> is some content. '\n                \"With some stuff to \"\n                \"&#8220;typogrify&#8221;&#8230;</p>\\n<p>Now with added \"\n                'support for <abbr title=\"three letter acronym\">'\n                '<span class=\"caps\">TLA</span></abbr>.</p>\\n'\n            )\n            self.assertEqual(page.content, expected)\n\n            page = self.read_file(\n                path=\"article.rst\",\n                TYPOGRIFY=True,\n                TYPOGRIFY_OMIT_FILTERS=[\"this-filter-does-not-exists\"],\n            )\n            self.assertRaises(TypeError)\n        except ImportError:\n            return unittest.skip(\"need the typogrify distribution\")\n        except TypeError:\n            return unittest.skip(\"need typogrify version 2.1.0 or later\")\n\n    def test_typogrify_ignore_tags(self):\n        try:\n            # typogrify should be able to ignore user specified tags.\n            page = self.read_file(\n                path=\"article.rst\", TYPOGRIFY=True, TYPOGRIFY_IGNORE_TAGS=[\"p\"]\n            )\n            expected = (\n                \"<p>THIS is some content. With some stuff to \"\n                \"&quot;typogrify&quot;...</p>\\n<p>Now with added \"\n                'support for <abbr title=\"three letter acronym\">'\n                \"TLA</abbr>.</p>\\n\"\n            )\n\n            self.assertEqual(page.content, expected)\n\n            # typogrify should ignore code blocks by default because\n            # code blocks are composed inside the pre tag\n            page = self.read_file(path=\"article_with_code_block.rst\", TYPOGRIFY=True)\n\n            expected = (\n                \"<p>An article with some&nbsp;code</p>\\n\"\n                '<div class=\"highlight\"><pre><span></span>'\n                '<span class=\"n\">x</span>'\n                ' <span class=\"o\">&amp;</span>'\n                ' <span class=\"n\">y</span>\\n</pre></div>\\n'\n                \"<p>A block&nbsp;quote:</p>\\n<blockquote>\\nx \"\n                '<span class=\"amp\">&amp;</span> y</blockquote>\\n'\n                \"<p>Normal:\\nx\"\n                ' <span class=\"amp\">&amp;</span>'\n                \"&nbsp;y\"\n                \"</p>\\n\"\n            )\n\n            self.assertEqual(page.content, expected)\n\n            # instruct typogrify to also ignore blockquotes\n            page = self.read_file(\n                path=\"article_with_code_block.rst\",\n                TYPOGRIFY=True,\n                TYPOGRIFY_IGNORE_TAGS=[\"blockquote\"],\n            )\n\n            expected = (\n                \"<p>An article with some&nbsp;code</p>\\n\"\n                '<div class=\"highlight\"><pre><span>'\n                '</span><span class=\"n\">x</span>'\n                ' <span class=\"o\">&amp;</span>'\n                ' <span class=\"n\">y</span>\\n</pre></div>\\n'\n                \"<p>A block&nbsp;quote:</p>\\n<blockquote>\\nx \"\n                \"&amp; y</blockquote>\\n\"\n                \"<p>Normal:\\nx\"\n                ' <span class=\"amp\">&amp;</span>'\n                \"&nbsp;y\"\n                \"</p>\\n\"\n            )\n\n            self.assertEqual(page.content, expected)\n        except ImportError:\n            return unittest.skip(\"need the typogrify distribution\")\n        except TypeError:\n            return unittest.skip(\"need typogrify version 2.0.4 or later\")\n\n    def test_article_with_multiple_authors(self):\n        page = self.read_file(path=\"article_with_multiple_authors.rst\")\n        expected = {\"authors\": [\"First Author\", \"Second Author\"]}\n\n        self.assertDictHasSubset(page.metadata, expected)\n\n    def test_article_with_multiple_authors_semicolon(self):\n        page = self.read_file(path=\"article_with_multiple_authors_semicolon.rst\")\n        expected = {\"authors\": [\"Author, First\", \"Author, Second\"]}\n\n        self.assertDictHasSubset(page.metadata, expected)\n\n    def test_article_with_multiple_authors_list(self):\n        page = self.read_file(path=\"article_with_multiple_authors_list.rst\")\n        expected = {\"authors\": [\"Author, First\", \"Author, Second\"]}\n\n        self.assertDictHasSubset(page.metadata, expected)\n\n    def test_default_date_formats(self):\n        tuple_date = self.read_file(path=\"article.rst\", DEFAULT_DATE=(2012, 5, 1))\n        string_date = self.read_file(path=\"article.rst\", DEFAULT_DATE=\"2012-05-01\")\n\n        self.assertEqual(tuple_date.metadata[\"date\"], string_date.metadata[\"date\"])\n\n    def test_parse_error(self):\n        # Verify that it raises an Exception, not nothing and not SystemExit or\n        # some such\n        with self.assertRaisesRegex(Exception, \"underline too short\"):\n            self.read_file(path=\"../parse_error/parse_error.rst\")\n\n    def test_typogrify_dashes_config(self):\n        # Test default config\n        page = self.read_file(\n            path=\"article_with_typogrify_dashes.rst\",\n            TYPOGRIFY=True,\n            TYPOGRIFY_DASHES=\"default\",\n        )\n        expected = \"<p>One: -; Two: &#8212;; Three:&nbsp;&#8212;-</p>\\n\"\n        expected_title = \"One -, two &#8212;, three &#8212;-&nbsp;dashes!\"\n\n        self.assertEqual(page.content, expected)\n        self.assertEqual(page.title, expected_title)\n\n        # Test 'oldschool' variant\n        page = self.read_file(\n            path=\"article_with_typogrify_dashes.rst\",\n            TYPOGRIFY=True,\n            TYPOGRIFY_DASHES=\"oldschool\",\n        )\n        expected = \"<p>One: -; Two: &#8211;; Three:&nbsp;&#8212;</p>\\n\"\n        expected_title = \"One -, two &#8211;, three &#8212;&nbsp;dashes!\"\n\n        self.assertEqual(page.content, expected)\n        self.assertEqual(page.title, expected_title)\n\n        # Test 'oldschool_inverted' variant\n        page = self.read_file(\n            path=\"article_with_typogrify_dashes.rst\",\n            TYPOGRIFY=True,\n            TYPOGRIFY_DASHES=\"oldschool_inverted\",\n        )\n        expected = \"<p>One: -; Two: &#8212;; Three:&nbsp;&#8211;</p>\\n\"\n        expected_title = \"One -, two &#8212;, three &#8211;&nbsp;dashes!\"\n\n        self.assertEqual(page.content, expected)\n        self.assertEqual(page.title, expected_title)\n\n\n@unittest.skipUnless(readers.Markdown, \"markdown isn't installed\")\nclass MdReaderTest(ReaderTest):\n    def test_article_with_metadata(self):\n        reader = readers.MarkdownReader(settings=get_settings())\n        content, metadata = reader.read(_path(\"article_with_md_extension.md\"))\n        expected = {\n            \"category\": \"test\",\n            \"title\": \"Test md File\",\n            \"summary\": \"<p>I have a lot to test</p>\",\n            \"date\": SafeDatetime(2010, 12, 2, 10, 14),\n            \"modified\": SafeDatetime(2010, 12, 2, 10, 20),\n            \"tags\": [\"foo\", \"bar\", \"foobar\"],\n        }\n        self.assertDictHasSubset(metadata, expected)\n\n        content, metadata = reader.read(\n            _path(\"article_with_markdown_and_nonascii_summary.md\")\n        )\n        expected = {\n            \"title\": \"マックOS X 10.8でパイソンとVirtualenvをインストールと設定\",\n            \"summary\": \"<p>パイソンとVirtualenvをまっくでインストールする方法について明確に説明します。</p>\",\n            \"category\": \"指導書\",\n            \"date\": SafeDatetime(2012, 12, 20),\n            \"modified\": SafeDatetime(2012, 12, 22),\n            \"tags\": [\"パイソン\", \"マック\"],\n            \"slug\": \"python-virtualenv-on-mac-osx-mountain-lion-10.8\",\n        }\n        self.assertDictHasSubset(metadata, expected)\n\n    def test_article_with_footnote(self):\n        settings = get_settings()\n        ec = settings[\"MARKDOWN\"][\"extension_configs\"]\n        ec[\"markdown.extensions.footnotes\"] = {\"SEPARATOR\": \"-\"}\n        reader = readers.MarkdownReader(settings)\n        content, metadata = reader.read(_path(\"article_with_markdown_and_footnote.md\"))\n        expected_content = (\n            \"<p>This is some content\"\n            '<sup id=\"fnref-1\"><a class=\"footnote-ref\" href=\"#fn-1\"'\n            \">1</a></sup>\"\n            \" with some footnotes\"\n            '<sup id=\"fnref-footnote\"><a class=\"footnote-ref\" '\n            'href=\"#fn-footnote\">2</a></sup></p>\\n'\n            '<div class=\"footnote\">\\n'\n            '<hr>\\n<ol>\\n<li id=\"fn-1\">\\n'\n            \"<p>Numbered footnote&#160;\"\n            '<a class=\"footnote-backref\" href=\"#fnref-1\" '\n            'title=\"Jump back to footnote 1 in the text\">&#8617;</a></p>\\n'\n            '</li>\\n<li id=\"fn-footnote\">\\n'\n            \"<p>Named footnote&#160;\"\n            '<a class=\"footnote-backref\" href=\"#fnref-footnote\"'\n            ' title=\"Jump back to footnote 2 in the text\">&#8617;</a></p>\\n'\n            \"</li>\\n</ol>\\n</div>\"\n        )\n        expected_metadata = {\n            \"title\": \"Article with markdown containing footnotes\",\n            \"summary\": (\n                \"<p>Summary with <strong>inline</strong> markup \"\n                \"<em>should</em> be supported.</p>\"\n            ),\n            \"date\": SafeDatetime(2012, 10, 31),\n            \"modified\": SafeDatetime(2012, 11, 1),\n            \"multiline\": [\n                \"Line Metadata should be handle properly.\",\n                \"See syntax of Meta-Data extension of Python Markdown package:\",\n                \"If a line is indented by 4 or more spaces,\",\n                \"that line is assumed to be an additional line of the value\",\n                \"for the previous keyword.\",\n                \"A keyword may have as many lines as desired.\",\n            ],\n        }\n        self.assertEqual(content, expected_content)\n        self.assertDictHasSubset(metadata, expected_metadata)\n\n    def test_article_with_file_extensions(self):\n        reader = readers.MarkdownReader(settings=get_settings())\n        # test to ensure the md file extension is being processed by the\n        # correct reader\n        content, metadata = reader.read(_path(\"article_with_md_extension.md\"))\n        expected = (\n            \"<h1>Test Markdown File Header</h1>\\n\"\n            \"<h2>Used for pelican test</h2>\\n\"\n            \"<p>The quick brown fox jumped over the lazy dog's back.</p>\"\n        )\n        self.assertEqual(content, expected)\n        # test to ensure the mkd file extension is being processed by the\n        # correct reader\n        content, metadata = reader.read(_path(\"article_with_mkd_extension.mkd\"))\n        expected = (\n            \"<h1>Test Markdown File Header</h1>\\n<h2>Used for pelican\"\n            \" test</h2>\\n<p>This is another markdown test file.  Uses\"\n            \" the mkd extension.</p>\"\n        )\n        self.assertEqual(content, expected)\n        # test to ensure the markdown file extension is being processed by the\n        # correct reader\n        content, metadata = reader.read(\n            _path(\"article_with_markdown_extension.markdown\")\n        )\n        expected = (\n            \"<h1>Test Markdown File Header</h1>\\n<h2>Used for pelican\"\n            \" test</h2>\\n<p>This is another markdown test file.  Uses\"\n            \" the markdown extension.</p>\"\n        )\n        self.assertEqual(content, expected)\n        # test to ensure the mdown file extension is being processed by the\n        # correct reader\n        content, metadata = reader.read(_path(\"article_with_mdown_extension.mdown\"))\n        expected = (\n            \"<h1>Test Markdown File Header</h1>\\n<h2>Used for pelican\"\n            \" test</h2>\\n<p>This is another markdown test file.  Uses\"\n            \" the mdown extension.</p>\"\n        )\n        self.assertEqual(content, expected)\n\n    def test_article_with_markdown_markup_extension(self):\n        # test to ensure the markdown markup extension is being processed as\n        # expected\n        page = self.read_file(\n            path=\"article_with_markdown_markup_extensions.md\",\n            MARKDOWN={\n                \"extension_configs\": {\n                    \"markdown.extensions.toc\": {},\n                    \"markdown.extensions.codehilite\": {},\n                    \"markdown.extensions.extra\": {},\n                }\n            },\n        )\n        expected = (\n            '<div class=\"toc\">\\n'\n            \"<ul>\\n\"\n            '<li><a href=\"#level1\">Level1</a><ul>\\n'\n            '<li><a href=\"#level2\">Level2</a></li>\\n'\n            \"</ul>\\n\"\n            \"</li>\\n\"\n            \"</ul>\\n\"\n            \"</div>\\n\"\n            '<h2 id=\"level1\">Level1</h2>\\n'\n            '<h3 id=\"level2\">Level2</h3>'\n        )\n\n        self.assertEqual(page.content, expected)\n\n    def test_article_with_filename_metadata(self):\n        page = self.read_file(\n            path=\"2012-11-30_md_w_filename_meta#foo-bar.md\", FILENAME_METADATA=None\n        )\n        expected = {\n            \"category\": \"yeah\",\n            \"author\": \"Alexis Métaireau\",\n        }\n        self.assertDictHasSubset(page.metadata, expected)\n\n        page = self.read_file(\n            path=\"2012-11-30_md_w_filename_meta#foo-bar.md\",\n            FILENAME_METADATA=r\"(?P<date>\\d{4}-\\d{2}-\\d{2}).*\",\n        )\n        expected = {\n            \"category\": \"yeah\",\n            \"author\": \"Alexis Métaireau\",\n            \"date\": SafeDatetime(2012, 11, 30),\n        }\n        self.assertDictHasSubset(page.metadata, expected)\n\n        page = self.read_file(\n            path=\"2012-11-30_md_w_filename_meta#foo-bar.md\",\n            FILENAME_METADATA=(\n                r\"(?P<date>\\d{4}-\\d{2}-\\d{2})\"\n                r\"_(?P<Slug>.*)\"\n                r\"#(?P<MyMeta>.*)-(?P<author>.*)\"\n            ),\n        )\n        expected = {\n            \"category\": \"yeah\",\n            \"author\": \"Alexis Métaireau\",\n            \"date\": SafeDatetime(2012, 11, 30),\n            \"slug\": \"md_w_filename_meta\",\n            \"mymeta\": \"foo\",\n        }\n        self.assertDictHasSubset(page.metadata, expected)\n\n    def test_article_with_optional_filename_metadata(self):\n        page = self.read_file(\n            path=\"2012-11-30_md_w_filename_meta#foo-bar.md\",\n            FILENAME_METADATA=r\"(?P<date>\\d{4}-\\d{2}-\\d{2})?\",\n        )\n        expected = {\n            \"date\": SafeDatetime(2012, 11, 30),\n            \"reader\": \"markdown\",\n        }\n        self.assertDictHasSubset(page.metadata, expected)\n\n        page = self.read_file(\n            path=\"empty.md\", FILENAME_METADATA=r\"(?P<date>\\d{4}-\\d{2}-\\d{2})?\"\n        )\n        expected = {\n            \"reader\": \"markdown\",\n        }\n        self.assertDictHasSubset(page.metadata, expected)\n        self.assertNotIn(\"date\", page.metadata, \"Date should not be set.\")\n\n    def test_duplicate_tags_or_authors_are_removed(self):\n        reader = readers.MarkdownReader(settings=get_settings())\n        content, metadata = reader.read(_path(\"article_with_duplicate_tags_authors.md\"))\n        expected = {\n            \"tags\": [\"foo\", \"bar\", \"foobar\"],\n            \"authors\": [\"Author, First\", \"Author, Second\"],\n        }\n        self.assertDictHasSubset(metadata, expected)\n\n    def test_metadata_not_parsed_for_metadata(self):\n        settings = get_settings()\n        settings[\"FORMATTED_FIELDS\"] = [\"summary\"]\n\n        reader = readers.MarkdownReader(settings=settings)\n        content, metadata = reader.read(\n            _path(\"article_with_markdown_and_nested_metadata.md\")\n        )\n        expected = {\n            \"title\": \"Article with markdown and nested summary metadata\",\n            \"summary\": \"<p>Test: This metadata value looks like metadata</p>\",\n        }\n        self.assertDictHasSubset(metadata, expected)\n\n    def test_empty_file(self):\n        reader = readers.MarkdownReader(settings=get_settings())\n        content, metadata = reader.read(_path(\"empty.md\"))\n\n        self.assertEqual(metadata, {})\n        self.assertEqual(content, \"\")\n\n    def test_empty_file_with_bom(self):\n        reader = readers.MarkdownReader(settings=get_settings())\n        content, metadata = reader.read(_path(\"empty_with_bom.md\"))\n\n        self.assertEqual(metadata, {})\n        self.assertEqual(content, \"\")\n\n    def test_typogrify_dashes_config(self):\n        # Test default config\n        page = self.read_file(\n            path=\"article_with_typogrify_dashes.md\",\n            TYPOGRIFY=True,\n            TYPOGRIFY_DASHES=\"default\",\n        )\n        expected = \"<p>One: -; Two: &#8212;; Three:&nbsp;&#8212;-</p>\"\n        expected_title = \"One -, two &#8212;, three &#8212;-&nbsp;dashes!\"\n\n        self.assertEqual(page.content, expected)\n        self.assertEqual(page.title, expected_title)\n\n        # Test 'oldschool' variant\n        page = self.read_file(\n            path=\"article_with_typogrify_dashes.md\",\n            TYPOGRIFY=True,\n            TYPOGRIFY_DASHES=\"oldschool\",\n        )\n        expected = \"<p>One: -; Two: &#8211;; Three:&nbsp;&#8212;</p>\"\n        expected_title = \"One -, two &#8211;, three &#8212;&nbsp;dashes!\"\n\n        self.assertEqual(page.content, expected)\n        self.assertEqual(page.title, expected_title)\n\n        # Test 'oldschool_inverted' variant\n        page = self.read_file(\n            path=\"article_with_typogrify_dashes.md\",\n            TYPOGRIFY=True,\n            TYPOGRIFY_DASHES=\"oldschool_inverted\",\n        )\n        expected = \"<p>One: -; Two: &#8212;; Three:&nbsp;&#8211;</p>\"\n        expected_title = \"One -, two &#8212;, three &#8211;&nbsp;dashes!\"\n\n        self.assertEqual(page.content, expected)\n        self.assertEqual(page.title, expected_title)\n\n    def test_metadata_has_no_discarded_data(self):\n        md_filename = \"article_with_markdown_and_empty_tags.md\"\n\n        r = readers.Readers(\n            cache_name=\"cache\", settings=get_settings(CACHE_CONTENT=True)\n        )\n        page = r.read_file(base_path=CONTENT_PATH, path=md_filename)\n\n        __, cached_metadata = r.get_cached_data(_path(md_filename), (None, None))\n\n        expected = {\"title\": \"Article with markdown and empty tags\"}\n        self.assertEqual(cached_metadata, expected)\n        self.assertNotIn(\"tags\", page.metadata)\n        self.assertDictHasSubset(page.metadata, expected)\n\n\nclass HTMLReaderTest(ReaderTest):\n    def test_article_with_comments(self):\n        page = self.read_file(path=\"article_with_comments.html\")\n\n        self.assertEqual(\n            \"\"\"\n        Body content\n        <!--  This comment is included (including extra whitespace)   -->\n    \"\"\",\n            page.content,\n        )\n\n    def test_article_with_keywords(self):\n        page = self.read_file(path=\"article_with_keywords.html\")\n        expected = {\n            \"tags\": [\"foo\", \"bar\", \"foobar\"],\n        }\n\n        self.assertDictHasSubset(page.metadata, expected)\n\n    def test_article_with_metadata(self):\n        page = self.read_file(path=\"article_with_metadata.html\")\n        expected = {\n            \"category\": \"yeah\",\n            \"author\": \"Alexis Métaireau\",\n            \"title\": \"This is a super article !\",\n            \"summary\": \"Summary and stuff\",\n            \"date\": SafeDatetime(2010, 12, 2, 10, 14),\n            \"tags\": [\"foo\", \"bar\", \"foobar\"],\n            \"custom_field\": \"http://notmyidea.org\",\n        }\n\n        self.assertDictHasSubset(page.metadata, expected)\n\n    def test_article_with_multiple_similar_metadata_tags(self):\n        page = self.read_file(path=\"article_with_multiple_metadata_tags.html\")\n        expected = {\n            \"custom_field\": [\"https://getpelican.com\", \"https://www.eff.org\"],\n        }\n\n        self.assertDictHasSubset(page.metadata, expected)\n\n    def test_article_with_multiple_authors(self):\n        page = self.read_file(path=\"article_with_multiple_authors.html\")\n        expected = {\"authors\": [\"First Author\", \"Second Author\"]}\n\n        self.assertDictHasSubset(page.metadata, expected)\n\n    def test_article_with_metadata_and_contents_attrib(self):\n        page = self.read_file(path=\"article_with_metadata_and_contents.html\")\n        expected = {\n            \"category\": \"yeah\",\n            \"author\": \"Alexis Métaireau\",\n            \"title\": \"This is a super article !\",\n            \"summary\": \"Summary and stuff\",\n            \"date\": SafeDatetime(2010, 12, 2, 10, 14),\n            \"tags\": [\"foo\", \"bar\", \"foobar\"],\n            \"custom_field\": \"http://notmyidea.org\",\n        }\n        self.assertDictHasSubset(page.metadata, expected)\n\n    def test_article_with_null_attributes(self):\n        page = self.read_file(path=\"article_with_null_attributes.html\")\n\n        self.assertEqual(\n            \"\"\"\n        Ensure that empty attributes are copied properly.\n        <input name=\"test\" disabled style=\"\" />\n    \"\"\",\n            page.content,\n        )\n\n    def test_article_with_attributes_containing_double_quotes(self):\n        page = self.read_file(\n            path=\"article_with_attributes_containing_\" + \"double_quotes.html\"\n        )\n        self.assertEqual(\n            \"\"\"\n        Ensure that if an attribute value contains a double quote, it is\n        surrounded with single quotes, otherwise with double quotes.\n        <span data-test=\"'single quoted string'\">Span content</span>\n        <span data-test='\"double quoted string\"'>Span content</span>\n        <span data-test=\"string without quotes\">Span content</span>\n    \"\"\",\n            page.content,\n        )\n\n    def test_article_metadata_key_lowercase(self):\n        # Keys of metadata should be lowercase.\n        page = self.read_file(path=\"article_with_uppercase_metadata.html\")\n\n        # Key should be lowercase\n        self.assertIn(\"category\", page.metadata, \"Key should be lowercase.\")\n\n        # Value should keep cases\n        self.assertEqual(\"Yeah\", page.metadata.get(\"category\"))\n\n    def test_article_with_nonconformant_meta_tags(self):\n        page = self.read_file(path=\"article_with_nonconformant_meta_tags.html\")\n        expected = {\n            \"summary\": \"Summary and stuff\",\n            \"title\": \"Article with Nonconformant HTML meta tags\",\n        }\n\n        self.assertDictHasSubset(page.metadata, expected)\n\n    def test_article_with_inline_svg(self):\n        page = self.read_file(path=\"article_with_inline_svg.html\")\n        expected = {\n            \"title\": \"Article with an inline SVG\",\n        }\n        self.assertDictHasSubset(page.metadata, expected)\n"
  },
  {
    "path": "pelican/tests/test_rstdirectives.py",
    "content": "from unittest.mock import Mock\n\nfrom pelican.rstdirectives import abbr_role\nfrom pelican.tests.support import unittest\n\n\nclass Test_abbr_role(unittest.TestCase):\n    def call_it(self, text):\n        rawtext = text\n        lineno = 42\n        inliner = Mock(name=\"inliner\")\n        nodes, system_messages = abbr_role(\"abbr\", rawtext, text, lineno, inliner)\n        self.assertEqual(system_messages, [])\n        self.assertEqual(len(nodes), 1)\n        return nodes[0]\n\n    def test(self):\n        node = self.call_it(\"Abbr (Abbreviation)\")\n        self.assertEqual(node.astext(), \"Abbr\")\n        self.assertEqual(node[\"explanation\"], \"Abbreviation\")\n\n    def test_newlines_in_explanation(self):\n        node = self.call_it(\"CUL (See you\\nlater)\")\n        self.assertEqual(node.astext(), \"CUL\")\n        self.assertEqual(node[\"explanation\"], \"See you\\nlater\")\n\n    def test_newlines_in_abbr(self):\n        node = self.call_it(\"US of\\nA \\n (USA)\")\n        self.assertEqual(node.astext(), \"US of\\nA\")\n        self.assertEqual(node[\"explanation\"], \"USA\")\n"
  },
  {
    "path": "pelican/tests/test_server.py",
    "content": "import os\nfrom io import BytesIO\nfrom shutil import rmtree\nfrom tempfile import mkdtemp\n\nfrom pelican.server import ComplexHTTPRequestHandler\nfrom pelican.tests.support import unittest\n\n\nclass MockRequest:\n    def makefile(self, *_args, **_kwargs):\n        return BytesIO(b\"\")\n\n\nclass MockServer:\n    pass\n\n\nclass TestServer(unittest.TestCase):\n    def setUp(self):\n        self.server = MockServer()\n        self.temp_output = mkdtemp(prefix=\"pelicantests.\")\n        self.old_cwd = os.getcwd()\n        os.chdir(self.temp_output)\n\n    def tearDown(self):\n        os.chdir(self.old_cwd)\n        rmtree(self.temp_output)\n\n    def test_get_path_that_exists(self):\n        handler = ComplexHTTPRequestHandler(\n            MockRequest(), (\"0.0.0.0\", 8888), self.server\n        )\n        handler.base_path = self.temp_output\n\n        open(os.path.join(self.temp_output, \"foo.html\"), \"a\").close()\n        os.mkdir(os.path.join(self.temp_output, \"foo\"))\n        open(os.path.join(self.temp_output, \"foo\", \"index.html\"), \"a\").close()\n\n        os.mkdir(os.path.join(self.temp_output, \"bar\"))\n        open(os.path.join(self.temp_output, \"bar\", \"index.html\"), \"a\").close()\n\n        os.mkdir(os.path.join(self.temp_output, \"baz\"))\n\n        for suffix in [\"\", \"/\"]:\n            # foo.html has precedence over foo/index.html\n            path = handler.get_path_that_exists(\"foo\" + suffix)\n            self.assertEqual(path, \"foo.html\")\n\n            # folder with index.html should return folder/index.html\n            path = handler.get_path_that_exists(\"bar\" + suffix)\n            self.assertEqual(path, \"bar/index.html\")\n\n            # folder without index.html should return same as input\n            path = handler.get_path_that_exists(\"baz\" + suffix)\n            self.assertEqual(path, \"baz\" + suffix)\n\n            # not existing path should return None\n            path = handler.get_path_that_exists(\"quux\" + suffix)\n            self.assertIsNone(path)\n"
  },
  {
    "path": "pelican/tests/test_settings.py",
    "content": "import copy\nimport locale\nimport os\nfrom os.path import abspath, dirname, join\n\nfrom pelican.settings import (\n    DEFAULT_CONFIG,\n    DEFAULT_THEME,\n    _printf_s_to_format_field,\n    configure_settings,\n    handle_deprecated_settings,\n    read_settings,\n)\nfrom pelican.tests.support import unittest\n\n\nclass TestSettingsConfiguration(unittest.TestCase):\n    \"\"\"Provided a file, it should read it, replace the default values,\n    append new values to the settings (if any), and apply basic settings\n    optimizations.\n    \"\"\"\n\n    def setUp(self):\n        self.old_locale = locale.setlocale(locale.LC_ALL)\n        locale.setlocale(locale.LC_ALL, \"C\")\n        self.PATH = abspath(dirname(__file__))\n        default_conf = join(self.PATH, \"default_conf.py\")\n        self.settings = read_settings(default_conf)\n\n    def tearDown(self):\n        locale.setlocale(locale.LC_ALL, self.old_locale)\n\n    def test_overwrite_existing_settings(self):\n        self.assertEqual(self.settings.get(\"SITENAME\"), \"Alexis' log\")\n        self.assertEqual(self.settings.get(\"SITEURL\"), \"http://blog.notmyidea.org\")\n\n    def test_keep_default_settings(self):\n        # Keep default settings if not defined.\n        self.assertEqual(\n            self.settings.get(\"DEFAULT_CATEGORY\"), DEFAULT_CONFIG[\"DEFAULT_CATEGORY\"]\n        )\n\n    def test_dont_copy_small_keys(self):\n        # Do not copy keys not in caps.\n        self.assertNotIn(\"foobar\", self.settings)\n\n    def test_read_empty_settings(self):\n        # Ensure an empty settings file results in default settings.\n        settings = read_settings(None)\n        expected = copy.deepcopy(DEFAULT_CONFIG)\n        # Added by configure settings\n        expected[\"FEED_DOMAIN\"] = \"\"\n        expected[\"ARTICLE_EXCLUDES\"] = [\"pages\"]\n        expected[\"PAGE_EXCLUDES\"] = [\"\"]\n        self.maxDiff = None\n        self.assertDictEqual(settings, expected)\n\n    def test_settings_return_independent(self):\n        # Make sure that the results from one settings call doesn't\n        # effect past or future instances.\n        self.PATH = abspath(dirname(__file__))\n        default_conf = join(self.PATH, \"default_conf.py\")\n        settings = read_settings(default_conf)\n        settings[\"SITEURL\"] = \"new-value\"\n        new_settings = read_settings(default_conf)\n        self.assertNotEqual(new_settings[\"SITEURL\"], settings[\"SITEURL\"])\n\n    def test_defaults_not_overwritten(self):\n        # This assumes 'SITENAME': 'A Pelican Blog'\n        settings = read_settings(None)\n        settings[\"SITENAME\"] = \"Not a Pelican Blog\"\n        self.assertNotEqual(settings[\"SITENAME\"], DEFAULT_CONFIG[\"SITENAME\"])\n\n    def test_static_path_settings_safety(self):\n        # Disallow static paths from being strings\n        settings = {\n            \"STATIC_PATHS\": \"foo/bar\",\n            \"THEME_STATIC_PATHS\": \"bar/baz\",\n            # These 4 settings are required to run configure_settings\n            \"PATH\": \".\",\n            \"THEME\": DEFAULT_THEME,\n            \"SITEURL\": \"http://blog.notmyidea.org/\",\n            \"LOCALE\": \"\",\n        }\n        configure_settings(settings)\n        self.assertEqual(settings[\"STATIC_PATHS\"], DEFAULT_CONFIG[\"STATIC_PATHS\"])\n        self.assertEqual(\n            settings[\"THEME_STATIC_PATHS\"], DEFAULT_CONFIG[\"THEME_STATIC_PATHS\"]\n        )\n\n    def test_configure_settings(self):\n        # Manipulations to settings should be applied correctly.\n        settings = {\n            \"SITEURL\": \"http://blog.notmyidea.org/\",\n            \"LOCALE\": \"\",\n            \"PATH\": os.curdir,\n            \"THEME\": DEFAULT_THEME,\n        }\n        configure_settings(settings)\n\n        # SITEURL should not have a trailing slash\n        self.assertEqual(settings[\"SITEURL\"], \"http://blog.notmyidea.org\")\n\n        # FEED_DOMAIN, if undefined, should default to SITEURL\n        self.assertEqual(settings[\"FEED_DOMAIN\"], \"http://blog.notmyidea.org\")\n\n        settings[\"FEED_DOMAIN\"] = \"http://feeds.example.com\"\n        configure_settings(settings)\n        self.assertEqual(settings[\"FEED_DOMAIN\"], \"http://feeds.example.com\")\n\n    def test_theme_settings_exceptions(self):\n        settings = self.settings\n\n        # Check that theme lookup in \"pelican/themes\" functions as expected\n        settings[\"THEME\"] = os.path.split(settings[\"THEME\"])[1]\n        configure_settings(settings)\n        self.assertEqual(settings[\"THEME\"], DEFAULT_THEME)\n\n        # Check that non-existent theme raises exception\n        settings[\"THEME\"] = \"foo\"\n        self.assertRaises(Exception, configure_settings, settings)\n\n    def test_deprecated_dir_setting(self):\n        settings = self.settings\n\n        settings[\"ARTICLE_DIR\"] = \"foo\"\n        settings[\"PAGE_DIR\"] = \"bar\"\n\n        settings = handle_deprecated_settings(settings)\n\n        self.assertEqual(settings[\"ARTICLE_PATHS\"], [\"foo\"])\n        self.assertEqual(settings[\"PAGE_PATHS\"], [\"bar\"])\n\n        with self.assertRaises(KeyError):\n            settings[\"ARTICLE_DIR\"]\n            settings[\"PAGE_DIR\"]\n\n    def test_default_encoding(self):\n        # Test that the user locale is set if not specified in settings\n\n        locale.setlocale(locale.LC_ALL, \"C\")\n        # empty string = user system locale\n        self.assertEqual(self.settings[\"LOCALE\"], [\"\"])\n\n        configure_settings(self.settings)\n        lc_time = locale.getlocale(locale.LC_TIME)  # should be set to user locale\n\n        # explicitly set locale to user pref and test\n        locale.setlocale(locale.LC_TIME, \"\")\n        self.assertEqual(lc_time, locale.getlocale(locale.LC_TIME))\n\n    def test_invalid_settings_throw_exception(self):\n        # Test that the path name is valid\n\n        # test that 'PATH' is set\n        settings = {}\n\n        self.assertRaises(Exception, configure_settings, settings)\n\n        # Test that 'PATH' is valid\n        settings[\"PATH\"] = \"\"\n        self.assertRaises(Exception, configure_settings, settings)\n\n        # Test nonexistent THEME\n        settings[\"PATH\"] = os.curdir\n        settings[\"THEME\"] = \"foo\"\n\n        self.assertRaises(Exception, configure_settings, settings)\n\n    def test__printf_s_to_format_field(self):\n        for s in (\"%s\", \"{%s}\", \"{%s\"):\n            option = f\"foo/{s}/bar.baz\"\n            result = _printf_s_to_format_field(option, \"slug\")\n            expected = option % \"qux\"\n            found = result.format(slug=\"qux\")\n            self.assertEqual(expected, found)\n\n    def test_deprecated_extra_templates_paths(self):\n        settings = self.settings\n        settings[\"EXTRA_TEMPLATES_PATHS\"] = [\"/foo/bar\", \"/ha\"]\n\n        settings = handle_deprecated_settings(settings)\n\n        self.assertEqual(settings[\"THEME_TEMPLATES_OVERRIDES\"], [\"/foo/bar\", \"/ha\"])\n        self.assertNotIn(\"EXTRA_TEMPLATES_PATHS\", settings)\n\n    def test_deprecated_paginated_direct_templates(self):\n        settings = self.settings\n        settings[\"PAGINATED_DIRECT_TEMPLATES\"] = [\"index\", \"archives\"]\n        settings[\"PAGINATED_TEMPLATES\"] = {\"index\": 10, \"category\": None}\n        settings = handle_deprecated_settings(settings)\n        self.assertEqual(\n            settings[\"PAGINATED_TEMPLATES\"],\n            {\"index\": 10, \"category\": None, \"archives\": None},\n        )\n        self.assertNotIn(\"PAGINATED_DIRECT_TEMPLATES\", settings)\n\n    def test_deprecated_paginated_direct_templates_from_file(self):\n        # This is equivalent to reading a settings file that has\n        # PAGINATED_DIRECT_TEMPLATES defined but no PAGINATED_TEMPLATES.\n        settings = read_settings(\n            None, override={\"PAGINATED_DIRECT_TEMPLATES\": [\"index\", \"archives\"]}\n        )\n        self.assertEqual(\n            settings[\"PAGINATED_TEMPLATES\"],\n            {\n                \"archives\": None,\n                \"author\": None,\n                \"index\": None,\n                \"category\": None,\n                \"tag\": None,\n            },\n        )\n        self.assertNotIn(\"PAGINATED_DIRECT_TEMPLATES\", settings)\n\n    def test_theme_and_extra_templates_exception(self):\n        settings = self.settings\n        settings[\"EXTRA_TEMPLATES_PATHS\"] = [\"/ha\"]\n        settings[\"THEME_TEMPLATES_OVERRIDES\"] = [\"/foo/bar\"]\n\n        self.assertRaises(Exception, handle_deprecated_settings, settings)\n\n    def test_slug_and_slug_regex_substitutions_exception(self):\n        settings = {}\n        settings[\"SLUG_REGEX_SUBSTITUTIONS\"] = [(\"C++\", \"cpp\")]\n        settings[\"TAG_SUBSTITUTIONS\"] = [(\"C#\", \"csharp\")]\n\n        self.assertRaises(Exception, handle_deprecated_settings, settings)\n\n    def test_deprecated_slug_substitutions(self):\n        default_slug_regex_subs = self.settings[\"SLUG_REGEX_SUBSTITUTIONS\"]\n\n        # If no deprecated setting is set, don't set new ones\n        settings = {}\n        settings = handle_deprecated_settings(settings)\n        self.assertNotIn(\"SLUG_REGEX_SUBSTITUTIONS\", settings)\n        self.assertNotIn(\"TAG_REGEX_SUBSTITUTIONS\", settings)\n        self.assertNotIn(\"CATEGORY_REGEX_SUBSTITUTIONS\", settings)\n        self.assertNotIn(\"AUTHOR_REGEX_SUBSTITUTIONS\", settings)\n\n        # If SLUG_SUBSTITUTIONS is set, set {SLUG, AUTHOR}_REGEX_SUBSTITUTIONS\n        # correctly, don't set {CATEGORY, TAG}_REGEX_SUBSTITUTIONS\n        settings = {}\n        settings[\"SLUG_SUBSTITUTIONS\"] = [(\"C++\", \"cpp\")]\n        settings = handle_deprecated_settings(settings)\n        self.assertEqual(\n            settings.get(\"SLUG_REGEX_SUBSTITUTIONS\"),\n            [(r\"C\\+\\+\", \"cpp\")] + default_slug_regex_subs,\n        )\n        self.assertNotIn(\"TAG_REGEX_SUBSTITUTIONS\", settings)\n        self.assertNotIn(\"CATEGORY_REGEX_SUBSTITUTIONS\", settings)\n        self.assertEqual(\n            settings.get(\"AUTHOR_REGEX_SUBSTITUTIONS\"), default_slug_regex_subs\n        )\n\n        # If {CATEGORY, TAG, AUTHOR}_SUBSTITUTIONS are set, set\n        # {CATEGORY, TAG, AUTHOR}_REGEX_SUBSTITUTIONS correctly, don't set\n        # SLUG_REGEX_SUBSTITUTIONS\n        settings = {}\n        settings[\"TAG_SUBSTITUTIONS\"] = [(\"C#\", \"csharp\")]\n        settings[\"CATEGORY_SUBSTITUTIONS\"] = [(\"C#\", \"csharp\")]\n        settings[\"AUTHOR_SUBSTITUTIONS\"] = [(\"Alexander Todorov\", \"atodorov\")]\n        settings = handle_deprecated_settings(settings)\n        self.assertNotIn(\"SLUG_REGEX_SUBSTITUTIONS\", settings)\n        self.assertEqual(\n            settings[\"TAG_REGEX_SUBSTITUTIONS\"],\n            [(r\"C\\#\", \"csharp\")] + default_slug_regex_subs,\n        )\n        self.assertEqual(\n            settings[\"CATEGORY_REGEX_SUBSTITUTIONS\"],\n            [(r\"C\\#\", \"csharp\")] + default_slug_regex_subs,\n        )\n        self.assertEqual(\n            settings[\"AUTHOR_REGEX_SUBSTITUTIONS\"],\n            [(r\"Alexander\\ Todorov\", \"atodorov\")] + default_slug_regex_subs,\n        )\n\n        # If {SLUG, CATEGORY, TAG, AUTHOR}_SUBSTITUTIONS are set, set\n        # {SLUG, CATEGORY, TAG, AUTHOR}_REGEX_SUBSTITUTIONS correctly\n        settings = {}\n        settings[\"SLUG_SUBSTITUTIONS\"] = [(\"C++\", \"cpp\")]\n        settings[\"TAG_SUBSTITUTIONS\"] = [(\"C#\", \"csharp\")]\n        settings[\"CATEGORY_SUBSTITUTIONS\"] = [(\"C#\", \"csharp\")]\n        settings[\"AUTHOR_SUBSTITUTIONS\"] = [(\"Alexander Todorov\", \"atodorov\")]\n        settings = handle_deprecated_settings(settings)\n        self.assertEqual(\n            settings[\"TAG_REGEX_SUBSTITUTIONS\"],\n            [(r\"C\\+\\+\", \"cpp\")] + [(r\"C\\#\", \"csharp\")] + default_slug_regex_subs,\n        )\n        self.assertEqual(\n            settings[\"CATEGORY_REGEX_SUBSTITUTIONS\"],\n            [(r\"C\\+\\+\", \"cpp\")] + [(r\"C\\#\", \"csharp\")] + default_slug_regex_subs,\n        )\n        self.assertEqual(\n            settings[\"AUTHOR_REGEX_SUBSTITUTIONS\"],\n            [(r\"Alexander\\ Todorov\", \"atodorov\")] + default_slug_regex_subs,\n        )\n\n        # Handle old 'skip' flags correctly\n        settings = {}\n        settings[\"SLUG_SUBSTITUTIONS\"] = [(\"C++\", \"cpp\", True)]\n        settings[\"AUTHOR_SUBSTITUTIONS\"] = [(\"Alexander Todorov\", \"atodorov\", False)]\n        settings = handle_deprecated_settings(settings)\n        self.assertEqual(\n            settings.get(\"SLUG_REGEX_SUBSTITUTIONS\"),\n            [(r\"C\\+\\+\", \"cpp\")] + [(r\"(?u)\\A\\s*\", \"\"), (r\"(?u)\\s*\\Z\", \"\")],\n        )\n        self.assertEqual(\n            settings[\"AUTHOR_REGEX_SUBSTITUTIONS\"],\n            [(r\"Alexander\\ Todorov\", \"atodorov\")] + default_slug_regex_subs,\n        )\n\n    def test_deprecated_slug_substitutions_from_file(self):\n        # This is equivalent to reading a settings file that has\n        # SLUG_SUBSTITUTIONS defined but no SLUG_REGEX_SUBSTITUTIONS.\n        settings = read_settings(\n            None, override={\"SLUG_SUBSTITUTIONS\": [(\"C++\", \"cpp\")]}\n        )\n        self.assertEqual(\n            settings[\"SLUG_REGEX_SUBSTITUTIONS\"],\n            [(r\"C\\+\\+\", \"cpp\")] + self.settings[\"SLUG_REGEX_SUBSTITUTIONS\"],\n        )\n        self.assertNotIn(\"SLUG_SUBSTITUTIONS\", settings)\n"
  },
  {
    "path": "pelican/tests/test_testsuite.py",
    "content": "import warnings\n\nfrom pelican.tests.support import unittest\n\n\nclass TestSuiteTest(unittest.TestCase):\n    def test_error_on_warning(self):\n        with self.assertRaises(UserWarning):\n            warnings.warn(\"test warning\")  # noqa: B028\n"
  },
  {
    "path": "pelican/tests/test_theme.py",
    "content": "import os\nimport unittest\nfrom shutil import rmtree\nfrom tempfile import mkdtemp\n\nfrom pelican import Pelican\nfrom pelican.settings import read_settings\nfrom pelican.tests.support import LoggedTestCase, mute\n\nCURRENT_DIR = os.path.dirname(os.path.abspath(__file__))\nCONTENT_DIR = os.path.join(CURRENT_DIR, \"simple_content\")\n\n\nclass TestTemplateInheritance(LoggedTestCase):\n    def setUp(self):\n        super().setUp()\n        self.temp_output = mkdtemp(prefix=\"pelican_test_output.\")\n        self.temp_theme = mkdtemp(prefix=\"pelican_test_theme.\")\n        self.temp_cache = mkdtemp(prefix=\"pelican_test_cache.\")\n\n        # Create test theme directory structure\n        os.makedirs(os.path.join(self.temp_theme, \"templates\"), exist_ok=True)\n\n        # Create base.html template that inherits from simple theme\n        template_content = \"\"\"{% extends \"!simple/base.html\" %}\n\n{% block head %}\n{{ super() }}\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"{{ SITEURL }}/theme/css/style.css\" />\n{% endblock %}\n\n{% block footer %}\n    <p>New footer</p>\n{% endblock %}\n\"\"\"\n\n        with open(os.path.join(self.temp_theme, \"templates\", \"base.html\"), \"w\") as f:\n            f.write(template_content)\n\n    def tearDown(self):\n        \"\"\"Clean up temporary directories and files\"\"\"\n        for path in [self.temp_output, self.temp_theme, self.temp_cache]:\n            if os.path.exists(path):\n                rmtree(path)\n\n        super().tearDown()\n\n    def test_simple_theme(self):\n        \"\"\"Test that when a template is missing from our theme, Pelican falls back\n        to using the template from the simple theme.\"\"\"\n\n        settings = read_settings(\n            path=None,\n            override={\n                \"THEME\": \"simple\",\n                \"PATH\": CONTENT_DIR,\n                \"OUTPUT_PATH\": self.temp_output,\n                \"CACHE_PATH\": self.temp_cache,\n                \"SITEURL\": \"http://example.com\",\n                # Disable unnecessary output that might cause failures\n                \"ARCHIVES_SAVE_AS\": \"\",\n                \"CATEGORIES_SAVE_AS\": \"\",\n                \"TAGS_SAVE_AS\": \"\",\n                \"AUTHOR_SAVE_AS\": \"\",\n                \"AUTHORS_SAVE_AS\": \"\",\n            },\n        )\n\n        pelican = Pelican(settings=settings)\n        mute(True)(pelican.run)()\n\n        output_file = os.path.join(self.temp_output, \"test-md-file.html\")\n        self.assertTrue(os.path.exists(output_file))\n\n        with open(output_file) as f:\n            content = f.read()\n\n        # Verify file content is present\n        self.assertIn(\"Test md File\", content)\n\n        # Verify simple theme content is present\n        self.assertIn('<html lang=\"en\">', content)\n        self.assertIn(\"Proudly powered by\", content)\n\n        # Verify our custom theme additions are NOT present\n        # (since we should be using the simple theme's template directly)\n        self.assertNotIn(\n            '<link rel=\"stylesheet\" type=\"text/css\" href=\"http://example.com/theme/css/style.css\"',\n            content,\n        )\n\n    def test_theme_inheritance(self):\n        \"\"\"Test that theme inheritance works correctly\"\"\"\n        settings = read_settings(\n            path=None,\n            override={\n                \"THEME\": self.temp_theme,\n                \"PATH\": CONTENT_DIR,\n                \"OUTPUT_PATH\": self.temp_output,\n                \"CACHE_PATH\": self.temp_cache,\n                \"SITEURL\": \"http://example.com\",\n                # Disable unnecessary output that might cause failures\n                \"ARCHIVES_SAVE_AS\": \"\",\n                \"CATEGORIES_SAVE_AS\": \"\",\n                \"TAGS_SAVE_AS\": \"\",\n                \"AUTHOR_SAVE_AS\": \"\",\n                \"AUTHORS_SAVE_AS\": \"\",\n            },\n        )\n\n        pelican = Pelican(settings=settings)\n        # Generate the site with muted output\n        mute(True)(pelican.run)()\n\n        # Check the output file\n        output_file = os.path.join(self.temp_output, \"test-md-file.html\")\n        self.assertTrue(os.path.exists(output_file))\n\n        with open(output_file) as f:\n            content = f.read()\n\n        # Verify inheritance worked\n        self.assertIn('<html lang=\"en\">', content)  # From simple theme\n\n        # Verify super() maintained original head content\n        self.assertIn('<meta charset=\"utf-8\"', content)\n\n        # Verify our changes were included\n        self.assertIn(\n            '<link rel=\"stylesheet\" type=\"text/css\" href=\"http://example.com/theme/css/style.css\"',\n            content,\n        )\n        self.assertNotIn(\"Proudly powered by\", content)\n        self.assertIn(\"New footer\", content)\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "pelican/tests/test_urlwrappers.py",
    "content": "from pelican.tests.support import unittest\nfrom pelican.urlwrappers import Author, Category, Tag, URLWrapper\n\n\nclass TestURLWrapper(unittest.TestCase):\n    def test_ordering(self):\n        # URLWrappers are sorted by name\n        wrapper_a = URLWrapper(name=\"first\", settings={})\n        wrapper_b = URLWrapper(name=\"last\", settings={})\n        self.assertFalse(wrapper_a > wrapper_b)\n        self.assertFalse(wrapper_a >= wrapper_b)\n        self.assertFalse(wrapper_a == wrapper_b)\n        self.assertTrue(wrapper_a != wrapper_b)\n        self.assertTrue(wrapper_a <= wrapper_b)\n        self.assertTrue(wrapper_a < wrapper_b)\n        wrapper_b.name = \"first\"\n        self.assertFalse(wrapper_a > wrapper_b)\n        self.assertTrue(wrapper_a >= wrapper_b)\n        self.assertTrue(wrapper_a == wrapper_b)\n        self.assertFalse(wrapper_a != wrapper_b)\n        self.assertTrue(wrapper_a <= wrapper_b)\n        self.assertFalse(wrapper_a < wrapper_b)\n        wrapper_a.name = \"last\"\n        self.assertTrue(wrapper_a > wrapper_b)\n        self.assertTrue(wrapper_a >= wrapper_b)\n        self.assertFalse(wrapper_a == wrapper_b)\n        self.assertTrue(wrapper_a != wrapper_b)\n        self.assertFalse(wrapper_a <= wrapper_b)\n        self.assertFalse(wrapper_a < wrapper_b)\n\n    def test_equality(self):\n        tag = Tag(\"test\", settings={})\n        cat = Category(\"test\", settings={})\n        author = Author(\"test\", settings={})\n\n        # same name, but different class\n        self.assertNotEqual(tag, cat)\n        self.assertNotEqual(tag, author)\n\n        # should be equal vs text representing the same name\n        self.assertEqual(tag, \"test\")\n\n        # should not be equal vs binary\n        self.assertNotEqual(tag, b\"test\")\n\n        # Tags describing the same should be equal\n        tag_equal = Tag(\"Test\", settings={})\n        self.assertEqual(tag, tag_equal)\n\n        # Author describing the same should be equal\n        author_equal = Author(\"Test\", settings={})\n        self.assertEqual(author, author_equal)\n\n        cat_ascii = Category(\"指導書\", settings={})\n        self.assertEqual(cat_ascii, \"zhi dao shu\")\n\n    def test_slugify_with_substitutions_and_dots(self):\n        tag = Tag(\n            \"Tag Dot\",\n            settings={\n                \"TAG_REGEX_SUBSTITUTIONS\": [\n                    (\"Tag Dot\", \"tag.dot\"),\n                ]\n            },\n        )\n        cat = Category(\n            \"Category Dot\",\n            settings={\n                \"CATEGORY_REGEX_SUBSTITUTIONS\": [\n                    (\"Category Dot\", \"cat.dot\"),\n                ]\n            },\n        )\n\n        self.assertEqual(tag.slug, \"tag.dot\")\n        self.assertEqual(cat.slug, \"cat.dot\")\n\n    def test_author_slug_substitutions(self):\n        settings = {\n            \"AUTHOR_REGEX_SUBSTITUTIONS\": [\n                (\"Alexander Todorov\", \"atodorov\"),\n                (\"Krasimir Tsonev\", \"krasimir\"),\n                (r\"[^\\w\\s-]\", \"\"),\n                (r\"(?u)\\A\\s*\", \"\"),\n                (r\"(?u)\\s*\\Z\", \"\"),\n                (r\"[-\\s]+\", \"-\"),\n            ]\n        }\n\n        author1 = Author(\"Mr. Senko\", settings=settings)\n        author2 = Author(\"Alexander Todorov\", settings=settings)\n        author3 = Author(\"Krasimir Tsonev\", settings=settings)\n\n        self.assertEqual(author1.slug, \"mr-senko\")\n        self.assertEqual(author2.slug, \"atodorov\")\n        self.assertEqual(author3.slug, \"krasimir\")\n"
  },
  {
    "path": "pelican/tests/test_utils.py",
    "content": "import locale\nimport logging\nimport os\nimport shutil\nfrom datetime import timezone\nfrom sys import platform\nfrom tempfile import mkdtemp\n\nimport watchfiles\n\ntry:\n    from zoneinfo import ZoneInfo\nexcept ModuleNotFoundError:\n    from backports.zoneinfo import ZoneInfo\n\nfrom pelican import utils\nfrom pelican.generators import TemplatePagesGenerator\nfrom pelican.settings import DEFAULT_CONFIG, read_settings\nfrom pelican.tests.support import (\n    LoggedTestCase,\n    get_article,\n    locale_available,\n    unittest,\n)\nfrom pelican.writers import Writer\n\n\nclass ClassDeprAttr:\n    _new_attribute = \"new_value\"\n\n    @utils.deprecated_attribute(\n        old=\"_old_attribute\", new=\"_new_attribute\", since=(3, 1, 0), remove=(4, 1, 3)\n    )\n    def _old_attribute():\n        return None\n\n\nclass TestUtils(LoggedTestCase):\n    def setUp(self):\n        super().setUp()\n        self.temp_output = mkdtemp(prefix=\"pelicantests.\")\n\n    def tearDown(self):\n        super().tearDown()\n        shutil.rmtree(self.temp_output)\n\n    def test_deprecated_attribute(self):\n        test_class = ClassDeprAttr()\n        value = test_class._old_attribute\n        self.assertEqual(value, test_class._new_attribute)\n        self.assertLogCountEqual(\n            count=1,\n            msg=(\n                \"_old_attribute has been deprecated since 3.1.0 and will be \"\n                \"removed by version 4.1.3.  Use _new_attribute instead\"\n            ),\n            level=logging.WARNING,\n        )\n\n    def test_get_date(self):\n        # valid ones\n        date = utils.SafeDatetime(year=2012, month=11, day=22)\n        date_hour = utils.SafeDatetime(year=2012, month=11, day=22, hour=22, minute=11)\n        date_hour_z = utils.SafeDatetime(\n            year=2012, month=11, day=22, hour=22, minute=11, tzinfo=timezone.utc\n        )\n        date_hour_est = utils.SafeDatetime(\n            year=2012, month=11, day=22, hour=22, minute=11, tzinfo=ZoneInfo(\"EST\")\n        )\n        date_hour_sec = utils.SafeDatetime(\n            year=2012, month=11, day=22, hour=22, minute=11, second=10\n        )\n        date_hour_sec_z = utils.SafeDatetime(\n            year=2012,\n            month=11,\n            day=22,\n            hour=22,\n            minute=11,\n            second=10,\n            tzinfo=timezone.utc,\n        )\n        date_hour_sec_est = utils.SafeDatetime(\n            year=2012,\n            month=11,\n            day=22,\n            hour=22,\n            minute=11,\n            second=10,\n            tzinfo=ZoneInfo(\"EST\"),\n        )\n        date_hour_sec_frac_z = utils.SafeDatetime(\n            year=2012,\n            month=11,\n            day=22,\n            hour=22,\n            minute=11,\n            second=10,\n            microsecond=123000,\n            tzinfo=timezone.utc,\n        )\n        dates = {\n            \"2012-11-22\": date,\n            \"2012/11/22\": date,\n            \"2012-11-22 22:11\": date_hour,\n            \"2012/11/22 22:11\": date_hour,\n            \"22-11-2012\": date,\n            \"22/11/2012\": date,\n            \"22.11.2012\": date,\n            \"22.11.2012 22:11\": date_hour,\n            \"2012-11-22T22:11Z\": date_hour_z,\n            \"2012-11-22T22:11-0500\": date_hour_est,\n            \"2012-11-22 22:11:10\": date_hour_sec,\n            \"2012-11-22T22:11:10Z\": date_hour_sec_z,\n            \"2012-11-22T22:11:10-0500\": date_hour_sec_est,\n            \"2012-11-22T22:11:10.123Z\": date_hour_sec_frac_z,\n        }\n\n        # examples from http://www.w3.org/TR/NOTE-datetime\n        iso_8601_date = utils.SafeDatetime(year=1997, month=7, day=16)\n        iso_8601_date_hour_tz = utils.SafeDatetime(\n            year=1997,\n            month=7,\n            day=16,\n            hour=19,\n            minute=20,\n            tzinfo=ZoneInfo(\"Europe/London\"),\n        )\n        iso_8601_date_hour_sec_tz = utils.SafeDatetime(\n            year=1997,\n            month=7,\n            day=16,\n            hour=19,\n            minute=20,\n            second=30,\n            tzinfo=ZoneInfo(\"Europe/London\"),\n        )\n        iso_8601_date_hour_sec_ms_tz = utils.SafeDatetime(\n            year=1997,\n            month=7,\n            day=16,\n            hour=19,\n            minute=20,\n            second=30,\n            microsecond=450000,\n            tzinfo=ZoneInfo(\"Europe/London\"),\n        )\n        iso_8601 = {\n            \"1997-07-16\": iso_8601_date,\n            \"1997-07-16T19:20+01:00\": iso_8601_date_hour_tz,\n            \"1997-07-16T19:20:30+01:00\": iso_8601_date_hour_sec_tz,\n            \"1997-07-16T19:20:30.45+01:00\": iso_8601_date_hour_sec_ms_tz,\n        }\n\n        # invalid ones\n        invalid_dates = [\"2010-110-12\", \"yay\"]\n\n        for value, expected in dates.items():\n            self.assertEqual(utils.get_date(value), expected, value)\n\n        for value, expected in iso_8601.items():\n            self.assertEqual(utils.get_date(value), expected, value)\n\n        for item in invalid_dates:\n            self.assertRaises(ValueError, utils.get_date, item)\n\n    def test_slugify(self):\n        samples = (\n            (\"this is a test\", \"this-is-a-test\"),\n            (\"this        is a test\", \"this-is-a-test\"),\n            (\"this → is ← a ↑ test\", \"this-is-a-test\"),\n            (\"this--is---a test\", \"this-is-a-test\"),\n            (\n                \"unicode測試許功蓋，你看到了嗎？\",\n                \"unicodece-shi-xu-gong-gai-ni-kan-dao-liao-ma\",\n            ),\n            (\n                \"大飯原発４号機、１８日夜起動へ\",\n                \"da-fan-yuan-fa-4hao-ji-18ri-ye-qi-dong-he\",\n            ),\n        )\n\n        settings = read_settings()\n        subs = settings[\"SLUG_REGEX_SUBSTITUTIONS\"]\n\n        for value, expected in samples:\n            self.assertEqual(utils.slugify(value, regex_subs=subs), expected)\n\n        self.assertEqual(utils.slugify(\"Cat\", regex_subs=subs), \"cat\")\n        self.assertEqual(\n            utils.slugify(\"Cat\", regex_subs=subs, preserve_case=False), \"cat\"\n        )\n        self.assertEqual(\n            utils.slugify(\"Cat\", regex_subs=subs, preserve_case=True), \"Cat\"\n        )\n\n    def test_slugify_use_unicode(self):\n        samples = (\n            (\"this is a test\", \"this-is-a-test\"),\n            (\"this        is a test\", \"this-is-a-test\"),\n            (\"this → is ← a ↑ test\", \"this-is-a-test\"),\n            (\"this--is---a test\", \"this-is-a-test\"),\n            (\"unicode測試許功蓋，你看到了嗎？\", \"unicode測試許功蓋你看到了嗎\"),\n            (\"Çığ\", \"çığ\"),\n        )\n\n        settings = read_settings()\n        subs = settings[\"SLUG_REGEX_SUBSTITUTIONS\"]\n\n        for value, expected in samples:\n            self.assertEqual(\n                utils.slugify(value, regex_subs=subs, use_unicode=True), expected\n            )\n\n        # check with preserve case\n        self.assertEqual(\n            utils.slugify(\"Çığ\", regex_subs=subs, preserve_case=True, use_unicode=True),\n            \"Çığ\",\n        )\n\n        # check normalization\n        samples = (\n            (\"大飯原発４号機、１８日夜起動へ\", \"大飯原発4号機18日夜起動へ\"),\n            (\n                \"\\N{LATIN SMALL LETTER C}\\N{COMBINING CEDILLA}\",\n                \"\\N{LATIN SMALL LETTER C WITH CEDILLA}\",\n            ),\n        )\n        for value, expected in samples:\n            self.assertEqual(\n                utils.slugify(value, regex_subs=subs, use_unicode=True), expected\n            )\n\n    def test_slugify_substitute(self):\n        samples = (\n            (\"C++ is based on C\", \"cpp-is-based-on-c\"),\n            (\"C+++ test C+ test\", \"cpp-test-c-test\"),\n            (\"c++, c#, C#, C++\", \"cpp-c-sharp-c-sharp-cpp\"),\n            (\"c++-streams\", \"cpp-streams\"),\n        )\n\n        settings = read_settings()\n        subs = [\n            (r\"C\\+\\+\", \"CPP\"),\n            (r\"C#\", \"C-SHARP\"),\n        ] + settings[\"SLUG_REGEX_SUBSTITUTIONS\"]\n        for value, expected in samples:\n            self.assertEqual(utils.slugify(value, regex_subs=subs), expected)\n\n    def test_slugify_substitute_and_keeping_non_alphanum(self):\n        samples = (\n            (\"Fedora QA\", \"fedora.qa\"),\n            (\"C++ is used by Fedora QA\", \"cpp is used by fedora.qa\"),\n            (\"C++ is based on C\", \"cpp is based on c\"),\n            (\"C+++ test C+ test\", \"cpp+ test c+ test\"),\n        )\n\n        subs = [\n            (r\"Fedora QA\", \"fedora.qa\"),\n            (r\"c\\+\\+\", \"cpp\"),\n        ]\n        for value, expected in samples:\n            self.assertEqual(utils.slugify(value, regex_subs=subs), expected)\n\n    def test_get_relative_path(self):\n        samples = (\n            (os.path.join(\"test\", \"test.html\"), os.pardir),\n            (\n                os.path.join(\"test\", \"test\", \"test.html\"),\n                os.path.join(os.pardir, os.pardir),\n            ),\n            (\"test.html\", os.curdir),\n            (os.path.join(\"/test\", \"test.html\"), os.pardir),\n            (\n                os.path.join(\"/test\", \"test\", \"test.html\"),\n                os.path.join(os.pardir, os.pardir),\n            ),\n            (\"/test.html\", os.curdir),\n        )\n\n        for value, expected in samples:\n            self.assertEqual(utils.get_relative_path(value), expected)\n\n    def test_truncate_html_words(self):\n        # Plain text.\n        self.assertEqual(utils.truncate_html_words(\"short string\", 20), \"short string\")\n        self.assertEqual(\n            utils.truncate_html_words(\"word \" * 100, 20), \"word \" * 20 + \"…\"\n        )\n\n        # Plain text with Unicode content.\n        self.assertEqual(\n            utils.truncate_html_words(\n                \"我愿意这样，朋友——我独自远行，不但没有你，\\\n                 并且再没有别的影在黑暗里。\",\n                12,\n            ),\n            \"我愿意这样，朋友——我独自远行\" + \" …\",\n        )\n        self.assertEqual(\n            utils.truncate_html_words(\n                \"Ты мелькнула, ты предстала, Снова сердце задрожало,\", 3\n            ),\n            \"Ты мелькнула, ты\" + \" …\",\n        )\n        self.assertEqual(\n            utils.truncate_html_words(\"Trong đầm gì đẹp bằng sen\", 4),\n            \"Trong đầm gì đẹp\" + \" …\",\n        )\n\n        # Words enclosed or intervaled by HTML tags.\n        self.assertEqual(\n            utils.truncate_html_words(\"<p>\" + \"word \" * 100 + \"</p>\", 20),\n            \"<p>\" + \"word \" * 20 + \"…</p>\",\n        )\n        self.assertEqual(\n            utils.truncate_html_words(\n                '<span\\nstyle=\"\\n…\\n\">' + \"word \" * 100 + \"</span>\", 20\n            ),\n            '<span\\nstyle=\"\\n…\\n\">' + \"word \" * 20 + \"…</span>\",\n        )\n        self.assertEqual(\n            utils.truncate_html_words(\"<br>\" + \"word \" * 100, 20),\n            \"<br>\" + \"word \" * 20 + \"…\",\n        )\n        self.assertEqual(\n            utils.truncate_html_words(\"<!-- comment -->\" + \"word \" * 100, 20),\n            \"<!-- comment -->\" + \"word \" * 20 + \"…\",\n        )\n\n        # Words enclosed or intervaled by HTML tags with a custom end\n        # marker containing HTML tags.\n        self.assertEqual(\n            utils.truncate_html_words(\n                \"<p>\" + \"word \" * 100 + \"</p>\", 20, \"<span>marker</span>\"\n            ),\n            \"<p>\" + \"word \" * 20 + \"<span>marker</span></p>\",\n        )\n        self.assertEqual(\n            utils.truncate_html_words(\n                '<span\\nstyle=\"\\n…\\n\">' + \"word \" * 100 + \"</span>\",\n                20,\n                \"<span>marker</span>\",\n            ),\n            '<span\\nstyle=\"\\n…\\n\">' + \"word \" * 20 + \"<span>marker</span></span>\",\n        )\n        self.assertEqual(\n            utils.truncate_html_words(\n                \"<br>\" + \"word \" * 100, 20, \"<span>marker</span>\"\n            ),\n            \"<br>\" + \"word \" * 20 + \"<span>marker</span>\",\n        )\n        self.assertEqual(\n            utils.truncate_html_words(\n                \"<!-- comment -->\" + \"word \" * 100, 20, \"<span>marker</span>\"\n            ),\n            \"<!-- comment -->\" + \"word \" * 20 + \"<span>marker</span>\",\n        )\n\n        # Words with hypens and apostrophes.\n        self.assertEqual(utils.truncate_html_words(\"a-b \" * 100, 20), \"a-b \" * 20 + \"…\")\n        self.assertEqual(\n            utils.truncate_html_words(\"it's \" * 100, 20), \"it's \" * 20 + \"…\"\n        )\n\n        # Words with HTML entity references.\n        self.assertEqual(\n            utils.truncate_html_words(\"&eacute; \" * 100, 20), \"&eacute; \" * 20 + \"…\"\n        )\n        self.assertEqual(\n            utils.truncate_html_words(\"caf&eacute; \" * 100, 20),\n            \"caf&eacute; \" * 20 + \"…\",\n        )\n        self.assertEqual(\n            utils.truncate_html_words(\"&egrave;lite \" * 100, 20),\n            \"&egrave;lite \" * 20 + \"…\",\n        )\n        self.assertEqual(\n            utils.truncate_html_words(\"cafeti&eacute;re \" * 100, 20),\n            \"cafeti&eacute;re \" * 20 + \"…\",\n        )\n        self.assertEqual(\n            utils.truncate_html_words(\"&int;dx \" * 100, 20), \"&int;dx \" * 20 + \"…\"\n        )\n\n        # Words with HTML character references inside and outside\n        # the ASCII range.\n        self.assertEqual(\n            utils.truncate_html_words(\"&#xe9; \" * 100, 20), \"&#xe9; \" * 20 + \"…\"\n        )\n        self.assertEqual(\n            utils.truncate_html_words(\"&#x222b;dx \" * 100, 20), \"&#x222b;dx \" * 20 + \"…\"\n        )\n\n        # Words with invalid or broken HTML references.\n        self.assertEqual(utils.truncate_html_words(\"&invalid;\", 20), \"&invalid;\")\n        self.assertEqual(\n            utils.truncate_html_words(\"&#9999999999;\", 20), \"&#9999999999;\"\n        )\n        self.assertEqual(\n            utils.truncate_html_words(\"&#xfffffffff;\", 20), \"&#xfffffffff;\"\n        )\n        self.assertEqual(utils.truncate_html_words(\"&mdash text\", 20), \"&mdash text\")\n        self.assertEqual(utils.truncate_html_words(\"&#1234 text\", 20), \"&#1234 text\")\n        self.assertEqual(utils.truncate_html_words(\"&#xabc text\", 20), \"&#xabc text\")\n\n    def test_truncate_html_paragraphs(self):\n        one = \"<p>one</p>\"\n\n        self.assertEqual(utils.truncate_html_paragraphs(one, 0), \"\")\n        self.assertEqual(utils.truncate_html_paragraphs(one, 1), one)\n        self.assertEqual(utils.truncate_html_paragraphs(one, 2), one)\n\n        two = one + \"<p>two</p>\"\n        self.assertEqual(utils.truncate_html_paragraphs(two, 1), one)\n        self.assertEqual(utils.truncate_html_paragraphs(two, 2), two)\n\n        three = two + \"<p>three</p>\"\n        self.assertEqual(utils.truncate_html_paragraphs(three, 1), one)\n        self.assertEqual(utils.truncate_html_paragraphs(three, 2), two)\n        self.assertEqual(utils.truncate_html_paragraphs(three, 3), three)\n        self.assertEqual(utils.truncate_html_paragraphs(three, 4), three)\n\n    def test_process_translations(self):\n        fr_articles = []\n        en_articles = []\n\n        # create a bunch of articles\n        # 0: no translation metadata\n        fr_articles.append(\n            get_article(lang=\"fr\", slug=\"yay0\", title=\"Titre\", content=\"en français\")\n        )\n        en_articles.append(\n            get_article(lang=\"en\", slug=\"yay0\", title=\"Title\", content=\"in english\")\n        )\n        # 1: translation metadata on default lang\n        fr_articles.append(\n            get_article(lang=\"fr\", slug=\"yay1\", title=\"Titre\", content=\"en français\")\n        )\n        en_articles.append(\n            get_article(\n                lang=\"en\",\n                slug=\"yay1\",\n                title=\"Title\",\n                content=\"in english\",\n                translation=\"true\",\n            )\n        )\n        # 2: translation metadata not on default lang\n        fr_articles.append(\n            get_article(\n                lang=\"fr\",\n                slug=\"yay2\",\n                title=\"Titre\",\n                content=\"en français\",\n                translation=\"true\",\n            )\n        )\n        en_articles.append(\n            get_article(lang=\"en\", slug=\"yay2\", title=\"Title\", content=\"in english\")\n        )\n        # 3: back to default language detection if all items have the\n        #    translation metadata\n        fr_articles.append(\n            get_article(\n                lang=\"fr\",\n                slug=\"yay3\",\n                title=\"Titre\",\n                content=\"en français\",\n                translation=\"yep\",\n            )\n        )\n        en_articles.append(\n            get_article(\n                lang=\"en\",\n                slug=\"yay3\",\n                title=\"Title\",\n                content=\"in english\",\n                translation=\"yes\",\n            )\n        )\n        # 4-5: translation pairs with the same slug but different category\n        fr_articles.append(\n            get_article(\n                lang=\"fr\",\n                slug=\"yay4\",\n                title=\"Titre\",\n                content=\"en français\",\n                category=\"foo\",\n            )\n        )\n        en_articles.append(\n            get_article(\n                lang=\"en\",\n                slug=\"yay4\",\n                title=\"Title\",\n                content=\"in english\",\n                category=\"foo\",\n            )\n        )\n        fr_articles.append(\n            get_article(\n                lang=\"fr\",\n                slug=\"yay4\",\n                title=\"Titre\",\n                content=\"en français\",\n                category=\"bar\",\n            )\n        )\n        en_articles.append(\n            get_article(\n                lang=\"en\",\n                slug=\"yay4\",\n                title=\"Title\",\n                content=\"in english\",\n                category=\"bar\",\n            )\n        )\n\n        # try adding articles in both orders\n        for lang0_articles, lang1_articles in (\n            (fr_articles, en_articles),\n            (en_articles, fr_articles),\n        ):\n            articles = lang0_articles + lang1_articles\n\n            # test process_translations with falsy translation_id\n            index, trans = utils.process_translations(articles, translation_id=None)\n            for i in range(6):\n                for lang_articles in [en_articles, fr_articles]:\n                    self.assertIn(lang_articles[i], index)\n                    self.assertNotIn(lang_articles[i], trans)\n\n            # test process_translations with simple and complex translation_id\n            for translation_id in [\"slug\", {\"slug\", \"category\"}]:\n                index, trans = utils.process_translations(\n                    articles, translation_id=translation_id\n                )\n\n                for a in [\n                    en_articles[0],\n                    fr_articles[1],\n                    en_articles[2],\n                    en_articles[3],\n                    en_articles[4],\n                    en_articles[5],\n                ]:\n                    self.assertIn(a, index)\n                    self.assertNotIn(a, trans)\n\n                for a in [\n                    fr_articles[0],\n                    en_articles[1],\n                    fr_articles[2],\n                    fr_articles[3],\n                    fr_articles[4],\n                    fr_articles[5],\n                ]:\n                    self.assertIn(a, trans)\n                    self.assertNotIn(a, index)\n\n                for i in range(6):\n                    self.assertIn(en_articles[i], fr_articles[i].translations)\n                    self.assertIn(fr_articles[i], en_articles[i].translations)\n\n                for a_arts in [en_articles, fr_articles]:\n                    for b_arts in [en_articles, fr_articles]:\n                        if translation_id == \"slug\":\n                            self.assertIn(a_arts[4], b_arts[5].translations)\n                            self.assertIn(a_arts[5], b_arts[4].translations)\n                        elif translation_id == {\"slug\", \"category\"}:\n                            self.assertNotIn(a_arts[4], b_arts[5].translations)\n                            self.assertNotIn(a_arts[5], b_arts[4].translations)\n\n    def test_clean_output_dir(self):\n        retention = ()\n        test_directory = os.path.join(self.temp_output, \"clean_output\")\n        content = os.path.join(os.path.dirname(__file__), \"content\")\n        shutil.copytree(content, test_directory)\n        utils.clean_output_dir(test_directory, retention)\n        self.assertTrue(os.path.isdir(test_directory))\n        self.assertListEqual([], os.listdir(test_directory))\n        shutil.rmtree(test_directory)\n\n    def test_clean_output_dir_not_there(self):\n        retention = ()\n        test_directory = os.path.join(self.temp_output, \"does_not_exist\")\n        utils.clean_output_dir(test_directory, retention)\n        self.assertFalse(os.path.exists(test_directory))\n\n    def test_clean_output_dir_is_file(self):\n        retention = ()\n        test_directory = os.path.join(self.temp_output, \"this_is_a_file\")\n        f = open(test_directory, \"w\")\n        f.write(\"\")\n        f.close()\n        utils.clean_output_dir(test_directory, retention)\n        self.assertFalse(os.path.exists(test_directory))\n\n    def test_strftime(self):\n        d = utils.SafeDatetime(2012, 8, 29)\n\n        # simple formatting\n        self.assertEqual(utils.strftime(d, \"%d/%m/%y\"), \"29/08/12\")\n        self.assertEqual(utils.strftime(d, \"%d/%m/%Y\"), \"29/08/2012\")\n\n        # RFC 3339\n        self.assertEqual(\n            utils.strftime(d, \"%Y-%m-%dT%H:%M:%SZ\"), \"2012-08-29T00:00:00Z\"\n        )\n\n        # % escaped\n        self.assertEqual(utils.strftime(d, \"%d%%%m%%%y\"), \"29%08%12\")\n        self.assertEqual(utils.strftime(d, \"%d %% %m %% %y\"), \"29 % 08 % 12\")\n        # not valid % formatter\n        self.assertEqual(\n            utils.strftime(d, \"10% reduction in %Y\"), \"10% reduction in 2012\"\n        )\n        self.assertEqual(\n            utils.strftime(d, \"%10 reduction in %Y\"), \"%10 reduction in 2012\"\n        )\n\n        # with text\n        self.assertEqual(\n            utils.strftime(d, \"Published in %d-%m-%Y\"), \"Published in 29-08-2012\"\n        )\n\n        # with non-ascii text\n        self.assertEqual(\n            utils.strftime(d, \"%d/%m/%Y Øl trinken beim Besäufnis\"),\n            \"29/08/2012 Øl trinken beim Besäufnis\",\n        )\n\n        # alternative formatting options\n        self.assertEqual(utils.strftime(d, \"%-d/%-m/%y\"), \"29/8/12\")\n        self.assertEqual(utils.strftime(d, \"%-H:%-M:%-S\"), \"0:0:0\")\n\n        d = utils.SafeDatetime(2012, 8, 9)\n        self.assertEqual(utils.strftime(d, \"%-d/%-m/%y\"), \"9/8/12\")\n\n        d = utils.SafeDatetime(2021, 1, 8)\n        self.assertEqual(utils.strftime(d, \"%G - %-V - %u\"), \"2021 - 1 - 5\")\n\n    # test the output of utils.strftime in a different locale\n    # Turkish locale\n    @unittest.skipUnless(\n        locale_available(\"tr_TR.UTF-8\") or locale_available(\"Turkish\"),\n        \"Turkish locale needed\",\n    )\n    def test_strftime_locale_dependent_turkish(self):\n        temp_locale = \"Turkish\" if platform == \"win32\" else \"tr_TR.UTF-8\"\n\n        with utils.temporary_locale(temp_locale):\n            d = utils.SafeDatetime(2012, 8, 29)\n\n            # simple\n            self.assertEqual(utils.strftime(d, \"%d %B %Y\"), \"29 Ağustos 2012\")\n            self.assertEqual(\n                utils.strftime(d, \"%A, %d %B %Y\"), \"Çarşamba, 29 Ağustos 2012\"\n            )\n\n            # with text\n            self.assertEqual(\n                utils.strftime(d, \"Yayınlanma tarihi: %A, %d %B %Y\"),\n                \"Yayınlanma tarihi: Çarşamba, 29 Ağustos 2012\",\n            )\n\n            # non-ascii format candidate (someone might pass it… for some reason)\n            self.assertEqual(\n                utils.strftime(d, \"%Y yılında %üretim artışı\"),\n                \"2012 yılında %üretim artışı\",\n            )\n\n    # test the output of utils.strftime in a different locale\n    # French locale\n    @unittest.skipUnless(\n        locale_available(\"fr_FR.UTF-8\") or locale_available(\"French\"),\n        \"French locale needed\",\n    )\n    def test_strftime_locale_dependent_french(self):\n        temp_locale = \"French\" if platform == \"win32\" else \"fr_FR.UTF-8\"\n\n        with utils.temporary_locale(temp_locale):\n            d = utils.SafeDatetime(2012, 8, 29)\n\n            # simple\n            self.assertEqual(utils.strftime(d, \"%d %B %Y\"), \"29 août 2012\")\n\n            # depending on OS, the first letter is m or M\n            self.assertTrue(utils.strftime(d, \"%A\") in (\"mercredi\", \"Mercredi\"))\n\n            # with text\n            self.assertEqual(\n                utils.strftime(d, \"Écrit le %d %B %Y\"), \"Écrit le 29 août 2012\"\n            )\n\n            # non-ascii format candidate (someone might pass it… for some reason)\n            self.assertEqual(utils.strftime(d, \"%écrits en %Y\"), \"%écrits en 2012\")\n\n    def test_maybe_pluralize(self):\n        self.assertEqual(utils.maybe_pluralize(0, \"Article\", \"Articles\"), \"0 Articles\")\n        self.assertEqual(utils.maybe_pluralize(1, \"Article\", \"Articles\"), \"1 Article\")\n        self.assertEqual(utils.maybe_pluralize(2, \"Article\", \"Articles\"), \"2 Articles\")\n\n    def test_temporary_locale(self):\n        # test with default LC category\n        orig_locale = locale.setlocale(locale.LC_ALL)\n\n        with utils.temporary_locale(\"C\"):\n            self.assertEqual(locale.setlocale(locale.LC_ALL), \"C\")\n\n        self.assertEqual(locale.setlocale(locale.LC_ALL), orig_locale)\n\n        # test with custom LC category\n        orig_locale = locale.setlocale(locale.LC_TIME)\n\n        with utils.temporary_locale(\"C\", locale.LC_TIME):\n            self.assertEqual(locale.setlocale(locale.LC_TIME), \"C\")\n\n        self.assertEqual(locale.setlocale(locale.LC_TIME), orig_locale)\n\n\nclass TestCopy(unittest.TestCase):\n    \"\"\"Tests the copy utility\"\"\"\n\n    def setUp(self):\n        self.root_dir = mkdtemp(prefix=\"pelicantests.\")\n        self.old_locale = locale.setlocale(locale.LC_ALL)\n        locale.setlocale(locale.LC_ALL, \"C\")\n\n    def tearDown(self):\n        shutil.rmtree(self.root_dir)\n        locale.setlocale(locale.LC_ALL, self.old_locale)\n\n    def _create_file(self, *path):\n        with open(os.path.join(self.root_dir, *path), \"w\") as f:\n            f.write(\"42\\n\")\n\n    def _create_dir(self, *path):\n        os.makedirs(os.path.join(self.root_dir, *path))\n\n    def _exist_file(self, *path):\n        path = os.path.join(self.root_dir, *path)\n        self.assertTrue(os.path.isfile(path), f\"File does not exist: {path}\")\n\n    def _exist_dir(self, *path):\n        path = os.path.join(self.root_dir, *path)\n        self.assertTrue(os.path.exists(path), f\"Directory does not exist: {path}\")\n\n    def test_copy_file_same_path(self):\n        self._create_file(\"a.txt\")\n        utils.copy(\n            os.path.join(self.root_dir, \"a.txt\"), os.path.join(self.root_dir, \"b.txt\")\n        )\n        self._exist_file(\"b.txt\")\n\n    def test_copy_file_different_path(self):\n        self._create_dir(\"a\")\n        self._create_dir(\"b\")\n        self._create_file(\"a\", \"a.txt\")\n        utils.copy(\n            os.path.join(self.root_dir, \"a\", \"a.txt\"),\n            os.path.join(self.root_dir, \"b\", \"b.txt\"),\n        )\n        self._exist_dir(\"b\")\n        self._exist_file(\"b\", \"b.txt\")\n\n    def test_copy_file_create_dirs(self):\n        self._create_file(\"a.txt\")\n        utils.copy(\n            os.path.join(self.root_dir, \"a.txt\"),\n            os.path.join(self.root_dir, \"b0\", \"b1\", \"b2\", \"b3\", \"b.txt\"),\n        )\n        self._exist_dir(\"b0\")\n        self._exist_dir(\"b0\", \"b1\")\n        self._exist_dir(\"b0\", \"b1\", \"b2\")\n        self._exist_dir(\"b0\", \"b1\", \"b2\", \"b3\")\n        self._exist_file(\"b0\", \"b1\", \"b2\", \"b3\", \"b.txt\")\n\n    def test_copy_dir_same_path(self):\n        self._create_dir(\"a\")\n        self._create_file(\"a\", \"a.txt\")\n        utils.copy(os.path.join(self.root_dir, \"a\"), os.path.join(self.root_dir, \"b\"))\n        self._exist_dir(\"b\")\n        self._exist_file(\"b\", \"a.txt\")\n\n    def test_copy_dir_different_path(self):\n        self._create_dir(\"a0\")\n        self._create_dir(\"a0\", \"a1\")\n        self._create_file(\"a0\", \"a1\", \"a.txt\")\n        self._create_dir(\"b0\")\n        utils.copy(\n            os.path.join(self.root_dir, \"a0\", \"a1\"),\n            os.path.join(self.root_dir, \"b0\", \"b1\"),\n        )\n        self._exist_dir(\"b0\", \"b1\")\n        self._exist_file(\"b0\", \"b1\", \"a.txt\")\n\n    def test_copy_dir_create_dirs(self):\n        self._create_dir(\"a\")\n        self._create_file(\"a\", \"a.txt\")\n        utils.copy(\n            os.path.join(self.root_dir, \"a\"),\n            os.path.join(self.root_dir, \"b0\", \"b1\", \"b2\", \"b3\", \"b\"),\n        )\n        self._exist_dir(\"b0\")\n        self._exist_dir(\"b0\", \"b1\")\n        self._exist_dir(\"b0\", \"b1\", \"b2\")\n        self._exist_dir(\"b0\", \"b1\", \"b2\", \"b3\")\n        self._exist_dir(\"b0\", \"b1\", \"b2\", \"b3\", \"b\")\n        self._exist_file(\"b0\", \"b1\", \"b2\", \"b3\", \"b\", \"a.txt\")\n\n\nclass TestDateFormatter(unittest.TestCase):\n    \"\"\"Tests that the output of DateFormatter jinja filter is same as\n    utils.strftime\"\"\"\n\n    def setUp(self):\n        # prepare a temp content and output folder\n        self.temp_content = mkdtemp(prefix=\"pelicantests.\")\n        self.temp_output = mkdtemp(prefix=\"pelicantests.\")\n\n        # prepare a template file\n        template_dir = os.path.join(self.temp_content, \"template\")\n        template_path = os.path.join(template_dir, \"source.html\")\n        os.makedirs(template_dir)\n        with open(template_path, \"w\") as template_file:\n            template_file.write('date = {{ date|strftime(\"%A, %d %B %Y\") }}')\n        self.date = utils.SafeDatetime(2012, 8, 29)\n\n    def tearDown(self):\n        shutil.rmtree(self.temp_content)\n        shutil.rmtree(self.temp_output)\n        # reset locale to default\n        locale.setlocale(locale.LC_ALL, \"\")\n\n    @unittest.skipUnless(\n        locale_available(\"fr_FR.UTF-8\") or locale_available(\"French\"),\n        \"French locale needed\",\n    )\n    def test_french_strftime(self):\n        # This test tries to reproduce an issue that\n        # occurred with python3.3 under macos10 only\n        temp_locale = \"French\" if platform == \"win32\" else \"fr_FR.UTF-8\"\n\n        with utils.temporary_locale(temp_locale):\n            date = utils.SafeDatetime(2014, 8, 14)\n            # we compare the lower() dates since macos10 returns\n            # \"Jeudi\" for %A whereas linux reports \"jeudi\"\n            self.assertEqual(\n                \"jeudi, 14 août 2014\",\n                utils.strftime(date, date_format=\"%A, %d %B %Y\").lower(),\n            )\n            df = utils.DateFormatter()\n            self.assertEqual(\n                \"jeudi, 14 août 2014\", df(date, date_format=\"%A, %d %B %Y\").lower()\n            )\n\n        # Let us now set the global locale to C:\n        with utils.temporary_locale(\"C\"):\n            # DateFormatter should still work as expected\n            # since it is the whole point of DateFormatter\n            # (This is where pre-2014/4/15 code fails on macos10)\n            df_date = df(date, date_format=\"%A, %d %B %Y\").lower()\n            self.assertEqual(\"jeudi, 14 août 2014\", df_date)\n\n    @unittest.skipUnless(\n        locale_available(\"fr_FR.UTF-8\") or locale_available(\"French\"),\n        \"French locale needed\",\n    )\n    def test_french_locale(self):\n        if platform == \"win32\":\n            locale_string = \"French\"\n        else:\n            locale_string = \"fr_FR.UTF-8\"\n        settings = read_settings(\n            override={\n                \"LOCALE\": locale_string,\n                \"TEMPLATE_PAGES\": {\"template/source.html\": \"generated/file.html\"},\n            }\n        )\n\n        generator = TemplatePagesGenerator(\n            {\"date\": self.date}, settings, self.temp_content, \"\", self.temp_output\n        )\n        generator.env.filters.update({\"strftime\": utils.DateFormatter()})\n\n        writer = Writer(self.temp_output, settings=settings)\n        generator.generate_output(writer)\n\n        output_path = os.path.join(self.temp_output, \"generated\", \"file.html\")\n\n        # output file has been generated\n        self.assertTrue(os.path.exists(output_path))\n\n        # output content is correct\n        with utils.pelican_open(output_path) as output_file:\n            self.assertEqual(\n                output_file, utils.strftime(self.date, \"date = %A, %d %B %Y\")\n            )\n\n    @unittest.skipUnless(\n        locale_available(\"tr_TR.UTF-8\") or locale_available(\"Turkish\"),\n        \"Turkish locale needed\",\n    )\n    def test_turkish_locale(self):\n        if platform == \"win32\":\n            locale_string = \"Turkish\"\n        else:\n            locale_string = \"tr_TR.UTF-8\"\n        settings = read_settings(\n            override={\n                \"LOCALE\": locale_string,\n                \"TEMPLATE_PAGES\": {\"template/source.html\": \"generated/file.html\"},\n            }\n        )\n\n        generator = TemplatePagesGenerator(\n            {\"date\": self.date}, settings, self.temp_content, \"\", self.temp_output\n        )\n        generator.env.filters.update({\"strftime\": utils.DateFormatter()})\n\n        writer = Writer(self.temp_output, settings=settings)\n        generator.generate_output(writer)\n\n        output_path = os.path.join(self.temp_output, \"generated\", \"file.html\")\n\n        # output file has been generated\n        self.assertTrue(os.path.exists(output_path))\n\n        # output content is correct\n        with utils.pelican_open(output_path) as output_file:\n            self.assertEqual(\n                output_file, utils.strftime(self.date, \"date = %A, %d %B %Y\")\n            )\n\n\nclass TestSanitisedJoin(unittest.TestCase):\n    def test_detect_parent_breakout(self):\n        with self.assertRaisesRegex(\n            RuntimeError,\n            \"Attempted to break out of output directory to (.*?:)?/foo/test\",\n        ):  # (.*?:)? accounts for Windows root\n            utils.sanitised_join(\"/foo/bar\", \"../test\")\n\n    def test_detect_root_breakout(self):\n        with self.assertRaisesRegex(\n            RuntimeError,\n            \"Attempted to break out of output directory to (.*?:)?/test\",\n        ):  # (.*?:)? accounts for Windows root\n            utils.sanitised_join(\"/foo/bar\", \"/test\")\n\n    def test_pass_deep_subpaths(self):\n        self.assertEqual(\n            utils.sanitised_join(\"/foo/bar\", \"test\"),\n            utils.posixize_path(os.path.abspath(os.path.join(\"/foo/bar\", \"test\"))),\n        )\n\n\nclass TestMemoized(unittest.TestCase):\n    def test_memoized(self):\n        class Container:\n            def _get(self, key):\n                pass\n\n            @utils.memoized\n            def get(self, key):\n                return self._get(key)\n\n        container = Container()\n\n        with unittest.mock.patch.object(\n            container, \"_get\", side_effect=lambda x: x\n        ) as get_mock:\n            self.assertEqual(\"foo\", container.get(\"foo\"))\n            get_mock.assert_called_once_with(\"foo\")\n\n            get_mock.reset_mock()\n            self.assertEqual(\"foo\", container.get(\"foo\"))\n            get_mock.assert_not_called()\n\n            self.assertEqual(\"bar\", container.get(\"bar\"))\n            get_mock.assert_called_once_with(\"bar\")\n\n            get_mock.reset_mock()\n            container.get.cache.clear()\n            self.assertEqual(\"bar\", container.get(\"bar\"))\n            get_mock.assert_called_once_with(\"bar\")\n\n\nclass TestStringUtils(unittest.TestCase):\n    def test_file_suffix(self):\n        self.assertEqual(\"\", utils.file_suffix(\"\"))\n        self.assertEqual(\"\", utils.file_suffix(\"foo\"))\n        self.assertEqual(\"md\", utils.file_suffix(\"foo.md\"))\n\n\nclass TestFileChangeFilter(unittest.TestCase):\n    ignore_file_patterns = DEFAULT_CONFIG[\"IGNORE_FILES\"]\n\n    def test_regular_files_not_filtered(self):\n        file_change_filter = utils.FileChangeFilter(\n            ignore_file_patterns=self.ignore_file_patterns\n        )\n        basename = \"article.rst\"\n        full_path = os.path.join(os.path.dirname(__file__), \"content\", basename)\n\n        for change in watchfiles.Change:\n            self.assertTrue(file_change_filter(change=change, path=basename))\n            self.assertTrue(file_change_filter(change=change, path=full_path))\n\n    def test_dotfiles_filtered(self):\n        file_change_filter = utils.FileChangeFilter(\n            ignore_file_patterns=self.ignore_file_patterns\n        )\n        basename = \".config\"\n        full_path = os.path.join(os.path.dirname(__file__), \"content\", basename)\n\n        # Testing with just the hidden file name and the full file path to the hidden file\n        for change in watchfiles.Change:\n            self.assertFalse(file_change_filter(change=change, path=basename))\n            self.assertFalse(file_change_filter(change=change, path=full_path))\n\n    def test_default_filters(self):\n        # Testing a subset of the default filters\n        # For reference: https://watchfiles.helpmanual.io/api/filters/#watchfiles.DefaultFilter.ignore_dirs\n        file_change_filter = utils.FileChangeFilter(ignore_file_patterns=[])\n        test_basenames = [\n            \"__pycache__\",\n            \".git\",\n            \".hg\",\n            \".svn\",\n            \".tox\",\n            \".venv\",\n            \".idea\",\n            \"node_modules\",\n            \".mypy_cache\",\n            \".pytest_cache\",\n            \".hypothesis\",\n            \".DS_Store\",\n            \"flycheck_file\",\n            \"test_file~\",\n        ]\n\n        for basename in test_basenames:\n            full_path = os.path.join(os.path.dirname(__file__), basename)\n            for change in watchfiles.Change:\n                self.assertFalse(file_change_filter(change=change, path=basename))\n                self.assertFalse(file_change_filter(change=change, path=full_path))\n\n    def test_custom_ignore_pattern(self):\n        file_change_filter = utils.FileChangeFilter(ignore_file_patterns=[\"*.rst\"])\n        basename = \"article.rst\"\n        full_path = os.path.join(os.path.dirname(__file__), basename)\n        for change in watchfiles.Change:\n            self.assertFalse(file_change_filter(change=change, path=basename))\n            self.assertFalse(file_change_filter(change=change, path=full_path))\n\n        # If the user changes `IGNORE_FILES` to only contain ['*.rst'], then dotfiles would not be filtered anymore\n        basename = \".config\"\n        full_path = os.path.join(os.path.dirname(__file__), basename)\n        for change in watchfiles.Change:\n            self.assertTrue(file_change_filter(change=change, path=basename))\n            self.assertTrue(file_change_filter(change=change, path=full_path))\n"
  },
  {
    "path": "pelican/tests/theme_overrides/level1/article.html",
    "content": "<!--\n  This file is only here to test the `THEME_TEMPLATES_OVERRIDES` configuration\n  setting.\n-->\n"
  },
  {
    "path": "pelican/tests/theme_overrides/level2/article.html",
    "content": "<!--\n  This file is only here to test the `THEME_TEMPLATES_OVERRIDES` configuration\n  setting.\n-->\n"
  },
  {
    "path": "pelican/tests/theme_overrides/level2/authors.html",
    "content": "<!--\n  This file is only here to test the `THEME_TEMPLATES_OVERRIDES` configuration\n  setting.\n-->\n"
  },
  {
    "path": "pelican/themes/notmyidea/static/css/fonts.css",
    "content": "@font-face {\n    font-family: 'Yanone Kaffeesatz';\n    font-style: normal;\n    font-weight: 400;\n    src:\n    local('Yanone Kaffeesatz Regular'),\n    local('YanoneKaffeesatz-Regular'),\n\t\t/* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLRTHiN2BPBirwIkMLKUspj4.woff */\n    url('../fonts/Yanone_Kaffeesatz_400.woff') format('woff'),\n\t\t/* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLfGwxTS8d1Q9KiDNCMKLFUM.woff2 */\n    url('../fonts/Yanone_Kaffeesatz_400.woff2') format('woff2');\n}\n"
  },
  {
    "path": "pelican/themes/notmyidea/static/css/main.css",
    "content": "/*\n\tName: Smashing HTML5\n\tDate: July 2009\n\tDescription: Sample layout for HTML5 and CSS3 goodness.\n\tVersion: 1.0\n\tLicense: MIT <https://opensource.org/licenses/MIT>\n\tLicensed by: Smashing Media GmbH <https://www.smashingmagazine.com/>\n\tOriginal author: Enrique Ramírez <http://enrique-ramirez.com/>\n*/\n\n/* Imports */\n@import url(\"reset.css\");\n@import url(\"pygment.css\");\n@import url(\"typogrify.css\");\n@import url(\"fonts.css\");\n\n/***** Global *****/\n/* Body */\nbody {\n    background: #F5F4EF;\n    color: #000305;\n    font-size: 87.5%; /* Base font size: 14px */\n    font-family: 'Trebuchet MS', Trebuchet, 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif;\n    line-height: 1.429;\n    margin: 0;\n    padding: 0;\n    text-align: left;\n}\n\n@media (prefers-color-scheme: dark) {\n    body {\n        background: #070808;\n        color: #FFFEFE;\n    }\n}\n\n/* Headings */\nh1 {font-size: 2em }\nh2 {font-size: 1.571em}\t/* 22px */\nh3 {font-size: 1.429em}\t/* 20px */\nh4 {font-size: 1.286em}\t/* 18px */\nh5 {font-size: 1.143em}\t/* 16px */\nh6 {font-size: 1em}\t\t/* 14px */\n\nh1, h2, h3, h4, h5, h6 {\n    font-weight: 400;\n    line-height: 1.1;\n    margin-bottom: .8em;\n    font-family: 'Yanone Kaffeesatz', arial, serif;\n}\n\nh3, h4, h5, h6 { margin-top: .8em; }\n\nhr { border: 2px solid #EEEEEE; }\n\n/* Anchors */\na {outline: 0;}\na img {border: 0px; text-decoration: none;}\na:link, a:visited {\n    color: #C74350;\n    padding: 0 1px;\n    text-decoration: underline;\n}\na:hover, a:active {\n    background-color: #C74350;\n    color: #fff;\n    text-decoration: none;\n    text-shadow: 1px 1px 1px #333;\n}\n\nh1 a:hover {\n    background-color: inherit\n}\n\n/* Paragraphs */\ndiv.line-block,\np { margin-top: 1em;\n    margin-bottom: 1em;}\n\nstrong, b {font-weight: bold;}\nem, i {font-style: italic;}\n\n/* Lists */\nul {\n    list-style: outside disc;\n    margin: 0em 0 0 1.5em;\n}\n\nol {\n    list-style: outside decimal;\n    margin: 0em 0 0 1.5em;\n}\n\nli { margin-top: 0.5em;\n    margin-bottom: 1em; }\n\n.post-info {\n    float:right;\n    margin:10px;\n    padding:5px;\n}\n\n.post-info p{\n    margin-top: 1px;\n    margin-bottom: 1px;\n}\n\n.readmore { float: right }\n\ndl {margin: 0 0 1.5em 0;}\ndt {font-weight: bold;}\ndd {margin-left: 1.5em;}\n\npre{background-color:  rgb(238, 238, 238); padding: 10px; margin: 10px; overflow: auto;}\n\n@media (prefers-color-scheme: dark) {\n    pre {\n        background: rgb(38, 38, 38);\n    }\n}\n\n/* Quotes */\nblockquote {\n    margin: 20px;\n    font-style: italic;\n}\ncite {}\n\nq {}\n\ndiv.note {\n    float: right;\n    margin: 5px;\n    font-size: 85%;\n    max-width: 300px;\n}\n\n/* Tables */\ntable {margin: .5em auto 1.5em auto; width: 98%;}\n\n\t/* Thead */\nthead th {padding: .5em .4em; text-align: left;}\nthead td {}\n\n\t/* Tbody */\ntbody td {padding: .5em .4em;}\ntbody th {}\n\ntbody .alt td {}\ntbody .alt th {}\n\n\t/* Tfoot */\ntfoot th {}\ntfoot td {}\n\n/* HTML5 tags */\nheader, section, footer,\naside, nav, article, figure {\n    display: block;\n}\n\n/***** Layout *****/\n.body {clear: both; margin: 0 auto; max-width: 800px;}\nimg { max-width: 100%; }\nimg.right, figure.right, div.figure.align-right {\n    float: right;\n    margin: 0 0 2em 2em;\n}\nimg.left, figure.left, div.figure.align-left {\n    float: left;\n    margin: 0 2em 2em 0;\n}\n\n/* .rst support */\ndiv.figure img, figure img {  /* to fill figure exactly */\n    max-width: 100%;\n}\ndiv.figure p.caption, figure p.caption { /* margin provided by figure */\n    margin-top: 0;\n    margin-bottom: 0;\n}\n\n/*\n\tHeader\n*****************/\n#banner {\n    margin: 0 auto;\n    padding: 0.8em 0 0 0;\n}\n\n\t/* Banner */\n#banner h1 {\n    font-size: 3.571em;\n    line-height: 1.0;\n    margin-bottom: .3em;\n}\n\n#banner h1 a:link, #banner h1 a:visited {\n    color: #000305;\n    display: block;\n    font-weight: bold;\n    margin: 0 0 0 .2em;\n    text-decoration: none;\n}\n#banner h1 a:hover, #banner h1 a:active {\n    background: none;\n    color: #C74350;\n    text-shadow: none;\n}\n\n#banner h1 strong {font-size: 0.36em; font-weight: normal;}\n\n@media (prefers-color-scheme: dark) {\n    #banner h1 a:link, #banner h1 a:visited {\n        color: #FFFAF8;\n    }\n}\n\n\t/* Main Nav */\n#banner nav {\n    background: #000305;\n    font-size: 1.143em;\n    overflow: auto;\n    line-height: 30px;\n    margin: 0 auto 2em auto;\n    padding: 0;\n    text-align: center;\n    max-width: 800px;\n\n    border-radius: 5px;\n    -moz-border-radius: 5px;\n    -webkit-border-radius: 5px;\n}\n\n@media (prefers-color-scheme: dark) {\n    #banner nav {\n        background: #121518;\n    }\n}\n\n#banner nav ul {list-style: none; margin: 0 auto; max-width: 800px;}\n#banner nav li {float: left; display: inline; margin: 0;}\n\n#banner nav a:link, #banner nav a:visited {\n    color: #fff;\n    display: inline-block;\n    height: 30px;\n    padding: 5px 1.5em;\n    text-decoration: none;\n}\n#banner nav a:hover, #banner nav a:active,\n#banner nav .active a:link, #banner nav .active a:visited {\n    background: #C74451;\n    color: #fff;\n    text-shadow: none !important;\n}\n\n#banner nav li:first-child a {\n    border-top-left-radius: 5px;\n    -moz-border-radius-topleft: 5px;\n    -webkit-border-top-left-radius: 5px;\n\n    border-bottom-left-radius: 5px;\n    -moz-border-radius-bottomleft: 5px;\n    -webkit-border-bottom-left-radius: 5px;\n}\n\n/*\n\tFeatured\n*****************/\n#featured {\n    background: #fff;\n    margin-bottom: 2em;\n    overflow: hidden;\n    padding: 20px;\n    max-width: 760px;\n\n    border-radius: 10px;\n    -moz-border-radius: 10px;\n    -webkit-border-radius: 10px;\n}\n\n@media (prefers-color-scheme: dark) {\n    #featured {\n        background: #151617;\n    }\n}\n\n#featured figure {\n    border: 2px solid #eee;\n    float: right;\n    margin: 0.786em 2em 0 5em;\n    max-width: 248px;\n}\n#featured figure img {display: block; float: right;}\n\n#featured h2 {color: #C74451; font-size: 1.714em; margin-bottom: 0.333em;}\n#featured h3 {font-size: 1.429em; margin-bottom: .5em;}\n\n#featured h3 a:link, #featured h3 a:visited {color: #000305; text-decoration: none;}\n#featured h3 a:hover, #featured h3 a:active {color: #fff;}\n\n/*\n\tBody\n*****************/\n#content {\n    background: #fff;\n    margin-bottom: 2em;\n    overflow: hidden;\n    padding: 20px 20px;\n    max-width: 760px;\n\n    border-radius: 10px;\n    -moz-border-radius: 10px;\n    -webkit-border-radius: 10px;\n}\n\n@media (prefers-color-scheme: dark) {\n    #content {\n        background: #111;\n    }\n}\n\n/*\n\tExtras\n*****************/\n#extras {margin: 0 auto 3em auto; overflow: hidden;}\n\n#extras ul {list-style: none; margin: 0;}\n#extras li {border-bottom: 1px solid #fff;}\n#extras h2 {\n    color: #C74350;\n    font-size: 1.429em;\n    margin-bottom: .25em;\n    padding: 0 3px;\n}\n\n#extras a:link, #extras a:visited {\n    color: #444;\n    display: block;\n    border-bottom: 1px solid #F4E3E3;\n    text-decoration: none;\n    padding: .3em .25em;\n}\n\n@media (prefers-color-scheme: dark) {\n    #extras a:link, #extras a:visited {\n        color: #888;\n    }\n}\n\n#extras a:hover, #extras a:active {color: #fff;}\n\n\t/* Blogroll */\n#extras .blogroll {\n    float: left;\n    max-width: 615px;\n}\n\n#extras .blogroll li {float: left; margin: 0 20px 0 0; max-width: 185px;}\n\n\t/* Social */\n#extras .social {\n    float: right;\n    max-width: 175px;\n}\n\n/*\n\tAbout\n*****************/\n#about {\n    background: #fff;\n    font-style: normal;\n    margin-bottom: 2em;\n    overflow: hidden;\n    padding: 20px;\n    text-align: left;\n    max-width: 760px;\n\n    border-radius: 10px;\n    -moz-border-radius: 10px;\n    -webkit-border-radius: 10px;\n}\n\n@media (prefers-color-scheme: dark) {\n    #about {\n        background: #222;\n    }\n}\n\n#about .primary {float: left; max-width: 165px;}\n#about .primary strong {color: #C64350; display: block; font-size: 1.286em;}\n#about .photo {float: left; margin: 5px 20px;}\n\n#about .url:link, #about .url:visited {text-decoration: none;}\n\n#about .bio {float: right; max-width: 500px;}\n\n/*\n\tFooter\n*****************/\n#contentinfo {padding-bottom: 2em; text-align: right;}\n\n/***** Sections *****/\n/* Blog */\n.hentry {\n    display: block;\n    clear: both;\n    border-top: 1px solid #eee;\n    padding: 1.5em 0;\n}\nli:first-child .hentry, #content > .hentry {border: 0; margin: 0;}\n#content > .hentry {padding: 1em 0;}\n.hentry img{display : none ;}\n.entry-title {font-size: 3em; margin-bottom: 10px; margin-top: 0;}\n.entry-title a:link, .entry-title a:visited {text-decoration: none; color: #333;}\n.entry-title a:visited {background-color: #fff;}\n\n@media (prefers-color-scheme: dark) {\n    .entry-title a:link, .entry-title a:visited {\n        color: #C74350;\n    }\n}\n\n.hentry .post-info * {font-style: normal;}\n\n\t/* Content */\n.hentry footer {margin-bottom: 2em;}\n.hentry footer address {display: inline;}\n#posts-list footer address {display: block;}\n\n\t/* Blog Index */\n#posts-list {list-style: none; margin: 0;}\n#posts-list .hentry {padding-left: 10px; position: relative;}\n\n#posts-list footer {\n    left: 10px;\n    position: relative;\n    float: left;\n    top: 0.5em;\n    max-width: 190px;\n}\n\n\t/* About the Author */\n#about-author {\n    background: #f9f9f9;\n    clear: both;\n    font-style: normal;\n    margin: 2em 0;\n    padding: 10px 20px 15px 20px;\n\n    border-radius: 5px;\n    -moz-border-radius: 5px;\n    -webkit-border-radius: 5px;\n}\n\n#about-author strong {\n    color: #C64350;\n    clear: both;\n    display: block;\n    font-size: 1.429em;\n}\n\n#about-author .photo {border: 1px solid #ddd; float: left; margin: 5px 1em 0 0;}\n\n\t/* Comments */\n#comments-list {list-style: none; margin: 0 1em;}\n#comments-list blockquote {\n    background: #f8f8f8;\n    clear: both;\n    font-style: normal;\n    margin: 0;\n    padding: 15px 20px;\n\n    border-radius: 5px;\n    -moz-border-radius: 5px;\n    -webkit-border-radius: 5px;\n}\n#comments-list footer {color: #888; padding: .5em 1em 0 0; text-align: right;}\n\n#comments-list li:nth-child(2n) blockquote {background: #F5f5f5;}\n\n\t/* Add a Comment */\n#add-comment label {clear: left; float: left; text-align: left; max-width: 150px;}\n#add-comment input[type='text'],\n#add-comment input[type='email'],\n#add-comment input[type='url'] {float: left; max-width: 200px;}\n\n#add-comment textarea {float: left; height: 150px; max-width: 495px;}\n\n#add-comment p.req {clear: both; margin: 0 .5em 1em 0; text-align: right;}\n\n#add-comment input[type='submit'] {float: right; margin: 0 .5em;}\n#add-comment * {margin-bottom: .5em;}\n"
  },
  {
    "path": "pelican/themes/notmyidea/static/css/pygment.css",
    "content": ".hll {\n    background-color:#eee;\n}\n.c {\n    color:#408090;\n    font-style:italic;\n}\n.err {\n    border:1px solid #FF0000;\n}\n.k {\n    color:#007020;\n    font-weight:bold;\n}\n.o {\n    color:#666666;\n}\n.cm {\n    color:#408090;\n    font-style:italic;\n}\n.cp {\n    color:#007020;\n}\n.c1 {\n    color:#408090;\n    font-style:italic;\n}\n.cs {\n    background-color:#FFF0F0;\n    color:#408090;\n}\n.gd {\n    color:#A00000;\n}\n.ge {\n    font-style:italic;\n}\n.gr {\n    color:#FF0000;\n}\n.gh {\n    color:#000080;\n    font-weight:bold;\n}\n.gi {\n    color:#00A000;\n}\n.go {\n    color:#303030;\n}\n.gp {\n    color:#C65D09;\n    font-weight:bold;\n}\n.gs {\n    font-weight:bold;\n}\n.gu {\n    color:#800080;\n    font-weight:bold;\n}\n.gt {\n    color:#0040D0;\n}\n.kc {\n    color:#007020;\n    font-weight:bold;\n}\n.kd {\n    color:#007020;\n    font-weight:bold;\n}\n.kn {\n    color:#007020;\n    font-weight:bold;\n}\n.kp {\n    color:#007020;\n}\n.kr {\n    color:#007020;\n    font-weight:bold;\n}\n.kt {\n    color:#902000;\n}\n.m {\n    color:#208050;\n}\n.s {\n    color:#4070A0;\n}\n.na {\n    color:#4070A0;\n}\n.nb {\n    color:#007020;\n}\n.nc {\n    color:#0E84B5;\n    font-weight:bold;\n}\n.no {\n    color:#60ADD5;\n}\n.nd {\n    color:#555555;\n    font-weight:bold;\n}\n.ni {\n    color:#D55537;\n    font-weight:bold;\n}\n.ne {\n    color:#007020;\n}\n.nf {\n    color:#06287E;\n}\n.nl {\n    color:#002070;\n    font-weight:bold;\n}\n.nn {\n    color:#0E84B5;\n    font-weight:bold;\n}\n.nt {\n    color:#062873;\n    font-weight:bold;\n}\n.nv {\n    color:#BB60D5;\n}\n.ow {\n    color:#007020;\n    font-weight:bold;\n}\n.w {\n    color:#BBBBBB;\n}\n.mf {\n    color:#208050;\n}\n.mh {\n    color:#208050;\n}\n.mi {\n    color:#208050;\n}\n.mo {\n    color:#208050;\n}\n.sb {\n    color:#4070A0;\n}\n.sc {\n    color:#4070A0;\n}\n.sd {\n    color:#4070A0;\n    font-style:italic;\n}\n.s2 {\n    color:#4070A0;\n}\n.se {\n    color:#4070A0;\n    font-weight:bold;\n}\n.sh {\n    color:#4070A0;\n}\n.si {\n    color:#70A0D0;\n    font-style:italic;\n}\n.sx {\n    color:#C65D09;\n}\n.sr {\n    color:#235388;\n}\n.s1 {\n    color:#4070A0;\n}\n.ss {\n    color:#517918;\n}\n.bp {\n    color:#007020;\n}\n.vc {\n    color:#BB60D5;\n}\n.vg {\n    color:#BB60D5;\n}\n.vi {\n    color:#BB60D5;\n}\n.il {\n    color:#208050;\n}\n"
  },
  {
    "path": "pelican/themes/notmyidea/static/css/reset.css",
    "content": "/*\n\tName: Reset Stylesheet\n\tDescription: Resets browser's default CSS\n\tAuthor: Eric Meyer\n\tAuthor URI: https://meyerweb.com/eric/tools/css/reset/\n*/\n\n/* v1.0 | 20080212 */\nhtml, body, div, span, applet, object, iframe,\nh1, h2, h3, h4, h5, h6, p, blockquote, pre,\na, abbr, acronym, address, big, cite, code,\ndel, dfn, em, font, img, ins, kbd, q, s, samp,\nsmall, strike, strong, sub, sup, tt, var,\nb, u, i, center,\ndl, dt, dd, ol, ul, li,\nfieldset, form, label, legend,\ntable, caption, tbody, tfoot, thead, tr, th, td {\n    background: transparent;\n    border: 0;\n    font-size: 100%;\n    margin: 0;\n    outline: 0;\n    padding: 0;\n    vertical-align: baseline;\n}\n\nbody {line-height: 1;}\n\nol, ul {list-style: none;}\n\nblockquote, q {quotes: none;}\n\nblockquote:before, blockquote:after,\nq:before, q:after {\n    content: '';\n    content: none;\n}\n\n/* remember to define focus styles! */\n:focus {\n    outline: 0;\n}\n\n/* remember to highlight inserts somehow! */\nins {text-decoration: none;}\ndel {text-decoration: line-through;}\n\n/* tables still need 'cellspacing=\"0\"' in the markup */\ntable {\n    border-collapse: collapse;\n    border-spacing: 0;\n}\n"
  },
  {
    "path": "pelican/themes/notmyidea/static/css/typogrify.css",
    "content": ".caps {font-size:.92em;}\n.amp {color:#666; font-size:1.05em;font-family:\"Warnock Pro\", \"Goudy Old Style\",\"Palatino\",\"Book Antiqua\",serif; font-style:italic;}\n.dquo {margin-left:-.38em;}\n"
  },
  {
    "path": "pelican/themes/notmyidea/static/css/wide.css",
    "content": "@import url(\"main.css\");\n\nbody {\n    font:1.3em/1.3 \"Hoefler Text\",\"Georgia\",Georgia,serif,sans-serif;\n}\n\n.post-info{\n    display: none;\n}\n\n#banner nav {\n    display: none;\n    -moz-border-radius: 0px;\n    margin-bottom: 20px;\n    overflow: hidden;\n    font-size: 1em;\n    background: #F5F4EF;\n}\n\n#banner nav ul{\n    padding-right: 50px;\n}\n\n#banner nav li{\n    float: right;\n    color: #000;\n}\n\n#banner nav li a {\n    color: #000;\n}\n\n#banner h1 {\n    margin-bottom: -18px;\n}\n\n#featured, #extras {\n    padding: 50px;\n}\n\n#featured {\n    padding-top: 20px;\n}\n\n#extras {\n    padding-top: 0px;\n    padding-bottom: 0px;\n}\n"
  },
  {
    "path": "pelican/themes/notmyidea/static/fonts/Yanone_Kaffeesatz_LICENSE.txt",
    "content": "Copyright 2010 The Yanone Kaffeesatz Project Authors (https://github.com/alexeiva/yanone-kaffeesatz)\n\nThis Font Software is licensed under the SIL Open Font License, Version 1.1.\nThis license is copied below, and is also available with a FAQ at:\nhttp://scripts.sil.org/OFL\n\n\n-----------------------------------------------------------\nSIL OPEN FONT LICENSE Version 1.1 - 26 February 2007\n-----------------------------------------------------------\n\nPREAMBLE\nThe goals of the Open Font License (OFL) are to stimulate worldwide\ndevelopment of collaborative font projects, to support the font creation\nefforts of academic and linguistic communities, and to provide a free and\nopen framework in which fonts may be shared and improved in partnership\nwith others.\n\nThe OFL allows the licensed fonts to be used, studied, modified and\nredistributed freely as long as they are not sold by themselves. The\nfonts, including any derivative works, can be bundled, embedded,\nredistributed and/or sold with any software provided that any reserved\nnames are not used by derivative works. The fonts and derivatives,\nhowever, cannot be released under any other type of license. The\nrequirement for fonts to remain under this license does not apply\nto any document created using the fonts or their derivatives.\n\nDEFINITIONS\n\"Font Software\" refers to the set of files released by the Copyright\nHolder(s) under this license and clearly marked as such. This may\ninclude source files, build scripts and documentation.\n\n\"Reserved Font Name\" refers to any names specified as such after the\ncopyright statement(s).\n\n\"Original Version\" refers to the collection of Font Software components as\ndistributed by the Copyright Holder(s).\n\n\"Modified Version\" refers to any derivative made by adding to, deleting,\nor substituting -- in part or in whole -- any of the components of the\nOriginal Version, by changing formats or by porting the Font Software to a\nnew environment.\n\n\"Author\" refers to any designer, engineer, programmer, technical\nwriter or other person who contributed to the Font Software.\n\nPERMISSION & CONDITIONS\nPermission is hereby granted, free of charge, to any person obtaining\na copy of the Font Software, to use, study, copy, merge, embed, modify,\nredistribute, and sell modified and unmodified copies of the Font\nSoftware, subject to the following conditions:\n\n1) Neither the Font Software nor any of its individual components,\nin Original or Modified Versions, may be sold by itself.\n\n2) Original or Modified Versions of the Font Software may be bundled,\nredistributed and/or sold with any software, provided that each copy\ncontains the above copyright notice and this license. These can be\nincluded either as stand-alone text files, human-readable headers or\nin the appropriate machine-readable metadata fields within text or\nbinary files as long as those fields can be easily viewed by the user.\n\n3) No Modified Version of the Font Software may use the Reserved Font\nName(s) unless explicit written permission is granted by the corresponding\nCopyright Holder. This restriction only applies to the primary font name as\npresented to the users.\n\n4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font\nSoftware shall not be used to promote, endorse or advertise any\nModified Version, except to acknowledge the contribution(s) of the\nCopyright Holder(s) and the Author(s) or with their explicit written\npermission.\n\n5) The Font Software, modified or unmodified, in part or in whole,\nmust be distributed entirely under this license, and must not be\ndistributed under any other license. The requirement for fonts to\nremain under this license does not apply to any document created\nusing the Font Software.\n\nTERMINATION\nThis license becomes null and void if any of the above conditions are\nnot met.\n\nDISCLAIMER\nTHE FONT SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT\nOF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE\nCOPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nINCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL\nDAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM\nOTHER DEALINGS IN THE FONT SOFTWARE.\n"
  },
  {
    "path": "pelican/themes/notmyidea/static/fonts/font.css",
    "content": "@font-face {\n    font-family: 'Yanone Kaffeesatz';\n    font-style: normal;\n    font-weight: 400;\n    src:\n    local('Yanone Kaffeesatz Regular'),\n    local('YanoneKaffeesatz-Regular'),\n\t\t/* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLRTHiN2BPBirwIkMLKUspj4.woff */\n    url('Yanone_Kaffeesatz_400.woff') format('woff'),\n\t\t/* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLfGwxTS8d1Q9KiDNCMKLFUM.woff2 */\n    url('Yanone_Kaffeesatz_400.woff2') format('woff2');\n}\n"
  },
  {
    "path": "pelican/themes/notmyidea/templates/analytics.html",
    "content": "{% if ANALYTICS %}\n    {{ ANALYTICS }}\n{% endif %}\n"
  },
  {
    "path": "pelican/themes/notmyidea/templates/archives.html",
    "content": "{% extends \"base.html\" %}\n{% block content %}\n    <section id=\"content\" class=\"body\">\n        <h1>Archives for {{ SITENAME }}</h1>\n\n        <dl>\n            {% for article in dates %}\n                <dt>{{ article.locale_date }}</dt>\n                <dd><a href=\"{{ SITEURL }}/{{ article.url }}\">{{ article.title }}</a></dd>\n            {% endfor %}\n        </dl>\n    </section>\n{% endblock %}\n"
  },
  {
    "path": "pelican/themes/notmyidea/templates/article.html",
    "content": "{% extends \"base.html\" %}\n{% block html_lang %}{{ article.lang }}{% endblock %}\n{% block head -%}\n  {{ super() -}}\n  {% if article.summary %}\n    <meta name=\"description\" content=\"{{ article.summary | striptags | safe | truncate(150) }}\" />\n  {% endif %}\n{% endblock %}\n\n{% block title %}{{ article.title|striptags }}{% endblock %}\n\n{% block extra_head %}\n  {% import 'translations.html' as translations with context %}\n  {% if translations.entry_hreflang(article) %}\n    {{ translations.entry_hreflang(article) }}\n  {% endif %}\n{% endblock %}\n\n{% block content %}\n  <section id=\"content\" class=\"body\">\n    <article>\n      <header>\n        <h1 class=\"entry-title\">\n          <a href=\"{{ SITEURL }}/{{ article.url }}\" rel=\"bookmark\"\n             title=\"Permalink to {{ article.title|striptags }}\">{{ article.title }}</a></h1>\n        {% include 'twitter.html' %}\n      </header>\n\n      <div class=\"entry-content\">\n        {% include 'article_infos.html' %}\n        {{ article.content }}\n      </div><!-- /.entry-content -->\n      {% if DISQUS_SITENAME and SITEURL and article.status != \"draft\" %}\n        <div class=\"comments\">\n          <h2>Comments !</h2>\n          <div id=\"disqus_thread\"></div>\n          <script type=\"text/javascript\">\n            var disqus_shortname = '{{ DISQUS_SITENAME }}';\n            var disqus_identifier = '{{ article.url }}';\n            var disqus_url = '{{ SITEURL }}/{{ article.url }}';\n            (function() {\n              var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;\n              dsq.src = '//{{ DISQUS_SITENAME }}.disqus.com/embed.js';\n              (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);\n            })();\n          </script>\n          <noscript>Please enable JavaScript to view the comments.</noscript>\n        </div>\n      {% endif %}\n\n    </article>\n  </section>\n{% endblock %}\n"
  },
  {
    "path": "pelican/themes/notmyidea/templates/article_infos.html",
    "content": "<footer class=\"post-info\">\n        <abbr class=\"published\" title=\"{{ article.date.isoformat() }}\">\n                Published: {{ article.locale_date }}\n        </abbr>\n        {% if article.modified %}\n                <br />\n                <abbr class=\"modified\" title=\"{{ article.modified.isoformat() }}\">\n                        Updated: {{ article.locale_modified }}\n                </abbr>\n        {% endif %}\n\n        {% if article.authors %}\n                <address class=\"vcard author\">\n                        By {% for author in article.authors %}\n                                <a class=\"url fn\" href=\"{{ SITEURL }}/{{ author.url }}\">{{ author }}</a>\n                        {% endfor %}\n                </address>\n        {% endif %}\n        <p>In <a href=\"{{ SITEURL }}/{{ article.category.url }}\">{{ article.category }}</a>.</p>\n        {% include 'taglist.html' %}\n        {% import 'translations.html' as translations with context %}\n        {{ translations.translations_for(article) }}\n</footer><!-- /.post-info -->\n"
  },
  {
    "path": "pelican/themes/notmyidea/templates/author.html",
    "content": "{% extends \"index.html\" %}\n{% block title %}{{ SITENAME|striptags }} - {{ author }}{% endblock %}\n"
  },
  {
    "path": "pelican/themes/notmyidea/templates/authors.html",
    "content": "{% extends \"base.html\" %}\n\n{% block title %}{{ SITENAME|striptags }} - Authors{% endblock %}\n\n{% block content %}\n\n    <section id=\"content\" class=\"body\">\n        <h1>Authors on {{ SITENAME }}</h1>\n        <ul>\n            {% for author, articles in authors|sort %}\n                <li><a href=\"{{ SITEURL }}/{{ author.url }}\">{{ author }}</a> ({{ articles|count }})</li>\n            {% endfor %}\n        </ul>\n    </section>\n\n{% endblock %}\n"
  },
  {
    "path": "pelican/themes/notmyidea/templates/base.html",
    "content": "<!DOCTYPE html>\n<html lang=\"{% block html_lang %}{{ DEFAULT_LANG }}{% endblock html_lang %}\">\n        <head>\n                {% block head %}\n                        <meta charset=\"utf-8\" />\n                        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n                        <meta name=\"generator\" content=\"Pelican\" />\n                        <title>{% block title %}{{ SITENAME|striptags }}{%endblock%}</title>\n                        <link rel=\"stylesheet\" href=\"{{ SITEURL }}/{{ THEME_STATIC_DIR }}/css/{{ CSS_FILE }}\" />\n                        {% if FEED_ALL_ATOM %}\n                                <link href=\"{{ FEED_DOMAIN }}/{% if FEED_ALL_ATOM_URL %}{{ FEED_ALL_ATOM_URL }}{% else %}{{ FEED_ALL_ATOM }}{% endif %}\" type=\"application/atom+xml\" rel=\"alternate\" title=\"{{ SITENAME|striptags }} Atom Feed\" />\n                        {% endif %}\n                        {% if FEED_ALL_RSS %}\n                                <link href=\"{{ FEED_DOMAIN }}/{% if FEED_ALL_RSS_URL %}{{ FEED_ALL_RSS_URL }}{% else %}{{ FEED_ALL_RSS }}{% endif %}\" type=\"application/rss+xml\" rel=\"alternate\" title=\"{{ SITENAME|striptags }} RSS Feed\" />\n                        {% endif %}\n                        {% block extra_head %}{% endblock extra_head %}\n                {% endblock head %}\n        </head>\n\n        <body id=\"index\" class=\"home\">\n                {% include 'github.html' %}\n                <header id=\"banner\" class=\"body\">\n                        <h1><a href=\"{{ SITEURL }}/\">{{ SITENAME }}{% if SITESUBTITLE %} <strong>{{ SITESUBTITLE }}</strong>{% endif %}</a></h1>\n                        <nav><ul>\n                                {% for title, link in MENUITEMS %}\n                                        <li><a href=\"{{ link }}\">{{ title }}</a></li>\n                                {% endfor %}\n                                {% if DISPLAY_PAGES_ON_MENU -%}\n                                        {% for pg in pages %}\n                                                <li{% if pg == page %} class=\"active\"{% endif %}><a href=\"{{ SITEURL }}/{{ pg.url }}\">{{ pg.title }}</a></li>\n                                        {% endfor %}\n                                {% endif %}\n                                {% if DISPLAY_CATEGORIES_ON_MENU -%}\n                                        {% for cat, null in categories %}\n                                                <li{% if cat == category %} class=\"active\"{% endif %}><a href=\"{{ SITEURL }}/{{ cat.url }}\">{{ cat }}</a></li>\n                                        {% endfor %}\n                                {% endif %}\n                        </ul></nav>\n                </header><!-- /#banner -->\n                {% block content %}\n                {% endblock %}\n                <section id=\"extras\" class=\"body\">\n                        {% if LINKS %}\n                                <div class=\"blogroll\">\n                                        <h2>{{ LINKS_WIDGET_NAME | default('links') }}</h2>\n                                        <ul>\n                                                {% for name, link in LINKS %}\n                                                        <li><a href=\"{{ link }}\">{{ name }}</a></li>\n                                                {% endfor %}\n                                        </ul>\n                                </div><!-- /.blogroll -->\n                        {% endif %}\n                        {% if SOCIAL or FEED_ALL_ATOM or FEED_ALL_RSS %}\n                                <div class=\"social\">\n                                        <h2>{{ SOCIAL_WIDGET_NAME | default('social') }}</h2>\n                                        <ul>\n                                                {% if FEED_ALL_ATOM %}\n                                                        <li><a href=\"{{ FEED_DOMAIN }}/{% if FEED_ALL_ATOM_URL %}{{ FEED_ALL_ATOM_URL }}{% else %}{{ FEED_ALL_ATOM }}{% endif %}\" type=\"application/atom+xml\" rel=\"alternate\">atom feed</a></li>\n                                                {% endif %}\n                                                {% if FEED_ALL_RSS %}\n                                                        <li><a href=\"{{ FEED_DOMAIN }}/{% if FEED_ALL_RSS_URL %}{{ FEED_ALL_RSS_URL }}{% else %}{{ FEED_ALL_RSS }}{% endif %}\" type=\"application/rss+xml\" rel=\"alternate\">rss feed</a></li>\n                                                {% endif %}\n\n                                                {% for name, link in SOCIAL %}\n                                                        <li><a href=\"{{ link }}\">{{ name }}</a></li>\n                                                {% endfor %}\n                                        </ul>\n                                </div><!-- /.social -->\n                        {% endif %}\n                </section><!-- /#extras -->\n\n                <footer id=\"contentinfo\" class=\"body\">\n                        <address id=\"about\" class=\"vcard body\">\n                                Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>, which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n                        </address><!-- /#about -->\n\n                        <p>The theme is by <a rel=\"nofollow\" href=\"https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/\">Smashing Magazine</a>, thanks!</p>\n                </footer><!-- /#contentinfo -->\n\n                {% include 'analytics.html' %}\n                {% include 'disqus_script.html' %}\n        </body>\n</html>\n"
  },
  {
    "path": "pelican/themes/notmyidea/templates/categories.html",
    "content": "{% extends \"base.html\" %}\n\n{% block title %}{{ SITENAME|striptags }} - Categories{% endblock %}\n\n{% block content %}\n\n    <section id=\"content\" class=\"body\">\n        <h1>Categories for {{ SITENAME }}</h1>\n        <ul>\n            {% for category, articles in categories|sort %}\n                <li><a href=\"{{ SITEURL }}/{{ category.url }}\">{{ category }}</a> ({{ articles|count }})</li>\n            {% endfor %}\n        </ul>\n    </section>\n\n{% endblock %}\n"
  },
  {
    "path": "pelican/themes/notmyidea/templates/category.html",
    "content": "{% extends \"index.html\" %}\n{% block title %}{{ SITENAME|striptags }} - {{ category }}{% endblock %}\n"
  },
  {
    "path": "pelican/themes/notmyidea/templates/comments.html",
    "content": "{% if DISQUS_SITENAME %}<p>There are <a href=\"{{ SITEURL }}/{{ article.url }}#disqus_thread\">comments</a>.</p>{% endif %}\n"
  },
  {
    "path": "pelican/themes/notmyidea/templates/disqus_script.html",
    "content": "{% if DISQUS_SITENAME %}\n    <script type=\"text/javascript\">\n        var disqus_shortname = '{{ DISQUS_SITENAME }}';\n        (function () {\n            var s = document.createElement('script'); s.async = true;\n            s.type = 'text/javascript';\n            s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';\n            (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n        }());\n    </script>\n{% endif %}\n"
  },
  {
    "path": "pelican/themes/notmyidea/templates/github.html",
    "content": "{% if GITHUB_URL %}\n    <style type=\"text/css\">\n        div.github_url {\n            position: absolute;\n            border: 0;\n            background: black;\n            padding: 2px 8px;\n            width: 120px;\n        }\n    </style>\n    <a href=\"{{ GITHUB_URL }}\">\n        {% if GITHUB_POSITION != \"left\" %}\n            <div class=\"github_url\" style=\"top: 0; right: 0; border-radius: 0 0 0 8px;\">Fork me on GitHub</div>\n        {% else %}\n            <div class=\"github_url\" style=\"top: 0; left: 0; border-radius: 0 0 8px 0;\">Fork me on GitHub</div>\n        {% endif %}\n    </a>\n{% endif %}\n"
  },
  {
    "path": "pelican/themes/notmyidea/templates/index.html",
    "content": "{% extends \"base.html\" %}\n{% block content_title %}{% endblock %}\n{% block content %}\n    {% if articles %}\n        {% for article in articles_page.object_list %}\n\n        {# First item #}\n            {% if loop.first and not articles_page.has_previous() %}\n                <aside id=\"featured\" class=\"body\">\n                    <article>\n                        <h1 class=\"entry-title\"><a href=\"{{ SITEURL }}/{{ article.url }}\">{{ article.title }}</a></h1>\n                        {% include 'article_infos.html' %}{{ article.content }}{% include 'comments.html' %}\n                    </article>\n                </aside><!-- /#featured -->\n                {% if loop.length > 1 %}\n                    <section id=\"content\" class=\"body\">\n                        <h1>Other articles</h1>\n                        <hr />\n                        <ol id=\"posts-list\" class=\"hfeed\">\n                {% endif %}\n        {# other items #}\n            {% else %}\n                {% if loop.first %}\n                    <section id=\"content\" class=\"body\">\n                        <ol id=\"posts-list\" class=\"hfeed\" start=\"{{ articles_paginator.per_page -1 }}\">\n                {% endif %}\n                <li><article class=\"hentry\">\n                    <header>\n                        <h1><a href=\"{{ SITEURL }}/{{ article.url }}\" rel=\"bookmark\"\n                               title=\"Permalink to {{ article.title|striptags }}\">{{ article.title }}</a></h1>\n                    </header>\n\n                    <div class=\"entry-content\">\n                        {% include 'article_infos.html' %}\n                        {{ article.summary }}\n                        <a class=\"readmore\" href=\"{{ SITEURL }}/{{ article.url }}\">read more</a>\n                        {% include 'comments.html' %}\n                    </div><!-- /.entry-content -->\n                </article></li>\n            {% endif %}\n            {% if loop.last %}\n                {% if loop.length > 1 or articles_page.has_other_pages() %}\n                    </ol><!-- /#posts-list -->\n                    {% if articles_page.has_other_pages() %}\n                        {% include 'pagination.html' %}\n                    {% endif %}\n                    </section><!-- /#content -->\n                {% endif %}\n            {% endif %}\n        {% endfor %}\n    {% else %}\n        <section id=\"content\" class=\"body\">\n            {% if pages %}\n                <h2>Pages</h2>\n                <ul>\n                    {% for page in pages %}\n                        <li><a href=\"{{ SITEURL }}/{{ page.url }}\">{{ page.title }}</a></li>\n                    {% endfor %}\n                </ul>\n            {% else %}\n                <p>This site currently has no content.</p>\n            {% endif %}\n        </section>\n    {% endif %}\n{% endblock content %}\n"
  },
  {
    "path": "pelican/themes/notmyidea/templates/page.html",
    "content": "{% extends \"base.html\" %}\n{% block html_lang %}{{ page.lang }}{% endblock %}\n{% block title %}{{ page.title|striptags }}{% endblock %}\n\n{% block extra_head %}\n  {% import 'translations.html' as translations with context %}\n  {% if translations.entry_hreflang(page) %}\n    {{ translations.entry_hreflang(page) }}\n  {% endif %}\n{% endblock %}\n\n{% block content %}\n  <section id=\"content\" class=\"body\">\n    <h1 class=\"entry-title\">{{ page.title }}</h1>\n    {% import 'translations.html' as translations with context %}\n    {{ translations.translations_for(page) }}\n    {{ page.content }}\n  </section>\n{% endblock %}\n"
  },
  {
    "path": "pelican/themes/notmyidea/templates/period_archives.html",
    "content": "{% extends \"base.html\" %}\n{% block content %}\n    <section id=\"content\" class=\"body\">\n        <h1>Archives for {{ period | reverse | join(' ') }}</h1>\n\n        <dl>\n            {% for article in dates %}\n                <dt>{{ article.locale_date }}</dt>\n                <dd><a href=\"{{ SITEURL }}/{{ article.url }}\">{{ article.title }}</a></dd>\n            {% endfor %}\n        </dl>\n    </section>\n{% endblock %}\n"
  },
  {
    "path": "pelican/themes/notmyidea/templates/tag.html",
    "content": "{% extends \"index.html\" %}\n{% block title %}{{ SITENAME|striptags }} - {{ tag }}{% endblock %}\n"
  },
  {
    "path": "pelican/themes/notmyidea/templates/taglist.html",
    "content": "{% if article.tags %}<p>tags: {% for tag in article.tags %}<a href=\"{{ SITEURL }}/{{ tag.url }}\">{{ tag | escape }}</a> {% endfor %}</p>{% endif %}\n"
  },
  {
    "path": "pelican/themes/notmyidea/templates/tags.html",
    "content": "{% extends \"base.html\" %}\n\n{% block title %}{{ SITENAME|striptags }} - Tags{% endblock %}\n\n{% block content %}\n\n    <section id=\"content\" class=\"body\">\n        <h1>Tags for {{ SITENAME }}</h1>\n        <ul>\n            {% for tag, articles in tags|sort %}\n                <li><a href=\"{{ SITEURL }}/{{ tag.url }}\">{{ tag }}</a> ({{ articles|count }})</li>\n            {% endfor %}\n        </ul>\n    </section>\n\n{% endblock %}\n"
  },
  {
    "path": "pelican/themes/notmyidea/templates/translations.html",
    "content": "{% macro translations_for(article) %}\n  {% if article.translations %}\n    Translations:\n    {% for translation in article.translations %}\n      <a href=\"{{ SITEURL }}/{{ translation.url }}\" hreflang=\"{{ translation.lang }}\">{{ translation.lang }}</a>\n    {% endfor %}\n  {% endif %}\n{% endmacro %}\n\n{% macro entry_hreflang(entry) %}\n  {% if entry.translations %}\n    {% for translation in entry.translations %}\n      <link rel=\"alternate\" hreflang=\"{{ translation.lang }}\" href=\"{{ SITEURL }}/{{ translation.url }}\">\n    {% endfor %}\n  {% endif %}\n{% endmacro %}\n"
  },
  {
    "path": "pelican/themes/notmyidea/templates/twitter.html",
    "content": "{% if TWITTER_USERNAME %}\n    <a rel=\"nofollow\" href=\"https://twitter.com/share\" class=\"twitter-share-button\" data-count=\"horizontal\" data-via=\"{{TWITTER_USERNAME}}\">Tweet</a><script type=\"text/javascript\" src=\"https://platform.twitter.com/widgets.js\"></script>\n{% endif %}\n"
  },
  {
    "path": "pelican/themes/simple/templates/archives.html",
    "content": "{% extends \"base.html\" %}\n\n{% block title %}{{ SITENAME|striptags }} - Archives{% endblock %}\n\n{% block content %}\n    <h2>Archives for {{ SITENAME }}</h2>\n\n    <dl>\n        {% for article in dates %}\n            <dt>{{ article.locale_date }}</dt>\n            <dd><a href=\"{{ SITEURL }}/{{ article.url }}\">{{ article.title }}</a></dd>\n        {% endfor %}\n    </dl>\n{% endblock %}\n"
  },
  {
    "path": "pelican/themes/simple/templates/article.html",
    "content": "{% extends \"base.html\" %}\n{% block html_lang %}{{ article.lang }}{% endblock %}\n\n{% block title %}{{ SITENAME|striptags }} - {{ article.title|striptags  }}{% endblock %}\n\n{% block head %}\n  {{ super() }}\n\n  {% import 'translations.html' as translations with context %}\n  {% if translations.entry_hreflang(article) %}\n    {{ translations.entry_hreflang(article) }}\n  {% endif %}\n\n  {% if article.description %}\n    <meta name=\"description\" content=\"{{article.description}}\" />\n  {% endif %}\n\n  {% for tag in article.tags %}\n    <meta name=\"tags\" content=\"{{tag}}\" />\n  {% endfor %}\n\n{% endblock %}\n\n{% block content %}\n  <article>\n    <header>\n      <h2>\n        <a href=\"{{ SITEURL }}/{{ article.url }}\" rel=\"bookmark\"\n           title=\"Permalink to {{ article.title|striptags }}\">{{ article.title }}</a></h2>\n      {% import 'translations.html' as translations with context %}\n      {{ translations.translations_for(article) }}\n    </header>\n    {{ article.content }}\n    <footer>\n      <p>Published: <time datetime=\"{{ article.date.isoformat() }}\">\n        {{ article.locale_date }}\n      </time></p>\n      {% if article.modified %}\n        <p>Last updated: <time datetime=\"{{ article.modified.isoformat() }}\">\n          {{ article.locale_modified }}\n        </time></p>\n      {% endif %}\n      {% if article.authors %}\n        <address>\n          By {% for author in article.authors %}\n            <a href=\"{{ SITEURL }}/{{ author.url }}\">{{ author }}</a>\n          {% endfor %}\n        </address>\n      {% endif %}\n      {% if article.category %}\n        <p>\n          Category: <a href=\"{{ SITEURL }}/{{ article.category.url }}\">{{ article.category }}</a>\n        </p>\n      {% endif %}\n      {% if article.tags %}\n        <p>\n          Tags:\n          {% for tag in article.tags %}\n            <a href=\"{{ SITEURL }}/{{ tag.url }}\">{{ tag }}</a>\n          {% endfor %}\n        </p>\n      {% endif %}\n    </footer>\n  </article>\n{% endblock %}\n"
  },
  {
    "path": "pelican/themes/simple/templates/author.html",
    "content": "{% extends \"index.html\" %}\n\n{% block title %}{{ SITENAME|striptags }} - Articles by {{ author }}{% endblock %}\n\n{% block content_title %}\n    <h2>Articles by {{ author }}</h2>\n{% endblock %}\n"
  },
  {
    "path": "pelican/themes/simple/templates/authors.html",
    "content": "{% extends \"base.html\" %}\n\n{% block title %}{{ SITENAME|striptags }} - Authors{% endblock %}\n\n{% block content %}\n    <h2>Authors on {{ SITENAME }}</h2>\n    <ul>\n        {% for author, articles in authors|sort %}\n            <li><a href=\"{{ SITEURL }}/{{ author.url }}\">{{ author }}</a> ({{ articles|count }})</li>\n        {% endfor %}\n    </ul>\n{% endblock %}\n"
  },
  {
    "path": "pelican/themes/simple/templates/base.html",
    "content": "<!DOCTYPE html>\n<html lang=\"{% block html_lang %}{{ DEFAULT_LANG }}{% endblock html_lang %}\">\n  <head>\n    {% block head %}\n      <title>{% block title %}{{ SITENAME|striptags }}{% endblock title %}</title>\n      <meta charset=\"utf-8\" />\n      <meta name=\"generator\" content=\"Pelican\" />\n      <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n      {% if SITESUBTITLE %}\n        <meta name=\"description\" content=\"{{ SITESUBTITLE }}\" />\n      {% endif %}\n      {% if STYLESHEET_URL %}\n        <link rel=\"stylesheet\" type=\"text/css\" href=\"{{ STYLESHEET_URL }}\" />\n      {% endif %}\n      {% if FEED_ALL_ATOM %}\n        <link href=\"{{ FEED_DOMAIN }}/{% if FEED_ALL_ATOM_URL %}{{ FEED_ALL_ATOM_URL }}{% else %}{{ FEED_ALL_ATOM }}{% endif %}\" type=\"application/atom+xml\" rel=\"alternate\" title=\"{{ SITENAME|striptags }} Full Atom Feed\" />\n      {% endif %}\n      {% if FEED_ALL_RSS %}\n        <link href=\"{{ FEED_DOMAIN }}/{% if FEED_ALL_RSS_URL %}{{ FEED_ALL_RSS_URL }}{% else %}{{ FEED_ALL_RSS }}{% endif %}\" type=\"application/rss+xml\" rel=\"alternate\" title=\"{{ SITENAME|striptags }} Full RSS Feed\" />\n      {% endif %}\n      {% if FEED_ATOM %}\n        <link href=\"{{ FEED_DOMAIN }}/{%if FEED_ATOM_URL %}{{ FEED_ATOM_URL }}{% else %}{{ FEED_ATOM }}{% endif %}\" type=\"application/atom+xml\" rel=\"alternate\" title=\"{{ SITENAME|striptags }} Atom Feed\" />\n      {% endif %}\n      {% if FEED_RSS %}\n        <link href=\"{{ FEED_DOMAIN }}/{% if FEED_RSS_URL %}{{ FEED_RSS_URL }}{% else %}{{ FEED_RSS }}{% endif %}\" type=\"application/rss+xml\" rel=\"alternate\" title=\"{{ SITENAME|striptags }} RSS Feed\" />\n      {% endif %}\n      {% if CATEGORY_FEED_ATOM and category %}\n        <link href=\"{{ FEED_DOMAIN }}/{% if CATEGORY_FEED_ATOM_URL %}{{ CATEGORY_FEED_ATOM_URL.format(slug=category.slug) }}{% else %}{{ CATEGORY_FEED_ATOM.format(slug=category.slug) }}{% endif %}\" type=\"application/atom+xml\" rel=\"alternate\" title=\"{{ SITENAME|striptags }} Categories Atom Feed\" />\n      {% endif %}\n      {% if CATEGORY_FEED_RSS and category %}\n        <link href=\"{{ FEED_DOMAIN }}/{% if CATEGORY_FEED_RSS_URL %}{{ CATEGORY_FEED_RSS_URL.format(slug=category.slug) }}{% else %}{{ CATEGORY_FEED_RSS.format(slug=category.slug) }}{% endif %}\" type=\"application/rss+xml\" rel=\"alternate\" title=\"{{ SITENAME|striptags }} Categories RSS Feed\" />\n      {% endif %}\n      {% if TAG_FEED_ATOM and tag %}\n        <link href=\"{{ FEED_DOMAIN }}/{% if TAG_FEED_ATOM_URL %}{{ TAG_FEED_ATOM_URL.format(slug=tag.slug) }}{% else %}{{ TAG_FEED_ATOM.format(slug=tag.slug) }}{% endif %}\" type=\"application/atom+xml\" rel=\"alternate\" title=\"{{ SITENAME|striptags }} Tags Atom Feed\" />\n      {% endif %}\n      {% if TAG_FEED_RSS and tag %}\n        <link href=\"{{ FEED_DOMAIN }}/{% if TAG_FEED_RSS_URL %}{{ TAG_FEED_RSS_URL.format(slug=tag.slug) }}{% else %}{{ TAG_FEED_RSS.format(slug=tag.slug) }}{% endif %}\" type=\"application/rss+xml\" rel=\"alternate\" title=\"{{ SITENAME|striptags }} Tags RSS Feed\" />\n      {% endif %}\n    {% endblock head %}\n  </head>\n\n  <body>\n    {% block body %}\n      <header>\n        {% block header %}\n          <hgroup><h1><a href=\"{{ SITEURL }}/\">{{ SITENAME }}</a></h1>{% if SITESUBTITLE %}<p>{{ SITESUBTITLE }}</p>{% endif %}</hgroup>\n        {% endblock header %}\n        {% block nav %}\n          <nav><ul>\n            {% for title, link in MENUITEMS %}\n              <li><a href=\"{{ link }}\">{{ title }}</a></li>\n            {% endfor %}\n            {% if DISPLAY_PAGES_ON_MENU %}\n              {% for p in pages %}\n                <li><a href=\"{{ SITEURL }}/{{ p.url }}\" {% if p==page %} aria-current=\"page\" {% endif %}>{{ p.title }}</a></li>\n              {% endfor %}\n            {% endif %}\n            {% if DISPLAY_CATEGORIES_ON_MENU %}\n              {% for cat, null in categories %}\n                <li><a href=\"{{ SITEURL }}/{{ cat.url }}\" {% if cat==category %} aria-current=\"page\" {% endif %}>{{ cat}}</a></li>\n              {% endfor %}\n            {% endif %}\n          </ul></nav>\n        {% endblock nav %}\n      </header>\n      <main>\n        {% block content %}\n        {% endblock content %}\n      </main>\n      <footer>\n        {% block footer %}\n          <address>\n            Proudly powered by <a rel=\"nofollow\" href=\"https://getpelican.com/\">Pelican</a>,\n            which takes great advantage of <a rel=\"nofollow\" href=\"https://www.python.org/\">Python</a>.\n          </address>\n        {% endblock footer %}\n      </footer>\n    {% endblock body %}\n  </body>\n</html>\n"
  },
  {
    "path": "pelican/themes/simple/templates/categories.html",
    "content": "{% extends \"base.html\" %}\n\n{% block title %}{{ SITENAME|striptags }} - Categories{% endblock %}\n\n{% block content %}\n    <h2>Categories on {{ SITENAME }}</h2>\n    <ul>\n        {% for category, articles in categories|sort %}\n            <li><a href=\"{{ SITEURL }}/{{ category.url }}\">{{ category }}</a> ({{ articles|count }})</li>\n        {% endfor %}\n    </ul>\n{% endblock %}\n"
  },
  {
    "path": "pelican/themes/simple/templates/category.html",
    "content": "{% extends \"index.html\" %}\n\n{% block title %}{{ SITENAME|striptags }} - {{ category }} category{% endblock %}\n\n{% block content_title %}\n    <h2>Articles in the {{ category }} category</h2>\n{% endblock %}\n"
  },
  {
    "path": "pelican/themes/simple/templates/index.html",
    "content": "{% extends \"base.html\" %}\n{% block content %}\n    {% block content_title %}\n        <h2>All articles</h2>\n    {% endblock %}\n\n\n    {% for article in articles_page.object_list %}\n        <article>\n            <header> <h2><a href=\"{{ SITEURL }}/{{ article.url }}\" rel=\"bookmark\" title=\"Permalink to {{ article.title|striptags }}\">{{ article.title }}</a></h2> </header>\n            <section>{{ article.summary }}</section>\n            <footer>\n                <p>Published: <time datetime=\"{{ article.date.isoformat() }}\"> {{ article.locale_date }} </time></p>\n                <address>By\n                    {% for author in article.authors %}\n                        <a href=\"{{ SITEURL }}/{{ author.url }}\">{{ author }}</a>\n                    {% endfor %}\n                </address>\n            </footer>\n        </article>\n    {% endfor %}\n\n    {% if articles_page.has_other_pages() %}\n        {% include 'pagination.html' %}\n    {% endif %}\n\n{% endblock content %}\n"
  },
  {
    "path": "pelican/themes/simple/templates/page.html",
    "content": "{% extends \"base.html\" %}\n{% block html_lang %}{{ page.lang }}{% endblock %}\n\n{% block title %}{{ SITENAME|striptags }} - {{ page.title|striptags }}{%endblock%}\n\n{% block head %}\n  {{ super() }}\n\n  {% import 'translations.html' as translations with context %}\n  {% if translations.entry_hreflang(page) %}\n    {{ translations.entry_hreflang(page) }}\n  {% endif %}\n{% endblock %}\n\n{% block content %}\n  <article>\n    <header>\n      <h2>{{ page.title }}</h2>\n    </header>\n    {% import 'translations.html' as translations with context %}\n    {{ translations.translations_for(page) }}\n\n    {{ page.content }}\n\n    {% if page.modified %}\n      <footer>\n        <p>\n          Last updated: {{ page.locale_modified }}\n        </p>\n      </footer>\n    {% endif %}\n  </article>\n{% endblock %}\n"
  },
  {
    "path": "pelican/themes/simple/templates/pagination.html",
    "content": "{% if DEFAULT_PAGINATION %}\n  {% set first_page = articles_paginator.page(1) %}\n  {% set last_page = articles_paginator.page(articles_paginator.num_pages) %}\n  <nav>\n    <ul>\n      {% if articles_page.has_previous() %}\n        <li><a href=\"{{ SITEURL }}/{{ first_page.url }}\">&Lang;</a></li>\n        <li><a href=\"{{ SITEURL }}/{{ articles_previous_page.url }}\">&lang;</a></li>\n      {% endif %}\n      <li>Page {{ articles_page.number }} / {{ articles_paginator.num_pages }}</li>\n      {% if articles_page.has_next() %}\n        <li><a href=\"{{ SITEURL }}/{{ articles_next_page.url }}\">&rang;</a></li>\n        <li><a href=\"{{ SITEURL }}/{{ last_page.url }}\">&Rang;</a></li>\n      {% endif %}\n    </ul>\n  </nav>\n{% endif %}\n"
  },
  {
    "path": "pelican/themes/simple/templates/period_archives.html",
    "content": "{% extends \"base.html\" %}\n\n{% block title %}{{ SITENAME|striptags }} - {{ period | reverse | join(' ') }} archives{% endblock %}\n\n{% block content %}\n    <h2>Archives for {{ period | reverse | join(' ') }}</h2>\n\n    <dl>\n        {% for article in dates %}\n            <dt>{{ article.locale_date }}</dt>\n            <dd><a href=\"{{ SITEURL }}/{{ article.url }}\">{{ article.title }}</a></dd>\n        {% endfor %}\n    </dl>\n{% endblock %}\n"
  },
  {
    "path": "pelican/themes/simple/templates/tag.html",
    "content": "{% extends \"index.html\" %}\n\n{% block title %}{{ SITENAME|striptags }} - {{ tag }} tag{% endblock %}\n\n{% block content_title %}\n    <h2>Articles tagged with {{ tag }}</h2>\n{% endblock %}\n"
  },
  {
    "path": "pelican/themes/simple/templates/tags.html",
    "content": "{% extends \"base.html\" %}\n\n{% block title %}{{ SITENAME|striptags }} - Tags{% endblock %}\n\n{% block content %}\n    <h2>Tags for {{ SITENAME }}</h2>\n    <ul>\n        {% for tag, articles in tags|sort %}\n            <li><a href=\"{{ SITEURL }}/{{ tag.url }}\">{{ tag }}</a> ({{ articles|count }})</li>\n        {% endfor %}\n    </ul>\n{% endblock %}\n"
  },
  {
    "path": "pelican/themes/simple/templates/translations.html",
    "content": "{% macro translations_for(article) %}\n  {% if article.translations %}\n    Translations:\n    {% for translation in article.translations %}\n      <a href=\"{{ SITEURL }}/{{ translation.url }}\" hreflang=\"{{ translation.lang }}\">{{ translation.lang }}</a>\n    {% endfor %}\n  {% endif %}\n{% endmacro %}\n\n{% macro entry_hreflang(entry) %}\n  {% if entry.translations %}\n    {% for translation in entry.translations %}\n      <link rel=\"alternate\" hreflang=\"{{ translation.lang }}\" href=\"{{ SITEURL }}/{{ translation.url }}\">\n    {% endfor %}\n  {% endif %}\n{% endmacro %}\n"
  },
  {
    "path": "pelican/tools/__init__.py",
    "content": ""
  },
  {
    "path": "pelican/tools/pelican_import.py",
    "content": "#!/usr/bin/env python\n\nimport argparse\nimport datetime\nimport json\nimport logging\nimport os\nimport re\nimport subprocess\nimport sys\nimport tempfile\nimport time\nimport urllib.request as urllib_request\nfrom collections import defaultdict\nfrom html import unescape\nfrom urllib.error import URLError\nfrom urllib.parse import quote, urlparse, urlsplit, urlunsplit\nfrom urllib.request import urlretrieve\n\nimport dateutil.parser\nfrom docutils.utils import column_width\n\n# because logging.setLoggerClass has to be called before logging.getLogger\nfrom pelican.log import init\nfrom pelican.settings import DEFAULT_CONFIG\nfrom pelican.utils import SafeDatetime, slugify\n\nlogger = logging.getLogger(__name__)\n\n\ndef decode_wp_content(content, br=True):\n    pre_tags = {}\n    if content is None or content.strip() == \"\":\n        return \"\"\n\n    content += \"\\n\"\n    if \"<pre\" in content:\n        pre_parts = content.split(\"</pre>\")\n        last_pre = pre_parts.pop()\n        content = \"\"\n        pre_index = 0\n\n        for pre_part in pre_parts:\n            start = pre_part.find(\"<pre\")\n            if start == -1:\n                content = content + pre_part\n                continue\n            name = f\"<pre wp-pre-tag-{pre_index}></pre>\"\n            pre_tags[name] = pre_part[start:] + \"</pre>\"\n            content = content + pre_part[0:start] + name\n            pre_index += 1\n        content = content + last_pre\n\n    content = re.sub(r\"<br />\\s*<br />\", \"\\n\\n\", content)\n    allblocks = (\n        \"(?:table|thead|tfoot|caption|col|colgroup|tbody|tr|\"\n        \"td|th|div|dl|dd|dt|ul|ol|li|pre|select|option|form|\"\n        \"map|area|blockquote|address|math|style|p|h[1-6]|hr|\"\n        \"fieldset|noscript|samp|legend|section|article|aside|\"\n        \"hgroup|header|footer|nav|figure|figcaption|details|\"\n        \"menu|summary)\"\n    )\n    content = re.sub(r\"(<\" + allblocks + r\"[^>]*>)\", \"\\n\\\\1\", content)\n    content = re.sub(r\"(</\" + allblocks + r\">)\", \"\\\\1\\n\\n\", content)\n    #    content = content.replace(\"\\r\\n\", \"\\n\")\n    if \"<object\" in content:\n        # no <p> inside object/embed\n        content = re.sub(r\"\\s*<param([^>]*)>\\s*\", \"<param\\\\1>\", content)\n        content = re.sub(r\"\\s*</embed>\\s*\", \"</embed>\", content)\n        #    content = re.sub(r'/\\n\\n+/', '\\n\\n', content)\n    pgraphs = filter(lambda s: s != \"\", re.split(r\"\\n\\s*\\n\", content))\n    content = \"\"\n    for p in pgraphs:\n        content = content + \"<p>\" + p.strip() + \"</p>\\n\"\n    # under certain strange conditions it could create\n    # a P of entirely whitespace\n    content = re.sub(r\"<p>\\s*</p>\", \"\", content)\n    content = re.sub(r\"<p>([^<]+)</(div|address|form)>\", \"<p>\\\\1</p></\\\\2>\", content)\n    # don't wrap tags\n    content = re.sub(r\"<p>\\s*(</?\" + allblocks + r\"[^>]*>)\\s*</p>\", \"\\\\1\", content)\n    # problem with nested lists\n    content = re.sub(r\"<p>(<li.*)</p>\", \"\\\\1\", content)\n    content = re.sub(r\"<p><blockquote([^>]*)>\", \"<blockquote\\\\1><p>\", content)\n    content = content.replace(\"</blockquote></p>\", \"</p></blockquote>\")\n    content = re.sub(r\"<p>\\s*(</?\" + allblocks + \"[^>]*>)\", \"\\\\1\", content)\n    content = re.sub(r\"(</?\" + allblocks + r\"[^>]*>)\\s*</p>\", \"\\\\1\", content)\n    if br:\n\n        def _preserve_newline(match):\n            return match.group(0).replace(\"\\n\", \"<WPPreserveNewline />\")\n\n        content = re.sub(r\"/<(script|style).*?<\\/\\\\1>/s\", _preserve_newline, content)\n        # optionally make line breaks\n        content = re.sub(r\"(?<!<br />)\\s*\\n\", \"<br />\\n\", content)\n        content = content.replace(\"<WPPreserveNewline />\", \"\\n\")\n    content = re.sub(r\"(</?\" + allblocks + r\"[^>]*>)\\s*<br />\", \"\\\\1\", content)\n    content = re.sub(\n        r\"<br />(\\s*</?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)[^>]*>)\", \"\\\\1\", content\n    )\n    content = re.sub(r\"\\n</p>\", \"</p>\", content)\n\n    if pre_tags:\n\n        def _multi_replace(dic, string):\n            pattern = r\"|\".join(map(re.escape, dic.keys()))\n            return re.sub(pattern, lambda m: dic[m.group()], string)\n\n        content = _multi_replace(pre_tags, content)\n\n    # convert [caption] tags into <figure>\n    content = re.sub(\n        r\"\\[caption(?:.*?)(?:caption=\\\"(.*?)\\\")?\\]\"\n        r\"((?:\\<a(?:.*?)\\>)?(?:\\<img.*?\\>)(?:\\<\\/a\\>)?)\\s?(.*?)\\[\\/caption\\]\",\n        r\"<figure>\\n\\2\\n<figcaption>\\1\\3</figcaption>\\n</figure>\",\n        content,\n    )\n\n    return content\n\n\ndef _import_bs4():\n    \"\"\"Import and return bs4, otherwise sys.exit.\"\"\"\n    try:\n        import bs4  # noqa: PLC0415\n    except ImportError:\n        error = (\n            'Missing dependency \"BeautifulSoup4\" and \"lxml\" required to '\n            \"import XML files.\"\n        )\n        sys.exit(error)\n    return bs4\n\n\ndef file_to_soup(xml, features=\"xml\"):\n    \"\"\"Reads a file, returns soup.\"\"\"\n    bs4 = _import_bs4()\n    with open(xml, encoding=\"utf-8\") as infile:\n        xmlfile = infile.read()\n    soup = bs4.BeautifulSoup(xmlfile, features)\n    return soup\n\n\ndef get_filename(post_name, post_id):\n    if post_name is None or post_name.isspace():\n        return post_id\n    else:\n        return post_name\n\n\ndef wp2fields(xml, wp_custpost=False):\n    \"\"\"Opens a wordpress XML file, and yield Pelican fields\"\"\"\n\n    soup = file_to_soup(xml)\n    items = soup.rss.channel.find_all(\"item\")\n    for item in items:\n        if item.find(\"status\").string in [\"publish\", \"draft\"]:\n            try:\n                # Use HTMLParser due to issues with BeautifulSoup 3\n                title = unescape(item.title.contents[0])\n            except IndexError:\n                title = \"No title [{}]\".format(item.find(\"post_name\").string)\n                logger.warning('Post \"%s\" is lacking a proper title', title)\n\n            post_name = item.find(\"post_name\").string\n            post_id = item.find(\"post_id\").string\n            filename = get_filename(post_name, post_id)\n\n            content = item.find(\"encoded\").string\n            raw_date = item.find(\"post_date\").string\n            if raw_date == \"0000-00-00 00:00:00\":\n                date = None\n            else:\n                date_object = SafeDatetime.strptime(raw_date, \"%Y-%m-%d %H:%M:%S\")\n                date = date_object.strftime(\"%Y-%m-%d %H:%M\")\n            author = item.find(\"creator\").string\n\n            categories = [\n                cat.string for cat in item.find_all(\"category\", {\"domain\": \"category\"})\n            ]\n\n            tags = [\n                tag.string for tag in item.find_all(\"category\", {\"domain\": \"post_tag\"})\n            ]\n            # To publish a post the status should be 'published'\n            status = (\n                \"published\"\n                if item.find(\"status\").string == \"publish\"\n                else item.find(\"status\").string\n            )\n\n            kind = \"article\"\n            post_type = item.find(\"post_type\").string\n            if post_type == \"page\":\n                kind = \"page\"\n            elif wp_custpost:\n                if post_type == \"post\":\n                    pass\n                # Old behaviour was to name everything not a page as an\n                # article.Theoretically all attachments have status == inherit\n                # so no attachments should be here. But this statement is to\n                # maintain existing behaviour in case that doesn't hold true.\n                elif post_type == \"attachment\":\n                    pass\n                else:\n                    kind = post_type\n            yield (\n                title,\n                content,\n                filename,\n                date,\n                author,\n                categories,\n                tags,\n                status,\n                kind,\n                \"wp-html\",\n            )\n\n\ndef blogger2fields(xml):\n    \"\"\"Opens a blogger XML file, and yield Pelican fields\"\"\"\n\n    soup = file_to_soup(xml)\n    entries = soup.feed.find_all(\"entry\")\n    for entry in entries:\n        raw_kind = entry.find(\n            \"category\", {\"scheme\": \"http://schemas.google.com/g/2005#kind\"}\n        ).get(\"term\")\n        if raw_kind == \"http://schemas.google.com/blogger/2008/kind#post\":\n            kind = \"article\"\n        elif raw_kind == \"http://schemas.google.com/blogger/2008/kind#comment\":\n            kind = \"comment\"\n        elif raw_kind == \"http://schemas.google.com/blogger/2008/kind#page\":\n            kind = \"page\"\n        else:\n            continue\n\n        try:\n            assert kind != \"comment\"\n            filename = entry.find(\"link\", {\"rel\": \"alternate\"})[\"href\"]\n            filename = os.path.splitext(os.path.basename(filename))[0]\n        except (AssertionError, TypeError, KeyError):\n            filename = entry.find(\"id\").string.split(\".\")[-1]\n\n        title = entry.find(\"title\").string or \"\"\n\n        content = entry.find(\"content\").string\n        raw_date = entry.find(\"published\").string\n        if hasattr(SafeDatetime, \"fromisoformat\"):\n            date_object = SafeDatetime.fromisoformat(raw_date)\n        else:\n            date_object = SafeDatetime.strptime(raw_date[:23], \"%Y-%m-%dT%H:%M:%S.%f\")\n        date = date_object.strftime(\"%Y-%m-%d %H:%M\")\n        author = entry.find(\"author\").find(\"name\").string\n\n        # blogger posts only have tags, no category\n        tags = [\n            tag.get(\"term\")\n            for tag in entry.find_all(\n                \"category\", {\"scheme\": \"http://www.blogger.com/atom/ns#\"}\n            )\n        ]\n\n        # Drafts have <app:control><app:draft>yes</app:draft></app:control>\n        status = \"published\"\n        try:\n            if entry.find(\"control\").find(\"draft\").string == \"yes\":\n                status = \"draft\"\n        except AttributeError:\n            pass\n\n        yield (title, content, filename, date, author, None, tags, status, kind, \"html\")\n\n\ndef dc2fields(file):\n    \"\"\"Opens a Dotclear export file, and yield pelican fields\"\"\"\n    try:\n        from bs4 import BeautifulSoup  # noqa: PLC0415\n    except ImportError:\n        error = (\n            \"Missing dependency \"\n            '\"BeautifulSoup4\" and \"lxml\" required '\n            \"to import Dotclear files.\"\n        )\n        sys.exit(error)\n\n    in_cat = False\n    in_post = False\n    category_list = {}\n    posts = []\n\n    with open(file, encoding=\"utf-8\") as f:\n        for line in f:\n            # remove final \\n\n            line = line[:-1]\n\n            if line.startswith(\"[category\"):\n                in_cat = True\n            elif line.startswith(\"[post\"):\n                in_post = True\n            elif in_cat:\n                fields = line.split('\",\"')\n                if not line:\n                    in_cat = False\n                else:\n                    # remove 1st and last \"\"\n                    fields[0] = fields[0][1:]\n                    # fields[-1] = fields[-1][:-1]\n                    category_list[fields[0]] = fields[2]\n            elif in_post:\n                if not line:\n                    in_post = False\n                    break\n                else:\n                    posts.append(line)\n\n    print(f\"{len(posts)} posts read.\")\n\n    subs = DEFAULT_CONFIG[\"SLUG_REGEX_SUBSTITUTIONS\"]\n    for post in posts:\n        fields = post.split('\",\"')\n\n        # post_id = fields[0][1:]\n        # blog_id = fields[1]\n        # user_id = fields[2]\n        cat_ids = fields[3]\n        # post_dt = fields[4]\n        # post_tz = fields[5]\n        post_creadt = fields[6]\n        # post_upddt = fields[7]\n        # post_password = fields[8]\n        # post_type = fields[9]\n        post_format = fields[10]\n        # post_url = fields[11]\n        # post_lang = fields[12]\n        post_title = fields[13]\n        post_excerpt = fields[14]\n        post_excerpt_xhtml = fields[15]\n        post_content = fields[16]\n        post_content_xhtml = fields[17]\n        # post_notes = fields[18]\n        # post_words = fields[19]\n        # post_status = fields[20]\n        # post_selected = fields[21]\n        # post_position = fields[22]\n        # post_open_comment = fields[23]\n        # post_open_tb = fields[24]\n        # nb_comment = fields[25]\n        # nb_trackback = fields[26]\n        post_meta = fields[27]\n        # redirect_url = fields[28][:-1]\n\n        # remove seconds\n        post_creadt = \":\".join(post_creadt.split(\":\")[0:2])\n\n        author = \"\"\n        categories = []\n        tags = []\n\n        if cat_ids:\n            categories = [\n                category_list[cat_id].strip() for cat_id in cat_ids.split(\",\")\n            ]\n\n        # Get tags related to a post\n        tag = (\n            post_meta.replace(\"{\", \"\")\n            .replace(\"}\", \"\")\n            .replace('a:1:s:3:\\\\\"tag\\\\\";a:', \"\")\n            .replace(\"a:0:\", \"\")\n        )\n        if len(tag) > 1:\n            if len(tag[:1]) == 1:\n                newtag = tag.split('\"')[1]\n                tags.append(\n                    BeautifulSoup(newtag, \"xml\")\n                    # bs4 always outputs UTF-8\n                    .decode(\"utf-8\")\n                )\n            else:\n                i = 1\n                j = 1\n                while i <= int(tag[:1]):\n                    newtag = tag.split('\"')[j].replace(\"\\\\\", \"\")\n                    tags.append(\n                        BeautifulSoup(newtag, \"xml\")\n                        # bs4 always outputs UTF-8\n                        .decode(\"utf-8\")\n                    )\n                    i = i + 1\n                    if j < int(tag[:1]) * 2:\n                        j = j + 2\n\n        \"\"\"\n        dotclear2 does not use markdown by default unless\n        you use the markdown plugin\n        Ref: http://plugins.dotaddict.org/dc2/details/formatting-markdown\n        \"\"\"\n        if post_format == \"markdown\":\n            content = post_excerpt + post_content\n        else:\n            content = post_excerpt_xhtml + post_content_xhtml\n            content = content.replace(\"\\\\n\", \"\")\n            post_format = \"html\"\n\n        kind = \"article\"  # TODO: Recognise pages\n        status = \"published\"  # TODO: Find a way for draft posts\n\n        yield (\n            post_title,\n            content,\n            slugify(post_title, regex_subs=subs),\n            post_creadt,\n            author,\n            categories,\n            tags,\n            status,\n            kind,\n            post_format,\n        )\n\n\ndef _get_tumblr_posts(api_key, blogname, offset=0):\n    url = (\n        f\"https://api.tumblr.com/v2/blog/{blogname}.tumblr.com/\"\n        f\"posts?api_key={api_key}&offset={offset}&filter=raw\"\n    )\n    request = urllib_request.Request(url)\n    handle = urllib_request.urlopen(request)\n    posts = json.loads(handle.read().decode(\"utf-8\"))\n    return posts.get(\"response\").get(\"posts\")\n\n\ndef tumblr2fields(api_key, blogname):\n    \"\"\"Imports Tumblr posts (API v2)\"\"\"\n    offset = 0\n    posts = _get_tumblr_posts(api_key, blogname, offset)\n    subs = DEFAULT_CONFIG[\"SLUG_REGEX_SUBSTITUTIONS\"]\n    while len(posts) > 0:\n        for post in posts:\n            title = (\n                post.get(\"title\")\n                or post.get(\"source_title\")\n                or post.get(\"type\").capitalize()\n            )\n            slug = post.get(\"slug\") or slugify(title, regex_subs=subs)\n            tags = post.get(\"tags\")\n            timestamp = post.get(\"timestamp\")\n            date = SafeDatetime.fromtimestamp(\n                int(timestamp), tz=datetime.timezone.utc\n            ).strftime(\"%Y-%m-%d %H:%M:%S%z\")\n            slug = (\n                SafeDatetime.fromtimestamp(\n                    int(timestamp), tz=datetime.timezone.utc\n                ).strftime(\"%Y-%m-%d-\")\n                + slug\n            )\n            post_format = post.get(\"format\")\n            content = post.get(\"body\")\n            post_type = post.get(\"type\")\n            if post_type == \"photo\":\n                if post_format == \"markdown\":\n                    fmtstr = \"![%s](%s)\"\n                else:\n                    fmtstr = '<img alt=\"%s\" src=\"%s\" />'\n                content = \"\\n\".join(\n                    fmtstr\n                    % (photo.get(\"caption\"), photo.get(\"original_size\").get(\"url\"))\n                    for photo in post.get(\"photos\")\n                )\n            elif post_type == \"quote\":\n                if post_format == \"markdown\":\n                    fmtstr = \"\\n\\n&mdash; %s\"\n                else:\n                    fmtstr = \"<p>&mdash; %s</p>\"\n                content = post.get(\"text\") + fmtstr % post.get(\"source\")\n            elif post_type == \"link\":\n                if post_format == \"markdown\":\n                    fmtstr = \"[via](%s)\\n\\n\"\n                else:\n                    fmtstr = '<p><a href=\"%s\">via</a></p>\\n'\n                content = fmtstr % post.get(\"url\") + post.get(\"description\")\n            elif post_type == \"audio\":\n                if post_format == \"markdown\":\n                    fmtstr = \"[via](%s)\\n\\n\"\n                else:\n                    fmtstr = '<p><a href=\"%s\">via</a></p>\\n'\n                content = (\n                    fmtstr % post.get(\"source_url\")\n                    + post.get(\"caption\")\n                    + post.get(\"player\")\n                )\n            elif post_type == \"video\":\n                if post_format == \"markdown\":\n                    fmtstr = \"[via](%s)\\n\\n\"\n                else:\n                    fmtstr = '<p><a href=\"%s\">via</a></p>\\n'\n                source = fmtstr % post.get(\"source_url\")\n                caption = post.get(\"caption\")\n                players = [\n                    # If embed_code is False, couldn't get the video\n                    player.get(\"embed_code\") or None\n                    for player in post.get(\"player\")\n                ]\n                # If there are no embeddable players, say so, once\n                if len(players) > 0 and all(player is None for player in players):\n                    players = \"<p>(This video isn't available anymore.)</p>\\n\"\n                else:\n                    players = \"\\n\".join(players)\n                content = source + caption + players\n            elif post_type == \"answer\":\n                title = post.get(\"question\")\n                content = (\n                    \"<p>\"\n                    '<a href=\"{}\" rel=\"external nofollow\">{}</a>'\n                    \": {}\"\n                    \"</p>\\n\"\n                    \" {}\".format(\n                        post.get(\"asking_name\"),\n                        post.get(\"asking_url\"),\n                        post.get(\"question\"),\n                        post.get(\"answer\"),\n                    )\n                )\n\n            content = content.rstrip() + \"\\n\"\n            kind = \"article\"\n            status = \"published\"  # TODO: Find a way for draft posts\n\n            yield (\n                title,\n                content,\n                slug,\n                date,\n                post.get(\"blog_name\"),\n                [post_type],\n                tags,\n                status,\n                kind,\n                post_format,\n            )\n\n        offset += len(posts)\n        posts = _get_tumblr_posts(api_key, blogname, offset)\n\n\ndef strip_medium_post_content(soup) -> str:\n    \"\"\"Strip some tags and attributes from medium post content.\n\n    For example, the 'section' and 'div' tags cause trouble while rendering.\n\n    The problem with these tags is you can get a section divider (--------------)\n    that is not between two pieces of content.  For example:\n\n      Some text.\n\n      .. container:: section-divider\n\n         --------------\n\n      .. container:: section-content\n\n      More content.\n\n    In this case, pandoc complains: \"Unexpected section title or transition.\"\n\n    Also, the \"id\" and \"name\" attributes in tags cause similar problems.  They show\n    up in .rst as extra junk that separates transitions.\n    \"\"\"\n    # Remove tags\n    # section and div cause problems\n    # footer also can cause problems, and has nothing we want to keep\n    # See https://stackoverflow.com/a/8439761\n    invalid_tags = [\"section\", \"div\", \"footer\"]\n    for tag in invalid_tags:\n        for match in soup.find_all(tag):\n            match.unwrap()\n\n    # Remove attributes\n    # See https://stackoverflow.com/a/9045719\n    invalid_attributes = [\"name\", \"id\", \"class\"]\n    bs4 = _import_bs4()\n    for tag in soup.descendants:\n        if isinstance(tag, bs4.element.Tag):\n            tag.attrs = {\n                key: value\n                for key, value in tag.attrs.items()\n                if key not in invalid_attributes\n            }\n\n    # Get the string of all content, keeping other tags\n    all_content = \"\".join(str(element) for element in soup.contents)\n    return all_content\n\n\ndef mediumpost2fields(filepath: str) -> tuple:\n    \"\"\"Take an HTML post from a medium export, return Pelican fields.\"\"\"\n\n    soup = file_to_soup(filepath, \"html.parser\")\n    if not soup:\n        raise ValueError(f\"{filepath} could not be parsed by beautifulsoup\")\n    kind = \"article\"\n\n    content = soup.find(\"section\", class_=\"e-content\")\n    if not content:\n        raise ValueError(f\"{filepath}: Post has no content\")\n\n    title = soup.find(\"title\").string or \"\"\n\n    raw_date = soup.find(\"time\", class_=\"dt-published\")\n    date = None\n    if raw_date:\n        # This datetime can include timezone, e.g., \"2017-04-21T17:11:55.799Z\"\n        # python before 3.11 can't parse the timezone using datetime.fromisoformat\n        # See also https://docs.python.org/3.10/library/datetime.html#datetime.datetime.fromisoformat\n        # \"This does not support parsing arbitrary ISO 8601 strings\"\n        # So, we use dateutil.parser, which can handle it.\n        date_object = dateutil.parser.parse(raw_date.attrs[\"datetime\"])\n        date = date_object.strftime(\"%Y-%m-%d %H:%M\")\n        status = \"published\"\n    else:\n        status = \"draft\"\n    author = soup.find(\"a\", class_=\"p-author h-card\")\n    if author:\n        author = author.string\n\n    # Now that we're done with classes, we can strip the content\n    content = strip_medium_post_content(content)\n\n    # medium HTML export doesn't have tag or category\n    # RSS feed has tags, but it doesn't have all the posts.\n    tags = ()\n\n    slug = medium_slug(filepath)\n\n    # TODO: make the fields a python dataclass\n    return (\n        title,\n        content,\n        slug,\n        date,\n        author,\n        None,\n        tags,\n        status,\n        kind,\n        \"html\",\n    )\n\n\ndef medium_slug(filepath: str) -> str:\n    \"\"\"Make the filepath of a medium exported file into a slug.\"\"\"\n    # slug: filename without extension\n    slug = os.path.basename(filepath)\n    slug = os.path.splitext(slug)[0]\n    # A medium export filename looks like date_-title-...html\n    # But, RST doesn't like \"_-\" (see https://github.com/sphinx-doc/sphinx/issues/4350)\n    # so get rid of it\n    slug = slug.replace(\"_-\", \"-\")\n    # drop the hex string medium puts on the end of the filename, why keep it.\n    # e.g., \"-a8a8a8a8\" or \"---a9a9a9a9\"\n    # also: drafts don't need \"--DRAFT\"\n    slug = re.sub(r\"((-)+([0-9a-f]+|DRAFT))+$\", \"\", slug)\n    return slug\n\n\ndef mediumposts2fields(medium_export_dir: str):\n    \"\"\"Take HTML posts in a medium export directory, and yield Pelican fields.\"\"\"\n    for file in os.listdir(medium_export_dir):\n        filename = os.fsdecode(file)\n        yield mediumpost2fields(os.path.join(medium_export_dir, filename))\n\n\ndef feed2fields(file):\n    \"\"\"Read a feed and yield pelican fields\"\"\"\n    import feedparser  # noqa: PLC0415\n\n    d = feedparser.parse(file)\n    subs = DEFAULT_CONFIG[\"SLUG_REGEX_SUBSTITUTIONS\"]\n    for entry in d.entries:\n        date = (\n            time.strftime(\"%Y-%m-%d %H:%M\", entry.updated_parsed)\n            if hasattr(entry, \"updated_parsed\")\n            else None\n        )\n        author = entry.author if hasattr(entry, \"author\") else None\n        tags = [e[\"term\"] for e in entry.tags] if hasattr(entry, \"tags\") else None\n\n        slug = slugify(entry.title, regex_subs=subs)\n        kind = \"article\"\n        yield (\n            entry.title,\n            entry.description,\n            slug,\n            date,\n            author,\n            [],\n            tags,\n            None,\n            kind,\n            \"html\",\n        )\n\n\ndef build_header(\n    title, date, author, categories, tags, slug, status=None, attachments=None\n):\n    \"\"\"Build a header from a list of fields\"\"\"\n\n    header = \"{}\\n{}\\n\".format(title, \"#\" * column_width(title))\n    if date:\n        header += f\":date: {date}\\n\"\n    if author:\n        header += f\":author: {author}\\n\"\n    if categories:\n        header += \":category: {}\\n\".format(\", \".join(categories))\n    if tags:\n        header += \":tags: {}\\n\".format(\", \".join(tags))\n    if slug:\n        header += f\":slug: {slug}\\n\"\n    if status:\n        header += f\":status: {status}\\n\"\n    if attachments:\n        header += \":attachments: {}\\n\".format(\", \".join(attachments))\n    header += \"\\n\"\n    return header\n\n\ndef build_asciidoc_header(\n    title, date, author, categories, tags, slug, status=None, attachments=None\n):\n    \"\"\"Build a header from a list of fields\"\"\"\n\n    header = f\"= {title}\\n\"\n    if author:\n        header += f\"{author}\\n\"\n        if date:\n            header += f\"{date}\\n\"\n    if categories:\n        header += \":category: {}\\n\".format(\", \".join(categories))\n    if tags:\n        header += \":tags: {}\\n\".format(\", \".join(tags))\n    if slug:\n        header += f\":slug: {slug}\\n\"\n    if status:\n        header += f\":status: {status}\\n\"\n    if attachments:\n        header += \":attachments: {}\\n\".format(\", \".join(attachments))\n    header += \"\\n\"\n    return header\n\n\ndef build_markdown_header(\n    title, date, author, categories, tags, slug, status=None, attachments=None\n):\n    \"\"\"Build a header from a list of fields\"\"\"\n    header = f\"Title: {title}\\n\"\n    if date:\n        header += f\"Date: {date}\\n\"\n    if author:\n        header += f\"Author: {author}\\n\"\n    if categories:\n        header += \"Category: {}\\n\".format(\", \".join(categories))\n    if tags:\n        header += \"Tags: {}\\n\".format(\", \".join(tags))\n    if slug:\n        header += f\"Slug: {slug}\\n\"\n    if status:\n        header += f\"Status: {status}\\n\"\n    if attachments:\n        header += \"Attachments: {}\\n\".format(\", \".join(attachments))\n    header += \"\\n\"\n    return header\n\n\ndef get_ext(out_markup, in_markup=\"html\"):\n    if out_markup == \"asciidoc\":\n        ext = \".adoc\"\n    elif in_markup == \"markdown\" or out_markup == \"markdown\":\n        ext = \".md\"\n    else:\n        ext = \".rst\"\n    return ext\n\n\ndef get_out_filename(\n    output_path,\n    filename,\n    ext,\n    kind,\n    dirpage,\n    dircat,\n    categories,\n    wp_custpost,\n    slug_subs,\n):\n    filename = os.path.basename(filename)\n\n    # Enforce filename restrictions for various filesystems at once; see\n    # https://en.wikipedia.org/wiki/Filename#Reserved_characters_and_words\n    # we do not need to filter words because an extension will be appended\n    filename = re.sub(r'[<>:\"/\\\\|?*^% ]', \"-\", filename)  # invalid chars\n    filename = filename.lstrip(\".\")  # should not start with a dot\n    if not filename:\n        filename = \"_\"\n    filename = filename[:249]  # allow for 5 extra characters\n\n    out_filename = os.path.join(output_path, filename + ext)\n    # option to put page posts in pages/ subdirectory\n    if dirpage and kind == \"page\":\n        pages_dir = os.path.join(output_path, \"pages\")\n        if not os.path.isdir(pages_dir):\n            os.mkdir(pages_dir)\n        out_filename = os.path.join(pages_dir, filename + ext)\n    elif not dirpage and kind == \"page\":\n        pass\n    # option to put wp custom post types in directories with post type\n    # names. Custom post types can also have categories so option to\n    # create subdirectories with category names\n    elif kind != \"article\":\n        if wp_custpost:\n            typename = slugify(kind, regex_subs=slug_subs)\n        else:\n            typename = \"\"\n            kind = \"article\"\n        if dircat and (len(categories) > 0):\n            catname = slugify(categories[0], regex_subs=slug_subs, preserve_case=True)\n        else:\n            catname = \"\"\n        out_filename = os.path.join(output_path, typename, catname, filename + ext)\n        if not os.path.isdir(os.path.join(output_path, typename, catname)):\n            os.makedirs(os.path.join(output_path, typename, catname))\n    # option to put files in directories with categories names\n    elif dircat and (len(categories) > 0):\n        catname = slugify(categories[0], regex_subs=slug_subs, preserve_case=True)\n        out_filename = os.path.join(output_path, catname, filename + ext)\n        if not os.path.isdir(os.path.join(output_path, catname)):\n            os.mkdir(os.path.join(output_path, catname))\n\n    return out_filename\n\n\ndef get_attachments(xml):\n    \"\"\"returns a dictionary of posts that have attachments with a list\n    of the attachment_urls\n    \"\"\"\n    soup = file_to_soup(xml)\n    items = soup.rss.channel.find_all(\"item\")\n    names = {}\n    attachments = []\n\n    for item in items:\n        kind = item.find(\"post_type\").string\n        post_name = item.find(\"post_name\").string\n        post_id = item.find(\"post_id\").string\n\n        if kind == \"attachment\":\n            attachments.append(\n                (item.find(\"post_parent\").string, item.find(\"attachment_url\").string)\n            )\n        else:\n            filename = get_filename(post_name, post_id)\n            names[post_id] = filename\n    attachedposts = defaultdict(set)\n    for parent, url in attachments:\n        try:\n            parent_name = names[parent]\n        except KeyError:\n            # attachment's parent is not a valid post\n            parent_name = None\n\n        attachedposts[parent_name].add(url)\n    return attachedposts\n\n\ndef download_attachments(output_path, urls):\n    \"\"\"Downloads WordPress attachments and returns a list of paths to\n    attachments that can be associated with a post (relative path to output\n    directory). Files that fail to download, will not be added to posts\"\"\"\n    locations = {}\n    for url in urls:\n        path = urlparse(url).path\n        # teardown path and rebuild to negate any errors with\n        # os.path.join and leading /'s\n        path = path.split(\"/\")\n        filename = path.pop(-1)\n        localpath = \"\"\n        for item in path:\n            if sys.platform != \"win32\" or \":\" not in item:\n                localpath = os.path.join(localpath, item)\n        full_path = os.path.join(output_path, localpath)\n\n        # Generate percent-encoded URL\n        scheme, netloc, path, query, fragment = urlsplit(url)\n        if scheme != \"file\":\n            path = quote(path)\n            url = urlunsplit((scheme, netloc, path, query, fragment))\n\n        if not os.path.exists(full_path):\n            os.makedirs(full_path)\n        print(f\"downloading {filename}\")\n        try:\n            urlretrieve(url, os.path.join(full_path, filename))\n            locations[url] = os.path.join(localpath, filename)\n        except (URLError, OSError) as e:\n            # Python 2.7 throws an IOError rather Than URLError\n            logger.warning(\"No file could be downloaded from %s\\n%s\", url, e)\n    return locations\n\n\ndef is_pandoc_needed(in_markup):\n    return in_markup in (\"html\", \"wp-html\")\n\n\ndef get_pandoc_version():\n    cmd = [\"pandoc\", \"--version\"]\n    try:\n        output = subprocess.check_output(cmd, text=True)\n    except (subprocess.CalledProcessError, OSError) as e:\n        logger.warning(\"Pandoc version unknown: %s\", e)\n        return ()\n\n    return tuple(int(i) for i in output.split()[1].split(\".\"))\n\n\ndef update_links_to_attached_files(content, attachments):\n    for old_url, new_path in attachments.items():\n        # url may occur both with http:// and https://\n        http_url = old_url.replace(\"https://\", \"http://\")\n        https_url = old_url.replace(\"http://\", \"https://\")\n        for url in [http_url, https_url]:\n            content = content.replace(url, \"{static}\" + new_path)\n    return content\n\n\ndef fields2pelican(\n    fields,\n    out_markup,\n    output_path,\n    dircat=False,\n    strip_raw=False,\n    disable_slugs=False,\n    dirpage=False,\n    filter_author=None,\n    wp_custpost=False,\n    wp_attach=False,\n    attachments=None,\n):\n    pandoc_version = get_pandoc_version()\n    posts_require_pandoc = []\n\n    slug_subs = DEFAULT_CONFIG[\"SLUG_REGEX_SUBSTITUTIONS\"]\n\n    for (\n        title,\n        content,\n        filename,\n        date,\n        author,\n        categories,\n        tags,\n        status,\n        kind,\n        in_markup,\n    ) in fields:\n        if filter_author and filter_author != author:\n            continue\n        if is_pandoc_needed(in_markup) and not pandoc_version:\n            posts_require_pandoc.append(filename)\n\n        slug = (not disable_slugs and filename) or None\n        assert slug is None or filename == os.path.basename(filename), (\n            f\"filename is not a basename: {filename}\"\n        )\n\n        if wp_attach and attachments:\n            try:\n                urls = attachments[filename]\n                links = download_attachments(output_path, urls)\n            except KeyError:\n                links = None\n        else:\n            links = None\n\n        ext = get_ext(out_markup, in_markup)\n        if ext == \".adoc\":\n            header = build_asciidoc_header(\n                title, date, author, categories, tags, slug, status, attachments\n            )\n        elif ext == \".md\":\n            header = build_markdown_header(\n                title,\n                date,\n                author,\n                categories,\n                tags,\n                slug,\n                status,\n                links.values() if links else None,\n            )\n        else:\n            out_markup = \"rst\"\n            header = build_header(\n                title,\n                date,\n                author,\n                categories,\n                tags,\n                slug,\n                status,\n                links.values() if links else None,\n            )\n\n        out_filename = get_out_filename(\n            output_path,\n            filename,\n            ext,\n            kind,\n            dirpage,\n            dircat,\n            categories,\n            wp_custpost,\n            slug_subs,\n        )\n        print(out_filename)\n\n        if in_markup in (\"html\", \"wp-html\"):\n            with tempfile.TemporaryDirectory() as tmpdir:\n                html_filename = os.path.join(tmpdir, \"pandoc-input.html\")\n                # Replace newlines with paragraphs wrapped with <p> so\n                # HTML is valid before conversion\n                if in_markup == \"wp-html\":\n                    new_content = decode_wp_content(content)\n                else:\n                    paragraphs = content.splitlines()\n                    paragraphs = [f\"<p>{p}</p>\" for p in paragraphs]\n                    new_content = \"\".join(paragraphs)\n                with open(html_filename, \"w\", encoding=\"utf-8\") as fp:\n                    fp.write(new_content)\n\n                if pandoc_version < (2,):\n                    parse_raw = \"--parse-raw\" if not strip_raw else \"\"\n                    wrap_none = (\n                        \"--wrap=none\" if pandoc_version >= (1, 16) else \"--no-wrap\"\n                    )\n                    cmd = (\n                        'pandoc --normalize {0} --from=html --to={1} {2} -o \"{3}\" \"{4}\"'\n                    )\n                    cmd = cmd.format(\n                        parse_raw,\n                        out_markup if out_markup != \"markdown\" else \"gfm\",\n                        wrap_none,\n                        out_filename,\n                        html_filename,\n                    )\n                else:\n                    from_arg = \"-f html+raw_html\" if not strip_raw else \"-f html\"\n                    cmd = 'pandoc {0} --to={1}-smart --wrap=none -o \"{2}\" \"{3}\"'\n                    cmd = cmd.format(\n                        from_arg,\n                        out_markup if out_markup != \"markdown\" else \"gfm\",\n                        out_filename,\n                        html_filename,\n                    )\n\n                try:\n                    rc = subprocess.call(cmd, shell=True)\n                    if rc < 0:\n                        error = f\"Child was terminated by signal {-rc}\"\n                        sys.exit(error)\n\n                    elif rc > 0:\n                        error = \"Please, check your Pandoc installation.\"\n                        sys.exit(error)\n                except OSError as e:\n                    error = f\"Pandoc execution failed: {e}\"\n                    sys.exit(error)\n\n            with open(out_filename, encoding=\"utf-8\") as fs:\n                content = fs.read()\n                if out_markup == \"markdown\":\n                    # In markdown, to insert a <br />, end a line with two\n                    # or more spaces & then a end-of-line\n                    content = content.replace(\"\\\\\\n \", \"  \\n\")\n                    content = content.replace(\"\\\\\\n\", \"  \\n\")\n\n            if wp_attach and links:\n                content = update_links_to_attached_files(content, links)\n\n        with open(out_filename, \"w\", encoding=\"utf-8\") as fs:\n            fs.write(header + content)\n\n    if posts_require_pandoc:\n        logger.error(\n            \"Pandoc must be installed to import the following posts:\\n  {}\".format(\n                \"\\n  \".join(posts_require_pandoc)\n            )\n        )\n\n    if wp_attach and attachments and None in attachments:\n        print(\"downloading attachments that don't have a parent post\")\n        urls = attachments[None]\n        download_attachments(output_path, urls)\n\n\ndef main():\n    parser = argparse.ArgumentParser(\n        description=\"Transform feed, Blogger, Dotclear, Tumblr, or \"\n        \"WordPress files into reST (rst) or Markdown (md) files. \"\n        \"Be sure to have pandoc installed.\",\n        formatter_class=argparse.ArgumentDefaultsHelpFormatter,\n    )\n\n    parser.add_argument(dest=\"input\", help=\"The input file to read\")\n    parser.add_argument(\n        \"--blogger\", action=\"store_true\", dest=\"blogger\", help=\"Blogger XML export\"\n    )\n    parser.add_argument(\n        \"--dotclear\", action=\"store_true\", dest=\"dotclear\", help=\"Dotclear export\"\n    )\n    parser.add_argument(\n        \"--medium\", action=\"store_true\", dest=\"medium\", help=\"Medium export\"\n    )\n    parser.add_argument(\n        \"--tumblr\", action=\"store_true\", dest=\"tumblr\", help=\"Tumblr export\"\n    )\n    parser.add_argument(\n        \"--wpfile\", action=\"store_true\", dest=\"wpfile\", help=\"Wordpress XML export\"\n    )\n    parser.add_argument(\n        \"--feed\", action=\"store_true\", dest=\"feed\", help=\"Feed to parse\"\n    )\n    parser.add_argument(\n        \"-o\", \"--output\", dest=\"output\", default=\"content\", help=\"Output path\"\n    )\n    parser.add_argument(\n        \"-m\",\n        \"--markup\",\n        dest=\"markup\",\n        default=\"rst\",\n        help=\"Output markup format (supports rst & markdown)\",\n    )\n    parser.add_argument(\n        \"--dir-cat\",\n        action=\"store_true\",\n        dest=\"dircat\",\n        help=\"Put files in directories with categories name\",\n    )\n    parser.add_argument(\n        \"--dir-page\",\n        action=\"store_true\",\n        dest=\"dirpage\",\n        help=(\n            'Put files recognised as pages in \"pages/\" sub-directory'\n            \" (blogger and wordpress import only)\"\n        ),\n    )\n    parser.add_argument(\n        \"--filter-author\",\n        dest=\"author\",\n        help=\"Import only post from the specified author\",\n    )\n    parser.add_argument(\n        \"--strip-raw\",\n        action=\"store_true\",\n        dest=\"strip_raw\",\n        help=\"Strip raw HTML code that can't be converted to \"\n        \"markup such as flash embeds or iframes (wordpress import only)\",\n    )\n    parser.add_argument(\n        \"--wp-custpost\",\n        action=\"store_true\",\n        dest=\"wp_custpost\",\n        help=\"Put wordpress custom post types in directories. If used with \"\n        \"--dir-cat option directories will be created as \"\n        \"/post_type/category/ (wordpress import only)\",\n    )\n    parser.add_argument(\n        \"--wp-attach\",\n        action=\"store_true\",\n        dest=\"wp_attach\",\n        help=\"(wordpress import only) Download files uploaded to wordpress as \"\n        \"attachments. Files will be added to posts as a list in the post \"\n        \"header. All files will be downloaded, even if \"\n        \"they aren't associated with a post. Files will be downloaded \"\n        \"with their original path inside the output directory. \"\n        \"e.g. output/wp-uploads/date/postname/file.jpg \"\n        \"-- Requires an internet connection --\",\n    )\n    parser.add_argument(\n        \"--disable-slugs\",\n        action=\"store_true\",\n        dest=\"disable_slugs\",\n        help=\"Disable storing slugs from imported posts within output. \"\n        \"With this disabled, your Pelican URLs may not be consistent \"\n        \"with your original posts.\",\n    )\n    parser.add_argument(\n        \"-b\", \"--blogname\", dest=\"blogname\", help=\"Blog name (Tumblr import only)\"\n    )\n\n    args = parser.parse_args()\n\n    input_type = None\n    if args.blogger:\n        input_type = \"blogger\"\n    elif args.dotclear:\n        input_type = \"dotclear\"\n    elif args.medium:\n        input_type = \"medium\"\n    elif args.tumblr:\n        input_type = \"tumblr\"\n    elif args.wpfile:\n        input_type = \"wordpress\"\n    elif args.feed:\n        input_type = \"feed\"\n    else:\n        error = (\n            \"You must provide one of --blogger, --dotclear, \"\n            \"--medium, --tumblr, --wpfile or --feed options\"\n        )\n        sys.exit(error)\n\n    if not os.path.exists(args.output):\n        try:\n            os.mkdir(args.output)\n        except OSError:\n            error = \"Unable to create the output folder: \" + args.output\n            sys.exit(error)\n\n    if args.wp_attach and input_type != \"wordpress\":\n        error = \"You must be importing a wordpress xml to use the --wp-attach option\"\n        sys.exit(error)\n\n    if input_type == \"blogger\":\n        fields = blogger2fields(args.input)\n    elif input_type == \"dotclear\":\n        fields = dc2fields(args.input)\n    elif input_type == \"medium\":\n        fields = mediumposts2fields(args.input)\n    elif input_type == \"tumblr\":\n        fields = tumblr2fields(args.input, args.blogname)\n    elif input_type == \"wordpress\":\n        fields = wp2fields(args.input, args.wp_custpost or False)\n    elif input_type == \"feed\":\n        fields = feed2fields(args.input)\n    else:\n        raise ValueError(f\"Unhandled input_type {input_type}\")\n\n    if args.wp_attach:\n        attachments = get_attachments(args.input)\n    else:\n        attachments = None\n\n    # init logging\n    init()\n    fields2pelican(\n        fields,\n        args.markup,\n        args.output,\n        dircat=args.dircat or False,\n        dirpage=args.dirpage or False,\n        strip_raw=args.strip_raw or False,\n        disable_slugs=args.disable_slugs or False,\n        filter_author=args.author,\n        wp_custpost=args.wp_custpost or False,\n        wp_attach=args.wp_attach or False,\n        attachments=attachments or None,\n    )\n"
  },
  {
    "path": "pelican/tools/pelican_quickstart.py",
    "content": "#!/usr/bin/env python\n\nimport argparse\nimport locale\nimport os\nfrom collections.abc import Mapping\n\nfrom jinja2 import Environment, FileSystemLoader\n\ntry:\n    import zoneinfo\nexcept ModuleNotFoundError:\n    from backports import zoneinfo\n\ntry:\n    import readline  # NOQA\nexcept ImportError:\n    pass\n\ntry:\n    import tzlocal\n\n    if hasattr(tzlocal.get_localzone(), \"zone\"):\n        _DEFAULT_TIMEZONE = tzlocal.get_localzone().zone\n    else:\n        _DEFAULT_TIMEZONE = tzlocal.get_localzone_name()\nexcept ModuleNotFoundError:\n    _DEFAULT_TIMEZONE = \"Europe/Rome\"\n\nfrom pelican import __version__\n\nlocale.setlocale(locale.LC_ALL, \"\")\ntry:\n    _DEFAULT_LANGUAGE = locale.getlocale()[0]\nexcept ValueError:\n    # Don't fail on macosx: \"unknown locale: UTF-8\"\n    _DEFAULT_LANGUAGE = None\nif _DEFAULT_LANGUAGE is None:\n    _DEFAULT_LANGUAGE = \"en\"\nelse:\n    _DEFAULT_LANGUAGE = _DEFAULT_LANGUAGE.split(\"_\")[0]\n\n_TEMPLATES_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), \"templates\")\n_jinja_env = Environment(\n    loader=FileSystemLoader(_TEMPLATES_DIR),\n    trim_blocks=True,\n    keep_trailing_newline=True,\n)\n\n\n_GITHUB_PAGES_BRANCHES = {\"personal\": \"main\", \"project\": \"gh-pages\"}\n\nCONF = {\n    \"pelican\": \"pelican\",\n    \"pelicanopts\": \"\",\n    \"basedir\": os.curdir,\n    \"ftp_host\": \"localhost\",\n    \"ftp_user\": \"anonymous\",\n    \"ftp_target_dir\": \"/\",\n    \"ssh_host\": \"localhost\",\n    \"ssh_port\": 22,\n    \"ssh_user\": \"root\",\n    \"ssh_target_dir\": \"/var/www\",\n    \"s3_bucket\": \"my_s3_bucket\",\n    \"cloudfiles_username\": \"my_rackspace_username\",\n    \"cloudfiles_api_key\": \"my_rackspace_api_key\",\n    \"cloudfiles_container\": \"my_cloudfiles_container\",\n    \"dropbox_dir\": \"~/Dropbox/Public/\",\n    \"github_pages_branch\": _GITHUB_PAGES_BRANCHES[\"project\"],\n    \"default_pagination\": 10,\n    \"siteurl\": \"\",\n    \"lang\": _DEFAULT_LANGUAGE,\n    \"timezone\": _DEFAULT_TIMEZONE,\n}\n\n# url for list of valid timezones\n_TZ_URL = \"https://en.wikipedia.org/wiki/List_of_tz_database_time_zones\"\n\n\n# Create a 'marked' default path, to determine if someone has supplied\n# a path on the command-line.\nclass _DEFAULT_PATH_TYPE(str):  # noqa: SLOT000\n    is_default_path = True\n\n\n_DEFAULT_PATH = _DEFAULT_PATH_TYPE(os.curdir)\n\n\ndef ask(question, answer=str, default=None, length=None):\n    if answer is str:\n        r = \"\"\n        while True:\n            if default:\n                r = input(f\"> {question} [{default}] \")\n            else:\n                r = input(f\"> {question} \")\n\n            r = r.strip()\n\n            if len(r) <= 0:\n                if default:\n                    r = default\n                    break\n                else:\n                    print(\"You must enter something\")\n            elif length and len(r) != length:\n                print(f\"Entry must be {length} characters long\")\n            else:\n                break\n\n        return r\n\n    elif answer is bool:\n        r = None\n        while True:\n            if default is True:\n                r = input(f\"> {question} (Y/n) \")\n            elif default is False:\n                r = input(f\"> {question} (y/N) \")\n            else:\n                r = input(f\"> {question} (y/n) \")\n\n            r = r.strip().lower()\n\n            if r in (\"y\", \"yes\"):\n                r = True\n                break\n            elif r in (\"n\", \"no\"):\n                r = False\n                break\n            elif not r:\n                r = default\n                break\n            else:\n                print(\"You must answer 'yes' or 'no'\")\n        return r\n    elif answer is int:\n        r = None\n        while True:\n            if default:\n                r = input(f\"> {question} [{default}] \")\n            else:\n                r = input(f\"> {question} \")\n\n            r = r.strip()\n\n            if not r:\n                r = default\n                break\n\n            try:\n                r = int(r)\n                break\n            except ValueError:\n                print(\"You must enter an integer\")\n        return r\n    else:\n        raise NotImplementedError(\"Argument `answer` must be str, bool, or integer\")\n\n\ndef ask_timezone(question, default, tzurl):\n    \"\"\"Prompt for time zone and validate input\"\"\"\n    tz_dict = {tz.lower(): tz for tz in zoneinfo.available_timezones()}\n    while True:\n        r = ask(question, str, default)\n        r = r.strip().replace(\" \", \"_\").lower()\n        if r in tz_dict.keys():\n            r = tz_dict[r]\n            break\n        else:\n            print(f\"Please enter a valid time zone:\\n (check [{tzurl}])\")\n    return r\n\n\ndef render_jinja_template(tmpl_name: str, tmpl_vars: Mapping, target_path: str):\n    try:\n        with open(\n            os.path.join(CONF[\"basedir\"], target_path), \"w\", encoding=\"utf-8\"\n        ) as fd:\n            _template = _jinja_env.get_template(tmpl_name)\n            fd.write(_template.render(**tmpl_vars))\n    except OSError as e:\n        print(f\"Error: {e}\")\n\n\ndef main():\n    parser = argparse.ArgumentParser(\n        description=\"A kickstarter for Pelican\",\n        formatter_class=argparse.ArgumentDefaultsHelpFormatter,\n    )\n    parser.add_argument(\n        \"-p\", \"--path\", default=_DEFAULT_PATH, help=\"The path to generate the blog into\"\n    )\n    parser.add_argument(\n        \"-t\", \"--title\", metavar=\"title\", help=\"Set the title of the website\"\n    )\n    parser.add_argument(\n        \"-a\", \"--author\", metavar=\"author\", help=\"Set the author name of the website\"\n    )\n    parser.add_argument(\n        \"-l\", \"--lang\", metavar=\"lang\", help=\"Set the default web site language\"\n    )\n\n    args = parser.parse_args()\n\n    print(\n        f\"\"\"Welcome to pelican-quickstart v{__version__}.\n\nThis script will help you create a new Pelican-based website.\n\nPlease answer the following questions so this script can generate the files\nneeded by Pelican.\n\n    \"\"\"\n    )\n\n    project = os.path.join(os.environ.get(\"VIRTUAL_ENV\", os.curdir), \".project\")\n    no_path_was_specified = hasattr(args.path, \"is_default_path\")\n    if os.path.isfile(project) and no_path_was_specified:\n        CONF[\"basedir\"] = open(project).read().rstrip(\"\\n\")\n        print(\n            \"Using project associated with current virtual environment. \"\n            \"Will save to:\\n{}\\n\".format(CONF[\"basedir\"])\n        )\n    else:\n        CONF[\"basedir\"] = os.path.abspath(\n            os.path.expanduser(\n                ask(\n                    \"Where do you want to create your new web site?\",\n                    answer=str,\n                    default=args.path,\n                )\n            )\n        )\n\n    CONF[\"sitename\"] = ask(\n        \"What will be the title of this web site?\", answer=str, default=args.title\n    )\n    CONF[\"author\"] = ask(\n        \"Who will be the author of this web site?\", answer=str, default=args.author\n    )\n    CONF[\"lang\"] = ask(\n        \"What will be the default language of this web site?\",\n        str,\n        args.lang or CONF[\"lang\"],\n        2,\n    )\n\n    if ask(\n        \"Do you want to specify a URL prefix? e.g., https://example.com  \",\n        answer=bool,\n        default=True,\n    ):\n        CONF[\"siteurl\"] = ask(\n            \"What is your URL prefix? (see above example; no trailing slash)\",\n            str,\n            CONF[\"siteurl\"],\n        )\n\n    CONF[\"with_pagination\"] = ask(\n        \"Do you want to enable article pagination?\",\n        bool,\n        bool(CONF[\"default_pagination\"]),\n    )\n\n    if CONF[\"with_pagination\"]:\n        CONF[\"default_pagination\"] = ask(\n            \"How many articles per page do you want?\",\n            int,\n            CONF[\"default_pagination\"],\n        )\n    else:\n        CONF[\"default_pagination\"] = False\n\n    CONF[\"timezone\"] = ask_timezone(\n        \"What is your time zone?\", CONF[\"timezone\"], _TZ_URL\n    )\n\n    automation = ask(\n        \"Do you want to generate a tasks.py/Makefile \"\n        \"to automate generation and publishing?\",\n        bool,\n        True,\n    )\n\n    if automation:\n        if ask(\n            \"Do you want to upload your website using FTP?\", answer=bool, default=False\n        ):\n            CONF[\"ftp\"] = (True,)\n            CONF[\"ftp_host\"] = ask(\n                \"What is the hostname of your FTP server?\", str, CONF[\"ftp_host\"]\n            )\n            CONF[\"ftp_user\"] = ask(\n                \"What is your username on that server?\", str, CONF[\"ftp_user\"]\n            )\n            CONF[\"ftp_target_dir\"] = ask(\n                \"Where do you want to put your web site on that server?\",\n                str,\n                CONF[\"ftp_target_dir\"],\n            )\n        if ask(\n            \"Do you want to upload your website using SSH?\", answer=bool, default=False\n        ):\n            CONF[\"ssh\"] = (True,)\n            CONF[\"ssh_host\"] = ask(\n                \"What is the hostname of your SSH server?\", str, CONF[\"ssh_host\"]\n            )\n            CONF[\"ssh_port\"] = ask(\n                \"What is the port of your SSH server?\", int, CONF[\"ssh_port\"]\n            )\n            CONF[\"ssh_user\"] = ask(\n                \"What is your username on that server?\", str, CONF[\"ssh_user\"]\n            )\n            CONF[\"ssh_target_dir\"] = ask(\n                \"Where do you want to put your web site on that server?\",\n                str,\n                CONF[\"ssh_target_dir\"],\n            )\n\n        if ask(\n            \"Do you want to upload your website using Dropbox?\",\n            answer=bool,\n            default=False,\n        ):\n            CONF[\"dropbox\"] = (True,)\n            CONF[\"dropbox_dir\"] = ask(\n                \"Where is your Dropbox directory?\", str, CONF[\"dropbox_dir\"]\n            )\n\n        if ask(\n            \"Do you want to upload your website using S3?\", answer=bool, default=False\n        ):\n            CONF[\"s3\"] = (True,)\n            CONF[\"s3_bucket\"] = ask(\n                \"What is the name of your S3 bucket?\", str, CONF[\"s3_bucket\"]\n            )\n\n        if ask(\n            \"Do you want to upload your website using Rackspace Cloud Files?\",\n            answer=bool,\n            default=False,\n        ):\n            CONF[\"cloudfiles\"] = (True,)\n            CONF[\"cloudfiles_username\"] = ask(\n                \"What is your Rackspace Cloud username?\",\n                str,\n                CONF[\"cloudfiles_username\"],\n            )\n            CONF[\"cloudfiles_api_key\"] = ask(\n                \"What is your Rackspace Cloud API key?\",\n                str,\n                CONF[\"cloudfiles_api_key\"],\n            )\n            CONF[\"cloudfiles_container\"] = ask(\n                \"What is the name of your Cloud Files container?\",\n                str,\n                CONF[\"cloudfiles_container\"],\n            )\n\n        if ask(\n            \"Do you want to upload your website using GitHub Pages?\",\n            answer=bool,\n            default=False,\n        ):\n            CONF[\"github\"] = (True,)\n            if ask(\n                \"Is this your personal page (username.github.io)?\",\n                answer=bool,\n                default=False,\n            ):\n                CONF[\"github_pages_branch\"] = _GITHUB_PAGES_BRANCHES[\"personal\"]\n            else:\n                CONF[\"github_pages_branch\"] = _GITHUB_PAGES_BRANCHES[\"project\"]\n\n    try:\n        os.makedirs(os.path.join(CONF[\"basedir\"], \"content\"))\n    except OSError as e:\n        print(f\"Error: {e}\")\n\n    try:\n        os.makedirs(os.path.join(CONF[\"basedir\"], \"output\"))\n    except OSError as e:\n        print(f\"Error: {e}\")\n\n    conf_python = {}\n    for key, value in CONF.items():\n        conf_python[key] = repr(value)\n    render_jinja_template(\"pelicanconf.py.jinja2\", conf_python, \"pelicanconf.py\")\n\n    render_jinja_template(\"publishconf.py.jinja2\", CONF, \"publishconf.py\")\n\n    if automation:\n        render_jinja_template(\"tasks.py.jinja2\", CONF, \"tasks.py\")\n        render_jinja_template(\"Makefile.jinja2\", CONF, \"Makefile\")\n\n    print(\"Done. Your new project is available at {}\".format(CONF[\"basedir\"]))\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "pelican/tools/pelican_themes.py",
    "content": "#!/usr/bin/env python\n\nimport argparse\nimport os\nimport shutil\nimport sys\n\n\ndef err(msg, die=None):\n    \"\"\"Print an error message and exits if an exit code is given\"\"\"\n    sys.stderr.write(msg + \"\\n\")\n    if die:\n        sys.exit(die if isinstance(die, int) else 1)\n\n\ntry:\n    import pelican\nexcept ImportError:\n    err(\n        \"Cannot import pelican.\\nYou must install Pelican in order to run this script.\",\n        -1,\n    )\n\n\n_THEMES_PATH = os.path.join(\n    os.path.dirname(os.path.abspath(pelican.__file__)), \"themes\"\n)\n\n__version__ = \"0.2\"\n_BUILTIN_THEMES = [\"simple\", \"notmyidea\"]\n\n\ndef main():\n    \"\"\"Main function\"\"\"\n\n    parser = argparse.ArgumentParser(description=\"\"\"Install themes for Pelican\"\"\")\n\n    excl = parser.add_mutually_exclusive_group()\n    excl.add_argument(\n        \"-l\",\n        \"--list\",\n        dest=\"action\",\n        action=\"store_const\",\n        const=\"list\",\n        help=\"Show the themes already installed and exit\",\n    )\n    excl.add_argument(\n        \"-p\",\n        \"--path\",\n        dest=\"action\",\n        action=\"store_const\",\n        const=\"path\",\n        help=\"Show the themes path and exit\",\n    )\n    excl.add_argument(\n        \"-V\",\n        \"--version\",\n        action=\"version\",\n        version=f\"pelican-themes v{__version__}\",\n        help=\"Print the version of this script\",\n    )\n\n    parser.add_argument(\n        \"-i\",\n        \"--install\",\n        dest=\"to_install\",\n        nargs=\"+\",\n        metavar=\"theme path\",\n        help=\"The themes to install\",\n    )\n    parser.add_argument(\n        \"-r\",\n        \"--remove\",\n        dest=\"to_remove\",\n        nargs=\"+\",\n        metavar=\"theme name\",\n        help=\"The themes to remove\",\n    )\n    parser.add_argument(\n        \"-U\",\n        \"--upgrade\",\n        dest=\"to_upgrade\",\n        nargs=\"+\",\n        metavar=\"theme path\",\n        help=\"The themes to upgrade\",\n    )\n    parser.add_argument(\n        \"-s\",\n        \"--symlink\",\n        dest=\"to_symlink\",\n        nargs=\"+\",\n        metavar=\"theme path\",\n        help=\"Same as `--install', but create a symbolic link instead of \"\n        \"copying the theme. Useful for theme development\",\n    )\n    parser.add_argument(\n        \"-c\",\n        \"--clean\",\n        dest=\"clean\",\n        action=\"store_true\",\n        help=\"Remove the broken symbolic links of the theme path\",\n    )\n\n    parser.add_argument(\n        \"-v\", \"--verbose\", dest=\"verbose\", action=\"store_true\", help=\"Verbose output\"\n    )\n\n    args = parser.parse_args()\n\n    to_install = args.to_install or args.to_upgrade\n    to_sym = args.to_symlink or args.clean\n\n    if args.action:\n        if args.action == \"list\":\n            list_themes(args.verbose)\n        elif args.action == \"path\":\n            print(_THEMES_PATH)\n    elif to_install or args.to_remove or to_sym:\n        if args.to_remove:\n            if args.verbose:\n                print(\"Removing themes...\")\n\n            for i in args.to_remove:\n                remove(i, v=args.verbose)\n\n        if args.to_install:\n            if args.verbose:\n                print(\"Installing themes...\")\n\n            for i in args.to_install:\n                install(i, v=args.verbose)\n\n        if args.to_upgrade:\n            if args.verbose:\n                print(\"Upgrading themes...\")\n\n            for i in args.to_upgrade:\n                install(i, v=args.verbose, u=True)\n\n        if args.to_symlink:\n            if args.verbose:\n                print(\"Linking themes...\")\n\n            for i in args.to_symlink:\n                symlink(i, v=args.verbose)\n\n        if args.clean:\n            if args.verbose:\n                print(\"Cleaning the themes directory...\")\n\n            clean(v=args.verbose)\n    else:\n        print(\"No argument given... exiting.\")\n\n\ndef themes():\n    \"\"\"Returns the list of the themes\"\"\"\n    for i in os.listdir(_THEMES_PATH):\n        e = os.path.join(_THEMES_PATH, i)\n\n        if os.path.isdir(e):\n            if os.path.islink(e):\n                yield (e, os.readlink(e))\n            else:\n                yield (e, None)\n\n\ndef list_themes(v=False):\n    \"\"\"Display the list of the themes\"\"\"\n    for theme_path, link_target in themes():\n        if not v:\n            theme_path = os.path.basename(theme_path)\n        if link_target:\n            if v:\n                print(theme_path + (\" (symbolic link to `\" + link_target + \"')\"))\n            else:\n                print(theme_path + \"@\")\n        else:\n            print(theme_path)\n\n\ndef remove(theme_name, v=False):\n    \"\"\"Removes a theme\"\"\"\n\n    theme_name = theme_name.replace(\"/\", \"\")\n    target = os.path.join(_THEMES_PATH, theme_name)\n\n    if theme_name in _BUILTIN_THEMES:\n        err(\n            theme_name + \" is a builtin theme.\\n\"\n            \"You cannot remove a builtin theme with this script, \"\n            \"remove it by hand if you want.\"\n        )\n    elif os.path.islink(target):\n        if v:\n            print(\"Removing link `\" + target + \"'\")\n        os.remove(target)\n    elif os.path.isdir(target):\n        if v:\n            print(\"Removing directory `\" + target + \"'\")\n        shutil.rmtree(target)\n    elif os.path.exists(target):\n        err(target + \" : not a valid theme\")\n    else:\n        err(target + \" : no such file or directory\")\n\n\ndef install(path, v=False, u=False):\n    \"\"\"Installs a theme\"\"\"\n    if not os.path.exists(path):\n        err(path + \" : no such file or directory\")\n    elif not os.path.isdir(path):\n        err(path + \" : not a directory\")\n    else:\n        theme_name = os.path.basename(os.path.normpath(path))\n        theme_path = os.path.join(_THEMES_PATH, theme_name)\n        exists = os.path.exists(theme_path)\n        if exists and not u:\n            err(path + \" : already exists\")\n        elif exists:\n            remove(theme_name, v)\n            install(path, v)\n        else:\n            if v:\n                print(f\"Copying '{path}' to '{theme_path}' ...\")\n            try:\n                shutil.copytree(path, theme_path)\n\n                try:\n                    if os.name == \"posix\":\n                        for root, dirs, files in os.walk(theme_path):\n                            for d in dirs:\n                                dname = os.path.join(root, d)\n                                os.chmod(dname, 493)  # 0o755\n                            for f in files:\n                                fname = os.path.join(root, f)\n                                os.chmod(fname, 420)  # 0o644\n                except OSError as e:\n                    err(\n                        \"Cannot change permissions of files \"\n                        f\"or directory in `{theme_path}':\\n{e!s}\",\n                        die=False,\n                    )\n            except OSError as e:\n                err(f\"Cannot copy `{path}' to `{theme_path}':\\n{e!s}\")\n\n\ndef symlink(path, v=False):\n    \"\"\"Symbolically link a theme\"\"\"\n    path = os.path.realpath(path)\n    if not os.path.exists(path):\n        err(path + \" : no such file or directory\")\n    elif not os.path.isdir(path):\n        err(path + \" : not a directory\")\n    else:\n        theme_name = os.path.basename(os.path.normpath(path))\n        theme_path = os.path.join(_THEMES_PATH, theme_name)\n        if os.path.exists(theme_path):\n            err(path + \" : already exists\")\n        else:\n            if v:\n                print(f\"Linking `{path}' to `{theme_path}' ...\")\n            try:\n                os.symlink(path, theme_path)\n            except OSError as e:\n                err(f\"Cannot link `{path}' to `{theme_path}':\\n{e!s}\")\n\n\ndef is_broken_link(path):\n    \"\"\"Returns True if the path given as is a broken symlink\"\"\"\n    path = os.path.realpath(path)\n    return not os.path.exists(path)\n\n\ndef clean(v=False):\n    \"\"\"Removes the broken symbolic links\"\"\"\n    c = 0\n    for path in os.listdir(_THEMES_PATH):\n        path = os.path.join(_THEMES_PATH, path)\n        if os.path.islink(path) and is_broken_link(path):\n            if v:\n                print(f\"Removing {path}\")\n            try:\n                os.remove(path)\n            except OSError:\n                print(f\"Error: cannot remove {path}\")\n            else:\n                c += 1\n\n    print(f\"\\nRemoved {c} broken links\")\n"
  },
  {
    "path": "pelican/tools/templates/Makefile.jinja2",
    "content": "PY?={{py_v}}\nPELICAN?={{pelican}}\nPELICANOPTS={{pelicanopts}}\n\nBASEDIR=$(CURDIR)\nINPUTDIR=$(BASEDIR)/content\nOUTPUTDIR=$(BASEDIR)/output\nCONFFILE=$(BASEDIR)/pelicanconf.py\nPUBLISHCONF=$(BASEDIR)/publishconf.py\n\n{% if ftp %}\nFTP_HOST={{ftp_host}}\nFTP_USER={{ftp_user}}\nFTP_TARGET_DIR={{ftp_target_dir}}\n\n{% endif %}\n{% if ssh %}\nSSH_HOST={{ssh_host}}\nSSH_PORT={{ssh_port}}\nSSH_USER={{ssh_user}}\nSSH_TARGET_DIR={{ssh_target_dir}}\n\n{% endif %}\n{% if s3 %}\nS3_BUCKET={{s3_bucket}}\n\n{% endif %}\n{% if cloudfiles %}\nCLOUDFILES_USERNAME={{cloudfiles_username}}\nCLOUDFILES_API_KEY={{cloudfiles_api_key}}\nCLOUDFILES_CONTAINER={{cloudfiles_container}}\n\n{% endif %}\n{% if dropbox %}\nDROPBOX_DIR={{dropbox_dir}}\n\n{% endif %}\n{% if github %}\nGITHUB_PAGES_BRANCH={{github_pages_branch}}\nGITHUB_PAGES_COMMIT_MESSAGE=Generate Pelican site\n\n{% endif %}\n\nDEBUG ?= 0\nifeq ($(DEBUG), 1)\n\tPELICANOPTS += -D\nendif\n\nRELATIVE ?= 0\nifeq ($(RELATIVE), 1)\n\tPELICANOPTS += --relative-urls\nendif\n\nSERVER ?= \"0.0.0.0\"\n\nPORT ?= 0\nifneq ($(PORT), 0)\n\tPELICANOPTS += -p $(PORT)\nendif\n\n\nhelp:\n\t@echo 'Makefile for a pelican Web site                                           '\n\t@echo '                                                                          '\n\t@echo 'Usage:                                                                    '\n\t@echo '   make html                           (re)generate the web site          '\n\t@echo '   make clean                          remove the generated files         '\n\t@echo '   make regenerate                     regenerate files upon modification '\n\t@echo '   make publish                        generate using production settings '\n\t@echo '   make serve [PORT=8000]              serve site at http://localhost:8000'\n\t@echo '   make serve-global [SERVER=0.0.0.0]  serve (as root) to $(SERVER):80    '\n\t@echo '   make devserver [PORT=8000]          serve and regenerate together      '\n\t@echo '   make devserver-global               regenerate and serve on 0.0.0.0    '\n{% if ssh %}\n\t@echo '   make ssh_upload                     upload the web site via SSH        '\n\t@echo '   make sftp_upload                    upload the web site via SFTP       '\n\t@echo '   make rsync_upload                   upload the web site via rsync+ssh  '\n{% endif %}\n{% if dropbox %}\n\t@echo '   make dropbox_upload                 upload the web site via Dropbox    '\n{% endif %}\n{% if ftp %}\n\t@echo '   make ftp_upload                     upload the web site via FTP        '\n{% endif %}\n{% if s3 %}\n\t@echo '   make s3_upload                      upload the web site via S3         '\n{% endif %}\n{% if cloudfiles %}\n\t@echo '   make cf_upload                      upload the web site via Cloud Files'\n{% endif %}\n{% if github %}\n\t@echo '   make github                         upload the web site via gh-pages   '\n{% endif %}\n\t@echo '                                                                          '\n\t@echo 'Set the DEBUG variable to 1 to enable debugging, e.g. make DEBUG=1 html   '\n\t@echo 'Set the RELATIVE variable to 1 to enable relative urls                    '\n\t@echo '                                                                          '\n\nhtml:\n\t\"$(PELICAN)\" \"$(INPUTDIR)\" -o \"$(OUTPUTDIR)\" -s \"$(CONFFILE)\" $(PELICANOPTS)\n\nclean:\n\t[ ! -d \"$(OUTPUTDIR)\" ] || rm -rf \"$(OUTPUTDIR)\"\n\nregenerate:\n\t\"$(PELICAN)\" -r \"$(INPUTDIR)\" -o \"$(OUTPUTDIR)\" -s \"$(CONFFILE)\" $(PELICANOPTS)\n\nserve:\n\t\"$(PELICAN)\" -l \"$(INPUTDIR)\" -o \"$(OUTPUTDIR)\" -s \"$(CONFFILE)\" $(PELICANOPTS)\n\nserve-global:\n\t\"$(PELICAN)\" -l \"$(INPUTDIR)\" -o \"$(OUTPUTDIR)\" -s \"$(CONFFILE)\" $(PELICANOPTS) -b $(SERVER)\n\ndevserver:\n\t\"$(PELICAN)\" -lr \"$(INPUTDIR)\" -o \"$(OUTPUTDIR)\" -s \"$(CONFFILE)\" $(PELICANOPTS)\n\ndevserver-global:\n\t\"$(PELICAN)\" -lr \"$(INPUTDIR)\" -o \"$(OUTPUTDIR)\" -s \"$(CONFFILE)\" $(PELICANOPTS) -b 0.0.0.0\n\npublish:\n\t\"$(PELICAN)\" \"$(INPUTDIR)\" -o \"$(OUTPUTDIR)\" -s \"$(PUBLISHCONF)\" $(PELICANOPTS)\n\n{% set upload = [] %}\n{% if ssh %}\n{% set upload = upload + [\"ssh_upload\"] %}\nssh_upload: publish\n\tscp -P $(SSH_PORT) -r \"$(OUTPUTDIR)\"/* \"$(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR)\"\n\n{% set upload = upload + [\"sftp_upload\"] %}\nsftp_upload: publish\n\tprintf 'put -r $(OUTPUTDIR)/*' | sftp $(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR)\n\n{% set upload = upload + [\"rsync_upload\"] %}\nrsync_upload: publish\n\trsync -e \"ssh -p $(SSH_PORT)\" -P -rvzc --include tags --cvs-exclude --delete \"$(OUTPUTDIR)\"/ \"$(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR)\"\n\n{% endif %}\n{% if dropbox %}\n{% set upload = upload + [\"dropbox_upload\"] %}\ndropbox_upload: publish\n\tcp -r \"$(OUTPUTDIR)\"/* \"$(DROPBOX_DIR)\"/\n\n{% endif %}\n{% if ftp %}\n{% set upload = upload + [\"ftp_upload\"] %}\nftp_upload: publish\n\tlftp ftp://$(FTP_USER)@$(FTP_HOST) -e \"mirror -R $(OUTPUTDIR) $(FTP_TARGET_DIR) ; quit\"\n\n{% endif %}\n{% if s3 %}\n{% set upload = upload + [\"s3_upload\"] %}\ns3_upload: publish\n\taws s3 sync \"$(OUTPUTDIR)\"/ s3://$(S3_BUCKET) --acl public-read --delete\n\n{% endif %}\n{% if cloudfiles %}\n{% set upload = upload + [\"cf_upload\"] %}\ncf_upload: publish\n\tcd \"$(OUTPUTDIR)\" && swift -v -A https://auth.api.rackspacecloud.com/v1.0 -U $(CLOUDFILES_USERNAME) -K $(CLOUDFILES_API_KEY) upload -c $(CLOUDFILES_CONTAINER) .\n\n{% endif %}\n{% if github %}\n{% set upload = upload + [\"github\"] %}\ngithub: publish\n\tghp-import -m \"$(GITHUB_PAGES_COMMIT_MESSAGE)\" -b $(GITHUB_PAGES_BRANCH) \"$(OUTPUTDIR)\" --no-jekyll\n\tgit push origin $(GITHUB_PAGES_BRANCH)\n\n{% endif %}\n\n.PHONY: html help clean regenerate serve serve-global devserver devserver-global publish {{ upload|join(\" \") }}\n"
  },
  {
    "path": "pelican/tools/templates/pelicanconf.py.jinja2",
    "content": "AUTHOR = {{author}}\nSITENAME = {{sitename}}\nSITEURL = \"\"\n\nPATH = \"content\"\n\nTIMEZONE = {{timezone}}\n\nDEFAULT_LANG = {{lang}}\n\n# Feed generation is usually not desired when developing\nFEED_ALL_ATOM = None\nCATEGORY_FEED_ATOM = None\nTRANSLATION_FEED_ATOM = None\nAUTHOR_FEED_ATOM = None\nAUTHOR_FEED_RSS = None\n\n# Blogroll\nLINKS = [\n    (\"Pelican\", \"https://getpelican.com/\"),\n    (\"Python.org\", \"https://www.python.org/\"),\n    (\"Jinja2\", \"https://palletsprojects.com/p/jinja/\"),\n    (\"You can modify those links in your config file\", \"#\"),\n]\n\n# Social widget\nSOCIAL = [\n    (\"You can add links in your config file\", \"#\"),\n    (\"Another social link\", \"#\"),\n]\n\nDEFAULT_PAGINATION = {{default_pagination}}\n\n# Uncomment following line if you want document-relative URLs when developing\n# RELATIVE_URLS = True\n"
  },
  {
    "path": "pelican/tools/templates/publishconf.py.jinja2",
    "content": "# This file is only used if you use `make publish` or\n# explicitly specify it as your config file.\n\nimport os\nimport sys\n\nsys.path.append(os.curdir)\nfrom pelicanconf import *\n\n# If your site is available via HTTPS, make sure SITEURL begins with https://\nSITEURL = \"{{siteurl}}\"\nRELATIVE_URLS = False\n\nFEED_ALL_ATOM = \"feeds/all.atom.xml\"\nCATEGORY_FEED_ATOM = \"feeds/{slug}.atom.xml\"\n\nDELETE_OUTPUT_DIRECTORY = True\n\n# Following items are often useful when publishing\n\n# DISQUS_SITENAME = \"\"\n# GOOGLE_ANALYTICS = \"\"\n"
  },
  {
    "path": "pelican/tools/templates/tasks.py.jinja2",
    "content": "import os\nimport shlex\nimport shutil\nimport sys\n{% if github %}\nimport datetime\n{% endif %}\n\nfrom invoke import task\nfrom invoke.main import program\n{% if cloudfiles %}\nfrom invoke.util import cd\n{% endif %}\nfrom pelican import main as pelican_main\nfrom pelican.server import ComplexHTTPRequestHandler, RootedHTTPServer\nfrom pelican.settings import DEFAULT_CONFIG, get_settings_from_file\n\nOPEN_BROWSER_ON_SERVE = True\nSETTINGS_FILE_BASE = \"pelicanconf.py\"\nSETTINGS = {}\nSETTINGS.update(DEFAULT_CONFIG)\nLOCAL_SETTINGS = get_settings_from_file(SETTINGS_FILE_BASE)\nSETTINGS.update(LOCAL_SETTINGS)\n\nCONFIG = {\n    \"settings_base\": SETTINGS_FILE_BASE,\n    \"settings_publish\": \"publishconf.py\",\n    # Output path. Can be absolute or relative to tasks.py. Default: 'output'\n    \"deploy_path\": SETTINGS[\"OUTPUT_PATH\"],\n{% if ssh %}\n    # Remote server configuration\n    \"ssh_user\": \"{{ssh_user}}\",\n    \"ssh_host\": \"{{ssh_host}}\",\n    \"ssh_port\": \"{{ssh_port}}\",\n    \"ssh_path\": \"{{ssh_target_dir}}\",\n{% endif %}\n{% if cloudfiles %}\n    # Rackspace Cloud Files configuration settings\n    \"cloudfiles_username\": \"{{cloudfiles_username}}\",\n    \"cloudfiles_api_key\": \"{{cloudfiles_api_key}}\",\n    \"cloudfiles_container\": \"{{cloudfiles_container}}\",\n{% endif %}\n{% if github %}\n    # Github Pages configuration\n    \"github_pages_branch\": \"{{github_pages_branch}}\",\n    \"commit_message\": f\"'Publish site on {datetime.date.today().isoformat()}'\",\n{% endif %}\n    # Host and port for `serve`\n    \"host\": \"localhost\",\n    \"port\": 8000,\n}\n\n\n@task\ndef clean(c):\n    \"\"\"Remove generated files\"\"\"\n    if os.path.isdir(CONFIG[\"deploy_path\"]):\n        shutil.rmtree(CONFIG[\"deploy_path\"])\n        os.makedirs(CONFIG[\"deploy_path\"])\n\n\n@task\ndef build(c):\n    \"\"\"Build local version of site\"\"\"\n    pelican_run(\"-s {settings_base}\".format(**CONFIG))\n\n\n@task\ndef rebuild(c):\n    \"\"\"`build` with the delete switch\"\"\"\n    pelican_run(\"-d -s {settings_base}\".format(**CONFIG))\n\n\n@task\ndef regenerate(c):\n    \"\"\"Automatically regenerate site upon file modification\"\"\"\n    pelican_run(\"-r -s {settings_base}\".format(**CONFIG))\n\n\n@task\ndef serve(c):\n    \"\"\"Serve site at http://$HOST:$PORT/ (default is localhost:8000)\"\"\"\n\n    class AddressReuseTCPServer(RootedHTTPServer):\n        allow_reuse_address = True\n\n    server = AddressReuseTCPServer(\n        CONFIG[\"deploy_path\"],\n        (CONFIG[\"host\"], CONFIG[\"port\"]),\n        ComplexHTTPRequestHandler,\n    )\n\n    if OPEN_BROWSER_ON_SERVE:\n        # Open site in default browser\n        import webbrowser\n\n        webbrowser.open(\"http://{host}:{port}\".format(**CONFIG))\n\n    sys.stderr.write(\"Serving at {host}:{port} ...\\n\".format(**CONFIG))\n    server.serve_forever()\n\n\n@task\ndef reserve(c):\n    \"\"\"`build`, then `serve`\"\"\"\n    build(c)\n    serve(c)\n\n\n@task\ndef preview(c):\n    \"\"\"Build production version of site\"\"\"\n    pelican_run(\"-s {settings_publish}\".format(**CONFIG))\n\n@task\ndef livereload(c):\n    \"\"\"Automatically reload browser tab upon file modification.\"\"\"\n    from livereload import Server\n\n    def cached_build():\n        cmd = \"-s {settings_base} -e CACHE_CONTENT=true LOAD_CONTENT_CACHE=true\"\n        pelican_run(cmd.format(**CONFIG))\n\n    cached_build()\n    server = Server()\n    theme_path = SETTINGS[\"THEME\"]\n    watched_globs = [\n        CONFIG[\"settings_base\"],\n        f\"{theme_path}/templates/**/*.html\",\n    ]\n\n    content_file_extensions = [\".md\", \".rst\"]\n    for extension in content_file_extensions:\n        content_glob = \"{}/**/*{}\".format(SETTINGS[\"PATH\"], extension)\n        watched_globs.append(content_glob)\n\n    static_file_extensions = [\".css\", \".js\"]\n    for extension in static_file_extensions:\n        static_file_glob = f\"{theme_path}/static/**/*{extension}\"\n        watched_globs.append(static_file_glob)\n\n    for glob in watched_globs:\n        server.watch(glob, cached_build)\n\n    if OPEN_BROWSER_ON_SERVE:\n        # Open site in default browser\n        import webbrowser\n\n        webbrowser.open(\"http://{host}:{port}\".format(**CONFIG))\n\n    server.serve(host=CONFIG[\"host\"], port=CONFIG[\"port\"], root=CONFIG[\"deploy_path\"])\n\n{% if cloudfiles %}\n@task\ndef cf_upload(c):\n    \"\"\"Publish to Rackspace Cloud Files\"\"\"\n    rebuild(c)\n    with cd(CONFIG[\"deploy_path\"]):\n        c.run(\n            \"swift -v -A https://auth.api.rackspacecloud.com/v1.0 \"\n            \"-U {cloudfiles_username} \"\n            \"-K {cloudfiles_api_key} \"\n            \"upload -c {cloudfiles_container} .\".format(**CONFIG)\n        )\n{% endif %}\n\n@task\ndef publish(c):\n    \"\"\"Publish to production via rsync\"\"\"\n    pelican_run(\"-s {settings_publish}\".format(**CONFIG))\n    c.run(\n        'rsync --delete --exclude \".DS_Store\" -pthrvz -c '\n        '-e \"ssh -p {ssh_port}\" '\n        \"{} {ssh_user}@{ssh_host}:{ssh_path}\".format(\n            CONFIG[\"deploy_path\"].rstrip(\"/\") + \"/\", **CONFIG\n        )\n    )\n\n{% if github %}\n@task\ndef gh_pages(c):\n    \"\"\"Publish to GitHub Pages\"\"\"\n    preview(c)\n    c.run(\n        \"ghp-import -b {github_pages_branch} \"\n        \"-m {commit_message} \"\n        \"{deploy_path} -p\".format(**CONFIG)\n    )\n{% endif %}\n\ndef pelican_run(cmd):\n    cmd += \" \" + program.core.remainder  # allows to pass-through args to pelican\n    pelican_main(shlex.split(cmd))\n"
  },
  {
    "path": "pelican/urlwrappers.py",
    "content": "import functools\nimport logging\nimport os\nimport pathlib\n\nfrom pelican.utils import slugify\n\nlogger = logging.getLogger(__name__)\n\n\n@functools.total_ordering\nclass URLWrapper:\n    def __init__(self, name, settings):\n        self.settings = settings\n        self._name = name\n        self._slug = None\n        self._slug_from_name = True\n\n    @property\n    def name(self):\n        return self._name\n\n    @name.setter\n    def name(self, name):\n        self._name = name\n        # if slug wasn't explicitly set, it needs to be regenerated from name\n        # so, changing name should reset slug for slugification\n        if self._slug_from_name:\n            self._slug = None\n\n    @property\n    def slug(self):\n        if self._slug is None:\n            class_key = f\"{self.__class__.__name__.upper()}_REGEX_SUBSTITUTIONS\"\n            regex_subs = self.settings.get(\n                class_key, self.settings.get(\"SLUG_REGEX_SUBSTITUTIONS\", [])\n            )\n            preserve_case = self.settings.get(\"SLUGIFY_PRESERVE_CASE\", False)\n            self._slug = slugify(\n                self.name,\n                regex_subs=regex_subs,\n                preserve_case=preserve_case,\n                use_unicode=self.settings.get(\"SLUGIFY_USE_UNICODE\", False),\n            )\n        return self._slug\n\n    @slug.setter\n    def slug(self, slug):\n        # if slug is expliticly set, changing name won't alter slug\n        self._slug_from_name = False\n        self._slug = slug\n\n    def as_dict(self):\n        d = self.__dict__\n        d[\"name\"] = self.name\n        d[\"slug\"] = self.slug\n        return d\n\n    def __hash__(self):\n        return hash(self.slug)\n\n    def _normalize_key(self, key):\n        class_key = f\"{self.__class__.__name__.upper()}_REGEX_SUBSTITUTIONS\"\n        regex_subs = self.settings.get(\n            class_key, self.settings.get(\"SLUG_REGEX_SUBSTITUTIONS\", [])\n        )\n        use_unicode = self.settings.get(\"SLUGIFY_USE_UNICODE\", False)\n        preserve_case = self.settings.get(\"SLUGIFY_PRESERVE_CASE\", False)\n        return slugify(\n            key,\n            regex_subs=regex_subs,\n            preserve_case=preserve_case,\n            use_unicode=use_unicode,\n        )\n\n    def __eq__(self, other):\n        if isinstance(other, self.__class__):\n            return self.slug == other.slug\n        if isinstance(other, str):\n            return self.slug == self._normalize_key(other)\n        return False\n\n    def __ne__(self, other):\n        if isinstance(other, self.__class__):\n            return self.slug != other.slug\n        if isinstance(other, str):\n            return self.slug != self._normalize_key(other)\n        return True\n\n    def __lt__(self, other):\n        if isinstance(other, self.__class__):\n            return self.slug < other.slug\n        if isinstance(other, str):\n            return self.slug < self._normalize_key(other)\n        return False\n\n    def __str__(self):\n        return self.name\n\n    def __repr__(self):\n        return f\"<{type(self).__name__} {self._name!r}>\"\n\n    def _from_settings(self, key, get_page_name=False):\n        \"\"\"Returns URL information as defined in settings.\n\n        When get_page_name=True returns URL without anything after {slug} e.g.\n        if in settings: CATEGORY_URL=\"cat/{slug}.html\" this returns\n        \"cat/{slug}\" Useful for pagination.\n\n        \"\"\"\n        setting = f\"{self.__class__.__name__.upper()}_{key}\"\n        value = self.settings[setting]\n        if isinstance(value, pathlib.Path):\n            value = str(value)\n        if not isinstance(value, str):\n            logger.warning(\"%s is set to %s\", setting, value)\n            return value\n        elif get_page_name:\n            return os.path.splitext(value)[0].format(**self.as_dict())\n        else:\n            return value.format(**self.as_dict())\n\n    page_name = property(\n        functools.partial(_from_settings, key=\"URL\", get_page_name=True)\n    )\n    url = property(functools.partial(_from_settings, key=\"URL\"))\n    save_as = property(functools.partial(_from_settings, key=\"SAVE_AS\"))\n\n\nclass Category(URLWrapper):\n    pass\n\n\nclass Tag(URLWrapper):\n    def __init__(self, name, *args, **kwargs):\n        super().__init__(name.strip(), *args, **kwargs)\n\n\nclass Author(URLWrapper):\n    pass\n"
  },
  {
    "path": "pelican/utils.py",
    "content": "from __future__ import annotations\n\nimport datetime\nimport fnmatch\nimport locale\nimport logging\nimport os\nimport pathlib\nimport re\nimport shutil\nimport traceback\nimport unicodedata\nimport urllib\nfrom collections.abc import (\n    Callable,\n    Collection,\n    Generator,\n    Hashable,\n    Iterable,\n    Sequence,\n)\nfrom contextlib import contextmanager\nfrom functools import partial\nfrom html import entities\nfrom html.parser import HTMLParser\nfrom itertools import groupby\nfrom operator import attrgetter\nfrom typing import (\n    TYPE_CHECKING,\n    Any,\n)\n\nimport dateutil.parser\nimport unidecode\nfrom watchfiles import Change\n\ntry:\n    from zoneinfo import ZoneInfo\nexcept ModuleNotFoundError:\n    from backports.zoneinfo import ZoneInfo\nimport watchfiles\nfrom markupsafe import Markup\n\nif TYPE_CHECKING:\n    from pelican.contents import Content\n    from pelican.settings import Settings\n\nlogger = logging.getLogger(__name__)\n\n\ndef sanitised_join(base_directory: str, *parts: str) -> str:\n    joined = posixize_path(os.path.abspath(os.path.join(base_directory, *parts)))\n    base = posixize_path(os.path.abspath(base_directory))\n    if not joined.startswith(base):\n        raise RuntimeError(f\"Attempted to break out of output directory to {joined}\")\n\n    return joined\n\n\ndef strftime(date: datetime.datetime, date_format: str) -> str:\n    \"\"\"\n    Enhanced replacement for built-in strftime with zero stripping\n\n    This works by 'grabbing' possible format strings (those starting with %),\n    formatting them with the date, stripping any leading zeros if - prefix is\n    used and replacing formatted output back.\n    \"\"\"\n\n    def strip_zeros(x):\n        return x.lstrip(\"0\") or \"0\"\n\n    # includes ISO date parameters added by Python 3.6\n    c89_directives = \"aAbBcdfGHIjmMpSUuVwWxXyYzZ%\"\n\n    # grab candidate format options\n    format_options = \"%[-]?.\"\n    candidates = re.findall(format_options, date_format)\n\n    # replace candidates with placeholders for later % formatting\n    template = re.sub(format_options, \"%s\", date_format)\n\n    formatted_candidates = []\n    for candidate in candidates:\n        # test for valid C89 directives only\n        if candidate[-1] in c89_directives:\n            # check for '-' prefix\n            if len(candidate) == 3:  # noqa: PLR2004\n                # '-' prefix\n                candidate = f\"%{candidate[-1]}\"\n                conversion = strip_zeros\n            else:\n                conversion = None\n\n            # format date\n            if isinstance(date, SafeDatetime):\n                formatted = date.strftime(candidate, safe=False)\n            else:\n                formatted = date.strftime(candidate)\n\n            # strip zeros if '-' prefix is used\n            if conversion:\n                formatted = conversion(formatted)\n        else:\n            formatted = candidate\n        formatted_candidates.append(formatted)\n\n    # put formatted candidates back and return\n    return template % tuple(formatted_candidates)\n\n\nclass SafeDatetime(datetime.datetime):\n    \"\"\"Subclass of datetime that works with utf-8 format strings on PY2\"\"\"\n\n    def strftime(self, fmt, safe=True):\n        \"\"\"Uses our custom strftime if supposed to be *safe*\"\"\"\n        if safe:\n            return strftime(self, fmt)\n        else:\n            return super().strftime(fmt)\n\n\nclass DateFormatter:\n    \"\"\"A date formatter object used as a jinja filter\n\n    Uses the `strftime` implementation and makes sure jinja uses the locale\n    defined in LOCALE setting\n    \"\"\"\n\n    def __init__(self) -> None:\n        self.locale = locale.setlocale(locale.LC_TIME)\n        # python has issue with Turkish_Türkiye.1254 locale, replace it to\n        # something accepted: Turkish\n        if self.locale == \"Turkish_Türkiye.1254\":\n            self.locale = \"Turkish\"\n\n    def __call__(self, date: datetime.datetime, date_format: str) -> str:\n        # on OSX, encoding from LC_CTYPE determines the unicode output in PY3\n        # make sure it's same as LC_TIME\n        with (\n            temporary_locale(self.locale, locale.LC_TIME),\n            temporary_locale(self.locale, locale.LC_CTYPE),\n        ):\n            formatted = strftime(date, date_format)\n\n        return formatted\n\n\nclass memoized:\n    \"\"\"Function decorator to cache return values.\n\n    If called later with the same arguments, the cached value is returned\n    (not reevaluated).\n\n    \"\"\"\n\n    def __init__(self, func: Callable) -> None:\n        self.func = func\n        self.cache: dict[Any, Any] = {}\n\n    def __call__(self, *args) -> Any:\n        if not isinstance(args, Hashable):\n            # uncacheable. a list, for instance.\n            # better to not cache than blow up.\n            return self.func(*args)\n        if args in self.cache:\n            return self.cache[args]\n        else:\n            value = self.func(*args)\n            self.cache[args] = value\n            return value\n\n    def __repr__(self) -> str | None:\n        return self.func.__doc__\n\n    def __get__(self, obj: Any, objtype):\n        \"\"\"Support instance methods.\"\"\"\n        fn = partial(self.__call__, obj)\n        fn.cache = self.cache\n        return fn\n\n\ndef deprecated_attribute(\n    old: str,\n    new: str,\n    since: tuple[int, ...],\n    remove: tuple[int, ...] | None = None,\n    doc: str | None = None,\n):\n    \"\"\"Attribute deprecation decorator for gentle upgrades\n\n    For example:\n\n        class MyClass (object):\n            @deprecated_attribute(\n                old='abc', new='xyz', since=(3, 2, 0), remove=(4, 1, 3))\n            def abc(): return None\n\n            def __init__(self):\n                xyz = 5\n\n    Note that the decorator needs a dummy method to attach to, but the\n    content of the dummy method is ignored.\n    \"\"\"\n\n    def _warn():\n        version = \".\".join(str(x) for x in since)\n        message = [f\"{old} has been deprecated since {version}\"]\n        if remove:\n            version = \".\".join(str(x) for x in remove)\n            message.append(f\" and will be removed by version {version}\")\n        message.append(f\".  Use {new} instead.\")\n        logger.warning(\"\".join(message))\n        logger.debug(\"\".join(str(x) for x in traceback.format_stack()))\n\n    def fget(self):\n        _warn()\n        return getattr(self, new)\n\n    def fset(self, value):\n        _warn()\n        setattr(self, new, value)\n\n    def decorator(_dummy):\n        return property(fget=fget, fset=fset, doc=doc)\n\n    return decorator\n\n\ndef get_date(string: str) -> datetime.datetime:\n    \"\"\"Return a datetime object from a string.\n\n    If no format matches the given date, raise a ValueError.\n    \"\"\"\n    string = re.sub(\" +\", \" \", string)\n    default = SafeDatetime.now().replace(hour=0, minute=0, second=0, microsecond=0)\n    try:\n        return dateutil.parser.parse(string, default=default)\n    except (TypeError, ValueError):\n        raise ValueError(f\"{string!r} is not a valid date\") from None\n\n\n@contextmanager\ndef pelican_open(filename: str, mode: str = \"r\") -> Generator[str]:\n    \"\"\"Open a file and return its content\"\"\"\n\n    # utf-8-sig will clear any BOM if present\n    with open(filename, mode, encoding=\"utf-8-sig\") as infile:\n        content = infile.read()\n    yield content\n\n\ndef slugify(\n    value: str,\n    regex_subs: Iterable[tuple[str, str]] = (),\n    preserve_case: bool = False,\n    use_unicode: bool = False,\n) -> str:\n    \"\"\"\n    Normalizes string, converts to lowercase, removes non-alpha characters,\n    and converts spaces to hyphens.\n\n    Took from Django sources.\n\n    For a set of sensible default regex substitutions to pass to regex_subs\n    look into pelican.settings.DEFAULT_CONFIG['SLUG_REGEX_SUBSTITUTIONS'].\n    \"\"\"\n\n    def normalize_unicode(text: str) -> str:\n        # normalize text by compatibility composition\n        # see: https://en.wikipedia.org/wiki/Unicode_equivalence\n        return unicodedata.normalize(\"NFKC\", text)\n\n    # strip tags from value\n    value = Markup(value).striptags()\n\n    # normalization\n    value = normalize_unicode(value)\n\n    if not use_unicode:\n        # ASCII-fy\n        value = unidecode.unidecode(value)\n\n    # perform regex substitutions\n    for src, dst in regex_subs:\n        value = re.sub(\n            normalize_unicode(src), normalize_unicode(dst), value, flags=re.IGNORECASE\n        )\n\n    if not preserve_case:\n        value = value.lower()\n\n    return value.strip()\n\n\ndef copy(source: str, destination: str, ignores: Iterable[str] | None = None) -> None:\n    \"\"\"Recursively copy source into destination.\n\n    If source is a file, destination has to be a file as well.\n    The function is able to copy either files or directories.\n\n    :param source: the source file or directory\n    :param destination: the destination file or directory\n    :param ignores: either None, or a list of glob patterns;\n        files matching those patterns will _not_ be copied.\n    \"\"\"\n\n    def walk_error(err):\n        logger.warning(\"While copying %s: %s: %s\", source_, err.filename, err.strerror)\n\n    source_ = os.path.abspath(os.path.expanduser(source))\n    destination_ = os.path.abspath(os.path.expanduser(destination))\n\n    if ignores is None:\n        ignores = []\n\n    if any(fnmatch.fnmatch(os.path.basename(source), ignore) for ignore in ignores):\n        logger.info(\"Not copying %s due to ignores\", source_)\n        return\n\n    if os.path.isfile(source_):\n        dst_dir = os.path.dirname(destination_)\n        if not os.path.exists(dst_dir):\n            logger.info(\"Creating directory %s\", dst_dir)\n            os.makedirs(dst_dir)\n        logger.info(\"Copying %s to %s\", source_, destination_)\n        copy_file(source_, destination_)\n\n    elif os.path.isdir(source_):\n        if not os.path.exists(destination_):\n            logger.info(\"Creating directory %s\", destination_)\n            os.makedirs(destination_)\n        if not os.path.isdir(destination_):\n            logger.warning(\n                \"Cannot copy %s (a directory) to %s (a file)\", source_, destination_\n            )\n            return\n\n        for src_dir, subdirs, others in os.walk(source_, followlinks=True):\n            dst_dir = os.path.join(destination_, os.path.relpath(src_dir, source_))\n\n            subdirs[:] = (\n                s for s in subdirs if not any(fnmatch.fnmatch(s, i) for i in ignores)\n            )\n            others[:] = (\n                o for o in others if not any(fnmatch.fnmatch(o, i) for i in ignores)\n            )\n\n            if not os.path.isdir(dst_dir):\n                logger.info(\"Creating directory %s\", dst_dir)\n                # Parent directories are known to exist, so 'mkdir' suffices.\n                os.mkdir(dst_dir)\n\n            for o in others:\n                src_path = os.path.join(src_dir, o)\n                dst_path = os.path.join(dst_dir, o)\n                if os.path.isfile(src_path):\n                    logger.info(\"Copying %s to %s\", src_path, dst_path)\n                    copy_file(src_path, dst_path)\n                else:\n                    logger.warning(\n                        \"Skipped copy %s (not a file or directory) to %s\",\n                        src_path,\n                        dst_path,\n                    )\n\n\ndef copy_file(source: str, destination: str) -> None:\n    \"\"\"Copy a file\"\"\"\n    try:\n        shutil.copyfile(source, destination)\n    except OSError as e:\n        logger.warning(\n            \"A problem occurred copying file %s to %s; %s\", source, destination, e\n        )\n\n\ndef clean_output_dir(path: str, retention: Iterable[str]) -> None:\n    \"\"\"Remove all files from output directory except those in retention list\"\"\"\n\n    if not os.path.exists(path):\n        logger.debug(\"Directory already removed: %s\", path)\n        return\n\n    if not os.path.isdir(path):\n        try:\n            os.remove(path)\n        except Exception:\n            logger.exception(\"Unable to delete file %s\", path)\n        return\n\n    # remove existing content from output folder unless in retention list\n    for filename in os.listdir(path):\n        file = os.path.join(path, filename)\n        if any(filename == retain for retain in retention):\n            logger.debug(\n                \"Skipping deletion; %s is on retention list: %s\", filename, file\n            )\n        elif os.path.isdir(file):\n            try:\n                shutil.rmtree(file)\n                logger.debug(\"Deleted directory %s\", file)\n            except Exception:\n                logger.exception(\"Unable to delete directory %s\", file)\n        elif os.path.isfile(file) or os.path.islink(file):\n            try:\n                os.remove(file)\n                logger.debug(\"Deleted file/link %s\", file)\n            except Exception:\n                logger.exception(\"Unable to delete file %s\", file)\n        else:\n            logger.error(\"Unable to delete %s, file type unknown\", file)\n\n\ndef get_relative_path(path: str) -> str:\n    \"\"\"Return the relative path from the given path to the root path.\"\"\"\n    components = split_all(path)\n    if components is None or len(components) <= 1:\n        return os.curdir\n    else:\n        parents = [os.pardir] * (len(components) - 1)\n        return os.path.join(*parents)\n\n\ndef path_to_url(path: str) -> str:\n    \"\"\"Return the URL corresponding to a given path.\"\"\"\n    if path is not None:\n        path = posixize_path(path)\n    return path\n\n\ndef posixize_path(rel_path: str) -> str:\n    \"\"\"Use '/' as path separator, so that source references,\n    like '{static}/foo/bar.jpg' or 'extras/favicon.ico',\n    will work on Windows as well as on Mac and Linux.\"\"\"\n    return rel_path.replace(os.sep, \"/\")\n\n\nclass _HTMLWordTruncator(HTMLParser):\n    _word_regex = re.compile(\n        r\"{DBC}|(\\w[\\w'-]*)\".format(\n            # DBC means CJK-like characters. An character can stand for a word.\n            DBC=(\n                \"([\\u4e00-\\u9fff])|\"  # CJK Unified Ideographs\n                \"([\\u3400-\\u4dbf])|\"  # CJK Unified Ideographs Extension A\n                \"([\\uf900-\\ufaff])|\"  # CJK Compatibility Ideographs\n                \"([\\U00020000-\\U0002a6df])|\"  # CJK Unified Ideographs Extension B\n                \"([\\U0002f800-\\U0002fa1f])|\"  # CJK Compatibility Ideographs Supplement\n                \"([\\u3040-\\u30ff])|\"  # Hiragana and Katakana\n                \"([\\u1100-\\u11ff])|\"  # Hangul Jamo\n                \"([\\uac00-\\ud7ff])|\"  # Hangul Compatibility Jamo\n                \"([\\u3130-\\u318f])\"  # Hangul Syllables\n            )\n        ),\n        re.UNICODE,\n    )\n    _word_prefix_regex = re.compile(r\"\\w\", re.U)\n    _singlets = (\"br\", \"col\", \"link\", \"base\", \"img\", \"param\", \"area\", \"hr\", \"input\")\n\n    class TruncationCompleted(Exception):\n        def __init__(self, truncate_at: int) -> None:\n            super().__init__(truncate_at)\n            self.truncate_at = truncate_at\n\n    def __init__(self, max_words: int) -> None:\n        super().__init__(convert_charrefs=False)\n\n        self.max_words = max_words\n        self.words_found = 0\n        self.open_tags = []\n        self.last_word_end = None\n        self.truncate_at: int | None = None\n\n    def feed(self, *args, **kwargs) -> None:\n        try:\n            super().feed(*args, **kwargs)\n        except self.TruncationCompleted as exc:\n            self.truncate_at = exc.truncate_at\n        else:\n            self.truncate_at = None\n\n    def getoffset(self) -> int:\n        line_start = 0\n        lineno, line_offset = self.getpos()\n        for _ in range(lineno - 1):\n            line_start = self.rawdata.index(\"\\n\", line_start) + 1\n        return line_start + line_offset\n\n    def add_word(self, word_end: int) -> None:\n        self.words_found += 1\n        self.last_word_end = None\n        if self.words_found == self.max_words:\n            raise self.TruncationCompleted(word_end)\n\n    def add_last_word(self) -> None:\n        if self.last_word_end is not None:\n            self.add_word(self.last_word_end)\n\n    def handle_starttag(self, tag: str, attrs: Any) -> None:\n        del attrs  # Unused argument\n        self.add_last_word()\n        if tag not in self._singlets:\n            self.open_tags.insert(0, tag)\n\n    def handle_endtag(self, tag: str) -> None:\n        self.add_last_word()\n        try:\n            i = self.open_tags.index(tag)\n        except ValueError:\n            pass\n        else:\n            # SGML: An end tag closes, back to the matching start tag,\n            # all unclosed intervening start tags with omitted end tags\n            del self.open_tags[: i + 1]\n\n    def handle_data(self, data: str) -> None:\n        word_end = 0\n        offset = self.getoffset()\n\n        while self.words_found < self.max_words:\n            match = self._word_regex.search(data, word_end)\n            if not match:\n                break\n\n            if match.start(0) > 0:\n                self.add_last_word()\n\n            word_end = match.end(0)\n            self.last_word_end = offset + word_end\n\n        if word_end < len(data):\n            self.add_last_word()\n\n    def _handle_ref(self, name: str, char: str) -> None:\n        \"\"\"\n        Called by handle_entityref() or handle_charref() when a ref like\n        `&mdash;`, `&#8212;`, or `&#x2014` is found.\n\n        The arguments for this method are:\n\n        - `name`: the HTML entity name (such as `mdash` or `#8212` or `#x2014`)\n        - `char`: the Unicode representation of the ref (such as `—`)\n\n        This method checks whether the entity is considered to be part of a\n        word or not and, if not, signals the end of a word.\n        \"\"\"\n        # Compute the index of the character right after the ref.\n        #\n        # In a string like 'prefix&mdash;suffix', the end is the sum of:\n        #\n        # - `self.getoffset()` (the length of `prefix`)\n        # - `1` (the length of `&`)\n        # - `len(name)` (the length of `mdash`)\n        # - `1` (the length of `;`)\n        #\n        # Note that, in case of malformed HTML, the ';' character may\n        # not be present.\n\n        offset = self.getoffset()\n        ref_end = offset + len(name) + 1\n\n        try:\n            if self.rawdata[ref_end] == \";\":\n                ref_end += 1\n        except IndexError:\n            # We are at the end of the string and there's no ';'\n            pass\n\n        if self.last_word_end is None:\n            if self._word_prefix_regex.match(char):\n                self.last_word_end = ref_end\n        elif self._word_regex.match(char):\n            self.last_word_end = ref_end\n        else:\n            self.add_last_word()\n\n    def handle_entityref(self, name: str) -> None:\n        \"\"\"\n        Called when an entity ref like '&mdash;' is found\n\n        `name` is the entity ref without ampersand and semicolon (e.g. `mdash`)\n        \"\"\"\n        try:\n            codepoint = entities.name2codepoint[name]\n            char = chr(codepoint)\n        except KeyError:\n            char = \"\"\n        self._handle_ref(name, char)\n\n    def handle_charref(self, name: str) -> None:\n        \"\"\"\n        Called when a char ref like '&#8212;' or '&#x2014' is found\n\n        `name` is the char ref without ampersand and semicolon (e.g. `#8212` or\n        `#x2014`)\n        \"\"\"\n        try:\n            if name.startswith(\"x\"):\n                codepoint = int(name[1:], 16)\n            else:\n                codepoint = int(name)\n            char = chr(codepoint)\n        except (ValueError, OverflowError):\n            char = \"\"\n        self._handle_ref(\"#\" + name, char)\n\n\ndef truncate_html_words(s: str, num: int, end_text: str = \"…\") -> str:\n    \"\"\"Truncates HTML to a certain number of words.\n\n    (not counting tags and comments). Closes opened tags if they were correctly\n    closed in the given html. Takes an optional argument of what should be used\n    to notify that the string has been truncated, defaulting to ellipsis (…).\n\n    Newlines in the HTML are preserved. (From the django framework).\n    \"\"\"\n    length = int(num)\n    if length <= 0:\n        return \"\"\n    truncator = _HTMLWordTruncator(length)\n    truncator.feed(s)\n    if truncator.truncate_at is None:\n        return s\n    out = s[: truncator.truncate_at]\n    if end_text:\n        out += \" \" + end_text\n    # Close any tags still open\n    for tag in truncator.open_tags:\n        out += f\"</{tag}>\"\n    # Return string\n    return out\n\n\ndef truncate_html_paragraphs(s, count):\n    \"\"\"Truncate HTML to a certain number of paragraphs.\n\n    :param count: number of paragraphs to keep\n\n    Newlines in the HTML are preserved.\n    \"\"\"\n    paragraphs = []\n    tag_stop = 0\n    substr = s[:]\n    for _ in range(count):\n        substr = substr[tag_stop:]\n        tag_start = substr.find(\"<p>\")\n        tag_stop = substr.find(\"</p>\") + len(\"</p>\")\n        paragraphs.append(substr[tag_start:tag_stop])\n\n    return \"\".join(paragraphs)\n\n\ndef process_translations(\n    content_list: list[Content],\n    translation_id: str | Collection[str] | None = None,\n) -> tuple[list[Content], list[Content]]:\n    \"\"\"Finds translations and returns them.\n\n    For each content_list item, populates the 'translations' attribute, and\n    returns a tuple with two lists (index, translations). Index list includes\n    items in default language or items which have no variant in default\n    language. Items with the `translation` metadata set to something else than\n    `False` or `false` will be used as translations, unless all the items in\n    the same group have that metadata.\n\n    Translations and original items are determined relative to one another\n    amongst items in the same group. Items are in the same group if they\n    have the same value(s) for the metadata attribute(s) specified by the\n    'translation_id', which must be a string or a collection of strings.\n    If 'translation_id' is falsy, the identification of translations is skipped\n    and all items are returned as originals.\n    \"\"\"\n\n    if not translation_id:\n        return content_list, []\n\n    if isinstance(translation_id, str):\n        translation_id = {translation_id}\n\n    index = []\n\n    try:\n        content_list.sort(key=attrgetter(*translation_id))\n    except TypeError:\n        raise TypeError(\n            f\"Cannot unpack {translation_id}, 'translation_id' must be falsy, a\"\n            \" string or a collection of strings\"\n        ) from None\n    except AttributeError:\n        raise AttributeError(\n            f\"Cannot use {translation_id} as 'translation_id', there \"\n            \"appear to be items without these metadata \"\n            \"attributes\"\n        ) from None\n\n    for id_vals, items in groupby(content_list, attrgetter(*translation_id)):\n        # prepare warning string\n        id_vals = (id_vals,) if len(translation_id) == 1 else id_vals\n        with_str = \"with\" + \", \".join([' {} \"{{}}\"'] * len(translation_id)).format(\n            *translation_id\n        ).format(*id_vals)\n\n        items = list(items)\n        original_items = get_original_items(items, with_str)\n        index.extend(original_items)\n        for a in items:\n            a.translations = [x for x in items if x != a]\n\n    translations = [x for x in content_list if x not in index]\n\n    return index, translations\n\n\ndef get_original_items(items: list[Content], with_str: str) -> list[Content]:\n    def _warn_source_paths(msg, items, *extra):\n        args = [len(items)]\n        args.extend(extra)\n        args.extend(x.source_path for x in items)\n        logger.warning(\"{}: {}\".format(msg, \"\\n%s\" * len(items)), *args)\n\n    # warn if several items have the same lang\n    for lang, lang_items in groupby(items, attrgetter(\"lang\")):\n        lang_items = list(lang_items)\n        if len(lang_items) > 1:\n            _warn_source_paths(\n                'There are %s items \"%s\" with lang %s', lang_items, with_str, lang\n            )\n\n    # items with `translation` metadata will be used as translations...\n    candidate_items = [\n        i for i in items if i.metadata.get(\"translation\", \"false\").lower() == \"false\"\n    ]\n\n    # ...unless all items with that slug are translations\n    if not candidate_items:\n        _warn_source_paths('All items (\"%s\") \"%s\" are translations', items, with_str)\n        candidate_items = items\n\n    # find items with default language\n    original_items = [i for i in candidate_items if i.in_default_lang]\n\n    # if there is no article with default language, go back one step\n    if not original_items:\n        original_items = candidate_items\n\n    # warn if there are several original items\n    if len(original_items) > 1:\n        _warn_source_paths(\n            \"There are %s original (not translated) items %s\", original_items, with_str\n        )\n    return original_items\n\n\ndef order_content(\n    content_list: list[Content],\n    order_by: str | Callable[[Content], Any] | None = \"slug\",\n) -> list[Content]:\n    \"\"\"Sorts content.\n\n    order_by can be a string of an attribute or sorting function. If order_by\n    is defined, content will be ordered by that attribute or sorting function.\n    By default, content is ordered by slug.\n\n    Different content types can have default order_by attributes defined\n    in settings, e.g. PAGES_ORDER_BY='sort-order', in which case `sort-order`\n    should be a defined metadata attribute in each page.\n    \"\"\"\n\n    if order_by:\n        if callable(order_by):\n            try:\n                content_list.sort(key=order_by)\n            except Exception:\n                logger.exception(\"Error sorting with function %s\", order_by)\n        elif isinstance(order_by, str):\n            if order_by.startswith(\"reversed-\"):\n                order_reversed = True\n                order_by = order_by.replace(\"reversed-\", \"\", 1)\n            else:\n                order_reversed = False\n\n            if order_by == \"basename\":\n                content_list.sort(\n                    key=lambda x: os.path.basename(x.source_path or \"\"),\n                    reverse=order_reversed,\n                )\n            else:\n                try:\n                    content_list.sort(key=attrgetter(order_by), reverse=order_reversed)\n                except AttributeError:\n                    for content in content_list:\n                        try:\n                            getattr(content, order_by)\n                        except AttributeError:\n                            logger.warning(\n                                'There is no \"%s\" attribute in \"%s\". '\n                                \"Defaulting to slug order.\",\n                                order_by,\n                                content.get_relative_source_path(),\n                                extra={\n                                    \"limit_msg\": (\n                                        \"More files are missing the needed attribute.\"\n                                    )\n                                },\n                            )\n        else:\n            logger.warning(\n                \"Invalid *_ORDER_BY setting (%s). \"\n                \"Valid options are strings and functions.\",\n                order_by,\n            )\n\n    return content_list\n\n\nclass FileChangeFilter(watchfiles.DefaultFilter):\n    def __init__(self, ignore_file_patterns: Sequence[str], *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        self.ignore_file_patterns = ignore_file_patterns\n\n    def __call__(self, change: watchfiles.Change, path: str) -> bool:\n        \"\"\"Returns `True` if a file should be watched for changes. The `IGNORE_FILES`\n        setting is a list of Unix glob patterns. This call will filter out files and\n        directories specified by `IGNORE_FILES` Pelican setting and by the default\n        filters of `watchfiles.DefaultFilter`, seen here:\n        https://watchfiles.helpmanual.io/api/filters/#watchfiles.DefaultFilter.ignore_dirs\n        \"\"\"\n        return super().__call__(change, path) and not any(\n            fnmatch.fnmatch(os.path.abspath(path), p) for p in self.ignore_file_patterns\n        )\n\n\ndef wait_for_changes(\n    settings_file: str,\n    settings: Settings,\n) -> set[tuple[Change, str]]:\n    content_path = settings.get(\"PATH\", \"\")\n    theme_path = settings.get(\"THEME\", \"\")\n    ignore_file_patterns = set(settings.get(\"IGNORE_FILES\", []))\n\n    candidate_paths = [\n        settings_file,\n        theme_path,\n        content_path,\n    ]\n\n    candidate_paths.extend(\n        os.path.join(content_path, path) for path in settings.get(\"STATIC_PATHS\", [])\n    )\n\n    watching_paths = []\n    for path in candidate_paths:\n        if not path:\n            continue\n        path = os.path.abspath(path)\n        if not os.path.exists(path):\n            logger.warning(\"Unable to watch path '%s' as it does not exist.\", path)\n        else:\n            watching_paths.append(path)\n\n    return next(\n        watchfiles.watch(\n            *watching_paths,\n            watch_filter=FileChangeFilter(ignore_file_patterns=ignore_file_patterns),\n            rust_timeout=0,\n        )\n    )\n\n\ndef set_date_tzinfo(\n    d: datetime.datetime, tz_name: str | None = None\n) -> datetime.datetime:\n    \"\"\"Set the timezone for dates that don't have tzinfo\"\"\"\n    if tz_name and not d.tzinfo:\n        timezone = ZoneInfo(tz_name)\n        d = d.replace(tzinfo=timezone)\n        return SafeDatetime(\n            d.year, d.month, d.day, d.hour, d.minute, d.second, d.microsecond, d.tzinfo\n        )\n    return d\n\n\ndef mkdir_p(path: str) -> None:\n    os.makedirs(path, exist_ok=True)\n\n\ndef split_all(path: str | pathlib.Path | None) -> Sequence[str] | None:\n    \"\"\"Split a path into a list of components\n\n    While os.path.split() splits a single component off the back of\n    `path`, this function splits all components:\n\n    >>> split_all(os.path.join('a', 'b', 'c'))\n    ['a', 'b', 'c']\n    \"\"\"\n    if isinstance(path, str):\n        components = []\n        path = path.lstrip(\"/\")\n        while path:\n            head, tail = os.path.split(path)\n            if tail:\n                components.insert(0, tail)\n            elif head == path:\n                components.insert(0, head)\n                break\n            path = head\n        return components\n    elif isinstance(path, pathlib.Path):\n        return path.parts\n    elif path is None:\n        return None\n    else:\n        raise TypeError(\n            f'\"path\" was {type(path)}, must be string, None, or pathlib.Path'\n        )\n\n\ndef path_to_file_url(path: str) -> str:\n    \"\"\"Convert file-system path to file:// URL\"\"\"\n    return urllib.parse.urljoin(\"file://\", urllib.request.pathname2url(path))\n\n\ndef maybe_pluralize(count: int, singular: str, plural: str) -> str:\n    \"\"\"\n    Returns a formatted string containing count and plural if count is not 1\n    Returns count and singular if count is 1\n\n    maybe_pluralize(0, 'Article', 'Articles') -> '0 Articles'\n    maybe_pluralize(1, 'Article', 'Articles') -> '1 Article'\n    maybe_pluralize(2, 'Article', 'Articles') -> '2 Articles'\n\n    \"\"\"\n    selection = plural\n    if count == 1:\n        selection = singular\n    return f\"{count} {selection}\"\n\n\n@contextmanager\ndef temporary_locale(\n    temp_locale: str | None = None, lc_category: int = locale.LC_ALL\n) -> Generator[None]:\n    \"\"\"\n    Enable code to run in a context with a temporary locale\n    Resets the locale back when exiting context.\n\n    Use tests.support.TestCaseWithCLocale if you want every unit test in a\n    class to use the C locale.\n    \"\"\"\n    orig_locale = locale.setlocale(lc_category)\n    # python has issue with Turkish_Türkiye.1254 locale, replace it to\n    # something accepted: Turkish\n    if orig_locale == \"Turkish_Türkiye.1254\":\n        orig_locale = \"Turkish\"\n    if temp_locale:\n        locale.setlocale(lc_category, temp_locale)\n    yield\n    locale.setlocale(lc_category, orig_locale)\n\n\ndef file_suffix(path: str) -> str:\n    \"\"\"Return the suffix of a filename in a path.\"\"\"\n    _, ext = os.path.splitext(os.path.basename(path))\n    ret = \"\"\n    if len(ext) > 1:\n        # drop the \".\", e.g., \"exe\", not \".exe\"\n        ret = ext[1:]\n    return ret\n"
  },
  {
    "path": "pelican/writers.py",
    "content": "import logging\nimport os\nfrom posixpath import join as posix_join\nfrom urllib.parse import urljoin\n\nfrom feedgenerator import Atom1Feed, Rss201rev2Feed, get_tag_uri\nfrom markupsafe import Markup\n\nfrom pelican.paginator import Paginator\nfrom pelican.plugins import signals\nfrom pelican.utils import (\n    get_relative_path,\n    path_to_url,\n    sanitised_join,\n    set_date_tzinfo,\n)\n\nlogger = logging.getLogger(__name__)\n\n\nclass Writer:\n    def __init__(self, output_path, settings=None):\n        self.output_path = output_path\n        self.reminder = {}\n        self.settings = settings or {}\n        self._written_files = set()\n        self._overridden_files = set()\n\n        # See Content._link_replacer for details\n        if self.settings.get(\"RELATIVE_URLS\"):\n            self.urljoiner = posix_join\n        else:\n            self.urljoiner = lambda base, url: urljoin(\n                base if base.endswith(\"/\") else base + \"/\", str(url)\n            )\n\n    def _create_new_feed(self, feed_type, feed_title, context):\n        feed_class = Rss201rev2Feed if feed_type == \"rss\" else Atom1Feed\n        if feed_title:\n            feed_title = context[\"SITENAME\"] + \" - \" + feed_title\n        else:\n            feed_title = context[\"SITENAME\"]\n        return feed_class(\n            title=Markup(feed_title).striptags(),\n            link=(self.site_url + \"/\"),\n            feed_url=self.feed_url,\n            description=context.get(\"SITESUBTITLE\", \"\"),\n            subtitle=context.get(\"SITESUBTITLE\", None),\n        )\n\n    def _add_item_to_the_feed(self, feed, item):\n        title = Markup(item.title).striptags()\n        link = self.urljoiner(self.site_url, item.url)\n\n        if self.settings[\"FEED_APPEND_REF\"]:\n            link = link + \"?ref=feed\"\n\n        if isinstance(feed, Rss201rev2Feed):\n            # RSS feeds use a single tag called 'description' for both the full\n            # content and the summary\n            content = None\n            if self.settings.get(\"RSS_FEED_SUMMARY_ONLY\"):\n                description = item.summary\n            else:\n                description = item.get_content(self.site_url)\n\n        else:\n            # Atom feeds have two different tags for full content (called\n            # 'content' by feedgenerator) and summary (called 'description' by\n            # feedgenerator).\n            #\n            # It does not make sense to have the summary be the\n            # exact same thing as the full content. If we detect that\n            # they are we just remove the summary.\n            content = item.get_content(self.site_url)\n            description = item.summary\n            if description == content:\n                description = None\n\n        categories = []\n        if hasattr(item, \"category\"):\n            categories.append(item.category)\n        if hasattr(item, \"tags\"):\n            categories.extend(item.tags)\n\n        feed.add_item(\n            title=title,\n            link=link,\n            unique_id=get_tag_uri(link, item.date),\n            description=description,\n            content=content,\n            categories=categories or None,\n            author_name=getattr(item, \"author\", \"\"),\n            pubdate=set_date_tzinfo(item.date, self.settings.get(\"TIMEZONE\", None)),\n            updateddate=set_date_tzinfo(\n                item.modified, self.settings.get(\"TIMEZONE\", None)\n            )\n            if hasattr(item, \"modified\")\n            else None,\n        )\n\n    def _open_w(self, filename, encoding, override=False):\n        \"\"\"Open a file to write some content to it.\n\n        Exit if we have already written to that file, unless one (and no more\n        than one) of the writes has the override parameter set to True.\n        \"\"\"\n        if filename in self._overridden_files:\n            if override:\n                raise RuntimeError(f\"File {filename} is set to be overridden twice\")\n            logger.info(\"Skipping %s\", filename)\n            filename = os.devnull\n        elif filename in self._written_files:\n            if override:\n                logger.info(\"Overwriting %s\", filename)\n            else:\n                raise RuntimeError(f\"File {filename} is to be overwritten\")\n        if override:\n            self._overridden_files.add(filename)\n        self._written_files.add(filename)\n        return open(filename, \"w\", encoding=encoding)\n\n    def write_feed(\n        self,\n        elements,\n        context,\n        path=None,\n        url=None,\n        feed_type=\"atom\",\n        override_output=False,\n        feed_title=None,\n    ):\n        \"\"\"Generate a feed with the list of articles provided\n\n        Return the feed. If no path or output_path is specified, just\n        return the feed object.\n\n        :param elements: the articles to put on the feed.\n        :param context: the context to get the feed metadata.\n        :param path: the path to output.\n        :param url: the publicly visible feed URL; if None, path is used\n            instead\n        :param feed_type: the feed type to use (atom or rss)\n        :param override_output: boolean telling if we can override previous\n            output with the same name (and if next files written with the same\n            name should be skipped to keep that one)\n        :param feed_title: the title of the feed.o\n        \"\"\"\n        self.site_url = context.get(\"SITEURL\", path_to_url(get_relative_path(path)))\n\n        self.feed_domain = context.get(\"FEED_DOMAIN\")\n        self.feed_url = self.urljoiner(self.feed_domain, url or path)\n\n        feed = self._create_new_feed(feed_type, feed_title, context)\n\n        # FEED_MAX_ITEMS = None means [:None] to get every element\n        for element in elements[: self.settings[\"FEED_MAX_ITEMS\"]]:\n            self._add_item_to_the_feed(feed, element)\n\n        signals.feed_generated.send(context, feed=feed)\n        if path:\n            complete_path = sanitised_join(self.output_path, path)\n\n            os.makedirs(os.path.dirname(complete_path), exist_ok=True)\n\n            with self._open_w(complete_path, \"utf-8\", override_output) as fp:\n                feed.write(fp, \"utf-8\")\n                logger.info(\"Writing %s\", complete_path)\n\n            signals.feed_written.send(complete_path, context=context, feed=feed)\n        return feed\n\n    def write_file(\n        self,\n        name,\n        template,\n        context,\n        relative_urls=False,\n        paginated=None,\n        template_name=None,\n        override_output=False,\n        url=None,\n        **kwargs,\n    ):\n        \"\"\"Render the template and write the file.\n\n        :param name: name of the file to output\n        :param template: template to use to generate the content\n        :param context: dict to pass to the templates.\n        :param relative_urls: use relative urls or absolutes ones\n        :param paginated: dict of article list to paginate - must have the\n            same length (same list in different orders)\n        :param template_name: the template name, for pagination\n        :param override_output: boolean telling if we can override previous\n            output with the same name (and if next files written with the same\n            name should be skipped to keep that one)\n        :param url: url of the file (needed by the paginator)\n        :param **kwargs: additional variables to pass to the templates\n        \"\"\"\n\n        if name is False or name == \"\":\n            return\n        elif not name:\n            # other stuff, just return for now\n            return\n\n        def _write_file(template, localcontext, output_path, name, override):\n            \"\"\"Render the template write the file.\"\"\"\n            # set localsiteurl for context so that Contents can adjust links\n            if localcontext[\"localsiteurl\"]:\n                context[\"localsiteurl\"] = localcontext[\"localsiteurl\"]\n            output = template.render(localcontext)\n            path = sanitised_join(output_path, name)\n\n            os.makedirs(os.path.dirname(path), exist_ok=True)\n\n            with self._open_w(path, \"utf-8\", override=override) as f:\n                f.write(output)\n            logger.info(\"Writing %s\", path)\n\n            # Send a signal to say we're writing a file with some specific\n            # local context.\n            signals.content_written.send(path, context=localcontext)\n\n        def _get_localcontext(context, name, kwargs, relative_urls):\n            localcontext = context.copy()\n            localcontext[\"localsiteurl\"] = localcontext.get(\"localsiteurl\", None)\n            if relative_urls:\n                relative_url = path_to_url(get_relative_path(name))\n                localcontext[\"SITEURL\"] = relative_url\n                localcontext[\"localsiteurl\"] = relative_url\n            localcontext[\"output_file\"] = name\n            localcontext.update(kwargs)\n            return localcontext\n\n        if paginated is None:\n            paginated = {\n                key: val for key, val in kwargs.items() if key in {\"articles\", \"dates\"}\n            }\n\n        # pagination\n        if paginated and template_name in self.settings[\"PAGINATED_TEMPLATES\"]:\n            # pagination needed\n            per_page = (\n                self.settings[\"PAGINATED_TEMPLATES\"][template_name]\n                or self.settings[\"DEFAULT_PAGINATION\"]\n            )\n\n            # init paginators\n            paginators = {\n                key: Paginator(name, url, val, self.settings, per_page)\n                for key, val in paginated.items()\n            }\n\n            # generated pages, and write\n            for page_num in range(next(iter(paginators.values())).num_pages):\n                paginated_kwargs = kwargs.copy()\n                for key, paginator in paginators.items():\n                    previous_page = paginator.page(page_num) if page_num > 0 else None\n                    page = paginator.page(page_num + 1)\n                    next_page = (\n                        paginator.page(page_num + 2)\n                        if page_num + 1 < paginator.num_pages\n                        else None\n                    )\n                    paginated_kwargs.update(\n                        {\n                            f\"{key}_paginator\": paginator,\n                            f\"{key}_page\": page,\n                            f\"{key}_previous_page\": previous_page,\n                            f\"{key}_next_page\": next_page,\n                        }\n                    )\n\n                localcontext = _get_localcontext(\n                    context, page.save_as, paginated_kwargs, relative_urls\n                )\n                _write_file(\n                    template,\n                    localcontext,\n                    self.output_path,\n                    page.save_as,\n                    override_output,\n                )\n        else:\n            # no pagination\n            localcontext = _get_localcontext(context, name, kwargs, relative_urls)\n            _write_file(template, localcontext, self.output_path, name, override_output)\n"
  },
  {
    "path": "pyproject.toml",
    "content": "[project]\nname = \"pelican\"\nauthors = [{ name = \"Justin Mayer\", email = \"authors@getpelican.com\" }]\ndescription = \"Static site generator supporting Markdown and reStructuredText\"\nversion = \"4.11.0\"\nlicense = { text = \"AGPLv3\" }\nreadme = \"README.rst\"\nkeywords = [\"static site generator\", \"static sites\", \"ssg\"]\nclassifiers = [\n    \"Development Status :: 5 - Production/Stable\",\n    \"Environment :: Console\",\n    \"Framework :: Pelican\",\n    \"Intended Audience :: End Users/Desktop\",\n    \"License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)\",\n    \"Operating System :: OS Independent\",\n    \"Programming Language :: Python :: 3\",\n    \"Programming Language :: Python :: 3.10\",\n    \"Programming Language :: Python :: 3.11\",\n    \"Programming Language :: Python :: 3.12\",\n    \"Programming Language :: Python :: 3.13\",\n    \"Programming Language :: Python :: 3.14\",\n    \"Programming Language :: Python :: Implementation :: CPython\",\n    \"Topic :: Internet :: WWW/HTTP :: Dynamic Content :: Content Management System\",\n    \"Topic :: Internet :: WWW/HTTP :: Site Management\",\n    \"Topic :: Software Development :: Libraries :: Python Modules\",\n    \"Topic :: Text Processing :: Markup :: Markdown\",\n    \"Topic :: Text Processing :: Markup :: HTML\",\n    \"Topic :: Text Processing :: Markup :: reStructuredText\",\n]\nrequires-python = \">=3.10\"\ndependencies = [\n    \"blinker>=1.7.0\",\n    \"docutils>=0.20.1\",\n    \"feedgenerator>=2.1.0\",\n    \"jinja2>=3.1.2\",\n    \"ordered-set>=4.1.0\",\n    \"pygments>=2.16.1,<2.20.0\",\n    \"python-dateutil>=2.8.2\",\n    \"rich>=13.6.0\",\n    \"unidecode>=1.3.7\",\n    \"watchfiles>=0.21.0\",\n    \"tzdata; sys_platform == 'win32'\",\n]\n\n[project.optional-dependencies]\nmarkdown = [\"markdown>=3.1\"]\n\n[project.urls]\nHomepage = \"https://getpelican.com\"\nFunding = \"https://donate.getpelican.com/\"\n\"Issue Tracker\" = \"https://github.com/getpelican/pelican/issues\"\nRepository = \"https://github.com/getpelican/pelican\"\nDocumentation = \"https://docs.getpelican.com\"\n\n[project.scripts]\npelican = \"pelican.__main__:main\"\npelican-import = \"pelican.tools.pelican_import:main\"\npelican-plugins = \"pelican.plugins._utils:list_plugins\"\npelican-quickstart = \"pelican.tools.pelican_quickstart:main\"\npelican-themes = \"pelican.tools.pelican_themes:main\"\n\n[tool.autopub]\nproject-name = \"Pelican\"\ngit-username = \"botpub\"\ngit-email = \"52496925+botpub@users.noreply.github.com\"\nchangelog-file = \"docs/changelog.rst\"\nchangelog-header = \"###############\"\nversion-header = \"=\"\n\n[tool.pdm]\nignore_package_warnings = [\"sphinx\"]\n\n[tool.pdm.scripts]\ndocbuild = \"invoke docbuild\"\ndocserve = \"invoke docserve\"\nlint = \"invoke lint\"\ntest = \"invoke tests\"\n\n[tool.pdm.dev-dependencies]\ndev = [\n    \"BeautifulSoup4>=4.13.3\",\n    \"jinja2>=3.1.2\",\n    \"lxml>=4.9.3\",\n    \"markdown>=3.5.1\",\n    \"typogrify>=2.1.0\",\n    \"sphinx>=7.1.2\",\n    \"sphinxext-opengraph>=0.9.0\",\n    \"furo==2025.9.25\",\n    \"livereload>=2.6.3\",\n    \"psutil>=5.9.6\",\n    \"pygments>=2.16.1,<2.20.0\",\n    \"pytest>=7.4.3\",\n    \"pytest-cov>=4.1.0\",\n    \"pytest-sugar>=0.9.7\",\n    \"pytest-xdist>=3.4.0\",\n    \"tox>=4.11.3\",\n    \"invoke>=2.2.0\",\n    # ruff version should match the one in .pre-commit-config.yaml\n    \"ruff==0.12.7\",\n    \"tomli>=2.0.1; python_version < \\\"3.11\\\"\",\n]\n\n[tool.pdm.build]\nsource-includes = [\n    \"CONTRIBUTING.rst\",\n    \"THANKS\",\n    \"docs/changelog.rst\",\n    \"samples/\",\n]\nexcludes = [\n    \"pelican/build/\"\n]\n\n[build-system]\nrequires = [\"pdm-backend\"]\nbuild-backend = \"pdm.backend\"\n\n[tool.ruff.lint]\n# see https://docs.astral.sh/ruff/configuration/#using-pyprojecttoml\n# \"F\" contains autoflake, see https://github.com/astral-sh/ruff/issues/1647\n# add more rules\nselect = [\n    # default Ruff checkers as of ruff 0.1.3: E4, E7, E9, F\n    \"E4\",\n    \"E7\",\n    \"E9\",\n    \"F\",  # pyflakes\n\n    # the rest in alphabetical order:\n    \"A\",   # flake8-builtins\n    \"ARG\", # flake8-unused-arguments\n    \"B\",   # flake8-bugbear\n    \"BLE\", # flake8-blind-except\n    # TODO: Do I want \"COM\", # flake8-commas\n    \"C4\",  # flake8-comprehensions\n    # TODO: \"DJ\",  # flake8-django\n    # TODO: \"DTZ\", # flake8-datetimez\n    # TODO: \"EM\",  # flake8-errmsg\n    \"EXE\", # flake8-executable\n    # TODO: \"FURB\", # refurb\n    # TODO: \"FBT\", # flake8-boolean-trap\n    # TODO: \"G\",   # flake8-logging-format\n    \"I\",   # isort\n    \"ICN\", # flake8-import-conventions\n    \"INP\", # flake8-no-pep420\n    # TODO: \"INT\", # flake8-gettext\n    \"ISC\", # flake8-implicit-str-concat\n    # TODO: \"LOG\", # flake8-logging\n    \"PERF\", # perflint\n    \"PIE\", # flake8-pie\n    \"PL\",  # pylint\n    \"PYI\", # flake8-pyi\n    # TODO: \"RET\", # flake8-return\n    \"RSE\", # flake8-raise\n    \"RUF\",\n    # TODO: \"SIM\", # flake8-simplify\n    \"SLF\", # flake8-self\n    \"SLOT\", # flake8-slots\n    \"TID\", # flake8-tidy-imports\n    \"UP\",  # pyupgrade\n    \"Q\",   # flake8-quotes\n    \"TCH\", # flake8-type-checking\n    \"T10\", # flake8-debugger\n    \"T20\", # flake8-print\n    # TODO: \"S\",   # flake8-bandit\n    \"YTT\", # flake8-2020\n    # TODO: add more flake8 rules\n  ]\n\nignore = [\n    # suppression in order of # of violations in Dec 2023:\n    \"PLW2901\",  # redefined-loop-name\n    \"SLF001\",  # private-member-access\n    \"PLR0912\",  # too-many-branches\n    \"PLR0913\",  # too-many-arguments\n    # RUF005: this is a different style of concatenating literals.  It perhaps performs\n    # a bit better, but doesn't seem any more readable to me.  So, ignore it.\n    \"RUF005\",  # collection-literal-concatenation\n    # TODO: several classes have class variables.  If that is correct, we should\n    #   annotate them with ClassVar.\n    # See https://docs.astral.sh/ruff/rules/mutable-class-default/\n    \"RUF012\",  # mutable-class-default\n    \"PLR0915\",  # too-many-statements\n    # Note: we have a couple of \"namespace packages\" (i.e. missing __init__.py)\n    # Not sure if we should add __init__.py to them, or they really need to be\n    # namespace packages.\n    \"INP001\",  # implicit-namespace-package\n    # ruff-format wants us to ignore ISC001.  I don't love that, but okay.\n    # \"warning: The following rules may cause conflicts when used with the formatter:\n    #  `ISC001`. To avoid unexpected behavior, we recommend disabling these rules,\n    #  either by removing them from the `select` or `extend-select` configuration,\n    #  or adding them to the `ignore` configuration.\"\n    \"ISC001\",  # single-line-implicit-string-concatenation\n    # PERF203 has minimal performance impact, and you have to catch the exception\n    # inside the loop if you want to ignore it, so let's ignore PERF203.\n    \"PERF203\",  # try-except-in-loop\n]\n\n[tool.ruff.lint.extend-per-file-ignores]\n\n\"pelican/__init__.py\" = [\n    # allow imports after a call to a function, see the file\n    \"E402\"\n]\n\"pelican/tests/test_utils.py\" = [\n    # the tests have a bunch of unicode characters\n    \"RUF001\"\n]\n\"pelican/tests/test_generators.py\" = [\n    # the tests have a bunch of constants, why not\n    \"PLR2004\"\n]\n\n\"pelican/tools/*.py}\" = [\n    # this is a command-line utility, prints are fine\n    \"T201\"\n]\n"
  },
  {
    "path": "requirements/developer.pip",
    "content": "-r test.pip\n-r docs.pip\n"
  },
  {
    "path": "requirements/docs.pip",
    "content": "sphinx\nsphinxext-opengraph\nfuro==2023.9.10\nlivereload\nmatplotlib\ntomli;python_version<\"3.11\"\n"
  },
  {
    "path": "requirements/owner.pip",
    "content": "-r developer.pip\n\n# Release issuance\ntox\nwheel\n"
  },
  {
    "path": "requirements/test.pip",
    "content": "# Tests\nPygments>=2.19.0\npytest\npytest-cov\npytest-xdist[psutil]\n\n# Optional Packages\nMarkdown>=3.5.1\nBeautifulSoup4\nlxml\ntypogrify\n"
  },
  {
    "path": "samples/content/2012-11-30_filename-metadata.rst",
    "content": "FILENAME_METADATA example\n#########################\n\nSome cool stuff!\n"
  },
  {
    "path": "samples/content/another_super_article-fr.rst",
    "content": "Trop bien !\n###########\n\n:date: 2010-10-20 10:14\n:lang: fr\n:slug: oh-yeah\n\nEt voila du contenu en français\n"
  },
  {
    "path": "samples/content/another_super_article.rst",
    "content": "Oh yeah !\n#########\n\n:tags: oh, bar, yeah\n:date: 2010-10-20 10:14\n:category: bar\n:author: Alexis Métaireau\n:lang: en\n:slug: oh-yeah\n:license: WTFPL\n\nWhy not ?\n=========\n\nAfter all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !\nYEAH !\n\n.. image:: |static|/pictures/Sushi.jpg\n   :height: 450 px\n   :width: 600 px\n   :alt: alternate text\n"
  },
  {
    "path": "samples/content/article2-fr.rst",
    "content": "Deuxième article\n################\n\n:tags: foo, bar, baz\n:date: 2012-02-29\n:lang: fr\n:slug: second-article\n\nCeci est un article, en français.\n"
  },
  {
    "path": "samples/content/article2.rst",
    "content": "Second article\n##############\n\n:tags: foo, bar, baz\n:date: 2012-02-29\n:lang: en\n:slug: second-article\n\nThis is some article, in english\n"
  },
  {
    "path": "samples/content/article_tag_baz.rst",
    "content": "The baz tag\n###########\n\n:date: 2010-03-14\n:url: tag/baz.html\n:save_as: tag/baz.html\n\nThis article overrides the listening of the articles under the *baz* tag.\n"
  },
  {
    "path": "samples/content/cat1/article1.rst",
    "content": "Article 1\n#########\n\n:date: 2011-02-17\n:yeah: oh yeah !\n\nArticle 1\n"
  },
  {
    "path": "samples/content/cat1/article2.rst",
    "content": "Article 2\n#########\n\n:date: 2011-02-17\n\nArticle 2\n"
  },
  {
    "path": "samples/content/cat1/article3.rst",
    "content": "Article 3\n#########\n\n:date: 2011-02-17\n\nArticle 3\n"
  },
  {
    "path": "samples/content/cat1/markdown-article.md",
    "content": "Title: A markdown powered article\nDate: 2011-04-20\n\nYou're mutually oblivious.\n\n[a root-relative link to unbelievable](|filename|/unbelievable.rst)\n[a file-relative link to unbelievable](|filename|../unbelievable.rst)\n"
  },
  {
    "path": "samples/content/draft_article without_date.rst",
    "content": "A draft article without date\n############################\n\n:status: draft\n\nThis is a draft article, it should live under the /drafts/ folder and not be\nlisted anywhere else.\n"
  },
  {
    "path": "samples/content/draft_article.rst",
    "content": "A draft article\n###############\n\n:date: 2011-05-08 15:58\n:status: draft\n\nThis is a draft article, it should live under the /drafts/ folder and not be\nlisted anywhere else.\n"
  },
  {
    "path": "samples/content/extra/robots.txt",
    "content": "User-agent: *\nDisallow: /pictures\n"
  },
  {
    "path": "samples/content/pages/hidden_page.rst",
    "content": "This is a test hidden page\n##########################\n\n:category: test\n:status: hidden\n\nThis is great for things like error(404) pages\nAnyone can see this page but it's not linked to anywhere!\n"
  },
  {
    "path": "samples/content/pages/jinja2_template.html",
    "content": "{% extends \"base.html\" %}\n{% block content %}\n\n    Some text\n\n{% endblock %}\n"
  },
  {
    "path": "samples/content/pages/override_tag_oh.rst",
    "content": "Oh Oh Oh\n########\n\n:date: 2010-03-14\n:url: tag/oh.html\n:save_as: tag/oh.html\n\nThis page overrides the listening of the articles under the *oh* tag.\n"
  },
  {
    "path": "samples/content/pages/override_url_saveas.rst",
    "content": "Override url/save_as\n####################\n\n:date: 2012-12-07\n:url: override/\n:save_as: override/index.html\n\nTest page which overrides save_as and url so that this page will be generated\nat a custom location.\n"
  },
  {
    "path": "samples/content/pages/test_page.rst",
    "content": "This is a test page\n###################\n\n:category: test\n\nJust an image.\n\n.. image:: {static}/pictures/Fat_Cat.jpg\n   :height: 450 px\n   :width: 600 px\n   :alt: alternate text\n\n.. image:: |filename|/images/Fat_Cat.jpg\n   :height: 450 px\n   :width: 600 px\n   :alt: wrong path since 'images' folder does not exist\n"
  },
  {
    "path": "samples/content/super_article.rst",
    "content": "This is a super article !\n#########################\n\n:tags: foo, bar, foobar\n:date: 2010-12-02 10:14\n:modified: 2013-11-17 23:29\n:category: yeah\n:author: Alexis Métaireau\n:summary:\n    Multi-line metadata should be supported\n    as well as **inline markup**.\n\nSome content here !\n\nThis is a simple title\n======================\n\nAnd here comes the cool stuff_.\n\n.. image:: |static|/pictures/Sushi.jpg\n   :height: 450 px\n   :width: 600 px\n   :alt: alternate text\n\n.. image:: |static|/pictures/Sushi_Macro.jpg\n   :height: 450 px\n   :width: 600 px\n   :alt: alternate text\n\n::\n\n   >>> from ipdb import set_trace\n   >>> set_trace()\n\n→ And now try with some utf8 hell: ééé\n\n.. _stuff: http://books.couchdb.org/relax/design-documents/views\n"
  },
  {
    "path": "samples/content/unbelievable.rst",
    "content": "Unbelievable !\n##############\n\n:date: 2010-10-15 20:30\n\nOr completely awesome. Depends the needs.\n\n`a root-relative link to markdown-article <|filename|/cat1/markdown-article.md>`_\n`a file-relative link to markdown-article <|filename|cat1/markdown-article.md>`_\n\nTesting sourcecode directive\n----------------------------\n\n.. sourcecode:: python\n    :linenos:\n\n    formatter = self.options and VARIANTS[self.options.keys()[0]]\n\n\nTesting another case\n--------------------\n\nThis will now have a line number in 'custom' since it's the default in\npelican.conf, it will have nothing in default.\n\n.. sourcecode:: python\n\n    formatter = self.options and VARIANTS[self.options.keys()[0]]\n\n\nLovely.\n\nTesting more sourcecode directives\n----------------------------------\n\n.. sourcecode:: python\n    :anchorlinenos:\n    :classprefix: testing\n    :hl_lines: 10,11,12\n    :lineanchors: foo\n    :linenos: inline\n    :linenospecial: 2\n    :linenostart: 8\n    :linenostep: 2\n    :lineseparator: <br>\n    :linespans: foo\n    :nobackground:\n\n    def run(self):\n        self.assert_has_content()\n        try:\n            lexer = get_lexer_by_name(self.arguments[0])\n        except ValueError:\n            # no lexer found - use the text one instead of an exception\n            lexer = TextLexer()\n\n        if ('linenos' in self.options and\n                self.options['linenos'] not in ('table', 'inline')):\n            self.options['linenos'] = 'table'\n\n        for flag in ('nowrap', 'nobackground', 'anchorlinenos'):\n            if flag in self.options:\n                self.options[flag] = True\n\n        # noclasses should already default to False, but just in case...\n        formatter = HtmlFormatter(noclasses=False, **self.options)\n        parsed = highlight('\\n'.join(self.content), lexer, formatter)\n        return [nodes.raw('', parsed, format='html')]\n\n\nLovely.\n\nTesting even more sourcecode directives\n---------------------------------------\n\n.. sourcecode:: python\n    :linenos: table\n    :nowrap:\n\n\n    formatter = self.options and VARIANTS[self.options.keys()[0]]\n\n\nLovely.\n\nTesting overriding config defaults\n----------------------------------\n\nEven if the default is line numbers, we can override it here\n\n.. sourcecode:: python\n    :linenos: none\n\n\n    formatter = self.options and VARIANTS[self.options.keys()[0]]\n\n\nLovely.\n"
  },
  {
    "path": "samples/content/unwanted_file",
    "content": "not to be parsed\n"
  },
  {
    "path": "samples/kinda/exciting/new/files/zap!",
    "content": ""
  },
  {
    "path": "samples/kinda/exciting/old",
    "content": ""
  },
  {
    "path": "samples/pelican.conf.py",
    "content": "AUTHOR = \"Alexis Métaireau\"\nSITENAME = \"Alexis' log\"\nSITESUBTITLE = \"A personal blog.\"\nSITEURL = \"http://blog.notmyidea.org\"\nTIMEZONE = \"Europe/Paris\"\n\n# can be useful in development, but set to False when you're ready to publish\nRELATIVE_URLS = True\n\nGITHUB_URL = \"http://github.com/ametaireau/\"\nDISQUS_SITENAME = \"blog-notmyidea\"\nREVERSE_CATEGORY_ORDER = True\nLOCALE = \"C\"\nDEFAULT_PAGINATION = 4\nDEFAULT_DATE = (2012, 3, 2, 14, 1, 1)\n\nFEED_ALL_RSS = \"feeds/all.rss.xml\"\nCATEGORY_FEED_RSS = \"feeds/{slug}.rss.xml\"\n\nLINKS = [\n    (\"Biologeek\", \"http://biologeek.org\"),\n    (\"Filyb\", \"http://filyb.info/\"),\n    (\"Libert-fr\", \"http://www.libert-fr.com\"),\n    (\"N1k0\", \"http://prendreuncafe.com/blog/\"),\n    (\"Tarek Ziadé\", \"http://ziade.org/blog\"),\n    (\"Zubin Mithra\", \"http://zubin71.wordpress.com/\"),\n]\n\nSOCIAL = [\n    (\"twitter\", \"http://twitter.com/ametaireau\"),\n    (\"lastfm\", \"http://lastfm.com/user/akounet\"),\n    (\"github\", \"http://github.com/ametaireau\"),\n]\n\n# global metadata to all the contents\nDEFAULT_METADATA = {\"yeah\": \"it is\"}\n\n# path-specific metadata\nEXTRA_PATH_METADATA = {\n    \"extra/robots.txt\": {\"path\": \"robots.txt\"},\n}\n\n# static paths will be copied without parsing their contents\nSTATIC_PATHS = [\n    \"images\",\n    \"extra/robots.txt\",\n]\n\n# custom page generated with a jinja2 template\nTEMPLATE_PAGES = {\"pages/jinja2_template.html\": \"jinja2_template.html\"}\n\n# there is no other HTML content\nREADERS = {\"html\": None}\n\n# code blocks with line numbers\nPYGMENTS_RST_OPTIONS = {\"linenos\": \"table\"}\n\n# foobar will not be used, because it's not in caps. All configuration keys\n# have to be in caps\nfoobar = \"barbaz\"\n"
  },
  {
    "path": "samples/pelican.conf_FR.py",
    "content": "AUTHOR = \"Alexis Métaireau\"\nSITENAME = \"Alexis' log\"\nSITEURL = \"http://blog.notmyidea.org\"\nTIMEZONE = \"Europe/Paris\"\n\n# can be useful in development, but set to False when you're ready to publish\nRELATIVE_URLS = True\n\nGITHUB_URL = \"http://github.com/ametaireau/\"\nDISQUS_SITENAME = \"blog-notmyidea\"\nPDF_GENERATOR = False\nREVERSE_CATEGORY_ORDER = True\nLOCALE = \"fr_FR.UTF-8\"\nDEFAULT_PAGINATION = 4\nDEFAULT_DATE = (2012, 3, 2, 14, 1, 1)\nDEFAULT_DATE_FORMAT = \"%d %B %Y\"\n\nARTICLE_URL = \"posts/{date:%Y}/{date:%B}/{date:%d}/{slug}/\"\nARTICLE_SAVE_AS = ARTICLE_URL + \"index.html\"\n\nFEED_ALL_RSS = \"feeds/all.rss.xml\"\nCATEGORY_FEED_RSS = \"feeds/{slug}.rss.xml\"\n\nLINKS = [\n    (\"Biologeek\", \"http://biologeek.org\"),\n    (\"Filyb\", \"http://filyb.info/\"),\n    (\"Libert-fr\", \"http://www.libert-fr.com\"),\n    (\"N1k0\", \"http://prendreuncafe.com/blog/\"),\n    (\"Tarek Ziadé\", \"http://ziade.org/blog\"),\n    (\"Zubin Mithra\", \"http://zubin71.wordpress.com/\"),\n]\n\nSOCIAL = [\n    (\"twitter\", \"http://twitter.com/ametaireau\"),\n    (\"lastfm\", \"http://lastfm.com/user/akounet\"),\n    (\"github\", \"http://github.com/ametaireau\"),\n]\n\n# global metadata to all the contents\nDEFAULT_METADATA = {\"yeah\": \"it is\"}\n\n# path-specific metadata\nEXTRA_PATH_METADATA = {\n    \"extra/robots.txt\": {\"path\": \"robots.txt\"},\n}\n\n# static paths will be copied without parsing their contents\nSTATIC_PATHS = [\n    \"pictures\",\n    \"extra/robots.txt\",\n]\n\n# custom page generated with a jinja2 template\nTEMPLATE_PAGES = {\"pages/jinja2_template.html\": \"jinja2_template.html\"}\n\n# code blocks with line numbers\nPYGMENTS_RST_OPTIONS = {\"linenos\": \"table\"}\n\n# foobar will not be used, because it's not in caps. All configuration keys\n# have to be in caps\nfoobar = \"barbaz\"\n"
  },
  {
    "path": "samples/theme_standard/a_stylesheet",
    "content": ""
  },
  {
    "path": "samples/theme_standard/a_template",
    "content": ""
  },
  {
    "path": "samples/very/exciting/new/files/bap!",
    "content": ""
  },
  {
    "path": "samples/very/exciting/new/files/boom!",
    "content": ""
  },
  {
    "path": "samples/very/exciting/new/files/wow!",
    "content": ""
  },
  {
    "path": "tasks.py",
    "content": "import os\nfrom pathlib import Path\nfrom shutil import which\n\nfrom invoke import task\nfrom livereload import Server\n\nPKG_NAME = \"pelican\"\nPKG_PATH = Path(PKG_NAME)\nDOCS_PORT = int(os.environ.get(\"DOCS_PORT\", \"8000\"))\nBIN_DIR = \"bin\" if os.name != \"nt\" else \"Scripts\"\nPTY = os.name != \"nt\"\nACTIVE_VENV = os.environ.get(\"VIRTUAL_ENV\", None)\nVENV_HOME = Path(os.environ.get(\"WORKON_HOME\", \"~/virtualenvs\"))\nVENV_PATH = Path(ACTIVE_VENV) if ACTIVE_VENV else (VENV_HOME / PKG_NAME)\nVENV = str(VENV_PATH.expanduser())\nVENV_BIN = Path(VENV) / Path(BIN_DIR)\n\nTOOLS = [\"pdm\", \"pre-commit\", \"psutil\"]\nPDM = which(\"pdm\") or VENV_BIN / \"pdm\"\nPRECOMMIT = which(\"pre-commit\") or VENV_BIN / \"pre-commit\"\n\n\n@task\ndef docbuild(c):\n    \"\"\"Build documentation\"\"\"\n    c.run(f\"{VENV_BIN}/sphinx-build -W docs docs/_build\", pty=PTY)\n\n\n@task(docbuild)\ndef docserve(c):\n    \"\"\"Serve docs at http://localhost:$DOCS_PORT/ (default port is 8000)\"\"\"\n    server = Server()\n    server.watch(\"docs/conf.py\", lambda: docbuild(c))\n    server.watch(\"CONTRIBUTING.rst\", lambda: docbuild(c))\n    server.watch(\"docs/*.rst\", lambda: docbuild(c))\n    server.serve(port=DOCS_PORT, root=\"docs/_build\")\n\n\n@task\ndef tests(c):\n    \"\"\"Run the test suite\"\"\"\n    c.run(f\"{VENV_BIN}/pytest\", pty=PTY)\n\n\n@task\ndef coverage(c):\n    \"\"\"Generate code coverage of running the test suite.\"\"\"\n    c.run(\n        f\"{VENV_BIN}/pytest --cov=pelican --cov-report term-missing \"\n        \"--cov-fail-under 75\",\n        pty=PTY,\n    )\n    c.run(f\"{VENV_BIN}/coverage html\", pty=PTY)\n\n\n@task\ndef formatcode(c, check=False, diff=False):\n    \"\"\"Run Ruff's auto-formatter, optionally with --check or --diff\"\"\"\n    check_flag, diff_flag = \"\", \"\"\n    if check:\n        check_flag = \"--check\"\n    if diff:\n        diff_flag = \"--diff\"\n    c.run(\n        f\"{VENV_BIN}/ruff format {check_flag} {diff_flag} {PKG_PATH} tasks.py\", pty=PTY\n    )\n\n\n@task\ndef ruff(c, fix=False, diff=False):\n    \"\"\"Run Ruff to ensure code meets project standards.\"\"\"\n    diff_flag, fix_flag = \"\", \"\"\n    if fix:\n        fix_flag = \"--fix\"\n    if diff:\n        diff_flag = \"--diff\"\n    c.run(f\"{VENV_BIN}/ruff check {diff_flag} {fix_flag} .\", pty=PTY)\n\n\n@task\ndef lint(c, fix=False, diff=False):\n    \"\"\"Check code style via linting tools.\"\"\"\n    ruff(c, fix=fix, diff=diff)\n    formatcode(c, check=not fix, diff=diff)\n\n\n@task\ndef tools(c):\n    \"\"\"Install tools in the virtual environment if not already on PATH\"\"\"\n    for tool in TOOLS:\n        if not which(tool):\n            c.run(f\"{VENV_BIN}/python -m pip install {tool}\", pty=PTY)\n\n\n@task\ndef precommit(c):\n    \"\"\"Install pre-commit hooks to .git/hooks/pre-commit\"\"\"\n    c.run(f\"{PRECOMMIT} install\", pty=PTY)\n\n\n@task\ndef setup(c):\n    c.run(f\"{VENV_BIN}/python -m pip install -U pip\", pty=PTY)\n    tools(c)\n    c.run(f\"{PDM} install\", pty=PTY)\n    precommit(c)\n\n\n@task\ndef update_functional_tests(c):\n    \"\"\"Update the generated functional test output\"\"\"\n    c.run(\n        f\"bash -c 'LC_ALL=en_US.utf8 pelican -o {PKG_PATH}/tests/output/custom/ \\\n            -s samples/pelican.conf.py samples/content/'\",\n        pty=PTY,\n    )\n    c.run(\n        f\"bash -c 'LC_ALL=fr_FR.utf8 pelican -o {PKG_PATH}/tests/output/custom_locale/ \\\n            -s samples/pelican.conf_FR.py samples/content/'\",\n        pty=PTY,\n    )\n    c.run(\n        f\"bash -c 'LC_ALL=en_US.utf8 pelican -o \\\n            {PKG_PATH}/tests/output/basic/ samples/content/'\",\n        pty=PTY,\n    )\n"
  },
  {
    "path": "tox.ini",
    "content": "[tox]\nenvlist = py{3.10,3.11,3.12,3.13,3.14},docs\n\n[testenv]\nbasepython =\n    py3.10: python3.10\n    py3.11: python3.11\n    py3.12: python3.12\n    py3.13: python3.13\n    py3.14: python3.14\npassenv = *\nusedevelop=True\ndeps =\n    -rrequirements/test.pip\n\ncommands =\n    {envpython} --version\n    pytest -s --cov=pelican --cov-fail-under 75 pelican\n\n[testenv:docs]\nbasepython = python3.11\ndeps =\n    -rrequirements/docs.pip\nchangedir = docs\ncommands =\n    sphinx-build -W -b html -d {envtmpdir}/doctrees . _build/html\n\n[pytest]\nfilterwarnings =\n    default::DeprecationWarning\n    error:.*:Warning:pelican\naddopts = -n auto -r a\n"
  }
]