├── pelican ├── tools │ ├── __init__.py │ └── templates │ │ ├── publishconf.py.jinja2 │ │ └── pelicanconf.py.jinja2 ├── tests │ ├── content │ │ ├── empty.md │ │ ├── empty_with_bom.md │ │ ├── article_draft.md │ │ ├── article_with_typogrify_dashes.md │ │ ├── bad_extension.mmd │ │ ├── article_hidden.md │ │ ├── article_skip.md │ │ ├── article_with_uppercase_metadata.rst │ │ ├── article_with_markdown_and_empty_tags.md │ │ ├── article_with_markdown_markup_extensions.md │ │ ├── article_with_typogrify_dashes.rst │ │ ├── 2012-11-29_rst_w_filename_meta#foo-bar.rst │ │ ├── 2012-11-30_md_w_filename_meta#foo-bar.md │ │ ├── article_without_category.rst │ │ ├── TestCategory │ │ │ ├── article_without_category.rst │ │ │ └── article_with_category.rst │ │ ├── article.rst │ │ ├── article_with_uppercase_metadata.html │ │ ├── article_with_keywords.html │ │ ├── article_with_comments.html │ │ ├── article_with_markdown_and_nested_metadata.md │ │ ├── article_with_multiple_authors.html │ │ ├── article_with_multiple_authors.rst │ │ ├── article_with_null_attributes.html │ │ ├── article_with_template.rst │ │ ├── article_with_markdown_and_summary_metadata_single.md │ │ ├── article_with_mkd_extension.mkd │ │ ├── article_with_mdown_extension.mdown │ │ ├── article_with_markdown_extension.markdown │ │ ├── article_with_multiple_authors_semicolon.rst │ │ ├── article_with_code_block.rst │ │ ├── article_with_metadata.unknownextension │ │ ├── article_with_md_extension.md │ │ ├── article_with_multiple_authors_list.rst │ │ ├── article_with_markdown_and_summary_metadata_multi.md │ │ ├── article_with_multiple_metadata_tags.html │ │ ├── article_with_duplicate_tags_authors.md │ │ ├── article_with_attributes_containing_double_quotes.html │ │ ├── article_with_markdown_and_nonascii_summary.md │ │ ├── article_with_metadata.rst │ │ ├── article_with_nonconformant_meta_tags.html │ │ ├── article_with_capitalized_metadata.rst │ │ ├── article_with_metadata_implicit_dates.html │ │ ├── article_with_metadata.html │ │ ├── article_with_metadata_and_contents.html │ │ ├── article_with_markdown_and_footnote.md │ │ ├── article_with_metadata_explicit_date_implicit_modified.html │ │ ├── article_with_metadata_implicit_date_explicit_modified.html │ │ ├── article_with_metadata_explicit_dates.html │ │ ├── article_with_inline_svg.html │ │ ├── medium_post_content.txt │ │ ├── wordpress_content_decoded │ │ └── wordpress_content_encoded │ ├── mixed_content │ │ ├── fake_image.jpg │ │ ├── subdir │ │ │ └── subdir_fake_image.jpg │ │ └── short_page.md │ ├── dummy_plugins │ │ ├── normal_plugin │ │ │ ├── normal_submodule_plugin │ │ │ │ ├── __init__.py │ │ │ │ ├── subpackage │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── subpackage.py │ │ │ │ └── subplugin.py │ │ │ └── normal_plugin │ │ │ │ ├── submodule.py │ │ │ │ └── __init__.py │ │ └── namespace_plugin │ │ │ └── pelican │ │ │ └── plugins │ │ │ └── ns_plugin │ │ │ └── __init__.py │ ├── output │ │ ├── custom │ │ │ ├── robots.txt │ │ │ ├── pictures │ │ │ │ ├── Sushi.jpg │ │ │ │ ├── Fat_Cat.jpg │ │ │ │ └── Sushi_Macro.jpg │ │ │ ├── theme │ │ │ │ ├── fonts │ │ │ │ │ ├── Yanone_Kaffeesatz_400.eot │ │ │ │ │ ├── Yanone_Kaffeesatz_400.ttf │ │ │ │ │ ├── Yanone_Kaffeesatz_400.woff │ │ │ │ │ ├── Yanone_Kaffeesatz_400.woff2 │ │ │ │ │ └── font.css │ │ │ │ └── css │ │ │ │ │ ├── typogrify.css │ │ │ │ │ ├── fonts.css │ │ │ │ │ ├── wide.css │ │ │ │ │ ├── reset.css │ │ │ │ │ └── pygment.css │ │ │ └── feeds │ │ │ │ ├── yeah.rss.xml │ │ │ │ ├── bar.rss.xml │ │ │ │ ├── bar.atom.xml │ │ │ │ ├── all-fr.atom.xml │ │ │ │ ├── yeah.atom.xml │ │ │ │ ├── cat1.rss.xml │ │ │ │ └── cat1.atom.xml │ │ ├── custom_locale │ │ │ ├── robots.txt │ │ │ ├── pictures │ │ │ │ ├── Sushi.jpg │ │ │ │ ├── Fat_Cat.jpg │ │ │ │ └── Sushi_Macro.jpg │ │ │ ├── theme │ │ │ │ ├── fonts │ │ │ │ │ ├── Yanone_Kaffeesatz_400.eot │ │ │ │ │ ├── Yanone_Kaffeesatz_400.ttf │ │ │ │ │ ├── Yanone_Kaffeesatz_400.woff │ │ │ │ │ ├── Yanone_Kaffeesatz_400.woff2 │ │ │ │ │ └── font.css │ │ │ │ └── css │ │ │ │ │ ├── typogrify.css │ │ │ │ │ ├── fonts.css │ │ │ │ │ ├── wide.css │ │ │ │ │ ├── reset.css │ │ │ │ │ └── pygment.css │ │ │ └── feeds │ │ │ │ ├── yeah.rss.xml │ │ │ │ ├── bar.atom.xml │ │ │ │ ├── bar.rss.xml │ │ │ │ ├── all-fr.atom.xml │ │ │ │ ├── yeah.atom.xml │ │ │ │ ├── cat1.rss.xml │ │ │ │ └── cat1.atom.xml │ │ └── basic │ │ │ ├── pictures │ │ │ ├── Fat_Cat.jpg │ │ │ ├── Sushi.jpg │ │ │ └── Sushi_Macro.jpg │ │ │ ├── theme │ │ │ ├── fonts │ │ │ │ ├── Yanone_Kaffeesatz_400.eot │ │ │ │ ├── Yanone_Kaffeesatz_400.ttf │ │ │ │ ├── Yanone_Kaffeesatz_400.woff │ │ │ │ ├── Yanone_Kaffeesatz_400.woff2 │ │ │ │ └── font.css │ │ │ └── css │ │ │ │ ├── typogrify.css │ │ │ │ ├── fonts.css │ │ │ │ ├── wide.css │ │ │ │ ├── reset.css │ │ │ │ └── pygment.css │ │ │ ├── feeds │ │ │ ├── bar.atom.xml │ │ │ ├── all-fr.atom.xml │ │ │ ├── alexis-metaireau.rss.xml │ │ │ ├── yeah.atom.xml │ │ │ ├── cat1.atom.xml │ │ │ └── alexis-metaireau.atom.xml │ │ │ ├── tag │ │ │ └── oh.html │ │ │ ├── authors.html │ │ │ ├── override │ │ │ └── index.html │ │ │ ├── pages │ │ │ ├── this-is-a-test-hidden-page.html │ │ │ └── this-is-a-test-page.html │ │ │ ├── categories.html │ │ │ └── tags.html │ ├── simple_content │ │ └── article_with_md_extension.md │ ├── nested_content │ │ └── maindir │ │ │ ├── maindir.md │ │ │ └── subdir │ │ │ └── subdir.md │ ├── parse_error │ │ └── parse_error.rst │ ├── TestPages │ │ ├── page.rst │ │ ├── page_with_category_and_tag_links.md │ │ ├── page_with_static_links.md │ │ ├── draft_page.rst │ │ ├── page_used_for_sorting_test.rst │ │ ├── hidden_page.rst │ │ ├── bad_page.rst │ │ ├── page_markdown.md │ │ ├── page_with_template.rst │ │ ├── draft_page_markdown.md │ │ ├── hidden_page_markdown.md │ │ ├── draft_page_with_template.rst │ │ └── hidden_page_with_template.rst │ ├── theme_overrides │ │ ├── level1 │ │ │ └── article.html │ │ └── level2 │ │ │ ├── article.html │ │ │ └── authors.html │ ├── build_test │ │ ├── conftest.py │ │ └── test_build_files.py │ ├── cyclic_intersite_links │ │ ├── first-article.rst │ │ ├── second-article.rst │ │ └── third-article.rst │ ├── test_testsuite.py │ ├── __init__.py │ ├── test_rstdirectives.py │ ├── default_conf.py │ ├── test_server.py │ ├── test_log.py │ └── test_cli.py ├── themes │ ├── notmyidea │ │ ├── templates │ │ │ ├── analytics.html │ │ │ ├── tag.html │ │ │ ├── author.html │ │ │ ├── category.html │ │ │ ├── comments.html │ │ │ ├── taglist.html │ │ │ ├── twitter.html │ │ │ ├── archives.html │ │ │ ├── period_archives.html │ │ │ ├── tags.html │ │ │ ├── authors.html │ │ │ ├── categories.html │ │ │ ├── disqus_script.html │ │ │ ├── translations.html │ │ │ ├── github.html │ │ │ ├── page.html │ │ │ ├── article_infos.html │ │ │ ├── article.html │ │ │ └── index.html │ │ └── static │ │ │ ├── fonts │ │ │ ├── Yanone_Kaffeesatz_400.eot │ │ │ ├── Yanone_Kaffeesatz_400.ttf │ │ │ ├── Yanone_Kaffeesatz_400.woff │ │ │ ├── Yanone_Kaffeesatz_400.woff2 │ │ │ └── font.css │ │ │ └── css │ │ │ ├── typogrify.css │ │ │ ├── fonts.css │ │ │ ├── wide.css │ │ │ ├── reset.css │ │ │ └── pygment.css │ └── simple │ │ └── templates │ │ ├── tag.html │ │ ├── author.html │ │ ├── category.html │ │ ├── tags.html │ │ ├── authors.html │ │ ├── categories.html │ │ ├── archives.html │ │ ├── period_archives.html │ │ ├── translations.html │ │ ├── pagination.html │ │ ├── page.html │ │ ├── index.html │ │ └── article.html ├── __main__.py ├── signals.py └── plugins │ └── signals.py ├── samples ├── kinda │ └── exciting │ │ ├── old │ │ └── new │ │ └── files │ │ └── zap! ├── theme_standard │ ├── a_template │ └── a_stylesheet ├── very │ └── exciting │ │ └── new │ │ └── files │ │ ├── bap! │ │ ├── boom! │ │ └── wow! ├── content │ ├── unwanted_file │ ├── extra │ │ └── robots.txt │ ├── cat1 │ │ ├── article2.rst │ │ ├── article3.rst │ │ ├── article1.rst │ │ └── markdown-article.md │ ├── pictures │ │ ├── Sushi.jpg │ │ ├── Fat_Cat.jpg │ │ └── Sushi_Macro.jpg │ ├── 2012-11-30_filename-metadata.rst │ ├── pages │ │ ├── jinja2_template.html │ │ ├── override_tag_oh.rst │ │ ├── hidden_page.rst │ │ ├── override_url_saveas.rst │ │ └── test_page.rst │ ├── another_super_article-fr.rst │ ├── article2.rst │ ├── article2-fr.rst │ ├── article_tag_baz.rst │ ├── draft_article.rst │ ├── draft_article without_date.rst │ ├── another_super_article.rst │ ├── super_article.rst │ └── unbelievable.rst ├── pelican.conf.py └── pelican.conf_FR.py ├── requirements ├── developer.pip ├── owner.pip ├── docs.pip └── test.pip ├── .github ├── CODEOWNERS ├── FUNDING.yml ├── dependabot.yml ├── ISSUE_TEMPLATE │ ├── config.yml │ ├── ---documentation.md │ ├── ---enhancement-request.md │ └── ---bug-report.md ├── pull_request_template.md └── stale.yml ├── .coveragerc ├── docs ├── _static │ ├── uml.jpg │ ├── overall.png │ ├── theme-basic.zip │ └── theme_overrides.css ├── locale │ └── zh_CN │ │ └── LC_MESSAGES │ │ └── sphinx.po ├── index.rst ├── quickstart.rst └── conf.py ├── .vale.ini ├── .editorconfig ├── .gitignore ├── .gitattributes ├── .readthedocs.yaml ├── tox.ini ├── .pre-commit-config.yaml ├── .git-blame-ignore-revs └── .mailmap /pelican/tools/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /samples/kinda/exciting/old: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /pelican/tests/content/empty.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /samples/theme_standard/a_template: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /samples/kinda/exciting/new/files/zap!: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /samples/theme_standard/a_stylesheet: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /samples/very/exciting/new/files/bap!: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /samples/very/exciting/new/files/boom!: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /samples/very/exciting/new/files/wow!: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /pelican/tests/mixed_content/fake_image.jpg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /pelican/tests/content/empty_with_bom.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /samples/content/unwanted_file: -------------------------------------------------------------------------------- 1 | not to be parsed 2 | -------------------------------------------------------------------------------- /pelican/tests/mixed_content/subdir/subdir_fake_image.jpg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /requirements/developer.pip: -------------------------------------------------------------------------------- 1 | -r test.pip 2 | -r docs.pip 3 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | .github/workflows/github_pages.yml @seanh 2 | -------------------------------------------------------------------------------- /pelican/tests/dummy_plugins/normal_plugin/normal_submodule_plugin/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /samples/content/extra/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: /pictures 3 | -------------------------------------------------------------------------------- /pelican/tests/output/custom/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: /pictures 3 | -------------------------------------------------------------------------------- /pelican/tests/dummy_plugins/normal_plugin/normal_submodule_plugin/subpackage/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /pelican/tests/output/custom_locale/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: /pictures 3 | -------------------------------------------------------------------------------- /.coveragerc: -------------------------------------------------------------------------------- 1 | [report] 2 | omit = 3 | pelican/tests/* 4 | pelican/signals.py 5 | -------------------------------------------------------------------------------- /requirements/owner.pip: -------------------------------------------------------------------------------- 1 | -r developer.pip 2 | 3 | # Release issuance 4 | tox 5 | wheel 6 | -------------------------------------------------------------------------------- /docs/_static/uml.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/getpelican/pelican/HEAD/docs/_static/uml.jpg -------------------------------------------------------------------------------- /pelican/tests/dummy_plugins/normal_plugin/normal_plugin/submodule.py: -------------------------------------------------------------------------------- 1 | def noop(): 2 | pass 3 | -------------------------------------------------------------------------------- /pelican/tests/simple_content/article_with_md_extension.md: -------------------------------------------------------------------------------- 1 | ../content/article_with_md_extension.md -------------------------------------------------------------------------------- /docs/_static/overall.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/getpelican/pelican/HEAD/docs/_static/overall.png -------------------------------------------------------------------------------- /pelican/tests/mixed_content/short_page.md: -------------------------------------------------------------------------------- 1 | Title: Short Page 2 | 3 | This is a page with little text. 4 | -------------------------------------------------------------------------------- /samples/content/cat1/article2.rst: -------------------------------------------------------------------------------- 1 | Article 2 2 | ######### 3 | 4 | :date: 2011-02-17 5 | 6 | Article 2 7 | -------------------------------------------------------------------------------- /samples/content/cat1/article3.rst: -------------------------------------------------------------------------------- 1 | Article 3 2 | ######### 3 | 4 | :date: 2011-02-17 5 | 6 | Article 3 7 | -------------------------------------------------------------------------------- /docs/_static/theme-basic.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/getpelican/pelican/HEAD/docs/_static/theme-basic.zip -------------------------------------------------------------------------------- /pelican/tests/dummy_plugins/normal_plugin/normal_submodule_plugin/subplugin.py: -------------------------------------------------------------------------------- 1 | def register(): 2 | pass 3 | -------------------------------------------------------------------------------- /pelican/tests/nested_content/maindir/maindir.md: -------------------------------------------------------------------------------- 1 | Title: Main Dir Page 2 | 3 | This page lives in maindir. 4 | -------------------------------------------------------------------------------- /pelican/themes/notmyidea/templates/analytics.html: -------------------------------------------------------------------------------- 1 | {% if ANALYTICS %} 2 | {{ ANALYTICS }} 3 | {% endif %} 4 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | github: justinmayer 4 | custom: https://donate.getpelican.com 5 | liberapay: pelican 6 | -------------------------------------------------------------------------------- /pelican/tests/dummy_plugins/normal_plugin/normal_submodule_plugin/subpackage/subpackage.py: -------------------------------------------------------------------------------- 1 | def register(): 2 | pass 3 | -------------------------------------------------------------------------------- /pelican/tests/nested_content/maindir/subdir/subdir.md: -------------------------------------------------------------------------------- 1 | Title: Subdir Page 2 | 3 | This page lives in maindir/subdir. 4 | -------------------------------------------------------------------------------- /samples/content/pictures/Sushi.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/getpelican/pelican/HEAD/samples/content/pictures/Sushi.jpg -------------------------------------------------------------------------------- /pelican/tests/parse_error/parse_error.rst: -------------------------------------------------------------------------------- 1 | Page with a parse error 2 | ############# 3 | 4 | The underline is too short. 5 | -------------------------------------------------------------------------------- /samples/content/cat1/article1.rst: -------------------------------------------------------------------------------- 1 | Article 1 2 | ######### 3 | 4 | :date: 2011-02-17 5 | :yeah: oh yeah ! 6 | 7 | Article 1 8 | -------------------------------------------------------------------------------- /samples/content/pictures/Fat_Cat.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/getpelican/pelican/HEAD/samples/content/pictures/Fat_Cat.jpg -------------------------------------------------------------------------------- /pelican/tests/content/article_draft.md: -------------------------------------------------------------------------------- 1 | Title: Draft article 2 | Date: 2012-10-31 3 | Status: draft 4 | 5 | This is some content. 6 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_typogrify_dashes.md: -------------------------------------------------------------------------------- 1 | Title: One -, two --, three --- dashes! 2 | 3 | One: -; Two: --; Three: --- 4 | -------------------------------------------------------------------------------- /requirements/docs.pip: -------------------------------------------------------------------------------- 1 | sphinx 2 | sphinxext-opengraph 3 | furo==2023.9.10 4 | livereload 5 | matplotlib 6 | tomli;python_version<"3.11" 7 | -------------------------------------------------------------------------------- /samples/content/2012-11-30_filename-metadata.rst: -------------------------------------------------------------------------------- 1 | FILENAME_METADATA example 2 | ######################### 3 | 4 | Some cool stuff! 5 | -------------------------------------------------------------------------------- /samples/content/pictures/Sushi_Macro.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/getpelican/pelican/HEAD/samples/content/pictures/Sushi_Macro.jpg -------------------------------------------------------------------------------- /pelican/tests/TestPages/page.rst: -------------------------------------------------------------------------------- 1 | This is a test page 2 | ################### 3 | 4 | The quick brown fox jumped over the lazy dog's back. 5 | -------------------------------------------------------------------------------- /pelican/tests/content/bad_extension.mmd: -------------------------------------------------------------------------------- 1 | Title: Bad Extension 2 | 3 | This file shouldn't be included because its file extension is `.mmd`. 4 | -------------------------------------------------------------------------------- /samples/content/pages/jinja2_template.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block content %} 3 | 4 | Some text 5 | 6 | {% endblock %} 7 | -------------------------------------------------------------------------------- /pelican/tests/content/article_hidden.md: -------------------------------------------------------------------------------- 1 | Title: Hidden article 2 | Date: 2012-10-31 3 | Status: hidden 4 | 5 | This is some unlisted content. 6 | -------------------------------------------------------------------------------- /pelican/tests/content/article_skip.md: -------------------------------------------------------------------------------- 1 | Title: Skipped article 2 | Date: 2024-06-30 3 | Status: skip 4 | 5 | This content will not be rendered. 6 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_uppercase_metadata.rst: -------------------------------------------------------------------------------- 1 | 2 | This is a super article ! 3 | ######################### 4 | 5 | :Category: Yeah 6 | -------------------------------------------------------------------------------- /pelican/tests/output/basic/pictures/Fat_Cat.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/getpelican/pelican/HEAD/pelican/tests/output/basic/pictures/Fat_Cat.jpg -------------------------------------------------------------------------------- /pelican/tests/output/basic/pictures/Sushi.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/getpelican/pelican/HEAD/pelican/tests/output/basic/pictures/Sushi.jpg -------------------------------------------------------------------------------- /pelican/tests/output/custom/pictures/Sushi.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/getpelican/pelican/HEAD/pelican/tests/output/custom/pictures/Sushi.jpg -------------------------------------------------------------------------------- /pelican/themes/notmyidea/templates/tag.html: -------------------------------------------------------------------------------- 1 | {% extends "index.html" %} 2 | {% block title %}{{ SITENAME|striptags }} - {{ tag }}{% endblock %} 3 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_markdown_and_empty_tags.md: -------------------------------------------------------------------------------- 1 | Title: Article with markdown and empty tags 2 | Tags: 3 | 4 | This is some content. 5 | -------------------------------------------------------------------------------- /pelican/tests/output/custom/pictures/Fat_Cat.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/getpelican/pelican/HEAD/pelican/tests/output/custom/pictures/Fat_Cat.jpg -------------------------------------------------------------------------------- /pelican/themes/notmyidea/templates/author.html: -------------------------------------------------------------------------------- 1 | {% extends "index.html" %} 2 | {% block title %}{{ SITENAME|striptags }} - {{ author }}{% endblock %} 3 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_markdown_markup_extensions.md: -------------------------------------------------------------------------------- 1 | Title: Test Markdown extensions 2 | 3 | [TOC] 4 | 5 | ## Level1 6 | 7 | ### Level2 8 | -------------------------------------------------------------------------------- /pelican/tests/dummy_plugins/namespace_plugin/pelican/plugins/ns_plugin/__init__.py: -------------------------------------------------------------------------------- 1 | NAME = "namespace plugin" 2 | 3 | 4 | def register(): 5 | pass 6 | -------------------------------------------------------------------------------- /pelican/tests/dummy_plugins/normal_plugin/normal_plugin/__init__.py: -------------------------------------------------------------------------------- 1 | from .submodule import noop # noqa: F401 2 | 3 | 4 | def register(): 5 | pass 6 | -------------------------------------------------------------------------------- /pelican/tests/output/basic/pictures/Sushi_Macro.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/getpelican/pelican/HEAD/pelican/tests/output/basic/pictures/Sushi_Macro.jpg -------------------------------------------------------------------------------- /pelican/tests/output/custom/pictures/Sushi_Macro.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/getpelican/pelican/HEAD/pelican/tests/output/custom/pictures/Sushi_Macro.jpg -------------------------------------------------------------------------------- /pelican/themes/notmyidea/templates/category.html: -------------------------------------------------------------------------------- 1 | {% extends "index.html" %} 2 | {% block title %}{{ SITENAME|striptags }} - {{ category }}{% endblock %} 3 | -------------------------------------------------------------------------------- /pelican/tests/output/custom_locale/pictures/Sushi.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/getpelican/pelican/HEAD/pelican/tests/output/custom_locale/pictures/Sushi.jpg -------------------------------------------------------------------------------- /pelican/tests/content/article_with_typogrify_dashes.rst: -------------------------------------------------------------------------------- 1 | One -, two --, three --- dashes! 2 | ################################ 3 | 4 | One: -; Two: --; Three: --- 5 | -------------------------------------------------------------------------------- /pelican/tests/output/custom_locale/pictures/Fat_Cat.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/getpelican/pelican/HEAD/pelican/tests/output/custom_locale/pictures/Fat_Cat.jpg -------------------------------------------------------------------------------- /pelican/tests/theme_overrides/level1/article.html: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /pelican/tests/theme_overrides/level2/article.html: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /pelican/tests/theme_overrides/level2/authors.html: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /pelican/tests/output/custom_locale/pictures/Sushi_Macro.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/getpelican/pelican/HEAD/pelican/tests/output/custom_locale/pictures/Sushi_Macro.jpg -------------------------------------------------------------------------------- /pelican/__main__.py: -------------------------------------------------------------------------------- 1 | """ 2 | python -m pelican module entry point to run via python -m 3 | """ 4 | 5 | from . import main 6 | 7 | if __name__ == "__main__": 8 | main() 9 | -------------------------------------------------------------------------------- /pelican/tests/TestPages/page_with_category_and_tag_links.md: -------------------------------------------------------------------------------- 1 | Title: Page with a bunch of links 2 | 3 | My links: 4 | 5 | [Link 1]({tag}マック) 6 | 7 | [Link 2]({category}Yeah) 8 | -------------------------------------------------------------------------------- /pelican/tests/TestPages/page_with_static_links.md: -------------------------------------------------------------------------------- 1 | Title: Page with static links 2 | 3 | My links: 4 | 5 | [Link 0]({static}image0.jpg) 6 | 7 | [Link 1]({attach}image1.jpg) 8 | -------------------------------------------------------------------------------- /pelican/themes/notmyidea/templates/comments.html: -------------------------------------------------------------------------------- 1 | {% if DISQUS_SITENAME %}

There are comments.

{% endif %} 2 | -------------------------------------------------------------------------------- /pelican/tests/output/basic/theme/fonts/Yanone_Kaffeesatz_400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/getpelican/pelican/HEAD/pelican/tests/output/basic/theme/fonts/Yanone_Kaffeesatz_400.eot -------------------------------------------------------------------------------- /pelican/tests/output/basic/theme/fonts/Yanone_Kaffeesatz_400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/getpelican/pelican/HEAD/pelican/tests/output/basic/theme/fonts/Yanone_Kaffeesatz_400.ttf -------------------------------------------------------------------------------- /pelican/themes/notmyidea/static/fonts/Yanone_Kaffeesatz_400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/getpelican/pelican/HEAD/pelican/themes/notmyidea/static/fonts/Yanone_Kaffeesatz_400.eot -------------------------------------------------------------------------------- /pelican/themes/notmyidea/static/fonts/Yanone_Kaffeesatz_400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/getpelican/pelican/HEAD/pelican/themes/notmyidea/static/fonts/Yanone_Kaffeesatz_400.ttf -------------------------------------------------------------------------------- /pelican/themes/notmyidea/static/fonts/Yanone_Kaffeesatz_400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/getpelican/pelican/HEAD/pelican/themes/notmyidea/static/fonts/Yanone_Kaffeesatz_400.woff -------------------------------------------------------------------------------- /samples/content/another_super_article-fr.rst: -------------------------------------------------------------------------------- 1 | Trop bien ! 2 | ########### 3 | 4 | :date: 2010-10-20 10:14 5 | :lang: fr 6 | :slug: oh-yeah 7 | 8 | Et voila du contenu en français 9 | -------------------------------------------------------------------------------- /pelican/tests/TestPages/draft_page.rst: -------------------------------------------------------------------------------- 1 | This is a test draft page 2 | ########################## 3 | 4 | :status: draft 5 | 6 | The quick brown fox . 7 | 8 | This page is a draft. 9 | -------------------------------------------------------------------------------- /pelican/tests/content/2012-11-29_rst_w_filename_meta#foo-bar.rst: -------------------------------------------------------------------------------- 1 | 2 | Rst with filename metadata 3 | ########################## 4 | 5 | :category: yeah 6 | :author: Alexis Métaireau 7 | -------------------------------------------------------------------------------- /pelican/tests/content/2012-11-30_md_w_filename_meta#foo-bar.md: -------------------------------------------------------------------------------- 1 | category: yeah 2 | author: Alexis Métaireau 3 | 4 | Markdown with filename metadata 5 | =============================== 6 | -------------------------------------------------------------------------------- /pelican/tests/output/basic/theme/fonts/Yanone_Kaffeesatz_400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/getpelican/pelican/HEAD/pelican/tests/output/basic/theme/fonts/Yanone_Kaffeesatz_400.woff -------------------------------------------------------------------------------- /pelican/tests/output/basic/theme/fonts/Yanone_Kaffeesatz_400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/getpelican/pelican/HEAD/pelican/tests/output/basic/theme/fonts/Yanone_Kaffeesatz_400.woff2 -------------------------------------------------------------------------------- /pelican/tests/output/custom/theme/fonts/Yanone_Kaffeesatz_400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/getpelican/pelican/HEAD/pelican/tests/output/custom/theme/fonts/Yanone_Kaffeesatz_400.eot -------------------------------------------------------------------------------- /pelican/tests/output/custom/theme/fonts/Yanone_Kaffeesatz_400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/getpelican/pelican/HEAD/pelican/tests/output/custom/theme/fonts/Yanone_Kaffeesatz_400.ttf -------------------------------------------------------------------------------- /pelican/tests/output/custom/theme/fonts/Yanone_Kaffeesatz_400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/getpelican/pelican/HEAD/pelican/tests/output/custom/theme/fonts/Yanone_Kaffeesatz_400.woff -------------------------------------------------------------------------------- /pelican/tests/output/custom/theme/fonts/Yanone_Kaffeesatz_400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/getpelican/pelican/HEAD/pelican/tests/output/custom/theme/fonts/Yanone_Kaffeesatz_400.woff2 -------------------------------------------------------------------------------- /pelican/themes/notmyidea/static/fonts/Yanone_Kaffeesatz_400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/getpelican/pelican/HEAD/pelican/themes/notmyidea/static/fonts/Yanone_Kaffeesatz_400.woff2 -------------------------------------------------------------------------------- /pelican/signals.py: -------------------------------------------------------------------------------- 1 | raise ImportError( 2 | "Importing from `pelican.signals` is deprecated. " 3 | "Use `from pelican import signals` or `import pelican.plugins.signals` instead." 4 | ) 5 | -------------------------------------------------------------------------------- /pelican/tests/content/article_without_category.rst: -------------------------------------------------------------------------------- 1 | 2 | This is an article without category ! 3 | ##################################### 4 | 5 | This article should be in the DEFAULT_CATEGORY. 6 | -------------------------------------------------------------------------------- /pelican/tests/output/custom_locale/theme/fonts/Yanone_Kaffeesatz_400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/getpelican/pelican/HEAD/pelican/tests/output/custom_locale/theme/fonts/Yanone_Kaffeesatz_400.eot -------------------------------------------------------------------------------- /pelican/tests/output/custom_locale/theme/fonts/Yanone_Kaffeesatz_400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/getpelican/pelican/HEAD/pelican/tests/output/custom_locale/theme/fonts/Yanone_Kaffeesatz_400.ttf -------------------------------------------------------------------------------- /.vale.ini: -------------------------------------------------------------------------------- 1 | StylesPath = .vale/styles 2 | 3 | Vocab = Pelican 4 | 5 | MinAlertLevel = suggestion 6 | 7 | Packages = proselint, alex 8 | 9 | [*] 10 | BasedOnStyles = Vale, proselint, alex 11 | -------------------------------------------------------------------------------- /pelican/tests/output/custom_locale/theme/fonts/Yanone_Kaffeesatz_400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/getpelican/pelican/HEAD/pelican/tests/output/custom_locale/theme/fonts/Yanone_Kaffeesatz_400.woff -------------------------------------------------------------------------------- /pelican/tests/output/custom_locale/theme/fonts/Yanone_Kaffeesatz_400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/getpelican/pelican/HEAD/pelican/tests/output/custom_locale/theme/fonts/Yanone_Kaffeesatz_400.woff2 -------------------------------------------------------------------------------- /pelican/themes/notmyidea/templates/taglist.html: -------------------------------------------------------------------------------- 1 | {% if article.tags %}

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

{% endif %} 2 | -------------------------------------------------------------------------------- /pelican/tests/content/TestCategory/article_without_category.rst: -------------------------------------------------------------------------------- 1 | This is an article without category ! 2 | ##################################### 3 | 4 | This article should be in 'TestCategory' category. 5 | -------------------------------------------------------------------------------- /pelican/tests/content/article.rst: -------------------------------------------------------------------------------- 1 | Article title 2 | ############# 3 | 4 | THIS is some content. With some stuff to "typogrify"... 5 | 6 | Now with added support for :abbr:`TLA (three letter acronym)`. 7 | -------------------------------------------------------------------------------- /requirements/test.pip: -------------------------------------------------------------------------------- 1 | # Tests 2 | Pygments>=2.19.0 3 | pytest 4 | pytest-cov 5 | pytest-xdist[psutil] 6 | 7 | # Optional Packages 8 | Markdown>=3.5.1 9 | BeautifulSoup4 10 | lxml 11 | typogrify 12 | -------------------------------------------------------------------------------- /pelican/tests/TestPages/page_used_for_sorting_test.rst: -------------------------------------------------------------------------------- 1 | A Page (Test) for sorting 2 | ######################### 3 | 4 | :slug: zzzz 5 | 6 | When using title, should be first. When using slug, should be last. 7 | -------------------------------------------------------------------------------- /samples/content/article2.rst: -------------------------------------------------------------------------------- 1 | Second article 2 | ############## 3 | 4 | :tags: foo, bar, baz 5 | :date: 2012-02-29 6 | :lang: en 7 | :slug: second-article 8 | 9 | This is some article, in english 10 | -------------------------------------------------------------------------------- /pelican/tests/TestPages/hidden_page.rst: -------------------------------------------------------------------------------- 1 | This is a test hidden page 2 | ########################## 3 | 4 | :status: hidden 5 | 6 | The quick brown fox jumped over the lazy dog's back. 7 | 8 | This page is hidden 9 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_uppercase_metadata.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | This is a super article ! 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /samples/content/article2-fr.rst: -------------------------------------------------------------------------------- 1 | Deuxième article 2 | ################ 3 | 4 | :tags: foo, bar, baz 5 | :date: 2012-02-29 6 | :lang: fr 7 | :slug: second-article 8 | 9 | Ceci est un article, en français. 10 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_keywords.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | This is a super article ! 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /samples/content/pages/override_tag_oh.rst: -------------------------------------------------------------------------------- 1 | Oh Oh Oh 2 | ######## 3 | 4 | :date: 2010-03-14 5 | :url: tag/oh.html 6 | :save_as: tag/oh.html 7 | 8 | This page overrides the listening of the articles under the *oh* tag. 9 | -------------------------------------------------------------------------------- /samples/content/article_tag_baz.rst: -------------------------------------------------------------------------------- 1 | The baz tag 2 | ########### 3 | 4 | :date: 2010-03-14 5 | :url: tag/baz.html 6 | :save_as: tag/baz.html 7 | 8 | This article overrides the listening of the articles under the *baz* tag. 9 | -------------------------------------------------------------------------------- /pelican/tests/build_test/conftest.py: -------------------------------------------------------------------------------- 1 | def pytest_addoption(parser): 2 | parser.addoption( 3 | "--check-build", 4 | action="store", 5 | default=False, 6 | help="Check wheel contents.", 7 | ) 8 | -------------------------------------------------------------------------------- /pelican/tests/content/TestCategory/article_with_category.rst: -------------------------------------------------------------------------------- 1 | This is an article with category ! 2 | ################################## 3 | 4 | :category: yeah 5 | :date: 1970-01-01 6 | 7 | This article should be in 'yeah' category. 8 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_comments.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Body content 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_markdown_and_nested_metadata.md: -------------------------------------------------------------------------------- 1 | Title: Article with markdown and nested summary metadata 2 | Date: 2012-10-30 3 | Summary: Test: This metadata value looks like metadata 4 | 5 | This is some content. 6 | -------------------------------------------------------------------------------- /samples/content/draft_article.rst: -------------------------------------------------------------------------------- 1 | A draft article 2 | ############### 3 | 4 | :date: 2011-05-08 15:58 5 | :status: draft 6 | 7 | This is a draft article, it should live under the /drafts/ folder and not be 8 | listed anywhere else. 9 | -------------------------------------------------------------------------------- /pelican/tests/TestPages/bad_page.rst: -------------------------------------------------------------------------------- 1 | This is a test bad page 2 | ####################### 3 | 4 | :status: invalid 5 | 6 | The quick brown fox jumped over the lazy dog's back. 7 | 8 | The status here is invalid, the page should not render. 9 | -------------------------------------------------------------------------------- /pelican/tests/output/basic/theme/css/typogrify.css: -------------------------------------------------------------------------------- 1 | .caps {font-size:.92em;} 2 | .amp {color:#666; font-size:1.05em;font-family:"Warnock Pro", "Goudy Old Style","Palatino","Book Antiqua",serif; font-style:italic;} 3 | .dquo {margin-left:-.38em;} 4 | -------------------------------------------------------------------------------- /pelican/themes/notmyidea/static/css/typogrify.css: -------------------------------------------------------------------------------- 1 | .caps {font-size:.92em;} 2 | .amp {color:#666; font-size:1.05em;font-family:"Warnock Pro", "Goudy Old Style","Palatino","Book Antiqua",serif; font-style:italic;} 3 | .dquo {margin-left:-.38em;} 4 | -------------------------------------------------------------------------------- /samples/content/draft_article without_date.rst: -------------------------------------------------------------------------------- 1 | A draft article without date 2 | ############################ 3 | 4 | :status: draft 5 | 6 | This is a draft article, it should live under the /drafts/ folder and not be 7 | listed anywhere else. 8 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_multiple_authors.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | This is an article with multiple authors! 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /pelican/tests/output/custom/theme/css/typogrify.css: -------------------------------------------------------------------------------- 1 | .caps {font-size:.92em;} 2 | .amp {color:#666; font-size:1.05em;font-family:"Warnock Pro", "Goudy Old Style","Palatino","Book Antiqua",serif; font-style:italic;} 3 | .dquo {margin-left:-.38em;} 4 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_multiple_authors.rst: -------------------------------------------------------------------------------- 1 | This is an article with multiple authors! 2 | ######################################### 3 | 4 | :date: 2014-02-09 02:20 5 | :modified: 2014-02-09 02:20 6 | :authors: First Author, Second Author 7 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_null_attributes.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Ensure that empty attributes are copied properly. 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /pelican/tests/output/custom_locale/theme/css/typogrify.css: -------------------------------------------------------------------------------- 1 | .caps {font-size:.92em;} 2 | .amp {color:#666; font-size:1.05em;font-family:"Warnock Pro", "Goudy Old Style","Palatino","Book Antiqua",serif; font-style:italic;} 3 | .dquo {margin-left:-.38em;} 4 | -------------------------------------------------------------------------------- /pelican/themes/simple/templates/tag.html: -------------------------------------------------------------------------------- 1 | {% extends "index.html" %} 2 | 3 | {% block title %}{{ SITENAME|striptags }} - {{ tag }} tag{% endblock %} 4 | 5 | {% block content_title %} 6 |

Articles tagged with {{ tag }}

7 | {% endblock %} 8 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_template.rst: -------------------------------------------------------------------------------- 1 | Article with template 2 | ##################### 3 | 4 | :template: custom 5 | 6 | This article has a custom template to be called when rendered 7 | 8 | This is some content. With some stuff to "typogrify". 9 | -------------------------------------------------------------------------------- /pelican/themes/simple/templates/author.html: -------------------------------------------------------------------------------- 1 | {% extends "index.html" %} 2 | 3 | {% block title %}{{ SITENAME|striptags }} - Articles by {{ author }}{% endblock %} 4 | 5 | {% block content_title %} 6 |

Articles by {{ author }}

7 | {% endblock %} 8 | -------------------------------------------------------------------------------- /samples/content/pages/hidden_page.rst: -------------------------------------------------------------------------------- 1 | This is a test hidden page 2 | ########################## 3 | 4 | :category: test 5 | :status: hidden 6 | 7 | This is great for things like error(404) pages 8 | Anyone can see this page but it's not linked to anywhere! 9 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_markdown_and_summary_metadata_single.md: -------------------------------------------------------------------------------- 1 | Title: Article with markdown and summary metadata single 2 | Date: 2012-10-30 3 | Summary: A single-line summary should be supported as well as **inline markup**. 4 | 5 | This is some content. 6 | -------------------------------------------------------------------------------- /pelican/tests/TestPages/page_markdown.md: -------------------------------------------------------------------------------- 1 | title: This is a markdown test page 2 | 3 | Test Markdown File Header 4 | ========================= 5 | 6 | Used for pelican test 7 | --------------------- 8 | 9 | The quick brown fox jumped over the lazy dog's back. 10 | -------------------------------------------------------------------------------- /pelican/themes/simple/templates/category.html: -------------------------------------------------------------------------------- 1 | {% extends "index.html" %} 2 | 3 | {% block title %}{{ SITENAME|striptags }} - {{ category }} category{% endblock %} 4 | 5 | {% block content_title %} 6 |

Articles in the {{ category }} category

7 | {% endblock %} 8 | -------------------------------------------------------------------------------- /samples/content/cat1/markdown-article.md: -------------------------------------------------------------------------------- 1 | Title: A markdown powered article 2 | Date: 2011-04-20 3 | 4 | You're mutually oblivious. 5 | 6 | [a root-relative link to unbelievable](|filename|/unbelievable.rst) 7 | [a file-relative link to unbelievable](|filename|../unbelievable.rst) 8 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_size = 4 7 | indent_style = space 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.py] 12 | max_line_length = 88 13 | 14 | [*.{yml,yaml}] 15 | indent_size = 2 16 | -------------------------------------------------------------------------------- /pelican/tests/TestPages/page_with_template.rst: -------------------------------------------------------------------------------- 1 | This is a test page with a preset template 2 | ########################################## 3 | 4 | :template: custom 5 | 6 | The quick brown fox jumped over the lazy dog's back. 7 | 8 | This article has a custom template to be called when rendered 9 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_mkd_extension.mkd: -------------------------------------------------------------------------------- 1 | title: Test mkd File 2 | category: test 3 | 4 | Test Markdown File Header 5 | ========================= 6 | 7 | Used for pelican test 8 | --------------------- 9 | 10 | This is another markdown test file. Uses the mkd extension. 11 | -------------------------------------------------------------------------------- /pelican/tests/cyclic_intersite_links/first-article.rst: -------------------------------------------------------------------------------- 1 | First article 2 | ############# 3 | 4 | :date: 2018-11-10 5 | :summary: Here's the `second <{filename}/second-article.rst>`_, 6 | `third <{filename}/third-article.rst>`_ and a 7 | `nonexistent article <{filename}/nonexistent.rst>`_. 8 | -------------------------------------------------------------------------------- /pelican/tests/cyclic_intersite_links/second-article.rst: -------------------------------------------------------------------------------- 1 | Second article 2 | ############## 3 | 4 | :date: 2018-11-10 5 | :summary: Here's the `first <{filename}/first-article.rst>`_, 6 | `third <{filename}/third-article.rst>`_ and a 7 | `nonexistent article <{filename}/nonexistent.rst>`_. 8 | -------------------------------------------------------------------------------- /pelican/tests/cyclic_intersite_links/third-article.rst: -------------------------------------------------------------------------------- 1 | Third article 2 | ############# 3 | 4 | :date: 2018-11-10 5 | :summary: Here's the `first <{filename}/first-article.rst>`_, 6 | `second <{filename}/second-article.rst>`_ and a 7 | `nonexistent article <{filename}/nonexistent.rst>`_. 8 | -------------------------------------------------------------------------------- /samples/content/pages/override_url_saveas.rst: -------------------------------------------------------------------------------- 1 | Override url/save_as 2 | #################### 3 | 4 | :date: 2012-12-07 5 | :url: override/ 6 | :save_as: override/index.html 7 | 8 | Test page which overrides save_as and url so that this page will be generated 9 | at a custom location. 10 | -------------------------------------------------------------------------------- /pelican/tests/TestPages/draft_page_markdown.md: -------------------------------------------------------------------------------- 1 | title: This is a markdown test draft page 2 | status: draft 3 | 4 | Test Markdown File Header 5 | ========================= 6 | 7 | Used for pelican test 8 | --------------------- 9 | 10 | The quick brown fox . 11 | 12 | This page is a draft 13 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_mdown_extension.mdown: -------------------------------------------------------------------------------- 1 | title: Test mdown File 2 | category: test 3 | 4 | Test Markdown File Header 5 | ========================= 6 | 7 | Used for pelican test 8 | --------------------- 9 | 10 | This is another markdown test file. Uses the mdown extension. 11 | -------------------------------------------------------------------------------- /pelican/tests/test_testsuite.py: -------------------------------------------------------------------------------- 1 | import warnings 2 | 3 | from pelican.tests.support import unittest 4 | 5 | 6 | class TestSuiteTest(unittest.TestCase): 7 | def test_error_on_warning(self): 8 | with self.assertRaises(UserWarning): 9 | warnings.warn("test warning") # noqa: B028 10 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_markdown_extension.markdown: -------------------------------------------------------------------------------- 1 | title: Test markdown File 2 | category: test 3 | 4 | Test Markdown File Header 5 | ========================= 6 | 7 | Used for pelican test 8 | --------------------- 9 | 10 | This is another markdown test file. Uses the markdown extension. 11 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_multiple_authors_semicolon.rst: -------------------------------------------------------------------------------- 1 | This is an article with multiple authors in lastname, firstname format! 2 | ####################################################################### 3 | 4 | :date: 2014-02-09 02:20 5 | :modified: 2014-02-09 02:20 6 | :authors: Author, First; Author, Second 7 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_code_block.rst: -------------------------------------------------------------------------------- 1 | An Article With Code Block To Test Typogrify Ignore 2 | ################################################### 3 | 4 | An article with some code 5 | 6 | .. code-block:: python 7 | 8 | x & y 9 | 10 | A block quote: 11 | 12 | x & y 13 | 14 | Normal: 15 | x & y 16 | -------------------------------------------------------------------------------- /pelican/themes/notmyidea/templates/twitter.html: -------------------------------------------------------------------------------- 1 | {% if TWITTER_USERNAME %} 2 | Tweet 3 | {% endif %} 4 | -------------------------------------------------------------------------------- /pelican/tests/TestPages/hidden_page_markdown.md: -------------------------------------------------------------------------------- 1 | title: This is a markdown test hidden page 2 | status: hidden 3 | 4 | Test Markdown File Header 5 | ========================= 6 | 7 | Used for pelican test 8 | --------------------- 9 | 10 | The quick brown fox jumped over the lazy dog's back. 11 | 12 | This page is hidden 13 | -------------------------------------------------------------------------------- /pelican/tests/TestPages/draft_page_with_template.rst: -------------------------------------------------------------------------------- 1 | This is a test draft page with a custom template 2 | ################################################# 3 | 4 | :status: draft 5 | :template: custom 6 | 7 | The quick brown fox . 8 | 9 | This page is a draft 10 | 11 | This page has a custom template to be called when rendered 12 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # See https://docs.github.com/en/free-pro-team@latest/ 2 | # github/administering-a-repository/enabling-and-disabling-version-updates 3 | --- 4 | version: 2 5 | updates: 6 | - package-ecosystem: "github-actions" 7 | directory: "/" 8 | schedule: 9 | interval: "monthly" 10 | open-pull-requests-limit: 0 11 | -------------------------------------------------------------------------------- /pelican/tests/TestPages/hidden_page_with_template.rst: -------------------------------------------------------------------------------- 1 | This is a test hidden page with a custom template 2 | ################################################# 3 | 4 | :status: hidden 5 | :template: custom 6 | 7 | The quick brown fox jumped over the lazy dog's back. 8 | 9 | This page is hidden 10 | 11 | This page has a custom template to be called when rendered 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.egg-info 2 | .*.swp 3 | .*.swo 4 | *.pyc 5 | .DS_Store 6 | docs/_build 7 | docs/*/_build 8 | build 9 | dist 10 | tags 11 | .tox 12 | .coverage 13 | htmlcov 14 | *.orig 15 | venv 16 | samples/output 17 | *.pem 18 | *.lock 19 | .pdm-python 20 | .vale 21 | .venv 22 | **/LC_MESSAGES/*.mo 23 | 24 | # direnv 25 | .envrc 26 | 27 | # IDE cruft 28 | .idea 29 | .vscode 30 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_metadata.unknownextension: -------------------------------------------------------------------------------- 1 | 2 | This is a super article ! 3 | ######################### 4 | 5 | :tags: foo, bar, foobar 6 | :date: 2010-12-02 10:14 7 | :category: yeah 8 | :author: Alexis Métaireau 9 | :summary: 10 | Multi-line metadata should be supported 11 | as well as **inline markup**. 12 | :custom_field: http://notmyidea.org 13 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_md_extension.md: -------------------------------------------------------------------------------- 1 | Title: Test md File 2 | Category: test 3 | Tags: foo, bar, foobar 4 | Date: 2010-12-02 10:14 5 | Modified: 2010-12-02 10:20 6 | Summary: I have a lot to test 7 | 8 | Test Markdown File Header 9 | ========================= 10 | 11 | Used for pelican test 12 | --------------------- 13 | 14 | The quick brown fox jumped over the lazy dog's back. 15 | -------------------------------------------------------------------------------- /docs/_static/theme_overrides.css: -------------------------------------------------------------------------------- 1 | 2 | /* override table width restrictions */ 3 | .wy-table-responsive table td, .wy-table-responsive table th { 4 | /* !important prevents the common CSS stylesheets from 5 | overriding this as on RTD they are loaded after this stylesheet */ 6 | white-space: normal !important; 7 | } 8 | 9 | .wy-table-responsive { 10 | overflow: visible !important; 11 | } 12 | -------------------------------------------------------------------------------- /samples/content/pages/test_page.rst: -------------------------------------------------------------------------------- 1 | This is a test page 2 | ################### 3 | 4 | :category: test 5 | 6 | Just an image. 7 | 8 | .. image:: {static}/pictures/Fat_Cat.jpg 9 | :height: 450 px 10 | :width: 600 px 11 | :alt: alternate text 12 | 13 | .. image:: |filename|/images/Fat_Cat.jpg 14 | :height: 450 px 15 | :width: 600 px 16 | :alt: wrong path since 'images' folder does not exist 17 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_multiple_authors_list.rst: -------------------------------------------------------------------------------- 1 | This is an article with multiple authors in list format! 2 | ######################################################## 3 | 4 | :date: 2014-02-09 02:20 5 | :modified: 2014-02-09 02:20 6 | :authors: - Author, First 7 | - Author, Second 8 | 9 | The author names are in last,first form to verify that 10 | they are not just getting split on commas. 11 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_markdown_and_summary_metadata_multi.md: -------------------------------------------------------------------------------- 1 | Title: Article with markdown and summary metadata multi 2 | Date: 2012-10-31 3 | Summary: 4 | A multi-line summary should be supported 5 | as well as **inline markup**. 6 | custom_formatted_field: 7 | Multi-line metadata should also be supported 8 | as well as *inline markup* and stuff to "typogrify"... 9 | 10 | This is some content. 11 | -------------------------------------------------------------------------------- /pelican/themes/simple/templates/tags.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block title %}{{ SITENAME|striptags }} - Tags{% endblock %} 4 | 5 | {% block content %} 6 |

Tags for {{ SITENAME }}

7 | 12 | {% endblock %} 13 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_multiple_metadata_tags.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Metadata tags as list! 4 | 5 | 6 | 7 | 8 | When custom metadata tags are specified more than once 9 | they are collected into a list! 10 | 11 | 12 | -------------------------------------------------------------------------------- /pelican/themes/simple/templates/authors.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block title %}{{ SITENAME|striptags }} - Authors{% endblock %} 4 | 5 | {% block content %} 6 |

Authors on {{ SITENAME }}

7 | 12 | {% endblock %} 13 | -------------------------------------------------------------------------------- /pelican/themes/simple/templates/categories.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block title %}{{ SITENAME|striptags }} - Categories{% endblock %} 4 | 5 | {% block content %} 6 |

Categories on {{ SITENAME }}

7 | 12 | {% endblock %} 13 | -------------------------------------------------------------------------------- /pelican/themes/simple/templates/archives.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block title %}{{ SITENAME|striptags }} - Archives{% endblock %} 4 | 5 | {% block content %} 6 |

Archives for {{ SITENAME }}

7 | 8 |
9 | {% for article in dates %} 10 |
{{ article.locale_date }}
11 |
{{ article.title }}
12 | {% endfor %} 13 |
14 | {% endblock %} 15 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_duplicate_tags_authors.md: -------------------------------------------------------------------------------- 1 | Title: Test metadata duplicates 2 | Category: test 3 | Tags: foo, bar, foobar, foo, bar 4 | Authors: Author, First; Author, Second; Author, First 5 | Date: 2010-12-02 10:14 6 | Modified: 2010-12-02 10:20 7 | Summary: I have a lot to test 8 | 9 | Test Markdown File Header 10 | ========================= 11 | 12 | Used for pelican test 13 | --------------------- 14 | 15 | The quick brown fox jumped over the lazy dog's back. 16 | -------------------------------------------------------------------------------- /pelican/themes/notmyidea/templates/archives.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block content %} 3 |
4 |

Archives for {{ SITENAME }}

5 | 6 |
7 | {% for article in dates %} 8 |
{{ article.locale_date }}
9 |
{{ article.title }}
10 | {% endfor %} 11 |
12 |
13 | {% endblock %} 14 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Improve accuracy of GitHub's Linguist-powered language statistics 5 | pelican/tests/content/* linguist-vendored 6 | pelican/tests/output/* linguist-vendored 7 | pelican/tests/theme_overrides/* linguist-vendored 8 | pelican/themes/notmyidea/templates/*.html linguist-language=Jinja 9 | pelican/themes/simple/templates/*.html linguist-language=Jinja 10 | samples/* linguist-vendored 11 | *.html linguist-vendored 12 | -------------------------------------------------------------------------------- /samples/content/another_super_article.rst: -------------------------------------------------------------------------------- 1 | Oh yeah ! 2 | ######### 3 | 4 | :tags: oh, bar, yeah 5 | :date: 2010-10-20 10:14 6 | :category: bar 7 | :author: Alexis Métaireau 8 | :lang: en 9 | :slug: oh-yeah 10 | :license: WTFPL 11 | 12 | Why not ? 13 | ========= 14 | 15 | After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst ! 16 | YEAH ! 17 | 18 | .. image:: |static|/pictures/Sushi.jpg 19 | :height: 450 px 20 | :width: 600 px 21 | :alt: alternate text 22 | -------------------------------------------------------------------------------- /pelican/themes/notmyidea/templates/period_archives.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block content %} 3 |
4 |

Archives for {{ period | reverse | join(' ') }}

5 | 6 |
7 | {% for article in dates %} 8 |
{{ article.locale_date }}
9 |
{{ article.title }}
10 | {% endfor %} 11 |
12 |
13 | {% endblock %} 14 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_attributes_containing_double_quotes.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Ensure that if an attribute value contains a double quote, it is 6 | surrounded with single quotes, otherwise with double quotes. 7 | Span content 8 | Span content 9 | Span content 10 | 11 | 12 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_markdown_and_nonascii_summary.md: -------------------------------------------------------------------------------- 1 | Title: マックOS X 10.8でパイソンとVirtualenvをインストールと設定 2 | Slug: python-virtualenv-on-mac-osx-mountain-lion-10.8 3 | Date: 2012-12-20 4 | Modified: 2012-12-22 5 | Tags: パイソン, マック 6 | Category: 指導書 7 | Summary: パイソンとVirtualenvをまっくでインストールする方法について明確に説明します。 8 | 9 | Writing unicode is certainly fun. 10 | 11 | パイソンとVirtualenvをまっくでインストールする方法について明確に説明します。 12 | 13 | And let's mix languages. 14 | 15 | первый пост 16 | 17 | Now another. 18 | 19 | İlk yazı çok özel değil. 20 | -------------------------------------------------------------------------------- /pelican/themes/notmyidea/templates/tags.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block title %}{{ SITENAME|striptags }} - Tags{% endblock %} 4 | 5 | {% block content %} 6 | 7 |
8 |

Tags for {{ SITENAME }}

9 | 14 |
15 | 16 | {% endblock %} 17 | -------------------------------------------------------------------------------- /pelican/tests/__init__.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import warnings 3 | 4 | from pelican.log import log_warnings 5 | 6 | # redirect warnings module to use logging instead 7 | log_warnings() 8 | 9 | # setup warnings to log DeprecationWarning's and error on 10 | # warnings in pelican's codebase 11 | warnings.simplefilter("default", DeprecationWarning) 12 | warnings.filterwarnings("error", ".*", Warning, "pelican") 13 | 14 | # Add a NullHandler to silence warning about no available handlers 15 | logging.getLogger().addHandler(logging.NullHandler()) 16 | -------------------------------------------------------------------------------- /pelican/themes/simple/templates/period_archives.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block title %}{{ SITENAME|striptags }} - {{ period | reverse | join(' ') }} archives{% endblock %} 4 | 5 | {% block content %} 6 |

Archives for {{ period | reverse | join(' ') }}

7 | 8 |
9 | {% for article in dates %} 10 |
{{ article.locale_date }}
11 |
{{ article.title }}
12 | {% endfor %} 13 |
14 | {% endblock %} 15 | -------------------------------------------------------------------------------- /pelican/themes/notmyidea/templates/authors.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block title %}{{ SITENAME|striptags }} - Authors{% endblock %} 4 | 5 | {% block content %} 6 | 7 |
8 |

Authors on {{ SITENAME }}

9 | 14 |
15 | 16 | {% endblock %} 17 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_metadata.rst: -------------------------------------------------------------------------------- 1 | 2 | This is a super article ! 3 | ######################### 4 | 5 | :tags: foo, bar, foobar 6 | :date: 2010-12-02 10:14 7 | :modified: 2010-12-02 10:20 8 | :category: yeah 9 | :author: Alexis Métaireau 10 | :summary: 11 | Multi-line metadata should be supported 12 | as well as **inline markup** and stuff to "typogrify"... 13 | :custom_field: http://notmyidea.org 14 | :custom_formatted_field: 15 | Multi-line metadata should also be supported 16 | as well as *inline markup* and stuff to "typogrify"... 17 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_nonconformant_meta_tags.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Article with Nonconformant HTML meta tags 7 | 8 | 9 | 10 | Multi-line metadata should be supported 11 | as well as inline markup. 12 | 13 | 14 | -------------------------------------------------------------------------------- /pelican/themes/notmyidea/templates/categories.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block title %}{{ SITENAME|striptags }} - Categories{% endblock %} 4 | 5 | {% block content %} 6 | 7 |
8 |

Categories for {{ SITENAME }}

9 | 14 |
15 | 16 | {% endblock %} 17 | -------------------------------------------------------------------------------- /pelican/themes/notmyidea/templates/disqus_script.html: -------------------------------------------------------------------------------- 1 | {% if DISQUS_SITENAME %} 2 | 11 | {% endif %} 12 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_capitalized_metadata.rst: -------------------------------------------------------------------------------- 1 | 2 | This is a super article ! 3 | ######################### 4 | 5 | :TAGS: foo, bar, foobar 6 | :DATE: 2010-12-02 10:14 7 | :MODIFIED: 2010-12-02 10:20 8 | :CATEGORY: yeah 9 | :AUTHOR: Alexis Métaireau 10 | :SUMMARY: 11 | Multi-line metadata should be supported 12 | as well as **inline markup** and stuff to "typogrify"... 13 | :CUSTOM_FIELD: http://notmyidea.org 14 | :CUSTOM_FORMATTED_FIELD: 15 | Multi-line metadata should also be supported 16 | as well as *inline markup* and stuff to "typogrify"... 17 | -------------------------------------------------------------------------------- /pelican/tests/output/basic/theme/fonts/font.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Yanone Kaffeesatz'; 3 | font-style: normal; 4 | font-weight: 400; 5 | src: 6 | local('Yanone Kaffeesatz Regular'), 7 | local('YanoneKaffeesatz-Regular'), 8 | /* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLRTHiN2BPBirwIkMLKUspj4.woff */ 9 | url('Yanone_Kaffeesatz_400.woff') format('woff'), 10 | /* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLfGwxTS8d1Q9KiDNCMKLFUM.woff2 */ 11 | url('Yanone_Kaffeesatz_400.woff2') format('woff2'); 12 | } 13 | -------------------------------------------------------------------------------- /pelican/tests/output/custom/theme/fonts/font.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Yanone Kaffeesatz'; 3 | font-style: normal; 4 | font-weight: 400; 5 | src: 6 | local('Yanone Kaffeesatz Regular'), 7 | local('YanoneKaffeesatz-Regular'), 8 | /* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLRTHiN2BPBirwIkMLKUspj4.woff */ 9 | url('Yanone_Kaffeesatz_400.woff') format('woff'), 10 | /* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLfGwxTS8d1Q9KiDNCMKLFUM.woff2 */ 11 | url('Yanone_Kaffeesatz_400.woff2') format('woff2'); 12 | } 13 | -------------------------------------------------------------------------------- /pelican/themes/notmyidea/static/fonts/font.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Yanone Kaffeesatz'; 3 | font-style: normal; 4 | font-weight: 400; 5 | src: 6 | local('Yanone Kaffeesatz Regular'), 7 | local('YanoneKaffeesatz-Regular'), 8 | /* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLRTHiN2BPBirwIkMLKUspj4.woff */ 9 | url('Yanone_Kaffeesatz_400.woff') format('woff'), 10 | /* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLfGwxTS8d1Q9KiDNCMKLFUM.woff2 */ 11 | url('Yanone_Kaffeesatz_400.woff2') format('woff2'); 12 | } 13 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_metadata_implicit_dates.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | This is a super article ! 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | Multi-line metadata should be supported 12 | as well as inline markup. 13 | 14 | 15 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # Ref: https://help.github.com/en/github/building-a-strong-community/configuring-issue-templates-for-your-repository#configuring-the-template-chooser 3 | blank_issues_enabled: false 4 | contact_links: 5 | - name: '🗃️ Everything Else' 6 | url: https://github.com/getpelican/pelican/discussions 7 | about: | 8 | Do you have a question/issue that does not fall into any of the other categories? 9 | - name: '💬 Pelican IRC Channel' 10 | url: https://web.libera.chat/?#pelican 11 | about: | 12 | Chat with the community, ask questions, and learn about best practices. 13 | -------------------------------------------------------------------------------- /pelican/tests/output/custom_locale/theme/fonts/font.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Yanone Kaffeesatz'; 3 | font-style: normal; 4 | font-weight: 400; 5 | src: 6 | local('Yanone Kaffeesatz Regular'), 7 | local('YanoneKaffeesatz-Regular'), 8 | /* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLRTHiN2BPBirwIkMLKUspj4.woff */ 9 | url('Yanone_Kaffeesatz_400.woff') format('woff'), 10 | /* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLfGwxTS8d1Q9KiDNCMKLFUM.woff2 */ 11 | url('Yanone_Kaffeesatz_400.woff2') format('woff2'); 12 | } 13 | -------------------------------------------------------------------------------- /pelican/tests/output/basic/theme/css/fonts.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Yanone Kaffeesatz'; 3 | font-style: normal; 4 | font-weight: 400; 5 | src: 6 | local('Yanone Kaffeesatz Regular'), 7 | local('YanoneKaffeesatz-Regular'), 8 | /* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLRTHiN2BPBirwIkMLKUspj4.woff */ 9 | url('../fonts/Yanone_Kaffeesatz_400.woff') format('woff'), 10 | /* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLfGwxTS8d1Q9KiDNCMKLFUM.woff2 */ 11 | url('../fonts/Yanone_Kaffeesatz_400.woff2') format('woff2'); 12 | } 13 | -------------------------------------------------------------------------------- /pelican/themes/notmyidea/static/css/fonts.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Yanone Kaffeesatz'; 3 | font-style: normal; 4 | font-weight: 400; 5 | src: 6 | local('Yanone Kaffeesatz Regular'), 7 | local('YanoneKaffeesatz-Regular'), 8 | /* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLRTHiN2BPBirwIkMLKUspj4.woff */ 9 | url('../fonts/Yanone_Kaffeesatz_400.woff') format('woff'), 10 | /* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLfGwxTS8d1Q9KiDNCMKLFUM.woff2 */ 11 | url('../fonts/Yanone_Kaffeesatz_400.woff2') format('woff2'); 12 | } 13 | -------------------------------------------------------------------------------- /pelican/tests/output/custom/theme/css/fonts.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Yanone Kaffeesatz'; 3 | font-style: normal; 4 | font-weight: 400; 5 | src: 6 | local('Yanone Kaffeesatz Regular'), 7 | local('YanoneKaffeesatz-Regular'), 8 | /* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLRTHiN2BPBirwIkMLKUspj4.woff */ 9 | url('../fonts/Yanone_Kaffeesatz_400.woff') format('woff'), 10 | /* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLfGwxTS8d1Q9KiDNCMKLFUM.woff2 */ 11 | url('../fonts/Yanone_Kaffeesatz_400.woff2') format('woff2'); 12 | } 13 | -------------------------------------------------------------------------------- /pelican/tests/output/custom_locale/theme/css/fonts.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Yanone Kaffeesatz'; 3 | font-style: normal; 4 | font-weight: 400; 5 | src: 6 | local('Yanone Kaffeesatz Regular'), 7 | local('YanoneKaffeesatz-Regular'), 8 | /* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLRTHiN2BPBirwIkMLKUspj4.woff */ 9 | url('../fonts/Yanone_Kaffeesatz_400.woff') format('woff'), 10 | /* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLfGwxTS8d1Q9KiDNCMKLFUM.woff2 */ 11 | url('../fonts/Yanone_Kaffeesatz_400.woff2') format('woff2'); 12 | } 13 | -------------------------------------------------------------------------------- /pelican/tools/templates/publishconf.py.jinja2: -------------------------------------------------------------------------------- 1 | # This file is only used if you use `make publish` or 2 | # explicitly specify it as your config file. 3 | 4 | import os 5 | import sys 6 | 7 | sys.path.append(os.curdir) 8 | from pelicanconf import * 9 | 10 | # If your site is available via HTTPS, make sure SITEURL begins with https:// 11 | SITEURL = "{{siteurl}}" 12 | RELATIVE_URLS = False 13 | 14 | FEED_ALL_ATOM = "feeds/all.atom.xml" 15 | CATEGORY_FEED_ATOM = "feeds/{slug}.atom.xml" 16 | 17 | DELETE_OUTPUT_DIRECTORY = True 18 | 19 | # Following items are often useful when publishing 20 | 21 | # DISQUS_SITENAME = "" 22 | # GOOGLE_ANALYTICS = "" 23 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_metadata.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | This is a super article ! 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | Multi-line metadata should be supported 13 | as well as inline markup. 14 | 15 | 16 | -------------------------------------------------------------------------------- /pelican/themes/simple/templates/translations.html: -------------------------------------------------------------------------------- 1 | {% macro translations_for(article) %} 2 | {% if article.translations %} 3 | Translations: 4 | {% for translation in article.translations %} 5 | {{ translation.lang }} 6 | {% endfor %} 7 | {% endif %} 8 | {% endmacro %} 9 | 10 | {% macro entry_hreflang(entry) %} 11 | {% if entry.translations %} 12 | {% for translation in entry.translations %} 13 | 14 | {% endfor %} 15 | {% endif %} 16 | {% endmacro %} 17 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_metadata_and_contents.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | This is a super article ! 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | Multi-line metadata should be supported 13 | as well as inline markup. 14 | 15 | 16 | -------------------------------------------------------------------------------- /pelican/themes/notmyidea/templates/translations.html: -------------------------------------------------------------------------------- 1 | {% macro translations_for(article) %} 2 | {% if article.translations %} 3 | Translations: 4 | {% for translation in article.translations %} 5 | {{ translation.lang }} 6 | {% endfor %} 7 | {% endif %} 8 | {% endmacro %} 9 | 10 | {% macro entry_hreflang(entry) %} 11 | {% if entry.translations %} 12 | {% for translation in entry.translations %} 13 | 14 | {% endfor %} 15 | {% endif %} 16 | {% endmacro %} 17 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_markdown_and_footnote.md: -------------------------------------------------------------------------------- 1 | Title: Article with markdown containing footnotes 2 | Date: 2012-10-31 3 | Modified: 2012-11-01 4 | Summary: Summary with **inline** markup *should* be supported. 5 | Multiline: Line Metadata should be handle properly. 6 | See syntax of Meta-Data extension of Python Markdown package: 7 | If a line is indented by 4 or more spaces, 8 | that line is assumed to be an additional line of the value 9 | for the previous keyword. 10 | A keyword may have as many lines as desired. 11 | 12 | This is some content[^1] with some footnotes[^footnote] 13 | 14 | [^1]: Numbered footnote 15 | [^footnote]: Named footnote 16 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_metadata_explicit_date_implicit_modified.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | This is a super article ! 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | Multi-line metadata should be supported 13 | as well as inline markup. 14 | 15 | 16 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_metadata_implicit_date_explicit_modified.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | This is a super article ! 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | Multi-line metadata should be supported 13 | as well as inline markup. 14 | 15 | 16 | -------------------------------------------------------------------------------- /.readthedocs.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | # Read the Docs configuration file 3 | # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details 4 | 5 | # Required 6 | version: 2 7 | 8 | # Set the OS, Python version, and any other needed tools 9 | build: 10 | os: ubuntu-22.04 11 | tools: 12 | python: "3.10" 13 | 14 | # Build HTML & PDF formats 15 | formats: 16 | - htmlzip 17 | - pdf 18 | 19 | # Build documentation in the docs/ directory with Sphinx 20 | sphinx: 21 | configuration: docs/conf.py 22 | 23 | # Version of Python and requirements required to build the docs 24 | python: 25 | install: 26 | - requirements: requirements/developer.pip 27 | - method: pip 28 | path: . 29 | -------------------------------------------------------------------------------- /pelican/themes/notmyidea/templates/github.html: -------------------------------------------------------------------------------- 1 | {% if GITHUB_URL %} 2 | 11 | 12 | {% if GITHUB_POSITION != "left" %} 13 |
Fork me on GitHub
14 | {% else %} 15 |
Fork me on GitHub
16 | {% endif %} 17 |
18 | {% endif %} 19 | -------------------------------------------------------------------------------- /pelican/themes/notmyidea/templates/page.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block html_lang %}{{ page.lang }}{% endblock %} 3 | {% block title %}{{ page.title|striptags }}{% endblock %} 4 | 5 | {% block extra_head %} 6 | {% import 'translations.html' as translations with context %} 7 | {% if translations.entry_hreflang(page) %} 8 | {{ translations.entry_hreflang(page) }} 9 | {% endif %} 10 | {% endblock %} 11 | 12 | {% block content %} 13 |
14 |

{{ page.title }}

15 | {% import 'translations.html' as translations with context %} 16 | {{ translations.translations_for(page) }} 17 | {{ page.content }} 18 |
19 | {% endblock %} 20 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_metadata_explicit_dates.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | This is a super article ! 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | Multi-line metadata should be supported 14 | as well as inline markup. 15 | 16 | 17 | -------------------------------------------------------------------------------- /tox.ini: -------------------------------------------------------------------------------- 1 | [tox] 2 | envlist = py{3.10,3.11,3.12,3.13,3.14},docs 3 | 4 | [testenv] 5 | basepython = 6 | py3.10: python3.10 7 | py3.11: python3.11 8 | py3.12: python3.12 9 | py3.13: python3.13 10 | py3.14: python3.14 11 | passenv = * 12 | usedevelop=True 13 | deps = 14 | -rrequirements/test.pip 15 | 16 | commands = 17 | {envpython} --version 18 | pytest -s --cov=pelican --cov-fail-under 75 pelican 19 | 20 | [testenv:docs] 21 | basepython = python3.11 22 | deps = 23 | -rrequirements/docs.pip 24 | changedir = docs 25 | commands = 26 | sphinx-build -W -b html -d {envtmpdir}/doctrees . _build/html 27 | 28 | [pytest] 29 | filterwarnings = 30 | default::DeprecationWarning 31 | error:.*:Warning:pelican 32 | addopts = -n auto -r a 33 | -------------------------------------------------------------------------------- /pelican/themes/simple/templates/pagination.html: -------------------------------------------------------------------------------- 1 | {% if DEFAULT_PAGINATION %} 2 | {% set first_page = articles_paginator.page(1) %} 3 | {% set last_page = articles_paginator.page(articles_paginator.num_pages) %} 4 | 17 | {% endif %} 18 | -------------------------------------------------------------------------------- /pelican/tests/output/basic/theme/css/wide.css: -------------------------------------------------------------------------------- 1 | @import url("main.css"); 2 | 3 | body { 4 | font:1.3em/1.3 "Hoefler Text","Georgia",Georgia,serif,sans-serif; 5 | } 6 | 7 | .post-info{ 8 | display: none; 9 | } 10 | 11 | #banner nav { 12 | display: none; 13 | -moz-border-radius: 0px; 14 | margin-bottom: 20px; 15 | overflow: hidden; 16 | font-size: 1em; 17 | background: #F5F4EF; 18 | } 19 | 20 | #banner nav ul{ 21 | padding-right: 50px; 22 | } 23 | 24 | #banner nav li{ 25 | float: right; 26 | color: #000; 27 | } 28 | 29 | #banner nav li a { 30 | color: #000; 31 | } 32 | 33 | #banner h1 { 34 | margin-bottom: -18px; 35 | } 36 | 37 | #featured, #extras { 38 | padding: 50px; 39 | } 40 | 41 | #featured { 42 | padding-top: 20px; 43 | } 44 | 45 | #extras { 46 | padding-top: 0px; 47 | padding-bottom: 0px; 48 | } 49 | -------------------------------------------------------------------------------- /pelican/tests/output/custom/theme/css/wide.css: -------------------------------------------------------------------------------- 1 | @import url("main.css"); 2 | 3 | body { 4 | font:1.3em/1.3 "Hoefler Text","Georgia",Georgia,serif,sans-serif; 5 | } 6 | 7 | .post-info{ 8 | display: none; 9 | } 10 | 11 | #banner nav { 12 | display: none; 13 | -moz-border-radius: 0px; 14 | margin-bottom: 20px; 15 | overflow: hidden; 16 | font-size: 1em; 17 | background: #F5F4EF; 18 | } 19 | 20 | #banner nav ul{ 21 | padding-right: 50px; 22 | } 23 | 24 | #banner nav li{ 25 | float: right; 26 | color: #000; 27 | } 28 | 29 | #banner nav li a { 30 | color: #000; 31 | } 32 | 33 | #banner h1 { 34 | margin-bottom: -18px; 35 | } 36 | 37 | #featured, #extras { 38 | padding: 50px; 39 | } 40 | 41 | #featured { 42 | padding-top: 20px; 43 | } 44 | 45 | #extras { 46 | padding-top: 0px; 47 | padding-bottom: 0px; 48 | } 49 | -------------------------------------------------------------------------------- /pelican/themes/notmyidea/static/css/wide.css: -------------------------------------------------------------------------------- 1 | @import url("main.css"); 2 | 3 | body { 4 | font:1.3em/1.3 "Hoefler Text","Georgia",Georgia,serif,sans-serif; 5 | } 6 | 7 | .post-info{ 8 | display: none; 9 | } 10 | 11 | #banner nav { 12 | display: none; 13 | -moz-border-radius: 0px; 14 | margin-bottom: 20px; 15 | overflow: hidden; 16 | font-size: 1em; 17 | background: #F5F4EF; 18 | } 19 | 20 | #banner nav ul{ 21 | padding-right: 50px; 22 | } 23 | 24 | #banner nav li{ 25 | float: right; 26 | color: #000; 27 | } 28 | 29 | #banner nav li a { 30 | color: #000; 31 | } 32 | 33 | #banner h1 { 34 | margin-bottom: -18px; 35 | } 36 | 37 | #featured, #extras { 38 | padding: 50px; 39 | } 40 | 41 | #featured { 42 | padding-top: 20px; 43 | } 44 | 45 | #extras { 46 | padding-top: 0px; 47 | padding-bottom: 0px; 48 | } 49 | -------------------------------------------------------------------------------- /pelican/tests/output/custom_locale/theme/css/wide.css: -------------------------------------------------------------------------------- 1 | @import url("main.css"); 2 | 3 | body { 4 | font:1.3em/1.3 "Hoefler Text","Georgia",Georgia,serif,sans-serif; 5 | } 6 | 7 | .post-info{ 8 | display: none; 9 | } 10 | 11 | #banner nav { 12 | display: none; 13 | -moz-border-radius: 0px; 14 | margin-bottom: 20px; 15 | overflow: hidden; 16 | font-size: 1em; 17 | background: #F5F4EF; 18 | } 19 | 20 | #banner nav ul{ 21 | padding-right: 50px; 22 | } 23 | 24 | #banner nav li{ 25 | float: right; 26 | color: #000; 27 | } 28 | 29 | #banner nav li a { 30 | color: #000; 31 | } 32 | 33 | #banner h1 { 34 | margin-bottom: -18px; 35 | } 36 | 37 | #featured, #extras { 38 | padding: 50px; 39 | } 40 | 41 | #featured { 42 | padding-top: 20px; 43 | } 44 | 45 | #extras { 46 | padding-top: 0px; 47 | padding-bottom: 0px; 48 | } 49 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/---documentation.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: "\U0001F4DA Documentation" 3 | about: Did you find errors, problems, or anything unclear in the docs (https://docs.getpelican.com/)? 4 | title: '' 5 | labels: docs 6 | assignees: '' 7 | 8 | --- 9 | 10 | 17 | 18 | 19 | - [ ] 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. 20 | 21 | ## Issue 22 | 23 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | # Pull Request Checklist 2 | 3 | Resolves: #issue-number-here 4 | 5 | 6 | 7 | - [ ] Ensured **tests pass** and (if applicable) updated functional test output 8 | - [ ] Conformed to **code style guidelines** by running appropriate linting tools 9 | - [ ] Added **tests** for changed code 10 | - [ ] Updated **documentation** for changed code 11 | 12 | 13 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | # See https://pre-commit.com/hooks.html for info on hooks 3 | repos: 4 | - repo: https://github.com/pre-commit/pre-commit-hooks 5 | rev: v5.0.0 6 | hooks: 7 | - id: check-added-large-files 8 | - id: check-ast 9 | - id: check-toml 10 | - id: check-yaml 11 | - id: debug-statements 12 | - id: detect-private-key 13 | - id: end-of-file-fixer 14 | - id: forbid-new-submodules 15 | - id: trailing-whitespace 16 | 17 | - repo: https://github.com/astral-sh/ruff-pre-commit 18 | # ruff version should match the one in pyproject.toml 19 | rev: v0.12.7 20 | hooks: 21 | - id: ruff-check 22 | args: [--fix, --exit-non-zero-on-fix] 23 | - id: ruff-format 24 | 25 | - repo: https://github.com/rtts/djhtml 26 | rev: '3.0.8' 27 | hooks: 28 | - id: djhtml 29 | - id: djcss 30 | - id: djjs 31 | -------------------------------------------------------------------------------- /samples/content/super_article.rst: -------------------------------------------------------------------------------- 1 | This is a super article ! 2 | ######################### 3 | 4 | :tags: foo, bar, foobar 5 | :date: 2010-12-02 10:14 6 | :modified: 2013-11-17 23:29 7 | :category: yeah 8 | :author: Alexis Métaireau 9 | :summary: 10 | Multi-line metadata should be supported 11 | as well as **inline markup**. 12 | 13 | Some content here ! 14 | 15 | This is a simple title 16 | ====================== 17 | 18 | And here comes the cool stuff_. 19 | 20 | .. image:: |static|/pictures/Sushi.jpg 21 | :height: 450 px 22 | :width: 600 px 23 | :alt: alternate text 24 | 25 | .. image:: |static|/pictures/Sushi_Macro.jpg 26 | :height: 450 px 27 | :width: 600 px 28 | :alt: alternate text 29 | 30 | :: 31 | 32 | >>> from ipdb import set_trace 33 | >>> set_trace() 34 | 35 | → And now try with some utf8 hell: ééé 36 | 37 | .. _stuff: http://books.couchdb.org/relax/design-documents/views 38 | -------------------------------------------------------------------------------- /pelican/themes/simple/templates/page.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block html_lang %}{{ page.lang }}{% endblock %} 3 | 4 | {% block title %}{{ SITENAME|striptags }} - {{ page.title|striptags }}{%endblock%} 5 | 6 | {% block head %} 7 | {{ super() }} 8 | 9 | {% import 'translations.html' as translations with context %} 10 | {% if translations.entry_hreflang(page) %} 11 | {{ translations.entry_hreflang(page) }} 12 | {% endif %} 13 | {% endblock %} 14 | 15 | {% block content %} 16 |
17 |
18 |

{{ page.title }}

19 |
20 | {% import 'translations.html' as translations with context %} 21 | {{ translations.translations_for(page) }} 22 | 23 | {{ page.content }} 24 | 25 | {% if page.modified %} 26 | 31 | {% endif %} 32 |
33 | {% endblock %} 34 | -------------------------------------------------------------------------------- /pelican/tools/templates/pelicanconf.py.jinja2: -------------------------------------------------------------------------------- 1 | AUTHOR = {{author}} 2 | SITENAME = {{sitename}} 3 | SITEURL = "" 4 | 5 | PATH = "content" 6 | 7 | TIMEZONE = {{timezone}} 8 | 9 | DEFAULT_LANG = {{lang}} 10 | 11 | # Feed generation is usually not desired when developing 12 | FEED_ALL_ATOM = None 13 | CATEGORY_FEED_ATOM = None 14 | TRANSLATION_FEED_ATOM = None 15 | AUTHOR_FEED_ATOM = None 16 | AUTHOR_FEED_RSS = None 17 | 18 | # Blogroll 19 | LINKS = [ 20 | ("Pelican", "https://getpelican.com/"), 21 | ("Python.org", "https://www.python.org/"), 22 | ("Jinja2", "https://palletsprojects.com/p/jinja/"), 23 | ("You can modify those links in your config file", "#"), 24 | ] 25 | 26 | # Social widget 27 | SOCIAL = [ 28 | ("You can add links in your config file", "#"), 29 | ("Another social link", "#"), 30 | ] 31 | 32 | DEFAULT_PAGINATION = {{default_pagination}} 33 | 34 | # Uncomment following line if you want document-relative URLs when developing 35 | # RELATIVE_URLS = True 36 | -------------------------------------------------------------------------------- /pelican/tests/output/basic/feeds/bar.atom.xml: -------------------------------------------------------------------------------- 1 | 2 | A Pelican Blog - bar/2010-10-20T10:14:00+00:00Oh yeah !2010-10-20T10:14:00+00:002010-10-20T10:14:00+00:00Alexis Métaireautag:None,2010-10-20:/oh-yeah.html<div class="section" id="why-not"> 3 | <h2>Why not ?</h2> 4 | <p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst ! 5 | YEAH !</p> 6 | <img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" /> 7 | </div> 8 | 9 | -------------------------------------------------------------------------------- /pelican/tests/output/custom/feeds/yeah.rss.xml: -------------------------------------------------------------------------------- 1 | 2 | Alexis' log - yeahhttp://blog.notmyidea.org/A personal blog.Sun, 17 Nov 2013 23:29:00 +0100This is a super article !http://blog.notmyidea.org/this-is-a-super-article.html<p class="first last">Multi-line metadata should be supported 3 | as well as <strong>inline markup</strong>.</p> 4 | Alexis MétaireauThu, 02 Dec 2010 10:14:00 +0100tag:blog.notmyidea.org,2010-12-02:/this-is-a-super-article.htmlyeahfoobarfoobar 5 | -------------------------------------------------------------------------------- /.git-blame-ignore-revs: -------------------------------------------------------------------------------- 1 | # .git-blame-ignore-revs 2 | # Apply code style to project via: ruff format . 3 | cabdb26cee66e1173cf16cb31d3fe5f9fa4392e7 4 | # Upgrade code base for Python 3.8 and above 5 | ecd598f293161a52564aa6e8dfdcc8284dc93970 6 | # Apply Ruff and pyupgrade to Jinja templates 7 | db241feaa445375dc05e189e69287000ffe5fa8e 8 | # Change pre-commit to run ruff and ruff-format with fixes 9 | 6d8597addb17d5fa3027ead91427939e8e4e89ec 10 | # Upgrade Ruff from 0.1.x to 0.4.x 11 | 0bd02c00c078fe041b65fbf4eab13601bb42676d 12 | # Apply more Ruff checks to code 13 | 9d30c5608a58d202b1c02d55651e6ac746bfb173 14 | # Apply yet more Ruff checks to code 15 | 7577dd7603f7cb3a09922d1edb65b6eafb6e2ac7 16 | # Indent Jinja templates, HTML, CSS, and JS via DjHTML 17 | 4af40e80772a58eac8969360e5caeb99e3e26e78 18 | # Ruff UP031: Use F-string format specifiers instead of percent format 19 | 30bde3823f50b9ba8ac5996c1c46bb72031aa6b8 20 | # Upgrade Ruff to 0.12.x & comply with new rules 21 | 4dedf1795831db99d18941c707923ba48cc28ce7 22 | -------------------------------------------------------------------------------- /pelican/tests/output/custom_locale/feeds/yeah.rss.xml: -------------------------------------------------------------------------------- 1 | 2 | Alexis' log - yeahhttp://blog.notmyidea.org/Sun, 17 Nov 2013 23:29:00 +0100This is a super article !http://blog.notmyidea.org/posts/2010/d%C3%A9cembre/02/this-is-a-super-article/<p class="first last">Multi-line metadata should be supported 3 | as well as <strong>inline markup</strong>.</p> 4 | Alexis MétaireauThu, 02 Dec 2010 10:14:00 +0100tag:blog.notmyidea.org,2010-12-02:/posts/2010/décembre/02/this-is-a-super-article/yeahfoobarfoobar 5 | -------------------------------------------------------------------------------- /pelican/tests/output/basic/feeds/all-fr.atom.xml: -------------------------------------------------------------------------------- 1 | 2 | A Pelican Blog/2012-02-29T00:00:00+00:00Deuxième article2012-02-29T00:00:00+00:002012-02-29T00:00:00+00:00tag:None,2012-02-29:/second-article-fr.html<p>Ceci est un article, en français.</p> 3 | Trop bien !2010-10-20T10:14:00+00:002010-10-20T10:14:00+00:00tag:None,2010-10-20:/oh-yeah-fr.html<p>Et voila du contenu en français</p> 4 | 5 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/---enhancement-request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: "\U0001F381 Feature Request" 3 | about: Do you have ideas for new features and improvements? 4 | title: '' 5 | labels: enhancement 6 | assignees: '' 7 | 8 | --- 9 | 10 | 17 | 18 | 19 | - [ ] 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. 20 | - [ ] I have searched the [documentation](https://docs.getpelican.com/) and believe that my question is not covered. 21 | - [ ] I am willing to lend a hand to help implement this feature. 22 | 23 | ## Feature Request 24 | 25 | -------------------------------------------------------------------------------- /pelican/themes/simple/templates/index.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block content %} 3 | {% block content_title %} 4 |

All articles

5 | {% endblock %} 6 | 7 | 8 | {% for article in articles_page.object_list %} 9 |
10 |

{{ article.title }}

11 |
{{ article.summary }}
12 | 20 |
21 | {% endfor %} 22 | 23 | {% if articles_page.has_other_pages() %} 24 | {% include 'pagination.html' %} 25 | {% endif %} 26 | 27 | {% endblock content %} 28 | -------------------------------------------------------------------------------- /.github/stale.yml: -------------------------------------------------------------------------------- 1 | # Configuration for probot-stale - https://github.com/probot/stale 2 | 3 | # Number of days of inactivity before an Issue or Pull Request becomes stale 4 | daysUntilStale: 60 5 | 6 | # Number of days of inactivity before an Issue or Pull Request with the stale label is closed. 7 | daysUntilClose: 30 8 | 9 | # Set to true to ignore issues in a project (defaults to false) 10 | exemptProjects: true 11 | 12 | # Set to true to ignore issues in a milestone (defaults to false) 13 | exemptMilestones: true 14 | 15 | # Set to true to ignore issues with an assignee (defaults to false) 16 | exemptAssignees: true 17 | 18 | # Label to use when marking as stale 19 | staleLabel: stale 20 | 21 | # Comment to post when marking as stale. Set to `false` to disable 22 | markComment: > 23 | This issue has been automatically marked as stale because it has not had 24 | recent activity. It will be closed if no further activity occurs. Thank you 25 | for your participation and understanding. 26 | 27 | # Limit the number of actions per hour, from 1-30. Default is 30 28 | limitPerRun: 1 29 | 30 | # Limit to only `issues` or `pulls` 31 | only: issues 32 | -------------------------------------------------------------------------------- /pelican/tests/content/article_with_inline_svg.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Article with an inline SVG 4 | 5 | 6 | Ensure that the title attribute in an inline svg is not handled as an HTML title. 7 | 8 | 9 | A different title inside the inline SVG 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /pelican/tests/output/custom/feeds/bar.rss.xml: -------------------------------------------------------------------------------- 1 | 2 | Alexis' log - barhttp://blog.notmyidea.org/A personal blog.Wed, 20 Oct 2010 10:14:00 +0200Oh yeah !http://blog.notmyidea.org/oh-yeah.html<div class="section" id="why-not"> 3 | <h2>Why not ?</h2> 4 | <p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst ! 5 | YEAH !</p> 6 | <img alt="alternate text" src="http://blog.notmyidea.org/pictures/Sushi.jpg" style="width: 600px; height: 450px;" /> 7 | </div> 8 | Alexis MétaireauWed, 20 Oct 2010 10:14:00 +0200tag:blog.notmyidea.org,2010-10-20:/oh-yeah.htmlbarohbaryeah 9 | -------------------------------------------------------------------------------- /pelican/tests/output/custom/feeds/bar.atom.xml: -------------------------------------------------------------------------------- 1 | 2 | Alexis' log - barhttp://blog.notmyidea.org/2010-10-20T10:14:00+02:00A personal blog.Oh yeah !2010-10-20T10:14:00+02:002010-10-20T10:14:00+02:00Alexis Métaireautag:blog.notmyidea.org,2010-10-20:/oh-yeah.html<div class="section" id="why-not"> 3 | <h2>Why not ?</h2> 4 | <p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst ! 5 | YEAH !</p> 6 | <img alt="alternate text" src="http://blog.notmyidea.org/pictures/Sushi.jpg" style="width: 600px; height: 450px;" /> 7 | </div> 8 | 9 | -------------------------------------------------------------------------------- /pelican/tests/output/custom_locale/feeds/bar.atom.xml: -------------------------------------------------------------------------------- 1 | 2 | Alexis' log - barhttp://blog.notmyidea.org/2010-10-20T10:14:00+02:00Oh yeah !2010-10-20T10:14:00+02:002010-10-20T10:14:00+02:00Alexis Métaireautag:blog.notmyidea.org,2010-10-20:/posts/2010/octobre/20/oh-yeah/<div class="section" id="why-not"> 3 | <h2>Why not ?</h2> 4 | <p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst ! 5 | YEAH !</p> 6 | <img alt="alternate text" src="http://blog.notmyidea.org/pictures/Sushi.jpg" style="width: 600px; height: 450px;" /> 7 | </div> 8 | 9 | -------------------------------------------------------------------------------- /pelican/tests/output/custom_locale/feeds/bar.rss.xml: -------------------------------------------------------------------------------- 1 | 2 | Alexis' log - barhttp://blog.notmyidea.org/Wed, 20 Oct 2010 10:14:00 +0200Oh yeah !http://blog.notmyidea.org/posts/2010/octobre/20/oh-yeah/<div class="section" id="why-not"> 3 | <h2>Why not ?</h2> 4 | <p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst ! 5 | YEAH !</p> 6 | <img alt="alternate text" src="http://blog.notmyidea.org/pictures/Sushi.jpg" style="width: 600px; height: 450px;" /> 7 | </div> 8 | Alexis MétaireauWed, 20 Oct 2010 10:14:00 +0200tag:blog.notmyidea.org,2010-10-20:/posts/2010/octobre/20/oh-yeah/barohbaryeah 9 | -------------------------------------------------------------------------------- /pelican/themes/notmyidea/templates/article_infos.html: -------------------------------------------------------------------------------- 1 | 24 | -------------------------------------------------------------------------------- /pelican/tests/test_rstdirectives.py: -------------------------------------------------------------------------------- 1 | from unittest.mock import Mock 2 | 3 | from pelican.rstdirectives import abbr_role 4 | from pelican.tests.support import unittest 5 | 6 | 7 | class Test_abbr_role(unittest.TestCase): 8 | def call_it(self, text): 9 | rawtext = text 10 | lineno = 42 11 | inliner = Mock(name="inliner") 12 | nodes, system_messages = abbr_role("abbr", rawtext, text, lineno, inliner) 13 | self.assertEqual(system_messages, []) 14 | self.assertEqual(len(nodes), 1) 15 | return nodes[0] 16 | 17 | def test(self): 18 | node = self.call_it("Abbr (Abbreviation)") 19 | self.assertEqual(node.astext(), "Abbr") 20 | self.assertEqual(node["explanation"], "Abbreviation") 21 | 22 | def test_newlines_in_explanation(self): 23 | node = self.call_it("CUL (See you\nlater)") 24 | self.assertEqual(node.astext(), "CUL") 25 | self.assertEqual(node["explanation"], "See you\nlater") 26 | 27 | def test_newlines_in_abbr(self): 28 | node = self.call_it("US of\nA \n (USA)") 29 | self.assertEqual(node.astext(), "US of\nA") 30 | self.assertEqual(node["explanation"], "USA") 31 | -------------------------------------------------------------------------------- /pelican/tests/output/custom_locale/feeds/all-fr.atom.xml: -------------------------------------------------------------------------------- 1 | 2 | Alexis' loghttp://blog.notmyidea.org/2012-02-29T00:00:00+01:00Deuxième article2012-02-29T00:00:00+01:002012-02-29T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2012-02-29:/second-article-fr.html<p>Ceci est un article, en français.</p> 3 | Trop bien !2010-10-20T10:14:00+02:002010-10-20T10:14:00+02:00Alexis Métaireautag:blog.notmyidea.org,2010-10-20:/oh-yeah-fr.html<p>Et voila du contenu en français</p> 4 | 5 | -------------------------------------------------------------------------------- /.mailmap: -------------------------------------------------------------------------------- 1 | Alexis Métaireau 2 | Alexis Métaireau 3 | Alexis Métaireau 4 | Axel Haustant 5 | Axel Haustant 6 | Dave Mankoff 7 | Feth Arezki 8 | Guillaume 9 | Guillaume 10 | Guillaume B 11 | Guillermo López 12 | Guillermo López 13 | Jomel Imperio 14 | Justin Mayer 15 | Justin Mayer 16 | Marco Milanesi 17 | Massimo Santini 18 | Rémy HUBSCHER 19 | Simon Conseil 20 | Simon Liedtke 21 | Skami18 22 | Stuart Colville 23 | Stéphane Bunel 24 | tBunnyMan 25 | -------------------------------------------------------------------------------- /pelican/tests/content/medium_post_content.txt: -------------------------------------------------------------------------------- 1 | 2 |

Title header

A paragraph of content.

Paragraph number two.

A list:

  1. One.
  2. Two.
  3. Three.

A link: link text.

Header 2

A block quote:

quote words strong words

after blockquote

A figure caption.

A final note: Cross-Validated has sometimes been helpful.


Next: Next post 3 |

4 |

By User Name on .

Canonical link

Exported from Medium on December 1, 2023.

5 | -------------------------------------------------------------------------------- /pelican/tests/output/custom/feeds/all-fr.atom.xml: -------------------------------------------------------------------------------- 1 | 2 | Alexis' loghttp://blog.notmyidea.org/2012-02-29T00:00:00+01:00A personal blog.Deuxième article2012-02-29T00:00:00+01:002012-02-29T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2012-02-29:/second-article-fr.html<p>Ceci est un article, en français.</p> 3 | Trop bien !2010-10-20T10:14:00+02:002010-10-20T10:14:00+02:00Alexis Métaireautag:blog.notmyidea.org,2010-10-20:/oh-yeah-fr.html<p>Et voila du contenu en français</p> 4 | 5 | -------------------------------------------------------------------------------- /pelican/tests/output/basic/theme/css/reset.css: -------------------------------------------------------------------------------- 1 | /* 2 | Name: Reset Stylesheet 3 | Description: Resets browser's default CSS 4 | Author: Eric Meyer 5 | Author URI: https://meyerweb.com/eric/tools/css/reset/ 6 | */ 7 | 8 | /* v1.0 | 20080212 */ 9 | html, body, div, span, applet, object, iframe, 10 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 11 | a, abbr, acronym, address, big, cite, code, 12 | del, dfn, em, font, img, ins, kbd, q, s, samp, 13 | small, strike, strong, sub, sup, tt, var, 14 | b, u, i, center, 15 | dl, dt, dd, ol, ul, li, 16 | fieldset, form, label, legend, 17 | table, caption, tbody, tfoot, thead, tr, th, td { 18 | background: transparent; 19 | border: 0; 20 | font-size: 100%; 21 | margin: 0; 22 | outline: 0; 23 | padding: 0; 24 | vertical-align: baseline; 25 | } 26 | 27 | body {line-height: 1;} 28 | 29 | ol, ul {list-style: none;} 30 | 31 | blockquote, q {quotes: none;} 32 | 33 | blockquote:before, blockquote:after, 34 | q:before, q:after { 35 | content: ''; 36 | content: none; 37 | } 38 | 39 | /* remember to define focus styles! */ 40 | :focus { 41 | outline: 0; 42 | } 43 | 44 | /* remember to highlight inserts somehow! */ 45 | ins {text-decoration: none;} 46 | del {text-decoration: line-through;} 47 | 48 | /* tables still need 'cellspacing="0"' in the markup */ 49 | table { 50 | border-collapse: collapse; 51 | border-spacing: 0; 52 | } 53 | -------------------------------------------------------------------------------- /pelican/themes/notmyidea/static/css/reset.css: -------------------------------------------------------------------------------- 1 | /* 2 | Name: Reset Stylesheet 3 | Description: Resets browser's default CSS 4 | Author: Eric Meyer 5 | Author URI: https://meyerweb.com/eric/tools/css/reset/ 6 | */ 7 | 8 | /* v1.0 | 20080212 */ 9 | html, body, div, span, applet, object, iframe, 10 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 11 | a, abbr, acronym, address, big, cite, code, 12 | del, dfn, em, font, img, ins, kbd, q, s, samp, 13 | small, strike, strong, sub, sup, tt, var, 14 | b, u, i, center, 15 | dl, dt, dd, ol, ul, li, 16 | fieldset, form, label, legend, 17 | table, caption, tbody, tfoot, thead, tr, th, td { 18 | background: transparent; 19 | border: 0; 20 | font-size: 100%; 21 | margin: 0; 22 | outline: 0; 23 | padding: 0; 24 | vertical-align: baseline; 25 | } 26 | 27 | body {line-height: 1;} 28 | 29 | ol, ul {list-style: none;} 30 | 31 | blockquote, q {quotes: none;} 32 | 33 | blockquote:before, blockquote:after, 34 | q:before, q:after { 35 | content: ''; 36 | content: none; 37 | } 38 | 39 | /* remember to define focus styles! */ 40 | :focus { 41 | outline: 0; 42 | } 43 | 44 | /* remember to highlight inserts somehow! */ 45 | ins {text-decoration: none;} 46 | del {text-decoration: line-through;} 47 | 48 | /* tables still need 'cellspacing="0"' in the markup */ 49 | table { 50 | border-collapse: collapse; 51 | border-spacing: 0; 52 | } 53 | -------------------------------------------------------------------------------- /pelican/tests/output/custom/theme/css/reset.css: -------------------------------------------------------------------------------- 1 | /* 2 | Name: Reset Stylesheet 3 | Description: Resets browser's default CSS 4 | Author: Eric Meyer 5 | Author URI: https://meyerweb.com/eric/tools/css/reset/ 6 | */ 7 | 8 | /* v1.0 | 20080212 */ 9 | html, body, div, span, applet, object, iframe, 10 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 11 | a, abbr, acronym, address, big, cite, code, 12 | del, dfn, em, font, img, ins, kbd, q, s, samp, 13 | small, strike, strong, sub, sup, tt, var, 14 | b, u, i, center, 15 | dl, dt, dd, ol, ul, li, 16 | fieldset, form, label, legend, 17 | table, caption, tbody, tfoot, thead, tr, th, td { 18 | background: transparent; 19 | border: 0; 20 | font-size: 100%; 21 | margin: 0; 22 | outline: 0; 23 | padding: 0; 24 | vertical-align: baseline; 25 | } 26 | 27 | body {line-height: 1;} 28 | 29 | ol, ul {list-style: none;} 30 | 31 | blockquote, q {quotes: none;} 32 | 33 | blockquote:before, blockquote:after, 34 | q:before, q:after { 35 | content: ''; 36 | content: none; 37 | } 38 | 39 | /* remember to define focus styles! */ 40 | :focus { 41 | outline: 0; 42 | } 43 | 44 | /* remember to highlight inserts somehow! */ 45 | ins {text-decoration: none;} 46 | del {text-decoration: line-through;} 47 | 48 | /* tables still need 'cellspacing="0"' in the markup */ 49 | table { 50 | border-collapse: collapse; 51 | border-spacing: 0; 52 | } 53 | -------------------------------------------------------------------------------- /pelican/tests/output/custom_locale/theme/css/reset.css: -------------------------------------------------------------------------------- 1 | /* 2 | Name: Reset Stylesheet 3 | Description: Resets browser's default CSS 4 | Author: Eric Meyer 5 | Author URI: https://meyerweb.com/eric/tools/css/reset/ 6 | */ 7 | 8 | /* v1.0 | 20080212 */ 9 | html, body, div, span, applet, object, iframe, 10 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 11 | a, abbr, acronym, address, big, cite, code, 12 | del, dfn, em, font, img, ins, kbd, q, s, samp, 13 | small, strike, strong, sub, sup, tt, var, 14 | b, u, i, center, 15 | dl, dt, dd, ol, ul, li, 16 | fieldset, form, label, legend, 17 | table, caption, tbody, tfoot, thead, tr, th, td { 18 | background: transparent; 19 | border: 0; 20 | font-size: 100%; 21 | margin: 0; 22 | outline: 0; 23 | padding: 0; 24 | vertical-align: baseline; 25 | } 26 | 27 | body {line-height: 1;} 28 | 29 | ol, ul {list-style: none;} 30 | 31 | blockquote, q {quotes: none;} 32 | 33 | blockquote:before, blockquote:after, 34 | q:before, q:after { 35 | content: ''; 36 | content: none; 37 | } 38 | 39 | /* remember to define focus styles! */ 40 | :focus { 41 | outline: 0; 42 | } 43 | 44 | /* remember to highlight inserts somehow! */ 45 | ins {text-decoration: none;} 46 | del {text-decoration: line-through;} 47 | 48 | /* tables still need 'cellspacing="0"' in the markup */ 49 | table { 50 | border-collapse: collapse; 51 | border-spacing: 0; 52 | } 53 | -------------------------------------------------------------------------------- /pelican/tests/default_conf.py: -------------------------------------------------------------------------------- 1 | AUTHOR = "Alexis Métaireau" 2 | SITENAME = "Alexis' log" 3 | SITEURL = "http://blog.notmyidea.org" 4 | TIMEZONE = "UTC" 5 | 6 | GITHUB_URL = "http://github.com/ametaireau/" 7 | DISQUS_SITENAME = "blog-notmyidea" 8 | PDF_GENERATOR = False 9 | REVERSE_CATEGORY_ORDER = True 10 | DEFAULT_PAGINATION = 2 11 | 12 | FEED_RSS = "feeds/all.rss.xml" 13 | CATEGORY_FEED_RSS = "feeds/{slug}.rss.xml" 14 | 15 | LINKS = [ 16 | ("Biologeek", "http://biologeek.org"), 17 | ("Filyb", "http://filyb.info/"), 18 | ("Libert-fr", "http://www.libert-fr.com"), 19 | ("N1k0", "http://prendreuncafe.com/blog/"), 20 | ("Tarek Ziadé", "http://ziade.org/blog"), 21 | ("Zubin Mithra", "http://zubin71.wordpress.com/"), 22 | ] 23 | 24 | SOCIAL = [ 25 | ("twitter", "http://twitter.com/ametaireau"), 26 | ("lastfm", "http://lastfm.com/user/akounet"), 27 | ("github", "http://github.com/ametaireau"), 28 | ] 29 | 30 | # global metadata to all the contents 31 | DEFAULT_METADATA = {"yeah": "it is"} 32 | 33 | # path-specific metadata 34 | EXTRA_PATH_METADATA = { 35 | "extra/robots.txt": {"path": "robots.txt"}, 36 | } 37 | 38 | # static paths will be copied without parsing their contents 39 | STATIC_PATHS = [ 40 | "pictures", 41 | "extra/robots.txt", 42 | ] 43 | 44 | FORMATTED_FIELDS = ["summary", "custom_formatted_field"] 45 | 46 | # foobar will not be used, because it's not in caps. All configuration keys 47 | # have to be in caps 48 | foobar = "barbaz" 49 | -------------------------------------------------------------------------------- /pelican/tests/output/basic/feeds/alexis-metaireau.rss.xml: -------------------------------------------------------------------------------- 1 | 2 | A Pelican Blog - Alexis Métaireau/Sun, 17 Nov 2013 23:29:00 +0000This is a super article !/this-is-a-super-article.html<p class="first last">Multi-line metadata should be supported 3 | as well as <strong>inline markup</strong>.</p> 4 | Alexis MétaireauThu, 02 Dec 2010 10:14:00 +0000tag:None,2010-12-02:/this-is-a-super-article.htmlyeahfoobarfoobarOh yeah !/oh-yeah.html<div class="section" id="why-not"> 5 | <h2>Why not ?</h2> 6 | <p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst ! 7 | YEAH !</p> 8 | <img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" /> 9 | </div> 10 | Alexis MétaireauWed, 20 Oct 2010 10:14:00 +0000tag:None,2010-10-20:/oh-yeah.htmlbarohbaryeah 11 | -------------------------------------------------------------------------------- /pelican/tests/output/basic/feeds/yeah.atom.xml: -------------------------------------------------------------------------------- 1 | 2 | A Pelican Blog - yeah/2013-11-17T23:29:00+00:00This is a super article !2010-12-02T10:14:00+00:002013-11-17T23:29:00+00:00Alexis Métaireautag:None,2010-12-02:/this-is-a-super-article.html<p class="first last">Multi-line metadata should be supported 3 | as well as <strong>inline markup</strong>.</p> 4 | <p>Some content here !</p> 5 | <div class="section" id="this-is-a-simple-title"> 6 | <h2>This is a simple title</h2> 7 | <p>And here comes the cool <a class="reference external" href="http://books.couchdb.org/relax/design-documents/views">stuff</a>.</p> 8 | <img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" /> 9 | <img alt="alternate text" src="/pictures/Sushi_Macro.jpg" style="width: 600px; height: 450px;" /> 10 | <pre class="literal-block"> 11 | &gt;&gt;&gt; from ipdb import set_trace 12 | &gt;&gt;&gt; set_trace() 13 | </pre> 14 | <p>→ And now try with some utf8 hell: ééé</p> 15 | </div> 16 | 17 | -------------------------------------------------------------------------------- /pelican/tests/output/custom/feeds/yeah.atom.xml: -------------------------------------------------------------------------------- 1 | 2 | Alexis' log - yeahhttp://blog.notmyidea.org/2013-11-17T23:29:00+01:00A personal blog.This is a super article !2010-12-02T10:14:00+01:002013-11-17T23:29:00+01:00Alexis Métaireautag:blog.notmyidea.org,2010-12-02:/this-is-a-super-article.html<p class="first last">Multi-line metadata should be supported 3 | as well as <strong>inline markup</strong>.</p> 4 | <p>Some content here !</p> 5 | <div class="section" id="this-is-a-simple-title"> 6 | <h2>This is a simple title</h2> 7 | <p>And here comes the cool <a class="reference external" href="http://books.couchdb.org/relax/design-documents/views">stuff</a>.</p> 8 | <img alt="alternate text" src="http://blog.notmyidea.org/pictures/Sushi.jpg" style="width: 600px; height: 450px;" /> 9 | <img alt="alternate text" src="http://blog.notmyidea.org/pictures/Sushi_Macro.jpg" style="width: 600px; height: 450px;" /> 10 | <pre class="literal-block"> 11 | &gt;&gt;&gt; from ipdb import set_trace 12 | &gt;&gt;&gt; set_trace() 13 | </pre> 14 | <p>→ And now try with some utf8 hell: ééé</p> 15 | </div> 16 | 17 | -------------------------------------------------------------------------------- /pelican/tests/output/basic/feeds/cat1.atom.xml: -------------------------------------------------------------------------------- 1 | 2 | A Pelican Blog - cat1/2011-04-20T00:00:00+00:00A markdown powered article2011-04-20T00:00:00+00:002011-04-20T00:00:00+00:00tag:None,2011-04-20:/a-markdown-powered-article.html<p>You're mutually oblivious.</p> 3 | <p><a href="/unbelievable.html">a root-relative link to unbelievable</a> 4 | <a href="/unbelievable.html">a file-relative link to unbelievable</a></p>Article 12011-02-17T00:00:00+00:002011-02-17T00:00:00+00:00tag:None,2011-02-17:/article-1.html<p>Article 1</p> 5 | Article 22011-02-17T00:00:00+00:002011-02-17T00:00:00+00:00tag:None,2011-02-17:/article-2.html<p>Article 2</p> 6 | Article 32011-02-17T00:00:00+00:002011-02-17T00:00:00+00:00tag:None,2011-02-17:/article-3.html<p>Article 3</p> 7 | 8 | -------------------------------------------------------------------------------- /pelican/tests/output/custom_locale/feeds/yeah.atom.xml: -------------------------------------------------------------------------------- 1 | 2 | Alexis' log - yeahhttp://blog.notmyidea.org/2013-11-17T23:29:00+01:00This is a super article !2010-12-02T10:14:00+01:002013-11-17T23:29:00+01:00Alexis Métaireautag:blog.notmyidea.org,2010-12-02:/posts/2010/décembre/02/this-is-a-super-article/<p class="first last">Multi-line metadata should be supported 3 | as well as <strong>inline markup</strong>.</p> 4 | <p>Some content here !</p> 5 | <div class="section" id="this-is-a-simple-title"> 6 | <h2>This is a simple title</h2> 7 | <p>And here comes the cool <a class="reference external" href="http://books.couchdb.org/relax/design-documents/views">stuff</a>.</p> 8 | <img alt="alternate text" src="http://blog.notmyidea.org/pictures/Sushi.jpg" style="width: 600px; height: 450px;" /> 9 | <img alt="alternate text" src="http://blog.notmyidea.org/pictures/Sushi_Macro.jpg" style="width: 600px; height: 450px;" /> 10 | <pre class="literal-block"> 11 | &gt;&gt;&gt; from ipdb import set_trace 12 | &gt;&gt;&gt; set_trace() 13 | </pre> 14 | <p>→ And now try with some utf8 hell: ééé</p> 15 | </div> 16 | 17 | -------------------------------------------------------------------------------- /samples/pelican.conf.py: -------------------------------------------------------------------------------- 1 | AUTHOR = "Alexis Métaireau" 2 | SITENAME = "Alexis' log" 3 | SITESUBTITLE = "A personal blog." 4 | SITEURL = "http://blog.notmyidea.org" 5 | TIMEZONE = "Europe/Paris" 6 | 7 | # can be useful in development, but set to False when you're ready to publish 8 | RELATIVE_URLS = True 9 | 10 | GITHUB_URL = "http://github.com/ametaireau/" 11 | DISQUS_SITENAME = "blog-notmyidea" 12 | REVERSE_CATEGORY_ORDER = True 13 | LOCALE = "C" 14 | DEFAULT_PAGINATION = 4 15 | DEFAULT_DATE = (2012, 3, 2, 14, 1, 1) 16 | 17 | FEED_ALL_RSS = "feeds/all.rss.xml" 18 | CATEGORY_FEED_RSS = "feeds/{slug}.rss.xml" 19 | 20 | LINKS = [ 21 | ("Biologeek", "http://biologeek.org"), 22 | ("Filyb", "http://filyb.info/"), 23 | ("Libert-fr", "http://www.libert-fr.com"), 24 | ("N1k0", "http://prendreuncafe.com/blog/"), 25 | ("Tarek Ziadé", "http://ziade.org/blog"), 26 | ("Zubin Mithra", "http://zubin71.wordpress.com/"), 27 | ] 28 | 29 | SOCIAL = [ 30 | ("twitter", "http://twitter.com/ametaireau"), 31 | ("lastfm", "http://lastfm.com/user/akounet"), 32 | ("github", "http://github.com/ametaireau"), 33 | ] 34 | 35 | # global metadata to all the contents 36 | DEFAULT_METADATA = {"yeah": "it is"} 37 | 38 | # path-specific metadata 39 | EXTRA_PATH_METADATA = { 40 | "extra/robots.txt": {"path": "robots.txt"}, 41 | } 42 | 43 | # static paths will be copied without parsing their contents 44 | STATIC_PATHS = [ 45 | "images", 46 | "extra/robots.txt", 47 | ] 48 | 49 | # custom page generated with a jinja2 template 50 | TEMPLATE_PAGES = {"pages/jinja2_template.html": "jinja2_template.html"} 51 | 52 | # there is no other HTML content 53 | READERS = {"html": None} 54 | 55 | # code blocks with line numbers 56 | PYGMENTS_RST_OPTIONS = {"linenos": "table"} 57 | 58 | # foobar will not be used, because it's not in caps. All configuration keys 59 | # have to be in caps 60 | foobar = "barbaz" 61 | -------------------------------------------------------------------------------- /samples/pelican.conf_FR.py: -------------------------------------------------------------------------------- 1 | AUTHOR = "Alexis Métaireau" 2 | SITENAME = "Alexis' log" 3 | SITEURL = "http://blog.notmyidea.org" 4 | TIMEZONE = "Europe/Paris" 5 | 6 | # can be useful in development, but set to False when you're ready to publish 7 | RELATIVE_URLS = True 8 | 9 | GITHUB_URL = "http://github.com/ametaireau/" 10 | DISQUS_SITENAME = "blog-notmyidea" 11 | PDF_GENERATOR = False 12 | REVERSE_CATEGORY_ORDER = True 13 | LOCALE = "fr_FR.UTF-8" 14 | DEFAULT_PAGINATION = 4 15 | DEFAULT_DATE = (2012, 3, 2, 14, 1, 1) 16 | DEFAULT_DATE_FORMAT = "%d %B %Y" 17 | 18 | ARTICLE_URL = "posts/{date:%Y}/{date:%B}/{date:%d}/{slug}/" 19 | ARTICLE_SAVE_AS = ARTICLE_URL + "index.html" 20 | 21 | FEED_ALL_RSS = "feeds/all.rss.xml" 22 | CATEGORY_FEED_RSS = "feeds/{slug}.rss.xml" 23 | 24 | LINKS = [ 25 | ("Biologeek", "http://biologeek.org"), 26 | ("Filyb", "http://filyb.info/"), 27 | ("Libert-fr", "http://www.libert-fr.com"), 28 | ("N1k0", "http://prendreuncafe.com/blog/"), 29 | ("Tarek Ziadé", "http://ziade.org/blog"), 30 | ("Zubin Mithra", "http://zubin71.wordpress.com/"), 31 | ] 32 | 33 | SOCIAL = [ 34 | ("twitter", "http://twitter.com/ametaireau"), 35 | ("lastfm", "http://lastfm.com/user/akounet"), 36 | ("github", "http://github.com/ametaireau"), 37 | ] 38 | 39 | # global metadata to all the contents 40 | DEFAULT_METADATA = {"yeah": "it is"} 41 | 42 | # path-specific metadata 43 | EXTRA_PATH_METADATA = { 44 | "extra/robots.txt": {"path": "robots.txt"}, 45 | } 46 | 47 | # static paths will be copied without parsing their contents 48 | STATIC_PATHS = [ 49 | "pictures", 50 | "extra/robots.txt", 51 | ] 52 | 53 | # custom page generated with a jinja2 template 54 | TEMPLATE_PAGES = {"pages/jinja2_template.html": "jinja2_template.html"} 55 | 56 | # code blocks with line numbers 57 | PYGMENTS_RST_OPTIONS = {"linenos": "table"} 58 | 59 | # foobar will not be used, because it's not in caps. All configuration keys 60 | # have to be in caps 61 | foobar = "barbaz" 62 | -------------------------------------------------------------------------------- /pelican/plugins/signals.py: -------------------------------------------------------------------------------- 1 | from blinker import Signal, signal 2 | from ordered_set import OrderedSet 3 | 4 | # Signals will call functions in the order of connection, i.e. plugin order 5 | Signal.set_class = OrderedSet 6 | 7 | # Run-level signals: 8 | 9 | initialized = signal("pelican_initialized") 10 | get_generators = signal("get_generators") 11 | all_generators_finalized = signal("all_generators_finalized") 12 | get_writer = signal("get_writer") 13 | finalized = signal("pelican_finalized") 14 | 15 | # Reader-level signals 16 | 17 | readers_init = signal("readers_init") 18 | 19 | # Generator-level signals 20 | 21 | generator_init = signal("generator_init") 22 | 23 | article_generator_init = signal("article_generator_init") 24 | article_generator_pretaxonomy = signal("article_generator_pretaxonomy") 25 | article_generator_finalized = signal("article_generator_finalized") 26 | article_generator_write_article = signal("article_generator_write_article") 27 | article_writer_finalized = signal("article_writer_finalized") 28 | 29 | page_generator_init = signal("page_generator_init") 30 | page_generator_finalized = signal("page_generator_finalized") 31 | page_generator_write_page = signal("page_generator_write_page") 32 | page_writer_finalized = signal("page_writer_finalized") 33 | 34 | static_generator_init = signal("static_generator_init") 35 | static_generator_finalized = signal("static_generator_finalized") 36 | 37 | # Page-level signals 38 | 39 | article_generator_preread = signal("article_generator_preread") 40 | article_generator_context = signal("article_generator_context") 41 | 42 | page_generator_preread = signal("page_generator_preread") 43 | page_generator_context = signal("page_generator_context") 44 | 45 | static_generator_preread = signal("static_generator_preread") 46 | static_generator_context = signal("static_generator_context") 47 | 48 | content_object_init = signal("content_object_init") 49 | 50 | # Writers signals 51 | content_written = signal("content_written") 52 | feed_generated = signal("feed_generated") 53 | feed_written = signal("feed_written") 54 | -------------------------------------------------------------------------------- /docs/locale/zh_CN/LC_MESSAGES/sphinx.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) 2010–2024 3 | # This file is distributed under the same license as the PELICAN package. 4 | # FIRST AUTHOR , 2024. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PELICAN 4\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2024-06-24 19:06+0800\n" 11 | "PO-Revision-Date: 2024-06-27 19:00+0800\n" 12 | "Last-Translator: GeorgeHu \n" 13 | "Language: zh_CN\n" 14 | "Language-Team: \n" 15 | "Plural-Forms: nplurals=1; plural=0;\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=utf-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "Generated-By: Babel 2.15.0\n" 20 | 21 | #: ../../_templates/page.html:68 697aead398874e06aa15cfd74d134745 22 | msgid "Back to top" 23 | msgstr "返回顶部" 24 | 25 | #: ../../_templates/page.html:101 f91a64e54aae49c2bd09a944ea693193 26 | msgid "Next" 27 | msgstr "下一节" 28 | 29 | #: ../../_templates/page.html:113 6c3ad069077b4e2cb6e1f77cc2962881 30 | msgid "Previous" 31 | msgstr "前一节" 32 | 33 | #: ../../_templates/page.html:116 e83e03d0b50c4065a9f87db25a23b3ee 34 | msgid "Home" 35 | msgstr "首页" 36 | 37 | #: ../../_templates/page.html:129 1d0fdb4c0b4e420283101ba5c21ac985 38 | #, python-format 39 | msgid "Copyright © %(copyright)s" 40 | msgstr "Copyright © %(copyright)s" 41 | 42 | #: ../../_templates/page.html:133 0a35c662e6574da48f7ac5c6b2c82874 43 | #, python-format 44 | msgid "" 45 | "Copyright © %(copyright)s, Justin Mayer, Alexis Metaireau, and " 47 | "contributors" 48 | msgstr "" 49 | "Copyright © %(copyright)s, Justin Mayer, Alexis Metaireau, and " 51 | "contributors" 52 | 53 | #: ../../_templates/page.html:141 07b89372db484251bfcd3b54e0845bf0 54 | #, python-format 55 | msgid "Last updated on %(last_updated)s" 56 | msgstr "最后更新于 %(last_updated)s" 57 | 58 | #: ../../_templates/page.html:187 2eb9f1b479a7405290a91d8e1962f265 59 | msgid "On this page" 60 | msgstr "本页目录" 61 | -------------------------------------------------------------------------------- /pelican/tests/output/custom/feeds/cat1.rss.xml: -------------------------------------------------------------------------------- 1 | 2 | Alexis' log - cat1http://blog.notmyidea.org/A personal blog.Wed, 20 Apr 2011 00:00:00 +0200A markdown powered articlehttp://blog.notmyidea.org/a-markdown-powered-article.html<p>You're mutually oblivious.</p> 3 | <p><a href="http://blog.notmyidea.org/unbelievable.html">a root-relative link to unbelievable</a> 4 | <a href="http://blog.notmyidea.org/unbelievable.html">a file-relative link to unbelievable</a></p>Alexis MétaireauWed, 20 Apr 2011 00:00:00 +0200tag:blog.notmyidea.org,2011-04-20:/a-markdown-powered-article.htmlcat1Article 1http://blog.notmyidea.org/article-1.html<p>Article 1</p> 5 | Alexis MétaireauThu, 17 Feb 2011 00:00:00 +0100tag:blog.notmyidea.org,2011-02-17:/article-1.htmlcat1Article 2http://blog.notmyidea.org/article-2.html<p>Article 2</p> 6 | Alexis MétaireauThu, 17 Feb 2011 00:00:00 +0100tag:blog.notmyidea.org,2011-02-17:/article-2.htmlcat1Article 3http://blog.notmyidea.org/article-3.html<p>Article 3</p> 7 | Alexis MétaireauThu, 17 Feb 2011 00:00:00 +0100tag:blog.notmyidea.org,2011-02-17:/article-3.htmlcat1 8 | -------------------------------------------------------------------------------- /pelican/themes/notmyidea/templates/article.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block html_lang %}{{ article.lang }}{% endblock %} 3 | {% block head -%} 4 | {{ super() -}} 5 | {% if article.summary %} 6 | 7 | {% endif %} 8 | {% endblock %} 9 | 10 | {% block title %}{{ article.title|striptags }}{% endblock %} 11 | 12 | {% block extra_head %} 13 | {% import 'translations.html' as translations with context %} 14 | {% if translations.entry_hreflang(article) %} 15 | {{ translations.entry_hreflang(article) }} 16 | {% endif %} 17 | {% endblock %} 18 | 19 | {% block content %} 20 |
21 |
22 |
23 |

24 | {{ article.title }}

26 | {% include 'twitter.html' %} 27 |
28 | 29 |
30 | {% include 'article_infos.html' %} 31 | {{ article.content }} 32 |
33 | {% if DISQUS_SITENAME and SITEURL and article.status != "draft" %} 34 |
35 |

Comments !

36 |
37 | 47 | 48 |
49 | {% endif %} 50 | 51 |
52 |
53 | {% endblock %} 54 | -------------------------------------------------------------------------------- /pelican/tests/test_server.py: -------------------------------------------------------------------------------- 1 | import os 2 | from io import BytesIO 3 | from shutil import rmtree 4 | from tempfile import mkdtemp 5 | 6 | from pelican.server import ComplexHTTPRequestHandler 7 | from pelican.tests.support import unittest 8 | 9 | 10 | class MockRequest: 11 | def makefile(self, *_args, **_kwargs): 12 | return BytesIO(b"") 13 | 14 | 15 | class MockServer: 16 | pass 17 | 18 | 19 | class TestServer(unittest.TestCase): 20 | def setUp(self): 21 | self.server = MockServer() 22 | self.temp_output = mkdtemp(prefix="pelicantests.") 23 | self.old_cwd = os.getcwd() 24 | os.chdir(self.temp_output) 25 | 26 | def tearDown(self): 27 | os.chdir(self.old_cwd) 28 | rmtree(self.temp_output) 29 | 30 | def test_get_path_that_exists(self): 31 | handler = ComplexHTTPRequestHandler( 32 | MockRequest(), ("0.0.0.0", 8888), self.server 33 | ) 34 | handler.base_path = self.temp_output 35 | 36 | open(os.path.join(self.temp_output, "foo.html"), "a").close() 37 | os.mkdir(os.path.join(self.temp_output, "foo")) 38 | open(os.path.join(self.temp_output, "foo", "index.html"), "a").close() 39 | 40 | os.mkdir(os.path.join(self.temp_output, "bar")) 41 | open(os.path.join(self.temp_output, "bar", "index.html"), "a").close() 42 | 43 | os.mkdir(os.path.join(self.temp_output, "baz")) 44 | 45 | for suffix in ["", "/"]: 46 | # foo.html has precedence over foo/index.html 47 | path = handler.get_path_that_exists("foo" + suffix) 48 | self.assertEqual(path, "foo.html") 49 | 50 | # folder with index.html should return folder/index.html 51 | path = handler.get_path_that_exists("bar" + suffix) 52 | self.assertEqual(path, "bar/index.html") 53 | 54 | # folder without index.html should return same as input 55 | path = handler.get_path_that_exists("baz" + suffix) 56 | self.assertEqual(path, "baz" + suffix) 57 | 58 | # not existing path should return None 59 | path = handler.get_path_that_exists("quux" + suffix) 60 | self.assertIsNone(path) 61 | -------------------------------------------------------------------------------- /pelican/tests/output/custom/feeds/cat1.atom.xml: -------------------------------------------------------------------------------- 1 | 2 | Alexis' log - cat1http://blog.notmyidea.org/2011-04-20T00:00:00+02:00A personal blog.A markdown powered article2011-04-20T00:00:00+02:002011-04-20T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-04-20:/a-markdown-powered-article.html<p>You're mutually oblivious.</p> 3 | <p><a href="http://blog.notmyidea.org/unbelievable.html">a root-relative link to unbelievable</a> 4 | <a href="http://blog.notmyidea.org/unbelievable.html">a file-relative link to unbelievable</a></p>Article 12011-02-17T00:00:00+01:002011-02-17T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2011-02-17:/article-1.html<p>Article 1</p> 5 | Article 22011-02-17T00:00:00+01:002011-02-17T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2011-02-17:/article-2.html<p>Article 2</p> 6 | Article 32011-02-17T00:00:00+01:002011-02-17T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2011-02-17:/article-3.html<p>Article 3</p> 7 | 8 | -------------------------------------------------------------------------------- /pelican/themes/simple/templates/article.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block html_lang %}{{ article.lang }}{% endblock %} 3 | 4 | {% block title %}{{ SITENAME|striptags }} - {{ article.title|striptags }}{% endblock %} 5 | 6 | {% block head %} 7 | {{ super() }} 8 | 9 | {% import 'translations.html' as translations with context %} 10 | {% if translations.entry_hreflang(article) %} 11 | {{ translations.entry_hreflang(article) }} 12 | {% endif %} 13 | 14 | {% if article.description %} 15 | 16 | {% endif %} 17 | 18 | {% for tag in article.tags %} 19 | 20 | {% endfor %} 21 | 22 | {% endblock %} 23 | 24 | {% block content %} 25 |
26 |
27 |

28 | {{ article.title }}

30 | {% import 'translations.html' as translations with context %} 31 | {{ translations.translations_for(article) }} 32 |
33 | {{ article.content }} 34 |
35 |

Published:

38 | {% if article.modified %} 39 |

Last updated:

42 | {% endif %} 43 | {% if article.authors %} 44 |
45 | By {% for author in article.authors %} 46 | {{ author }} 47 | {% endfor %} 48 |
49 | {% endif %} 50 | {% if article.category %} 51 |

52 | Category: {{ article.category }} 53 |

54 | {% endif %} 55 | {% if article.tags %} 56 |

57 | Tags: 58 | {% for tag in article.tags %} 59 | {{ tag }} 60 | {% endfor %} 61 |

62 | {% endif %} 63 |
64 |
65 | {% endblock %} 66 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/---bug-report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: "\U0001F41E Bug Report" 3 | about: Did you find a bug? 4 | title: '' 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | 17 | 18 | 19 | - [ ] 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. 20 | - [ ] 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). 21 | - [ ] 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. 22 | 23 | 30 | 31 | - **OS version and name**: 32 | - **Python version**: 33 | - **Pelican version**: 34 | - **Link to theme**: 35 | - **Links to plugins**: 36 | - **Link to your site**: 37 | - **Link to your source**: 38 | - **Link to a [Gist](https://gist.github.com/) with the contents of your settings file**: 39 | 40 | ## Issue 41 | 45 | -------------------------------------------------------------------------------- /pelican/tests/output/custom_locale/feeds/cat1.rss.xml: -------------------------------------------------------------------------------- 1 | 2 | Alexis' log - cat1http://blog.notmyidea.org/Wed, 20 Apr 2011 00:00:00 +0200A markdown powered articlehttp://blog.notmyidea.org/posts/2011/avril/20/a-markdown-powered-article/<p>You're mutually oblivious.</p> 3 | <p><a href="http://blog.notmyidea.org/posts/2010/octobre/15/unbelievable/">a root-relative link to unbelievable</a> 4 | <a href="http://blog.notmyidea.org/posts/2010/octobre/15/unbelievable/">a file-relative link to unbelievable</a></p>Alexis MétaireauWed, 20 Apr 2011 00:00:00 +0200tag:blog.notmyidea.org,2011-04-20:/posts/2011/avril/20/a-markdown-powered-article/cat1Article 1http://blog.notmyidea.org/posts/2011/f%C3%A9vrier/17/article-1/<p>Article 1</p> 5 | Alexis MétaireauThu, 17 Feb 2011 00:00:00 +0100tag:blog.notmyidea.org,2011-02-17:/posts/2011/février/17/article-1/cat1Article 2http://blog.notmyidea.org/posts/2011/f%C3%A9vrier/17/article-2/<p>Article 2</p> 6 | Alexis MétaireauThu, 17 Feb 2011 00:00:00 +0100tag:blog.notmyidea.org,2011-02-17:/posts/2011/février/17/article-2/cat1Article 3http://blog.notmyidea.org/posts/2011/f%C3%A9vrier/17/article-3/<p>Article 3</p> 7 | Alexis MétaireauThu, 17 Feb 2011 00:00:00 +0100tag:blog.notmyidea.org,2011-02-17:/posts/2011/février/17/article-3/cat1 8 | -------------------------------------------------------------------------------- /pelican/tests/output/basic/feeds/alexis-metaireau.atom.xml: -------------------------------------------------------------------------------- 1 | 2 | A Pelican Blog - Alexis Métaireau/2013-11-17T23:29:00+00:00This is a super article !2010-12-02T10:14:00+00:002013-11-17T23:29:00+00:00Alexis Métaireautag:None,2010-12-02:/this-is-a-super-article.html<p class="first last">Multi-line metadata should be supported 3 | as well as <strong>inline markup</strong>.</p> 4 | <p>Some content here !</p> 5 | <div class="section" id="this-is-a-simple-title"> 6 | <h2>This is a simple title</h2> 7 | <p>And here comes the cool <a class="reference external" href="http://books.couchdb.org/relax/design-documents/views">stuff</a>.</p> 8 | <img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" /> 9 | <img alt="alternate text" src="/pictures/Sushi_Macro.jpg" style="width: 600px; height: 450px;" /> 10 | <pre class="literal-block"> 11 | &gt;&gt;&gt; from ipdb import set_trace 12 | &gt;&gt;&gt; set_trace() 13 | </pre> 14 | <p>→ And now try with some utf8 hell: ééé</p> 15 | </div> 16 | Oh yeah !2010-10-20T10:14:00+00:002010-10-20T10:14:00+00:00Alexis Métaireautag:None,2010-10-20:/oh-yeah.html<div class="section" id="why-not"> 17 | <h2>Why not ?</h2> 18 | <p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst ! 19 | YEAH !</p> 20 | <img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" /> 21 | </div> 22 | 23 | -------------------------------------------------------------------------------- /docs/index.rst: -------------------------------------------------------------------------------- 1 | Pelican |release| 2 | ================= 3 | 4 | Pelican is a static site generator, written in Python_. Highlights include: 5 | 6 | * Write your content directly with your editor of choice in reStructuredText_ 7 | or Markdown_ formats 8 | * Includes a simple CLI tool to (re)generate your site 9 | * Easy to interface with distributed version control systems and web hooks 10 | * Completely static output is easy to host anywhere 11 | 12 | Ready to get started? Check out the :doc:`Quickstart` guide. 13 | 14 | Features 15 | -------- 16 | 17 | Pelican’s feature highlights include: 18 | 19 | * Articles (e.g., blog posts) and pages (e.g., "About", "Projects", "Contact") 20 | * Integration with external services 21 | * Site themes (created using Jinja2_ templates) 22 | * Publication of articles in multiple languages 23 | * Generation of Atom and RSS feeds 24 | * Code syntax highlighting 25 | * Import existing content from WordPress, Dotclear, or RSS feeds 26 | * Fast rebuild times thanks to content caching and selective output writing 27 | * Extensible via a rich plugin ecosystem: `Pelican Plugins`_ 28 | 29 | Why the name "Pelican"? 30 | ----------------------- 31 | 32 | "Pelican" is an anagram for *calepin*, which means "notebook" in French. ;) 33 | 34 | Source code 35 | ----------- 36 | 37 | You can access the source code at: https://github.com/getpelican/pelican 38 | 39 | How to get help, contribute, or provide feedback 40 | ------------------------------------------------ 41 | 42 | See our :doc:`feedback and contribution submission guidelines `. 43 | 44 | Documentation 45 | ------------- 46 | 47 | .. toctree:: 48 | :maxdepth: 2 49 | 50 | quickstart 51 | install 52 | content 53 | publish 54 | settings 55 | plugins 56 | themes 57 | pelican-themes 58 | importer 59 | faq 60 | tips 61 | contribute 62 | internals 63 | report 64 | changelog 65 | 66 | .. Links 67 | 68 | .. _Python: https://www.python.org/ 69 | .. _reStructuredText: http://docutils.sourceforge.net/rst.html 70 | .. _Markdown: https://daringfireball.net/projects/markdown/ 71 | .. _Jinja2: https://palletsprojects.com/p/jinja/ 72 | .. _`Pelican documentation`: https://docs.getpelican.com/latest/ 73 | .. _`Pelican's internals`: https://docs.getpelican.com/en/latest/internals.html 74 | .. _`Pelican Plugins`: https://github.com/pelican-plugins 75 | -------------------------------------------------------------------------------- /pelican/tests/output/custom_locale/feeds/cat1.atom.xml: -------------------------------------------------------------------------------- 1 | 2 | Alexis' log - cat1http://blog.notmyidea.org/2011-04-20T00:00:00+02:00A markdown powered article2011-04-20T00:00:00+02:002011-04-20T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-04-20:/posts/2011/avril/20/a-markdown-powered-article/<p>You're mutually oblivious.</p> 3 | <p><a href="http://blog.notmyidea.org/posts/2010/octobre/15/unbelievable/">a root-relative link to unbelievable</a> 4 | <a href="http://blog.notmyidea.org/posts/2010/octobre/15/unbelievable/">a file-relative link to unbelievable</a></p>Article 12011-02-17T00:00:00+01:002011-02-17T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2011-02-17:/posts/2011/février/17/article-1/<p>Article 1</p> 5 | Article 22011-02-17T00:00:00+01:002011-02-17T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2011-02-17:/posts/2011/février/17/article-2/<p>Article 2</p> 6 | Article 32011-02-17T00:00:00+01:002011-02-17T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2011-02-17:/posts/2011/février/17/article-3/<p>Article 3</p> 7 | 8 | -------------------------------------------------------------------------------- /pelican/tests/build_test/test_build_files.py: -------------------------------------------------------------------------------- 1 | import importlib.metadata 2 | import tarfile 3 | from pathlib import Path 4 | from re import match 5 | from zipfile import ZipFile 6 | 7 | import pytest 8 | 9 | version = importlib.metadata.version("pelican") 10 | 11 | 12 | @pytest.mark.skipif( 13 | "not config.getoption('--check-build')", 14 | reason="Only run when --check-build is given", 15 | ) 16 | def test_wheel_contents(pytestconfig): 17 | """ 18 | This test should test the contents of the wheel to make sure 19 | that everything that is needed is included in the final build 20 | """ 21 | dist_folder = pytestconfig.getoption("--check-build") 22 | wheels = Path(dist_folder).rglob(f"pelican-{version}-py3-none-any.whl") 23 | for wheel_file in wheels: 24 | files_list = ZipFile(wheel_file).namelist() 25 | # Check if theme files are copied to wheel 26 | simple_theme = Path("./pelican/themes/simple/templates") 27 | for x in simple_theme.iterdir(): 28 | assert str(x) in files_list 29 | 30 | # Check if tool templates are copied to wheel 31 | tools = Path("./pelican/tools/templates") 32 | for x in tools.iterdir(): 33 | assert str(x) in files_list 34 | 35 | assert "pelican/tools/templates/tasks.py.jinja2" in files_list 36 | 37 | 38 | @pytest.mark.skipif( 39 | "not config.getoption('--check-build')", 40 | reason="Only run when --check-build is given", 41 | ) 42 | @pytest.mark.parametrize( 43 | "expected_file", 44 | [ 45 | ("THANKS"), 46 | ("README.rst"), 47 | ("CONTRIBUTING.rst"), 48 | ("docs/changelog.rst"), 49 | ("samples/"), 50 | ], 51 | ) 52 | def test_sdist_contents(pytestconfig, expected_file): 53 | """ 54 | This test should test the contents of the source distribution to make sure 55 | that everything that is needed is included in the final build. 56 | """ 57 | dist_folder = pytestconfig.getoption("--check-build") 58 | sdist_files = Path(dist_folder).rglob(f"pelican-{version}.tar.gz") 59 | for dist in sdist_files: 60 | files_list = tarfile.open(dist, "r:gz").getnames() 61 | dir_matcher = "" 62 | if expected_file.endswith("/"): 63 | dir_matcher = ".*" 64 | filtered_values = [ 65 | path 66 | for path in files_list 67 | if match(rf"^pelican-{version}/{expected_file}{dir_matcher}$", path) 68 | ] 69 | assert len(filtered_values) > 0 70 | -------------------------------------------------------------------------------- /samples/content/unbelievable.rst: -------------------------------------------------------------------------------- 1 | Unbelievable ! 2 | ############## 3 | 4 | :date: 2010-10-15 20:30 5 | 6 | Or completely awesome. Depends the needs. 7 | 8 | `a root-relative link to markdown-article <|filename|/cat1/markdown-article.md>`_ 9 | `a file-relative link to markdown-article <|filename|cat1/markdown-article.md>`_ 10 | 11 | Testing sourcecode directive 12 | ---------------------------- 13 | 14 | .. sourcecode:: python 15 | :linenos: 16 | 17 | formatter = self.options and VARIANTS[self.options.keys()[0]] 18 | 19 | 20 | Testing another case 21 | -------------------- 22 | 23 | This will now have a line number in 'custom' since it's the default in 24 | pelican.conf, it will have nothing in default. 25 | 26 | .. sourcecode:: python 27 | 28 | formatter = self.options and VARIANTS[self.options.keys()[0]] 29 | 30 | 31 | Lovely. 32 | 33 | Testing more sourcecode directives 34 | ---------------------------------- 35 | 36 | .. sourcecode:: python 37 | :anchorlinenos: 38 | :classprefix: testing 39 | :hl_lines: 10,11,12 40 | :lineanchors: foo 41 | :linenos: inline 42 | :linenospecial: 2 43 | :linenostart: 8 44 | :linenostep: 2 45 | :lineseparator:
46 | :linespans: foo 47 | :nobackground: 48 | 49 | def run(self): 50 | self.assert_has_content() 51 | try: 52 | lexer = get_lexer_by_name(self.arguments[0]) 53 | except ValueError: 54 | # no lexer found - use the text one instead of an exception 55 | lexer = TextLexer() 56 | 57 | if ('linenos' in self.options and 58 | self.options['linenos'] not in ('table', 'inline')): 59 | self.options['linenos'] = 'table' 60 | 61 | for flag in ('nowrap', 'nobackground', 'anchorlinenos'): 62 | if flag in self.options: 63 | self.options[flag] = True 64 | 65 | # noclasses should already default to False, but just in case... 66 | formatter = HtmlFormatter(noclasses=False, **self.options) 67 | parsed = highlight('\n'.join(self.content), lexer, formatter) 68 | return [nodes.raw('', parsed, format='html')] 69 | 70 | 71 | Lovely. 72 | 73 | Testing even more sourcecode directives 74 | --------------------------------------- 75 | 76 | .. sourcecode:: python 77 | :linenos: table 78 | :nowrap: 79 | 80 | 81 | formatter = self.options and VARIANTS[self.options.keys()[0]] 82 | 83 | 84 | Lovely. 85 | 86 | Testing overriding config defaults 87 | ---------------------------------- 88 | 89 | Even if the default is line numbers, we can override it here 90 | 91 | .. sourcecode:: python 92 | :linenos: none 93 | 94 | 95 | formatter = self.options and VARIANTS[self.options.keys()[0]] 96 | 97 | 98 | Lovely. 99 | -------------------------------------------------------------------------------- /docs/quickstart.rst: -------------------------------------------------------------------------------- 1 | Quickstart 2 | ########## 3 | 4 | Reading through all the documentation is highly recommended, but for the truly 5 | impatient, following are some quick steps to get started. 6 | 7 | Installation 8 | ------------ 9 | 10 | Install Pelican (and optionally Markdown if you intend to use it) on Python 11 | |min_python| by running the following command in your preferred terminal, prefixing 12 | with ``sudo`` if permissions warrant:: 13 | 14 | python -m pip install "pelican[markdown]" 15 | 16 | Create a project 17 | ---------------- 18 | 19 | First, choose a name for your project, create an appropriately-named directory 20 | for your site, and switch to that directory:: 21 | 22 | mkdir -p ~/projects/yoursite 23 | cd ~/projects/yoursite 24 | 25 | Create a skeleton project via the ``pelican-quickstart`` command, which begins 26 | by asking some questions about your site:: 27 | 28 | pelican-quickstart 29 | 30 | For questions that have default values denoted in brackets, feel free to use 31 | the Return key to accept those default values [#tzlocal_fn]_. When asked for 32 | your URL prefix, enter your domain name as indicated (e.g., 33 | ``https://example.com``). 34 | 35 | Create an article 36 | ----------------- 37 | 38 | You cannot run Pelican until you have created some content. Use your preferred 39 | text editor to create your first article with the following content:: 40 | 41 | Title: My First Review 42 | Date: 2010-12-03 10:20 43 | Category: Review 44 | 45 | Following is a review of my favorite mechanical keyboard. 46 | 47 | Given that this example article is in Markdown format, save it as 48 | ``~/projects/yoursite/content/keyboard-review.md``. 49 | 50 | Generate your site 51 | ------------------ 52 | 53 | From your project root directory, run the ``pelican`` command to generate your site:: 54 | 55 | pelican content 56 | 57 | Your site has now been generated inside the ``output/`` directory. (You may see 58 | a warning related to feeds, but that is normal when developing locally and can 59 | be ignored for now.) 60 | 61 | Preview your site 62 | ----------------- 63 | 64 | Open a new terminal session, navigate to your project root directory, and 65 | run the following command to launch Pelican's web server:: 66 | 67 | pelican --listen 68 | 69 | Preview your site by navigating to http://localhost:8000/ in your browser. 70 | 71 | Continue reading the other documentation sections for more detail, and check 72 | out the Pelican wiki's Tutorials_ page for links to community-published 73 | tutorials. 74 | 75 | .. _Tutorials: https://github.com/getpelican/pelican/wiki/Tutorials 76 | 77 | Footnotes 78 | --------- 79 | 80 | .. [#tzlocal_fn] You can help localize default fields by installing the 81 | optional `tzlocal `_ 82 | module. 83 | -------------------------------------------------------------------------------- /pelican/tests/test_log.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import unittest 3 | from collections import defaultdict 4 | from contextlib import contextmanager 5 | 6 | from pelican import log 7 | from pelican.tests.support import LogCountHandler 8 | 9 | 10 | class TestLog(unittest.TestCase): 11 | def setUp(self): 12 | super().setUp() 13 | self.logger = logging.getLogger(__name__) 14 | self.handler = LogCountHandler() 15 | self.logger.addHandler(self.handler) 16 | 17 | def tearDown(self): 18 | self._reset_limit_filter() 19 | super().tearDown() 20 | 21 | def _reset_limit_filter(self): 22 | log.LimitFilter._ignore = set() 23 | log.LimitFilter._raised_messages = set() 24 | log.LimitFilter._threshold = 5 25 | log.LimitFilter._group_count = defaultdict(int) 26 | 27 | @contextmanager 28 | def reset_logger(self): 29 | try: 30 | yield None 31 | finally: 32 | self._reset_limit_filter() 33 | self.handler.flush() 34 | 35 | def test_log_filter(self): 36 | def do_logging(): 37 | for i in range(5): 38 | self.logger.warning("Log %s", i) 39 | self.logger.warning("Another log %s", i) 40 | 41 | # no filter 42 | with self.reset_logger(): 43 | do_logging() 44 | self.assertEqual(self.handler.count_logs("Log \\d", logging.WARNING), 5) 45 | self.assertEqual( 46 | self.handler.count_logs("Another log \\d", logging.WARNING), 5 47 | ) 48 | 49 | # filter by template 50 | with self.reset_logger(): 51 | log.LimitFilter._ignore.add((logging.WARNING, "Log %s")) 52 | do_logging() 53 | self.assertEqual(self.handler.count_logs("Log \\d", logging.WARNING), 0) 54 | self.assertEqual( 55 | self.handler.count_logs("Another log \\d", logging.WARNING), 5 56 | ) 57 | 58 | # filter by exact message 59 | with self.reset_logger(): 60 | log.LimitFilter._ignore.add((logging.WARNING, "Log 3")) 61 | do_logging() 62 | self.assertEqual(self.handler.count_logs("Log \\d", logging.WARNING), 4) 63 | self.assertEqual( 64 | self.handler.count_logs("Another log \\d", logging.WARNING), 5 65 | ) 66 | 67 | # filter by both 68 | with self.reset_logger(): 69 | log.LimitFilter._ignore.add((logging.WARNING, "Log 3")) 70 | log.LimitFilter._ignore.add((logging.WARNING, "Another log %s")) 71 | do_logging() 72 | self.assertEqual(self.handler.count_logs("Log \\d", logging.WARNING), 4) 73 | self.assertEqual( 74 | self.handler.count_logs("Another log \\d", logging.WARNING), 0 75 | ) 76 | -------------------------------------------------------------------------------- /pelican/tests/output/basic/tag/oh.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Oh Oh Oh 8 | 9 | 10 | 11 | 12 | 13 | 25 |
26 |

Oh Oh Oh

27 | 28 |

This page overrides the listening of the articles under the oh tag.

29 | 30 |
31 |
32 | 39 |
40 | 41 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /pelican/tests/test_cli.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | 3 | from pelican import get_config, parse_arguments 4 | 5 | 6 | class TestParseOverrides(unittest.TestCase): 7 | def test_flags(self): 8 | for flag in ["-e", "--extra-settings"]: 9 | args = parse_arguments([flag, "k=1"]) 10 | self.assertDictEqual(args.overrides, {"k": 1}) 11 | 12 | def test_parse_multiple_items(self): 13 | args = parse_arguments("-e k1=1 k2=2".split()) 14 | self.assertDictEqual(args.overrides, {"k1": 1, "k2": 2}) 15 | 16 | def test_parse_valid_json(self): 17 | json_values_python_values_map = { 18 | '""': "", 19 | "null": None, 20 | '"string"': "string", 21 | '["foo", 12, "4", {}]': ["foo", 12, "4", {}], 22 | } 23 | for k, v in json_values_python_values_map.items(): 24 | args = parse_arguments(["-e", "k=" + k]) 25 | self.assertDictEqual(args.overrides, {"k": v}) 26 | 27 | def test_parse_invalid_syntax(self): 28 | invalid_items = ["k= 1", "k =1", "k", "k v"] 29 | for item in invalid_items: 30 | with self.assertRaises(ValueError): 31 | parse_arguments(f"-e {item}".split()) 32 | 33 | def test_parse_invalid_json(self): 34 | invalid_json = { 35 | "", 36 | "False", 37 | "True", 38 | "None", 39 | "some other string", 40 | '{"foo": bar}', 41 | "[foo]", 42 | } 43 | for v in invalid_json: 44 | with self.assertRaises(ValueError): 45 | parse_arguments(["-e ", "k=" + v]) 46 | 47 | 48 | class TestGetConfigFromArgs(unittest.TestCase): 49 | def test_overrides_known_keys(self): 50 | args = parse_arguments( 51 | [ 52 | "-e", 53 | "DELETE_OUTPUT_DIRECTORY=false", 54 | 'OUTPUT_RETENTION=["1.txt"]', 55 | 'SITENAME="Title"', 56 | ] 57 | ) 58 | config = get_config(args) 59 | config_must_contain = { 60 | "DELETE_OUTPUT_DIRECTORY": False, 61 | "OUTPUT_RETENTION": ["1.txt"], 62 | "SITENAME": "Title", 63 | } 64 | self.assertDictEqual(config, {**config, **config_must_contain}) 65 | 66 | def test_overrides_non_default_type(self): 67 | args = parse_arguments( 68 | [ 69 | "-e", 70 | "DISPLAY_PAGES_ON_MENU=123", 71 | "PAGE_TRANSLATION_ID=null", 72 | 'TRANSLATION_FEED_RSS_URL="someurl"', 73 | ] 74 | ) 75 | config = get_config(args) 76 | config_must_contain = { 77 | "DISPLAY_PAGES_ON_MENU": 123, 78 | "PAGE_TRANSLATION_ID": None, 79 | "TRANSLATION_FEED_RSS_URL": "someurl", 80 | } 81 | self.assertDictEqual(config, {**config, **config_must_contain}) 82 | -------------------------------------------------------------------------------- /pelican/tests/output/basic/authors.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | A Pelican Blog - Authors 8 | 9 | 10 | 11 | 12 | 13 | 25 | 26 |
27 |

Authors on A Pelican Blog

28 | 31 |
32 | 33 |
34 | 41 |
42 | 43 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /pelican/tests/output/basic/override/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Override url/save_as 8 | 9 | 10 | 11 | 12 | 13 | 25 |
26 |

Override url/save_as

27 | 28 |

Test page which overrides save_as and url so that this page will be generated 29 | at a custom location.

30 | 31 |
32 |
33 | 40 |
41 | 42 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /pelican/tests/output/basic/pages/this-is-a-test-hidden-page.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | This is a test hidden page 8 | 9 | 10 | 11 | 12 | 13 | 25 |
26 |

This is a test hidden page

27 | 28 |

This is great for things like error(404) pages 29 | Anyone can see this page but it's not linked to anywhere!

30 | 31 |
32 |
33 | 40 |
41 | 42 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /pelican/themes/notmyidea/templates/index.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block content_title %}{% endblock %} 3 | {% block content %} 4 | {% if articles %} 5 | {% for article in articles_page.object_list %} 6 | 7 | {# First item #} 8 | {% if loop.first and not articles_page.has_previous() %} 9 | 15 | {% if loop.length > 1 %} 16 |
17 |

Other articles

18 |
19 |
    20 | {% endif %} 21 | {# other items #} 22 | {% else %} 23 | {% if loop.first %} 24 |
    25 |
      26 | {% endif %} 27 |
    1. 28 |
      29 |

      {{ article.title }}

      31 |
      32 | 33 |
      34 | {% include 'article_infos.html' %} 35 | {{ article.summary }} 36 | read more 37 | {% include 'comments.html' %} 38 |
      39 |
    2. 40 | {% endif %} 41 | {% if loop.last %} 42 | {% if loop.length > 1 or articles_page.has_other_pages() %} 43 |
    44 | {% if articles_page.has_other_pages() %} 45 | {% include 'pagination.html' %} 46 | {% endif %} 47 |
    48 | {% endif %} 49 | {% endif %} 50 | {% endfor %} 51 | {% else %} 52 |
    53 | {% if pages %} 54 |

    Pages

    55 | 60 | {% else %} 61 |

    This site currently has no content.

    62 | {% endif %} 63 |
    64 | {% endif %} 65 | {% endblock content %} 66 | -------------------------------------------------------------------------------- /pelican/tests/output/basic/pages/this-is-a-test-page.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | This is a test page 8 | 9 | 10 | 11 | 12 | 13 | 25 |
    26 |

    This is a test page

    27 | 28 |

    Just an image.

    29 | alternate text 30 | wrong path since 'images' folder does not exist 31 | 32 |
    33 |
    34 | 41 |
    42 | 43 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /pelican/tests/output/basic/categories.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | A Pelican Blog - Categories 8 | 9 | 10 | 11 | 12 | 13 | 25 | 26 |
    27 |

    Categories for A Pelican Blog

    28 | 34 |
    35 | 36 |
    37 | 44 |
    45 | 46 | 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /docs/conf.py: -------------------------------------------------------------------------------- 1 | import datetime 2 | import os 3 | import sys 4 | import time 5 | 6 | if sys.version_info >= (3, 11): 7 | import tomllib 8 | else: 9 | import tomli as tomllib 10 | 11 | 12 | sys.path.append(os.path.abspath(os.pardir)) 13 | 14 | 15 | with open("../pyproject.toml", "rb") as f: 16 | project_data = tomllib.load(f).get("project") 17 | if project_data is None: 18 | raise KeyError("project data is not found") 19 | 20 | 21 | # -- General configuration ---------------------------------------------------- 22 | templates_path = ["_templates"] 23 | locale_dirs = ["locale/"] 24 | gettext_compact = False 25 | gettext_uuid = True 26 | extensions = [ 27 | "sphinx.ext.autodoc", 28 | "sphinx.ext.extlinks", 29 | "sphinxext.opengraph", 30 | ] 31 | source_suffix = ".rst" 32 | master_doc = "index" 33 | project = project_data.get("name").upper() 34 | year = datetime.datetime.fromtimestamp( 35 | int(os.environ.get("SOURCE_DATE_EPOCH", time.time())), datetime.timezone.utc 36 | ).year 37 | project_copyright = f"2010–{year}" # noqa: RUF001 38 | exclude_patterns = ["_build"] 39 | release = project_data.get("version") 40 | version = ".".join(release.split(".")[:1]) 41 | last_stable = project_data.get("version") 42 | rst_prolog = f""" 43 | .. |last_stable| replace:: :pelican-doc:`{last_stable}` 44 | .. |min_python| replace:: {project_data.get("requires-python").split(",")[0]} 45 | """ 46 | 47 | extlinks = {"pelican-doc": ("https://docs.getpelican.com/en/latest/%s.html", "%s")} 48 | 49 | # -- Options for HTML output -------------------------------------------------- 50 | 51 | html_theme = "furo" 52 | html_title = f"{project} {release}" 53 | html_static_path = ["_static"] 54 | html_theme_options = { 55 | "light_logo": "pelican-logo.svg", 56 | "dark_logo": "pelican-logo.svg", 57 | "navigation_with_keys": True, 58 | } 59 | 60 | # Output file base name for HTML help builder. 61 | htmlhelp_basename = "Pelicandoc" 62 | 63 | html_use_smartypants = True 64 | 65 | # If false, no module index is generated. 66 | html_use_modindex = False 67 | 68 | # If false, no index is generated. 69 | html_use_index = False 70 | 71 | # If true, links to the reST sources are added to the pages. 72 | html_show_sourcelink = False 73 | 74 | 75 | def setup(app): 76 | # overrides for wide tables in RTD theme 77 | app.add_css_file("theme_overrides.css") # path relative to _static 78 | 79 | 80 | # -- Options for LaTeX output ------------------------------------------------- 81 | latex_documents = [ 82 | ("index", "Pelican.tex", "Pelican Documentation", "Justin Mayer", "manual"), 83 | ] 84 | 85 | # -- Options for manual page output ------------------------------------------- 86 | man_pages = [ 87 | ("index", "pelican", "pelican documentation", ["Justin Mayer"], 1), 88 | ( 89 | "pelican-themes", 90 | "pelican-themes", 91 | "A theme manager for Pelican", 92 | ["Mickaël Raybaud"], 93 | 1, 94 | ), 95 | ( 96 | "themes", 97 | "pelican-theming", 98 | "How to create themes for Pelican", 99 | ["The Pelican contributors"], 100 | 1, 101 | ), 102 | ] 103 | -------------------------------------------------------------------------------- /pelican/tests/output/basic/tags.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | A Pelican Blog - Tags 8 | 9 | 10 | 11 | 12 | 13 | 25 | 26 |
    27 |

    Tags for A Pelican Blog

    28 | 36 |
    37 | 38 |
    39 | 46 |
    47 | 48 | 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /pelican/tests/output/basic/theme/css/pygment.css: -------------------------------------------------------------------------------- 1 | .hll { 2 | background-color:#eee; 3 | } 4 | .c { 5 | color:#408090; 6 | font-style:italic; 7 | } 8 | .err { 9 | border:1px solid #FF0000; 10 | } 11 | .k { 12 | color:#007020; 13 | font-weight:bold; 14 | } 15 | .o { 16 | color:#666666; 17 | } 18 | .cm { 19 | color:#408090; 20 | font-style:italic; 21 | } 22 | .cp { 23 | color:#007020; 24 | } 25 | .c1 { 26 | color:#408090; 27 | font-style:italic; 28 | } 29 | .cs { 30 | background-color:#FFF0F0; 31 | color:#408090; 32 | } 33 | .gd { 34 | color:#A00000; 35 | } 36 | .ge { 37 | font-style:italic; 38 | } 39 | .gr { 40 | color:#FF0000; 41 | } 42 | .gh { 43 | color:#000080; 44 | font-weight:bold; 45 | } 46 | .gi { 47 | color:#00A000; 48 | } 49 | .go { 50 | color:#303030; 51 | } 52 | .gp { 53 | color:#C65D09; 54 | font-weight:bold; 55 | } 56 | .gs { 57 | font-weight:bold; 58 | } 59 | .gu { 60 | color:#800080; 61 | font-weight:bold; 62 | } 63 | .gt { 64 | color:#0040D0; 65 | } 66 | .kc { 67 | color:#007020; 68 | font-weight:bold; 69 | } 70 | .kd { 71 | color:#007020; 72 | font-weight:bold; 73 | } 74 | .kn { 75 | color:#007020; 76 | font-weight:bold; 77 | } 78 | .kp { 79 | color:#007020; 80 | } 81 | .kr { 82 | color:#007020; 83 | font-weight:bold; 84 | } 85 | .kt { 86 | color:#902000; 87 | } 88 | .m { 89 | color:#208050; 90 | } 91 | .s { 92 | color:#4070A0; 93 | } 94 | .na { 95 | color:#4070A0; 96 | } 97 | .nb { 98 | color:#007020; 99 | } 100 | .nc { 101 | color:#0E84B5; 102 | font-weight:bold; 103 | } 104 | .no { 105 | color:#60ADD5; 106 | } 107 | .nd { 108 | color:#555555; 109 | font-weight:bold; 110 | } 111 | .ni { 112 | color:#D55537; 113 | font-weight:bold; 114 | } 115 | .ne { 116 | color:#007020; 117 | } 118 | .nf { 119 | color:#06287E; 120 | } 121 | .nl { 122 | color:#002070; 123 | font-weight:bold; 124 | } 125 | .nn { 126 | color:#0E84B5; 127 | font-weight:bold; 128 | } 129 | .nt { 130 | color:#062873; 131 | font-weight:bold; 132 | } 133 | .nv { 134 | color:#BB60D5; 135 | } 136 | .ow { 137 | color:#007020; 138 | font-weight:bold; 139 | } 140 | .w { 141 | color:#BBBBBB; 142 | } 143 | .mf { 144 | color:#208050; 145 | } 146 | .mh { 147 | color:#208050; 148 | } 149 | .mi { 150 | color:#208050; 151 | } 152 | .mo { 153 | color:#208050; 154 | } 155 | .sb { 156 | color:#4070A0; 157 | } 158 | .sc { 159 | color:#4070A0; 160 | } 161 | .sd { 162 | color:#4070A0; 163 | font-style:italic; 164 | } 165 | .s2 { 166 | color:#4070A0; 167 | } 168 | .se { 169 | color:#4070A0; 170 | font-weight:bold; 171 | } 172 | .sh { 173 | color:#4070A0; 174 | } 175 | .si { 176 | color:#70A0D0; 177 | font-style:italic; 178 | } 179 | .sx { 180 | color:#C65D09; 181 | } 182 | .sr { 183 | color:#235388; 184 | } 185 | .s1 { 186 | color:#4070A0; 187 | } 188 | .ss { 189 | color:#517918; 190 | } 191 | .bp { 192 | color:#007020; 193 | } 194 | .vc { 195 | color:#BB60D5; 196 | } 197 | .vg { 198 | color:#BB60D5; 199 | } 200 | .vi { 201 | color:#BB60D5; 202 | } 203 | .il { 204 | color:#208050; 205 | } 206 | -------------------------------------------------------------------------------- /pelican/tests/output/custom/theme/css/pygment.css: -------------------------------------------------------------------------------- 1 | .hll { 2 | background-color:#eee; 3 | } 4 | .c { 5 | color:#408090; 6 | font-style:italic; 7 | } 8 | .err { 9 | border:1px solid #FF0000; 10 | } 11 | .k { 12 | color:#007020; 13 | font-weight:bold; 14 | } 15 | .o { 16 | color:#666666; 17 | } 18 | .cm { 19 | color:#408090; 20 | font-style:italic; 21 | } 22 | .cp { 23 | color:#007020; 24 | } 25 | .c1 { 26 | color:#408090; 27 | font-style:italic; 28 | } 29 | .cs { 30 | background-color:#FFF0F0; 31 | color:#408090; 32 | } 33 | .gd { 34 | color:#A00000; 35 | } 36 | .ge { 37 | font-style:italic; 38 | } 39 | .gr { 40 | color:#FF0000; 41 | } 42 | .gh { 43 | color:#000080; 44 | font-weight:bold; 45 | } 46 | .gi { 47 | color:#00A000; 48 | } 49 | .go { 50 | color:#303030; 51 | } 52 | .gp { 53 | color:#C65D09; 54 | font-weight:bold; 55 | } 56 | .gs { 57 | font-weight:bold; 58 | } 59 | .gu { 60 | color:#800080; 61 | font-weight:bold; 62 | } 63 | .gt { 64 | color:#0040D0; 65 | } 66 | .kc { 67 | color:#007020; 68 | font-weight:bold; 69 | } 70 | .kd { 71 | color:#007020; 72 | font-weight:bold; 73 | } 74 | .kn { 75 | color:#007020; 76 | font-weight:bold; 77 | } 78 | .kp { 79 | color:#007020; 80 | } 81 | .kr { 82 | color:#007020; 83 | font-weight:bold; 84 | } 85 | .kt { 86 | color:#902000; 87 | } 88 | .m { 89 | color:#208050; 90 | } 91 | .s { 92 | color:#4070A0; 93 | } 94 | .na { 95 | color:#4070A0; 96 | } 97 | .nb { 98 | color:#007020; 99 | } 100 | .nc { 101 | color:#0E84B5; 102 | font-weight:bold; 103 | } 104 | .no { 105 | color:#60ADD5; 106 | } 107 | .nd { 108 | color:#555555; 109 | font-weight:bold; 110 | } 111 | .ni { 112 | color:#D55537; 113 | font-weight:bold; 114 | } 115 | .ne { 116 | color:#007020; 117 | } 118 | .nf { 119 | color:#06287E; 120 | } 121 | .nl { 122 | color:#002070; 123 | font-weight:bold; 124 | } 125 | .nn { 126 | color:#0E84B5; 127 | font-weight:bold; 128 | } 129 | .nt { 130 | color:#062873; 131 | font-weight:bold; 132 | } 133 | .nv { 134 | color:#BB60D5; 135 | } 136 | .ow { 137 | color:#007020; 138 | font-weight:bold; 139 | } 140 | .w { 141 | color:#BBBBBB; 142 | } 143 | .mf { 144 | color:#208050; 145 | } 146 | .mh { 147 | color:#208050; 148 | } 149 | .mi { 150 | color:#208050; 151 | } 152 | .mo { 153 | color:#208050; 154 | } 155 | .sb { 156 | color:#4070A0; 157 | } 158 | .sc { 159 | color:#4070A0; 160 | } 161 | .sd { 162 | color:#4070A0; 163 | font-style:italic; 164 | } 165 | .s2 { 166 | color:#4070A0; 167 | } 168 | .se { 169 | color:#4070A0; 170 | font-weight:bold; 171 | } 172 | .sh { 173 | color:#4070A0; 174 | } 175 | .si { 176 | color:#70A0D0; 177 | font-style:italic; 178 | } 179 | .sx { 180 | color:#C65D09; 181 | } 182 | .sr { 183 | color:#235388; 184 | } 185 | .s1 { 186 | color:#4070A0; 187 | } 188 | .ss { 189 | color:#517918; 190 | } 191 | .bp { 192 | color:#007020; 193 | } 194 | .vc { 195 | color:#BB60D5; 196 | } 197 | .vg { 198 | color:#BB60D5; 199 | } 200 | .vi { 201 | color:#BB60D5; 202 | } 203 | .il { 204 | color:#208050; 205 | } 206 | -------------------------------------------------------------------------------- /pelican/themes/notmyidea/static/css/pygment.css: -------------------------------------------------------------------------------- 1 | .hll { 2 | background-color:#eee; 3 | } 4 | .c { 5 | color:#408090; 6 | font-style:italic; 7 | } 8 | .err { 9 | border:1px solid #FF0000; 10 | } 11 | .k { 12 | color:#007020; 13 | font-weight:bold; 14 | } 15 | .o { 16 | color:#666666; 17 | } 18 | .cm { 19 | color:#408090; 20 | font-style:italic; 21 | } 22 | .cp { 23 | color:#007020; 24 | } 25 | .c1 { 26 | color:#408090; 27 | font-style:italic; 28 | } 29 | .cs { 30 | background-color:#FFF0F0; 31 | color:#408090; 32 | } 33 | .gd { 34 | color:#A00000; 35 | } 36 | .ge { 37 | font-style:italic; 38 | } 39 | .gr { 40 | color:#FF0000; 41 | } 42 | .gh { 43 | color:#000080; 44 | font-weight:bold; 45 | } 46 | .gi { 47 | color:#00A000; 48 | } 49 | .go { 50 | color:#303030; 51 | } 52 | .gp { 53 | color:#C65D09; 54 | font-weight:bold; 55 | } 56 | .gs { 57 | font-weight:bold; 58 | } 59 | .gu { 60 | color:#800080; 61 | font-weight:bold; 62 | } 63 | .gt { 64 | color:#0040D0; 65 | } 66 | .kc { 67 | color:#007020; 68 | font-weight:bold; 69 | } 70 | .kd { 71 | color:#007020; 72 | font-weight:bold; 73 | } 74 | .kn { 75 | color:#007020; 76 | font-weight:bold; 77 | } 78 | .kp { 79 | color:#007020; 80 | } 81 | .kr { 82 | color:#007020; 83 | font-weight:bold; 84 | } 85 | .kt { 86 | color:#902000; 87 | } 88 | .m { 89 | color:#208050; 90 | } 91 | .s { 92 | color:#4070A0; 93 | } 94 | .na { 95 | color:#4070A0; 96 | } 97 | .nb { 98 | color:#007020; 99 | } 100 | .nc { 101 | color:#0E84B5; 102 | font-weight:bold; 103 | } 104 | .no { 105 | color:#60ADD5; 106 | } 107 | .nd { 108 | color:#555555; 109 | font-weight:bold; 110 | } 111 | .ni { 112 | color:#D55537; 113 | font-weight:bold; 114 | } 115 | .ne { 116 | color:#007020; 117 | } 118 | .nf { 119 | color:#06287E; 120 | } 121 | .nl { 122 | color:#002070; 123 | font-weight:bold; 124 | } 125 | .nn { 126 | color:#0E84B5; 127 | font-weight:bold; 128 | } 129 | .nt { 130 | color:#062873; 131 | font-weight:bold; 132 | } 133 | .nv { 134 | color:#BB60D5; 135 | } 136 | .ow { 137 | color:#007020; 138 | font-weight:bold; 139 | } 140 | .w { 141 | color:#BBBBBB; 142 | } 143 | .mf { 144 | color:#208050; 145 | } 146 | .mh { 147 | color:#208050; 148 | } 149 | .mi { 150 | color:#208050; 151 | } 152 | .mo { 153 | color:#208050; 154 | } 155 | .sb { 156 | color:#4070A0; 157 | } 158 | .sc { 159 | color:#4070A0; 160 | } 161 | .sd { 162 | color:#4070A0; 163 | font-style:italic; 164 | } 165 | .s2 { 166 | color:#4070A0; 167 | } 168 | .se { 169 | color:#4070A0; 170 | font-weight:bold; 171 | } 172 | .sh { 173 | color:#4070A0; 174 | } 175 | .si { 176 | color:#70A0D0; 177 | font-style:italic; 178 | } 179 | .sx { 180 | color:#C65D09; 181 | } 182 | .sr { 183 | color:#235388; 184 | } 185 | .s1 { 186 | color:#4070A0; 187 | } 188 | .ss { 189 | color:#517918; 190 | } 191 | .bp { 192 | color:#007020; 193 | } 194 | .vc { 195 | color:#BB60D5; 196 | } 197 | .vg { 198 | color:#BB60D5; 199 | } 200 | .vi { 201 | color:#BB60D5; 202 | } 203 | .il { 204 | color:#208050; 205 | } 206 | -------------------------------------------------------------------------------- /pelican/tests/content/wordpress_content_decoded: -------------------------------------------------------------------------------- 1 |

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod 2 | tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, 3 | quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo 4 | consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse 5 | cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non 6 | proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

    7 |

    8 |

    9 | Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod 10 | tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, 11 | quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo 12 | consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse 13 | cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non 14 | proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

    15 |

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod 16 | tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, 17 | quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo 18 | consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse 19 | cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non 20 | proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

    21 |
      22 |
    • Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod 23 | tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, 24 | quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo 25 | consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse 26 | cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non 27 | proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
    • 28 |
    • Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod 29 | tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, 30 | quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo 31 | consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse 32 | cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non 33 | proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
    • 34 |
    35 |
    36 | 
    37 |   a = [1, 2, 3]
    38 |   b = [4, 5, 6]
    39 |   for i in zip(a, b):
    40 |     print i
    41 | 
    42 | 
    43 |

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod 44 | tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, 45 | quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo 46 | consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse 47 | cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non 48 | proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

    49 | -------------------------------------------------------------------------------- /pelican/tests/output/custom_locale/theme/css/pygment.css: -------------------------------------------------------------------------------- 1 | .hll { 2 | background-color:#eee; 3 | } 4 | .c { 5 | color:#408090; 6 | font-style:italic; 7 | } 8 | .err { 9 | border:1px solid #FF0000; 10 | } 11 | .k { 12 | color:#007020; 13 | font-weight:bold; 14 | } 15 | .o { 16 | color:#666666; 17 | } 18 | .cm { 19 | color:#408090; 20 | font-style:italic; 21 | } 22 | .cp { 23 | color:#007020; 24 | } 25 | .c1 { 26 | color:#408090; 27 | font-style:italic; 28 | } 29 | .cs { 30 | background-color:#FFF0F0; 31 | color:#408090; 32 | } 33 | .gd { 34 | color:#A00000; 35 | } 36 | .ge { 37 | font-style:italic; 38 | } 39 | .gr { 40 | color:#FF0000; 41 | } 42 | .gh { 43 | color:#000080; 44 | font-weight:bold; 45 | } 46 | .gi { 47 | color:#00A000; 48 | } 49 | .go { 50 | color:#303030; 51 | } 52 | .gp { 53 | color:#C65D09; 54 | font-weight:bold; 55 | } 56 | .gs { 57 | font-weight:bold; 58 | } 59 | .gu { 60 | color:#800080; 61 | font-weight:bold; 62 | } 63 | .gt { 64 | color:#0040D0; 65 | } 66 | .kc { 67 | color:#007020; 68 | font-weight:bold; 69 | } 70 | .kd { 71 | color:#007020; 72 | font-weight:bold; 73 | } 74 | .kn { 75 | color:#007020; 76 | font-weight:bold; 77 | } 78 | .kp { 79 | color:#007020; 80 | } 81 | .kr { 82 | color:#007020; 83 | font-weight:bold; 84 | } 85 | .kt { 86 | color:#902000; 87 | } 88 | .m { 89 | color:#208050; 90 | } 91 | .s { 92 | color:#4070A0; 93 | } 94 | .na { 95 | color:#4070A0; 96 | } 97 | .nb { 98 | color:#007020; 99 | } 100 | .nc { 101 | color:#0E84B5; 102 | font-weight:bold; 103 | } 104 | .no { 105 | color:#60ADD5; 106 | } 107 | .nd { 108 | color:#555555; 109 | font-weight:bold; 110 | } 111 | .ni { 112 | color:#D55537; 113 | font-weight:bold; 114 | } 115 | .ne { 116 | color:#007020; 117 | } 118 | .nf { 119 | color:#06287E; 120 | } 121 | .nl { 122 | color:#002070; 123 | font-weight:bold; 124 | } 125 | .nn { 126 | color:#0E84B5; 127 | font-weight:bold; 128 | } 129 | .nt { 130 | color:#062873; 131 | font-weight:bold; 132 | } 133 | .nv { 134 | color:#BB60D5; 135 | } 136 | .ow { 137 | color:#007020; 138 | font-weight:bold; 139 | } 140 | .w { 141 | color:#BBBBBB; 142 | } 143 | .mf { 144 | color:#208050; 145 | } 146 | .mh { 147 | color:#208050; 148 | } 149 | .mi { 150 | color:#208050; 151 | } 152 | .mo { 153 | color:#208050; 154 | } 155 | .sb { 156 | color:#4070A0; 157 | } 158 | .sc { 159 | color:#4070A0; 160 | } 161 | .sd { 162 | color:#4070A0; 163 | font-style:italic; 164 | } 165 | .s2 { 166 | color:#4070A0; 167 | } 168 | .se { 169 | color:#4070A0; 170 | font-weight:bold; 171 | } 172 | .sh { 173 | color:#4070A0; 174 | } 175 | .si { 176 | color:#70A0D0; 177 | font-style:italic; 178 | } 179 | .sx { 180 | color:#C65D09; 181 | } 182 | .sr { 183 | color:#235388; 184 | } 185 | .s1 { 186 | color:#4070A0; 187 | } 188 | .ss { 189 | color:#517918; 190 | } 191 | .bp { 192 | color:#007020; 193 | } 194 | .vc { 195 | color:#BB60D5; 196 | } 197 | .vg { 198 | color:#BB60D5; 199 | } 200 | .vi { 201 | color:#BB60D5; 202 | } 203 | .il { 204 | color:#208050; 205 | } 206 | -------------------------------------------------------------------------------- /pelican/tests/content/wordpress_content_encoded: -------------------------------------------------------------------------------- 1 | Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod 2 | tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, 3 | quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo 4 | consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse 5 | cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non 6 | proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 7 | 8 | 9 | 10 |
    11 | Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod 12 | tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, 13 | quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo 14 | consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse 15 | cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non 16 | proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 17 | 18 | Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod 19 | tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, 20 | quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo 21 | consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse 22 | cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non 23 | proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 24 |
    25 |
      26 |
    • Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod 27 | tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, 28 | quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo 29 | consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse 30 | cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non 31 | proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
    • 32 |
    • Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod 33 | tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, 34 | quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo 35 | consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse 36 | cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non 37 | proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
    • 38 |
    39 | 40 |
    41 | 
    42 |   a = [1, 2, 3]
    43 |   b = [4, 5, 6]
    44 |   for i in zip(a, b):
    45 |     print i
    46 | 
    47 | 
    48 | 49 | Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod 50 | tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, 51 | quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo 52 | consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse 53 | cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non 54 | proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 55 | --------------------------------------------------------------------------------