pax_global_header00006660000000000000000000000064147065130770014524gustar00rootroot0000000000000052 comment=e9821ca01df84b9ca672fe2df59d1795f8956f0b python-pallets-sphinx-themes-2.3.0/000077500000000000000000000000001470651307700173035ustar00rootroot00000000000000python-pallets-sphinx-themes-2.3.0/.editorconfig000066400000000000000000000003511470651307700217570ustar00rootroot00000000000000root = true [*] indent_style = space indent_size = 4 insert_final_newline = true trim_trailing_whitespace = true end_of_line = lf charset = utf-8 max_line_length = 88 [*.{css,html,js,json,jsx,scss,ts,tsx,yaml,yml}] indent_size = 2 python-pallets-sphinx-themes-2.3.0/.github/000077500000000000000000000000001470651307700206435ustar00rootroot00000000000000python-pallets-sphinx-themes-2.3.0/.github/workflows/000077500000000000000000000000001470651307700227005ustar00rootroot00000000000000python-pallets-sphinx-themes-2.3.0/.github/workflows/lock.yaml000066400000000000000000000012251470651307700245140ustar00rootroot00000000000000name: Lock inactive closed issues # Lock closed issues that have not received any further activity for two weeks. # This does not close open issues, only humans may do that. It is easier to # respond to new issues with fresh examples rather than continuing discussions # on old issues. on: schedule: - cron: '0 0 * * *' permissions: issues: write pull-requests: write concurrency: group: lock jobs: lock: runs-on: ubuntu-latest steps: - uses: dessant/lock-threads@1bf7ec25051fe7c00bdd17e6a7cf3d7bfb7dc771 # v5.0.1 with: issue-inactive-days: 14 pr-inactive-days: 14 discussion-inactive-days: 14 python-pallets-sphinx-themes-2.3.0/.github/workflows/pre-commit.yaml000066400000000000000000000010151470651307700256350ustar00rootroot00000000000000name: pre-commit on: pull_request: push: branches: [main, '*.x'] jobs: main: runs-on: ubuntu-latest steps: - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 - uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 # v5.2.0 with: python-version: 3.x - uses: pre-commit/action@2c7b3805fd2a0fd8c1884dcaebf91fc102a13ecd # v3.0.1 - uses: pre-commit-ci/lite-action@5d6cc0eb514c891a40562a58a8e71576c5c7fb43 # v1.1.0 if: ${{ !cancelled() }} python-pallets-sphinx-themes-2.3.0/.github/workflows/publish.yaml000066400000000000000000000051641470651307700252400ustar00rootroot00000000000000name: Publish on: push: tags: - '*' jobs: build: runs-on: ubuntu-latest outputs: hash: ${{ steps.hash.outputs.hash }} steps: - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 - uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 # v5.2.0 with: python-version: '3.x' cache: pip cache-dependency-path: requirements*/*.txt - run: pip install -r requirements/build.txt # Use the commit date instead of the current date during the build. - run: echo "SOURCE_DATE_EPOCH=$(git log -1 --pretty=%ct)" >> $GITHUB_ENV - run: python -m build # Generate hashes used for provenance. - name: generate hash id: hash run: cd dist && echo "hash=$(sha256sum * | base64 -w0)" >> $GITHUB_OUTPUT - uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: path: ./dist provenance: needs: [build] permissions: actions: read id-token: write contents: write # Can't pin with hash due to how this workflow works. uses: slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v2.0.0 with: base64-subjects: ${{ needs.build.outputs.hash }} create-release: # Upload the sdist, wheels, and provenance to a GitHub release. They remain # available as build artifacts for a while as well. needs: [provenance] runs-on: ubuntu-latest permissions: contents: write steps: - uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 - name: create release run: > gh release create --draft --repo ${{ github.repository }} ${{ github.ref_name }} *.intoto.jsonl/* artifact/* env: GH_TOKEN: ${{ github.token }} publish-pypi: needs: [provenance] # Wait for approval before attempting to upload to PyPI. This allows reviewing the # files in the draft release. environment: name: publish url: https://pypi.org/project/Pallets-Sphinx-Themes/${{ github.ref_name }} runs-on: ubuntu-latest permissions: id-token: write steps: - uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 - uses: pypa/gh-action-pypi-publish@f7600683efdcb7656dec5b29656edb7bc586e597 # v1.10.3 with: repository-url: https://test.pypi.org/legacy/ packages-dir: artifact/ - uses: pypa/gh-action-pypi-publish@f7600683efdcb7656dec5b29656edb7bc586e597 # v1.10.3 with: packages-dir: artifact/ python-pallets-sphinx-themes-2.3.0/.gitignore000066400000000000000000000001311470651307700212660ustar00rootroot00000000000000.idea/ .vscode/ .venv*/ venv*/ __pycache__/ dist/ .coverage* htmlcov/ .tox/ docs/_build/ python-pallets-sphinx-themes-2.3.0/.pre-commit-config.yaml000066400000000000000000000006271470651307700235710ustar00rootroot00000000000000ci: autoupdate_schedule: monthly repos: - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.6.9 hooks: - id: ruff - id: ruff-format - repo: https://github.com/pre-commit/pre-commit-hooks rev: v5.0.0 hooks: - id: check-merge-conflict - id: debug-statements - id: fix-byte-order-marker - id: trailing-whitespace - id: end-of-file-fixer python-pallets-sphinx-themes-2.3.0/.readthedocs.yaml000066400000000000000000000003211470651307700225260ustar00rootroot00000000000000version: 2 build: os: ubuntu-24.04 tools: python: '3.12' python: install: - requirements: requirements/docs.txt - method: pip path: . sphinx: builder: dirhtml fail_on_warning: true python-pallets-sphinx-themes-2.3.0/CHANGES.rst000066400000000000000000000164551470651307700211200ustar00rootroot00000000000000Version 2.3.0 ------------- Released 2024-10-24 - When getting the canonical URL on Read the Docs, replace the path with ``/en/stable/`` instead of ``/page/``. This can be configured with ``rtd_canonical_path``. :pr:`122` - The version banner can be disabled by setting ``version_banner = False``. On Read the Docs, it is disabled when building the ``stable`` version or PRs. :pr:`123` Version 2.2.0 ------------- Released 2024-10-15 - Get canonical URL from environment variable when building on Read the Docs. :pr:`117` - New version warning banner. Use JavaScript to query PyPI when viewing a page, rather than baking the warning into the build. New builds of old versions are no longer required for the banner to be correct. :pr:`117` - Generate 404 page using the sphinx-notfound-page extension. This fixes the URLs when the page is hosted so that it loads the CSS. :issue:`34` - Remove handling for ``singlehtml_sidebars`` config which predated Sphinx's support. :pr:`119` - Remove "babel" and "platter" theme variants which were undocumented and did not appear to be used by the relevant projects. :pr:`120` Version 2.1.3 ------------- Released 2024-04-29 - Allow Sphinx's parallel build feature. :issue:`88` Version 2.1.2 ------------- Released 2024-04-19 - Use modern packaging metadata with ``pyproject.toml`` instead of ``setup.cfg``. - Use ``flit_core`` instead of ``setuptools`` as build backend. - Compatibility with changes in Sphinx 7.3. :pr:`100` Version 2.1.1 ------------- Released 2023-06-08 - Remove leftover Python 2 compatibility code. :pr:`69` - Dotted underlines on links are smaller. :issue:`70` Version 2.1.0 ------------- Released 2023-04-25 - Drop support for Python 3.6 and 3.7. - Require Sphinx >= 3. - Remove previously deprecated code. - Fix table of contents overflow issue. Version 2.0.3 ------------- Released 2022-12-24 - Fix compatibility with ``packaging>=22``. Version 2.0.2 ------------- Released 2021-11-10 - Detect if Sphinx dirhtml builder is generating canonical URLs with ".html" and replace with the correct dir URL. :issue:`47` - ``canonical_url`` config is deprecated. Use Sphinx's built-in ``html_baseurl`` config instead. :pr:`53` - Address deprecations in Jinja 2.0. :pr:`54` Version 2.0.1 ------------- Released 2021-05-20 - Remove workaround for search URLs when using the ``dirhtml`` builder. The issue has been fixed in Sphinx and the workaround was causing the issue again. :issue:`39` - Remove ``html_context["readthedocs_docsearch"]`` for controlling whether Read the Docs' search is used. :issue:`40` - Add an ``ethicalads.html`` sidebar to have Read the Docs always show ads in the sidebar instead of other possible locations. The sidebar is enabled by default at the end of the list. :issue:`41` Version 2.0.0 ------------- Released 2021-05-11 - Drop Python < 3.6. - Update for Jinja 2.0. - Update for Click 8.0. Version 1.2.3 ------------- Released 2020-01-02 - Use built-in :mod:`importlib.metadata` on Python 3.8. :pr:`27` Version 1.2.2 ------------- Released 2019-07-04 - Make the version warning sticky so that it appears when linking to the middle of a document. :issue:`5` - Remove CSS for old ads. Version 1.2.1 ------------- Released 2019-07-29 - Sort versions taken from Read the Docs so that 2.10.x is considered newer than 2.9.x. :issue:`24` Version 1.2.0 ------------- Released 2019-07-26 - Use HTTPS for font URLs in CSS. :pr:`22` - Don't require ``sphinx.ext.autodoc`` to be enabled. - Implement the Jinja directives ``jinja:filters::``, ``jinja:tests::``, and ``jinja:nodes::``. - Generate a table of contents for Jinja filters and tests. - Update the ``babel`` and ``platter`` themes. Version 1.1.4 ------------- Released 2019-01-28 - Store a page's canonical URL in ``html_context["page_canonical_url"]`` rather than overwriting ``canonical_url``, for compatibility with Read the Docs. :pr:`21` Version 1.1.3 ------------- Released 2019-01-28 - Move the Read the Docs search flag to the ``footer`` block to ensure it executes after Read the Docs injects its data. :pr:`20` Version 1.1.2 ------------- Released 2018-09-24 - Strip ".x" placeholder when parsing versions for sidebar. :issue:`7`, :pr:`17` Version 1.1.1 ------------- Released 2018-09-16 - Add configurable ".x" placholder to versions, producing strings like "1.2.x". :issue:`6`, :pr:`12` - Add dependency on "packaging" to support older Sphinx versions. :issue:`9`, :pr:`11` - Backport ``shlex.quote`` for Python 2. :issue:`13`, :pr:`14` Version 1.1.0 ------------- Released 2018-08-28 - Modernize ``click`` theme. The ``.. click:example::`` and ``.. click:run::`` directives used by Click are available and ported to Python 3. - Modernize ``werkzeug`` theme. :pr:`4` - Modernize ``jinja`` theme. Local extensions used by Jinja are not available yet. - Remove theme entry points to make late configuration consistent. The themes are available when ``"pallets_sphinx_themes"`` is added to ``extensions``. - Only run event callbacks added by theme when the theme is actually in use. This allows the package to be installed without interfering with other themes. - Support ``html_context["versions"]`` in the format injected by Read the Docs. - Set ``html_context["readthedocs_docsearch"]`` to opt in to replacing Sphinx's built-in search with Read the Docs' new implementation. - Make version handling more robust for various configurations. - Autodoc skips docstrings that contain the line ``:internal:``. - Autodoc removes lines that start with ``:copyright:`` or ``:license:`` from module docstrings. - Add ``singlehtml_sidebars`` config for Sphinx < 1.8. - Add ``hide-header`` CSS class to hide the page header with ``.. rst-class:: hide-header``. The header is still useable by assistive technology. This is useful for replacing the header with a large logo image. - Disable the sidebar logo on the index page with ``html_theme_options["index_sidebar_logo"] = False``. Version 1.0.1 ------------- Released 2018-04-29 - Work around an issues with search when using the ``dirhtml`` builder. :pr:`3` Version 1.0.0 ------------- Released 2018-04-18 - Major rewrite of CSS and HTML templates to clean up and reduce complexity. Widen columns, improve responsive breakpoints. Currently all themes are available, but only ``pocoo`` and ``flask`` themes are modernized. - Parse ``html_context["versions"]``. These will be rendered in the ``versions.html`` sidebar. When viewing an old version, or the development version, a warning is displayed at the top of each page. - Add a ``ProjectLink`` named tuple. A list of these in ``html_context["project_links"]`` will be rendered in the ``project.html`` sidebar. - Add a ``get_version`` function to ensure a project is installed and get its version information. - Use ``html_context["canonical_url"]`` as a base URL to build a canonical URL link on each page. - Add Sphinx entry points for themes. - Rename from "pocoo-sphinx-themes". See commit `f675bfc`_ for the old themes from the docbuilder. .. _f675bfc: https://github.com/pallets/pallets-sphinx-themes/tree/f675bfc python-pallets-sphinx-themes-2.3.0/LICENSE.txt000066400000000000000000000027031470651307700211300ustar00rootroot00000000000000Copyright 2007 Pallets Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. python-pallets-sphinx-themes-2.3.0/README.md000066400000000000000000000005701470651307700205640ustar00rootroot00000000000000# Pallets Sphinx Themes Themes for the Pallets projects. If you're writing an extension, use the appropriate theme to make your documentation look consistent. Available themes: - flask - jinja - werkzeug - click Enable the extension and choose the theme in `docs/conf.py`: ```python extensions = [ "pallets_sphinx_themes", ... ] html_theme = "flask" ``` python-pallets-sphinx-themes-2.3.0/docs/000077500000000000000000000000001470651307700202335ustar00rootroot00000000000000python-pallets-sphinx-themes-2.3.0/docs/conf.py000066400000000000000000000030421470651307700215310ustar00rootroot00000000000000from pallets_sphinx_themes import get_version # Project -------------------------------------------------------------- project = "Pallets-Sphinx-Themes" copyright = "2007 Pallets" author = "Pallets" release, version = get_version("pallets-sphinx-themes") # General -------------------------------------------------------------- default_role = "code" extensions = [ "sphinx.ext.autodoc", "sphinx.ext.extlinks", "sphinx.ext.intersphinx", "sphinxcontrib.log_cabinet", "myst_parser", "pallets_sphinx_themes", ] autodoc_member_order = "bysource" autodoc_typehints = "description" autodoc_preserve_defaults = True extlinks = { "issue": ("https://github.com/pallets/pallets-sphinx-themes/issues/%s", "#%s"), "pr": ("https://github.com/pallets/pallets-sphinx-themes/pull/%s", "#%s"), } intersphinx_mapping = { "python": ("https://docs.python.org/3/", None), } myst_enable_extensions = [ "fieldlist", ] myst_heading_anchors = 2 # HTML ----------------------------------------------------------------- html_theme = "flask" html_theme_options = {"index_sidebar_logo": False} html_sidebars = { "index": ["project.html", "localtoc.html", "searchbox.html", "ethicalads.html"], "**": ["localtoc.html", "relations.html", "searchbox.html", "ethicalads.html"], } singlehtml_sidebars = {"index": ["project.html", "localtoc.html", "ethicalads.html"]} html_title = f"{project} Documentation ({version})" html_copy_source = False html_show_sourcelink = False html_show_copyright = False html_use_index = False html_domain_indices = False python-pallets-sphinx-themes-2.3.0/docs/index.rst000066400000000000000000000000541470651307700220730ustar00rootroot00000000000000Pallets Sphinx Themes ===================== python-pallets-sphinx-themes-2.3.0/pyproject.toml000066400000000000000000000032561470651307700222250ustar00rootroot00000000000000[project] name = "Pallets-Sphinx-Themes" version = "2.3.0" description = "Sphinx themes for Pallets and related projects." readme = "README.md" license = { file = "LICENSE.txt" } maintainers = [{ name = "Pallets", email = "contact@palletsprojects.com" }] classifiers = [ "Development Status :: 5 - Production/Stable", "Framework :: Sphinx", "Framework :: Sphinx :: Theme", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Topic :: Documentation", "Topic :: Documentation :: Sphinx", "Topic :: Software Development :: Documentation", ] requires-python = ">=3.8" dependencies = [ "packaging", "sphinx>=3", "sphinx-notfound-page", ] [project.urls] Donate = "https://palletsprojects.com/donate" Source = "https://github.com/pallets/pallets-sphinx-themes/" Chat = "https://discord.gg/pallets" [project.entry-points."pygments.styles"] pocoo = "pallets_sphinx_themes.themes.pocoo:PocooStyle" jinja = "pallets_sphinx_themes.themes.jinja:JinjaStyle" [build-system] requires = ["flit_core<4"] build-backend = "flit_core.buildapi" [tool.flit.module] name = "pallets_sphinx_themes" [tool.flit.sdist] include = [ "requirements/", "CHANGES.rst", ] [tool.ruff] src = ["src"] fix = true show-fixes = true output-format = "full" [tool.ruff.lint] select = [ "B", # flake8-bugbear "E", # pycodestyle error "F", # pyflakes "I", # isort "UP", # pyupgrade "W", # pycodestyle warning ] [tool.ruff.lint.isort] force-single-line = true order-by-type = false [tool.gha-update] tag-only = [ "slsa-framework/slsa-github-generator", ] python-pallets-sphinx-themes-2.3.0/requirements/000077500000000000000000000000001470651307700220265ustar00rootroot00000000000000python-pallets-sphinx-themes-2.3.0/requirements/build.in000066400000000000000000000000061470651307700234510ustar00rootroot00000000000000build python-pallets-sphinx-themes-2.3.0/requirements/build.txt000066400000000000000000000003511470651307700236650ustar00rootroot00000000000000# # This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # pip-compile build.in # build==1.2.2.post1 # via -r build.in packaging==24.1 # via build pyproject-hooks==1.2.0 # via build python-pallets-sphinx-themes-2.3.0/requirements/dev.in000066400000000000000000000000321470651307700231270ustar00rootroot00000000000000-r docs.in pre-commit tox python-pallets-sphinx-themes-2.3.0/requirements/dev.txt000066400000000000000000000040121470651307700233420ustar00rootroot00000000000000# # This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # pip-compile dev.in # alabaster==1.0.0 # via sphinx babel==2.16.0 # via sphinx cachetools==5.5.0 # via tox certifi==2024.8.30 # via requests cfgv==3.4.0 # via pre-commit chardet==5.2.0 # via tox charset-normalizer==3.4.0 # via requests colorama==0.4.6 # via tox distlib==0.3.9 # via virtualenv docutils==0.21.2 # via # myst-parser # sphinx filelock==3.16.1 # via # tox # virtualenv identify==2.6.1 # via pre-commit idna==3.10 # via requests imagesize==1.4.1 # via sphinx jinja2==3.1.4 # via # myst-parser # sphinx markdown-it-py==3.0.0 # via # mdit-py-plugins # myst-parser markupsafe==3.0.1 # via jinja2 mdit-py-plugins==0.4.2 # via myst-parser mdurl==0.1.2 # via markdown-it-py myst-parser==4.0.0 # via -r docs.in nodeenv==1.9.1 # via pre-commit packaging==24.1 # via # pallets-sphinx-themes # pyproject-api # sphinx # tox pallets-sphinx-themes==2.1.3 # via -r docs.in platformdirs==4.3.6 # via # tox # virtualenv pluggy==1.5.0 # via tox pre-commit==4.0.1 # via -r dev.in pygments==2.18.0 # via sphinx pyproject-api==1.8.0 # via tox pyyaml==6.0.2 # via # myst-parser # pre-commit requests==2.32.3 # via sphinx snowballstemmer==2.2.0 # via sphinx sphinx==8.1.3 # via # -r docs.in # myst-parser # pallets-sphinx-themes # sphinxcontrib-log-cabinet sphinxcontrib-applehelp==2.0.0 # via sphinx sphinxcontrib-devhelp==2.0.0 # via sphinx sphinxcontrib-htmlhelp==2.1.0 # via sphinx sphinxcontrib-jsmath==1.0.1 # via sphinx sphinxcontrib-log-cabinet==1.0.1 # via -r docs.in sphinxcontrib-qthelp==2.0.0 # via sphinx sphinxcontrib-serializinghtml==2.0.0 # via sphinx tox==4.22.0 # via -r dev.in urllib3==2.2.3 # via requests virtualenv==20.26.6 # via # pre-commit # tox python-pallets-sphinx-themes-2.3.0/requirements/docs.in000066400000000000000000000001031470651307700233000ustar00rootroot00000000000000myst-parser pallets-sphinx-themes sphinx sphinxcontrib-log-cabinet python-pallets-sphinx-themes-2.3.0/requirements/docs.txt000066400000000000000000000026541470651307700235260ustar00rootroot00000000000000# # This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # pip-compile docs.in # alabaster==1.0.0 # via sphinx babel==2.16.0 # via sphinx certifi==2024.8.30 # via requests charset-normalizer==3.4.0 # via requests docutils==0.21.2 # via # myst-parser # sphinx idna==3.10 # via requests imagesize==1.4.1 # via sphinx jinja2==3.1.4 # via # myst-parser # sphinx markdown-it-py==3.0.0 # via # mdit-py-plugins # myst-parser markupsafe==3.0.1 # via jinja2 mdit-py-plugins==0.4.2 # via myst-parser mdurl==0.1.2 # via markdown-it-py myst-parser==4.0.0 # via -r docs.in packaging==24.1 # via # pallets-sphinx-themes # sphinx pallets-sphinx-themes==2.1.3 # via -r docs.in pygments==2.18.0 # via sphinx pyyaml==6.0.2 # via myst-parser requests==2.32.3 # via sphinx snowballstemmer==2.2.0 # via sphinx sphinx==8.1.3 # via # -r docs.in # myst-parser # pallets-sphinx-themes # sphinxcontrib-log-cabinet sphinxcontrib-applehelp==2.0.0 # via sphinx sphinxcontrib-devhelp==2.0.0 # via sphinx sphinxcontrib-htmlhelp==2.1.0 # via sphinx sphinxcontrib-jsmath==1.0.1 # via sphinx sphinxcontrib-log-cabinet==1.0.1 # via -r docs.in sphinxcontrib-qthelp==2.0.0 # via sphinx sphinxcontrib-serializinghtml==2.0.0 # via sphinx urllib3==2.2.3 # via requests python-pallets-sphinx-themes-2.3.0/src/000077500000000000000000000000001470651307700200725ustar00rootroot00000000000000python-pallets-sphinx-themes-2.3.0/src/pallets_sphinx_themes/000077500000000000000000000000001470651307700244745ustar00rootroot00000000000000python-pallets-sphinx-themes-2.3.0/src/pallets_sphinx_themes/__init__.py000066400000000000000000000146721470651307700266170ustar00rootroot00000000000000import inspect import os import re import sys import textwrap from collections import namedtuple from importlib import metadata as importlib_metadata from urllib.parse import urlsplit from sphinx.application import Sphinx from sphinx.builders.dirhtml import DirectoryHTMLBuilder from sphinx.errors import ExtensionError from .theme_check import only_pallets_theme from .theme_check import set_is_pallets_theme def setup(app): base = os.path.join(os.path.dirname(__file__), "themes") for name in os.listdir(base): path = os.path.join(base, name) if os.path.isdir(path): app.add_html_theme(name, path) app.add_config_value("is_pallets_theme", None, "html") app.add_config_value("rtd_canonical_path", "/en/stable/", "html") app.add_config_value("version_banner", True, "html") # Use the sphinx-notfound-page extension to generate a 404 page with valid # URLs. Only configure it if it's not already configured. if "notfound.extension" not in app.config.extensions: app.config.extensions.append("notfound.extension") app.config.notfound_context = { "title": "Page Not Found", "body": """

Page Not Found

The page you requested does not exist. You may have followed a bad link, or the page may have been moved or removed. """, } if "READTHEDOCS" not in os.environ: # Disable the default prefix outside of Read the Docs. app.config.notfound_urls_prefix = None app.connect("builder-inited", set_is_pallets_theme) app.connect("builder-inited", find_base_canonical_url) app.connect("builder-inited", add_theme_files) app.connect("html-page-context", canonical_url) try: app.connect("autodoc-skip-member", skip_internal) app.connect("autodoc-process-docstring", cut_module_meta) except ExtensionError: pass from .themes import click as click_ext from .themes import jinja as jinja_ext click_ext.setup(app) jinja_ext.setup(app) own_release, _ = get_version(__name__) return {"version": own_release, "parallel_read_safe": True} @only_pallets_theme() def find_base_canonical_url(app: Sphinx) -> None: """When building on Read the Docs, build the base canonical URL from the environment variable if it's not given in the config. Replace the path with ``rtd_canonical_path``, which defaults to ``/en/stable/``. """ if app.config.html_baseurl: return if "READTHEDOCS_CANONICAL_URL" in os.environ: parts = urlsplit(os.environ["READTHEDOCS_CANONICAL_URL"]) path = app.config.rtd_canonical_path app.config.html_baseurl = f"{parts.scheme}://{parts.netloc}{path}" @only_pallets_theme() def add_theme_files(app: Sphinx) -> None: # Add the JavaScript for the version warning banner if ``version_banner`` is # enabled. On Read the Docs, don't include it for stable or PR builds. # Include the project and version as data attributes that the script will # access. The project name is assumed to be the PyPI name, and is normalized # to avoid a redirect. rtd_version = os.environ.get("READTHEDOCS_VERSION") rtd_version_type = os.environ.get("READTHEDOCS_VERSION_TYPE") if app.config.version_banner and ( rtd_version is None # not on read the docs or (rtd_version != "stable" and rtd_version_type in {"branch", "tag"}) ): app.add_js_file( "describe_version.js", **{ "data-project": re.sub(r"[-_.]+", "-", app.config.project).lower(), "data-version": app.config.version, }, ) @only_pallets_theme() def canonical_url(app: Sphinx, pagename, templatename, context, doctree): """Sphinx 1.8 builds a canonical URL if ``html_baseurl`` config is set. However, it builds a URL ending with ".html" when using the dirhtml builder, which is incorrect. Detect this and generate the correct URL for each page. """ base = app.config.html_baseurl if ( not base or not isinstance(app.builder, DirectoryHTMLBuilder) or not context["pageurl"] or not context["pageurl"].endswith(".html") ): return # Fix pageurl for dirhtml builder if this version of Sphinx still # generates .html URLs. target = app.builder.get_target_uri(pagename) context["pageurl"] = base + target @only_pallets_theme() def skip_internal(app, what, name, obj, skip, options): """Skip rendering autodoc when the docstring contains a line with only the string `:internal:`. """ docstring = inspect.getdoc(obj) or "" if skip or re.search(r"^\s*:internal:\s*$", docstring, re.M) is not None: return True @only_pallets_theme() def cut_module_meta(app, what, name, obj, options, lines): """Don't render lines that start with ``:copyright:`` or ``:license:`` when rendering module autodoc. These lines are useful meta information in the source code, but are noisy in the docs. """ if what != "module": return lines[:] = [ line for line in lines if not line.startswith((":copyright:", ":license:")) ] def get_version(name, version_length=2, placeholder="x"): """Ensures that the named package is installed and returns version strings to be used by Sphinx. Sphinx uses ``version`` to mean an abbreviated form of the full version string, which is called ``release``. In ``conf.py``:: release, version = get_version("Flask") # release = 1.0.x, version = 1.0.3.dev0 :param name: Name of package to get. :param version_length: How many values from ``release`` to use for ``version``. :param placeholder: Extra suffix to add to the version. The default produces versions like ``1.2.x``. :return: ``(release, version)`` tuple. """ try: release = importlib_metadata.version(name) except ImportError: print( textwrap.fill( f"'{name}' must be installed to build the documentation." " Install from source using `pip install -e .` in a virtualenv." ) ) sys.exit(1) version = ".".join(release.split(".", version_length)[:version_length]) if placeholder: version = f"{version}.{placeholder}" return release, version #: ``(title, url)`` named tuple that will be rendered with ProjectLink = namedtuple("ProjectLink", ("title", "url")) python-pallets-sphinx-themes-2.3.0/src/pallets_sphinx_themes/theme_check.py000066400000000000000000000024561470651307700273140ustar00rootroot00000000000000from functools import wraps from sphinx.theming import HTMLThemeFactory def set_is_pallets_theme(app): """Set the ``is_pallets_theme`` config to ``True`` if the current theme is a decedent of the ``pocoo`` theme. """ if app.config.is_pallets_theme is not None: return theme = getattr(app.builder, "theme", None) if theme is None: app.config.is_pallets_theme = False return pocoo_dir = HTMLThemeFactory(app).create("pocoo").get_theme_dirs()[0] app.config.is_pallets_theme = pocoo_dir in theme.get_theme_dirs() def only_pallets_theme(default=None): """Create a decorator that calls a function only if the ``is_pallets_theme`` config is ``True``. Used to prevent Sphinx event callbacks from doing anything if the Pallets themes are installed but not used. :: @only_pallets_theme() def inject_value(app): ... app.connect("builder-inited", inject_value) :param default: Value to return if a Pallets theme is not in use. :return: A decorator. """ def decorator(f): @wraps(f) def wrapped(app, *args, **kwargs): if not app.config.is_pallets_theme: return default return f(app, *args, **kwargs) return wrapped return decorator python-pallets-sphinx-themes-2.3.0/src/pallets_sphinx_themes/themes/000077500000000000000000000000001470651307700257615ustar00rootroot00000000000000python-pallets-sphinx-themes-2.3.0/src/pallets_sphinx_themes/themes/__init__.py000066400000000000000000000000001470651307700300600ustar00rootroot00000000000000python-pallets-sphinx-themes-2.3.0/src/pallets_sphinx_themes/themes/click/000077500000000000000000000000001470651307700270465ustar00rootroot00000000000000python-pallets-sphinx-themes-2.3.0/src/pallets_sphinx_themes/themes/click/__init__.py000066400000000000000000000002561470651307700311620ustar00rootroot00000000000000def setup(app): """Load the Click extension if Click is installed.""" try: from . import domain except ImportError: return domain.setup(app) python-pallets-sphinx-themes-2.3.0/src/pallets_sphinx_themes/themes/click/domain.py000066400000000000000000000172371470651307700307010ustar00rootroot00000000000000import contextlib import shlex import subprocess import sys import tempfile from functools import partial import click from click.testing import CliRunner from click.testing import EchoingStdin from docutils import nodes from docutils.parsers.rst import Directive from docutils.statemachine import ViewList from sphinx.domains import Domain class EofEchoingStdin(EchoingStdin): """Like :class:`click.testing.EchoingStdin` but adds a visible ``^D`` in place of the EOT character (``\x04``). :meth:`ExampleRunner.invoke` adds ``\x04`` when ``terminate_input=True``. """ def _echo(self, rv): eof = rv[-1] == b"\x04"[0] if eof: rv = rv[:-1] if not self._paused: self._output.write(rv) if eof: self._output.write(b"^D\n") return rv @contextlib.contextmanager def patch_modules(): """Patch modules to work better with :meth:`ExampleRunner.invoke`. ``subprocess.call` output is redirected to ``click.echo`` so it shows up in the example output. """ old_call = subprocess.call def dummy_call(*args, **kwargs): with tempfile.TemporaryFile("wb+") as f: kwargs["stdout"] = f kwargs["stderr"] = f rv = subprocess.Popen(*args, **kwargs).wait() f.seek(0) click.echo(f.read().decode("utf-8", "replace").rstrip()) return rv subprocess.call = dummy_call try: yield finally: subprocess.call = old_call class ExampleRunner(CliRunner): def __init__(self): super().__init__(echo_stdin=True) self.namespace = {"click": click, "__file__": "dummy.py"} @contextlib.contextmanager def isolation(self, *args, **kwargs): iso = super().isolation(*args, **kwargs) with iso as streams: try: buffer = sys.stdin.buffer except AttributeError: buffer = sys.stdin # FIXME: We need to replace EchoingStdin with our custom # class that outputs "^D". At this point we know sys.stdin # has been patched so it's safe to reassign the class. # Remove this once EchoingStdin is overridable. buffer.__class__ = EofEchoingStdin yield streams def invoke( self, cli, args=None, prog_name=None, input=None, terminate_input=False, env=None, _output_lines=None, **extra, ): """Like :meth:`CliRunner.invoke` but displays what the user would enter in the terminal for env vars, command args, and prompts. :param terminate_input: Whether to display "^D" after a list of input. :param _output_lines: A list used internally to collect lines to be displayed. """ output_lines = _output_lines if _output_lines is not None else [] if env: for key, value in sorted(env.items()): value = shlex.quote(value) output_lines.append(f"$ export {key}={value}") args = args or [] if prog_name is None: prog_name = cli.name.replace("_", "-") output_lines.append(f"$ {prog_name} {shlex.join(args)}".rstrip()) # remove "python" from command prog_name = prog_name.rsplit(" ", 1)[-1] if isinstance(input, (tuple, list)): input = "\n".join(input) + "\n" if terminate_input: input += "\x04" result = super().invoke( cli=cli, args=args, input=input, env=env, prog_name=prog_name, **extra ) output_lines.extend(result.output.splitlines()) return result def declare_example(self, source): """Execute the given code, adding it to the runner's namespace.""" with patch_modules(): code = compile(source, "", "exec") exec(code, self.namespace) def run_example(self, source): """Run commands by executing the given code, returning the lines of input and output. The code should be a series of the following functions: * :meth:`invoke`: Invoke a command, adding env vars, input, and output to the output. * ``println(text="")``: Add a line of text to the output. * :meth:`isolated_filesystem`: A context manager that changes to a temporary directory while executing the block. """ code = compile(source, "", "exec") buffer = [] invoke = partial(self.invoke, _output_lines=buffer) def println(text=""): buffer.append(text) exec( code, self.namespace, { "invoke": invoke, "println": println, "isolated_filesystem": self.isolated_filesystem, }, ) return buffer def close(self): """Clean up the runner once the document has been read.""" pass def get_example_runner(document): """Get or create the :class:`ExampleRunner` instance associated with a document. """ runner = getattr(document, "click_example_runner", None) if runner is None: runner = document.click_example_runner = ExampleRunner() return runner class DeclareExampleDirective(Directive): """Add the source contained in the directive's content to the document's :class:`ExampleRunner`, to be run using :class:`RunExampleDirective`. See :meth:`ExampleRunner.declare_example`. """ has_content = True required_arguments = 0 optional_arguments = 0 final_argument_whitespace = False def run(self): doc = ViewList() runner = get_example_runner(self.state.document) try: runner.declare_example("\n".join(self.content)) except BaseException: runner.close() raise doc.append(".. sourcecode:: python", "") doc.append("", "") for line in self.content: doc.append(" " + line, "") node = nodes.section() self.state.nested_parse(doc, self.content_offset, node) return node.children class RunExampleDirective(Directive): """Run commands from :class:`DeclareExampleDirective` and display the input and output. See :meth:`ExampleRunner.run_example`. """ has_content = True required_arguments = 0 optional_arguments = 0 final_argument_whitespace = False def run(self): doc = ViewList() runner = get_example_runner(self.state.document) try: rv = runner.run_example("\n".join(self.content)) except BaseException: runner.close() raise doc.append(".. sourcecode:: shell-session", "") doc.append("", "") for line in rv: doc.append(" " + line, "") node = nodes.section() self.state.nested_parse(doc, self.content_offset, node) return node.children class ClickDomain(Domain): name = "click" label = "Click" directives = {"example": DeclareExampleDirective, "run": RunExampleDirective} def merge_domaindata(self, docnames, otherdata): # Needed to support parallel build. # Not using self.data -- nothing to merge. pass def delete_example_runner_state(app, doctree): """Close and remove the :class:`ExampleRunner` instance once the document has been read. """ runner = getattr(doctree, "click_example_runner", None) if runner is not None: runner.close() del doctree.click_example_runner def setup(app): app.add_domain(ClickDomain) app.connect("doctree-read", delete_example_runner_state) python-pallets-sphinx-themes-2.3.0/src/pallets_sphinx_themes/themes/click/static/000077500000000000000000000000001470651307700303355ustar00rootroot00000000000000python-pallets-sphinx-themes-2.3.0/src/pallets_sphinx_themes/themes/click/static/click.css000066400000000000000000000011111470651307700321260ustar00rootroot00000000000000@import url("pocoo.css"); @import url("https://fonts.googleapis.com/css?family=Ubuntu+Mono"); @import url("https://fonts.googleapis.com/css?family=Open+Sans"); body, pre, code { font-family: "Ubuntu Mono", "Consolas", "Menlo", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", monospace; font-size: 15px; } h1, h2, h3, h4, h5, h6, p.admonition-title, div.sphinxsidebar input { font-family: "Open Sans", "Helvetica", "Arial", sans-serif; } div.body { color: #3e4349; } a { color: #5d2cd1; } a:hover { color: #7546e3; } p.version-warning { background-color: #7546e3; } python-pallets-sphinx-themes-2.3.0/src/pallets_sphinx_themes/themes/click/theme.conf000066400000000000000000000001061470651307700310140ustar00rootroot00000000000000[theme] inherit = pocoo stylesheet = click.css pygments_style = tango python-pallets-sphinx-themes-2.3.0/src/pallets_sphinx_themes/themes/flask/000077500000000000000000000000001470651307700270615ustar00rootroot00000000000000python-pallets-sphinx-themes-2.3.0/src/pallets_sphinx_themes/themes/flask/static/000077500000000000000000000000001470651307700303505ustar00rootroot00000000000000python-pallets-sphinx-themes-2.3.0/src/pallets_sphinx_themes/themes/flask/static/flask.css000066400000000000000000000003551470651307700321650ustar00rootroot00000000000000@import url("pocoo.css"); a, a.reference, a.footnote-reference { color: #004b6b; text-decoration-color: #004b6b; } a:hover { color: #6d4100; text-decoration-color: #6d4100; } p.version-warning { background-color: #004b6b; } python-pallets-sphinx-themes-2.3.0/src/pallets_sphinx_themes/themes/flask/theme.conf000066400000000000000000000000571470651307700310340ustar00rootroot00000000000000[theme] inherit = pocoo stylesheet = flask.css python-pallets-sphinx-themes-2.3.0/src/pallets_sphinx_themes/themes/jinja/000077500000000000000000000000001470651307700270545ustar00rootroot00000000000000python-pallets-sphinx-themes-2.3.0/src/pallets_sphinx_themes/themes/jinja/__init__.py000066400000000000000000000030141470651307700311630ustar00rootroot00000000000000from pygments.style import Style from pygments.token import Comment from pygments.token import Error from pygments.token import Generic from pygments.token import Keyword from pygments.token import Name from pygments.token import Number from pygments.token import Operator from pygments.token import String class JinjaStyle(Style): background_color = "#f8f8f8" default_style = "" styles = { Comment: "italic #aaaaaa", Comment.Preproc: "noitalic #b11414", Comment.Special: "italic #505050", Keyword: "bold #b80000", Keyword.Type: "#808080", Operator.Word: "bold #b80000", Name.Builtin: "#333333", Name.Function: "#333333", Name.Class: "bold #333333", Name.Namespace: "bold #333333", Name.Entity: "bold #363636", Name.Attribute: "#686868", Name.Tag: "bold #686868", Name.Decorator: "#686868", String: "#aa891c", Number: "#444444", Generic.Heading: "bold #000080", Generic.Subheading: "bold #800080", Generic.Deleted: "#aa0000", Generic.Inserted: "#00aa00", Generic.Error: "#aa0000", Generic.Emph: "italic", Generic.Strong: "bold", Generic.Prompt: "#555555", Generic.Output: "#888888", Generic.Traceback: "#aa0000", Error: "#f00 bg:#faa", } def setup(app): """Load the Jinja extension if Jinja is installed.""" try: from . import domain except ImportError: return domain.setup(app) python-pallets-sphinx-themes-2.3.0/src/pallets_sphinx_themes/themes/jinja/domain.py000066400000000000000000000213261470651307700307010ustar00rootroot00000000000000import csv import inspect import re from io import StringIO from docutils import nodes from docutils.statemachine import StringList from sphinx.domains import Domain from sphinx.util import import_object from sphinx.util.docutils import SphinxDirective def build_function_directive(name, aliases, func): """Build a function directive, with name, signature, docs, and aliases. .. code-block:: rst .. function:: name(signature) doc doc :aliases: ``name2``, ``name3`` :param name: The name mapped to the function, which may not match the real name of the function. :param aliases: Other names mapped to the function. :param func: The function. :return: A list of lines of reStructuredText to be rendered. If the function is a Jinja environment, context, or eval context filter, the first argument is omitted from the signature since it's not seen by template developers. If the filter is a Jinja async variant, it is unwrapped to its sync variant to get the docs and signature. """ if getattr(func, "jinja_async_variant", False): # unwrap async filters to their normal variant func = inspect.unwrap(func) doc = inspect.getdoc(func).splitlines() try: sig = inspect.signature(func, follow_wrapped=False) except ValueError: # some c function that doesn't report its signature (ex. MarkupSafe.escape) # try the first line of the docs, fall back to generic value sig = "(value)" m = re.match(r"[a-zA-Z_]\w*(\(.*?\))", doc[0]) if m is not None: doc = doc[1:] sig = m.group(1) else: if getattr(func, "jinja_pass_arg", None) is not None: # remove the internal-only first argument from context filters params = list(sig.parameters.values()) if params[0].kind != inspect.Parameter.VAR_POSITIONAL: # only remove it if it's not "*args" del params[0] sig = sig.replace(parameters=params) result = ["", f".. function:: {name}{sig}", ""] result.extend([f" {x}" for x in doc]) if aliases: result.append("") alias_str = ", ".join([f"``{x}``" for x in sorted(aliases)]) result.append(f" :aliases: {alias_str}") return result class MappedFunctionsDirective(SphinxDirective): """Take a dict of names to functions and produce rendered docs. Requires one argument, the import name of the dict to process. Used for the ``jinja:filters::` and `jinja:tests::` directives. Multiple names can point to the same function. In this case the shortest name is used as the primary name, and other names are displayed as aliases. Comparison operators are special cased to prefer their two letter names, like "eq". The docs are sorted by primary name. A table is rendered above the docs as a compact table of contents linking to each function. """ required_arguments = 1 def _build_functions(self): """Imports the dict and builds the output for the functions. This is what determines aliases and performs sorting. Calls :func:`build_function_directive` for each function, then renders the list of reStructuredText to nodes. The list of sorted names is stored for use by :meth:`_build_table`. :return: A list of rendered nodes. """ map_name = self.arguments[0] mapping = import_object(map_name) grouped = {} # reverse the mapping to get a list of aliases for each function for key, value in mapping.items(): grouped.setdefault(value, []).append(key) # store the function names for use by _build_table self.funcs = funcs = [] compare_ops = {"eq", "ge", "gt", "le", "lt", "ne"} for func, names in grouped.items(): # use the longest alias as the canonical name names.sort(key=len) # adjust for special cases names.sort(key=lambda x: x in compare_ops) name = names.pop() funcs.append((name, names, func)) funcs.sort() result = StringList() # generate and collect markup for name, aliases, func in funcs: for item in build_function_directive(name, aliases, func): result.append(item, "") # parse the generated markup into nodes node = nodes.Element() self.state.nested_parse(result, self.content_offset, node) return node.children def _build_table(self): """Takes the sorted list of names produced by :meth:`_build_functions` and builds the nodes for the table of contents. The table is hard coded to be 5 columns wide. Names are rendered in alphabetical order in columns. :return: A list of rendered nodes. """ # the reference markup to link to each name names = [f":func:`{name}`" for name, _, _ in self.funcs] # total number of rows, the number of names divided by the # number of columns, plus one in case of overflow row_size = (len(names) // 5) + bool(len(names) % 5) # pivot to rows so that names remain alphabetical in columns rows = [names[i::row_size] for i in range(row_size)] # render the names to CSV for the csv-table directive out = StringIO() writer = csv.writer(out) writer.writerows(rows) # generate the markup for the csv-table directive result = ["", ".. csv-table::", " :align: left", ""] result.extend([f" {line}" for line in out.getvalue().splitlines()]) # parse the generated markup into nodes result = StringList(result, "") node = nodes.Element() self.state.nested_parse(result, self.content_offset, node) return node.children def run(self): """Render the table and function docs. Build the functions first to calculate the names and order, then build the table. Return the table above the functions. :return: A list of rendered nodes. """ functions = self._build_functions() table = self._build_table() return table + functions class NodesDirective(SphinxDirective): """Take a base Jinja ``Node`` class and render docs for it and all subclasses, recursively, depth first. Requires one argument, the import name of the base class. Used for the ``jinja:nodes::` directive. Each descendant renders a link back to its parent. """ required_arguments = 1 def run(self): def walk(cls): """Render the given class, then recursively render its descendants depth first. Appends to the outer ``lines`` variable. :param cls: The Jinja ``Node`` class to render. """ lines.append( ".. autoclass:: {}({})".format(cls.__name__, ", ".join(cls.fields)) ) # render member methods for nodes marked abstract if cls.abstract: members = [] for key, value in cls.__dict__.items(): if ( not key.startswith("_") and not hasattr(cls.__base__, key) and callable(value) ): members.append(key) if members: members.sort() lines.append(" :members: " + ", ".join(members)) # reference the parent node, except for the base node if cls.__base__ is not object: lines.append("") lines.append(f" :Node type: :class:`{cls.__base__.__name__}`") lines.append("") children = cls.__subclasses__() children.sort(key=lambda x: x.__name__.lower()) # render each child for child in children: walk(child) # generate the markup starting at the base class lines = [] target = import_object(self.arguments[0]) walk(target) # parse the generated markup into nodes doc = StringList(lines, "") node = nodes.Element() self.state.nested_parse(doc, self.content_offset, node) return node.children class JinjaDomain(Domain): name = "jinja" label = "Jinja" directives = { "filters": MappedFunctionsDirective, "tests": MappedFunctionsDirective, "nodes": NodesDirective, } def merge_domaindata(self, docnames, otherdata): # Needed to support parallel build. # Not using self.data -- nothing to merge. pass def setup(app): app.add_domain(JinjaDomain) python-pallets-sphinx-themes-2.3.0/src/pallets_sphinx_themes/themes/jinja/static/000077500000000000000000000000001470651307700303435ustar00rootroot00000000000000python-pallets-sphinx-themes-2.3.0/src/pallets_sphinx_themes/themes/jinja/static/jinja.css000066400000000000000000000006511470651307700321520ustar00rootroot00000000000000@import url("pocoo.css"); @import url("https://fonts.googleapis.com/css?family=Crimson+Text"); h1, h2, h3, h4, h5, h6, p.admonition-title, div.sphinxsidebar input { font-family: "Crimson Text", "Garamond", "Georgia", serif; } a, a.reference, a.footnote-reference { color: #a00; text-decoration-color: #a00; } a:hover { color: #d00; text-decoration-color: #d00; } p.version-warning { background-color: #d40; } python-pallets-sphinx-themes-2.3.0/src/pallets_sphinx_themes/themes/jinja/theme.conf000066400000000000000000000001061470651307700310220ustar00rootroot00000000000000[theme] inherit = pocoo stylesheet = jinja.css pygments_style = jinja python-pallets-sphinx-themes-2.3.0/src/pallets_sphinx_themes/themes/pocoo/000077500000000000000000000000001470651307700271005ustar00rootroot00000000000000python-pallets-sphinx-themes-2.3.0/src/pallets_sphinx_themes/themes/pocoo/__init__.py000066400000000000000000000077241470651307700312230ustar00rootroot00000000000000from pygments.style import Style from pygments.token import Comment from pygments.token import Error from pygments.token import Generic from pygments.token import Keyword from pygments.token import Literal from pygments.token import Name from pygments.token import Number from pygments.token import Operator from pygments.token import Other from pygments.token import Punctuation from pygments.token import String from pygments.token import Whitespace class PocooStyle(Style): background_color = "#f8f8f8" default_style = "" styles = { # No corresponding class for the following: # Text: "", # class: '' Whitespace: "underline #f8f8f8", # class: 'w' Error: "#a40000 border:#ef2929", # class: 'err' Other: "#000000", # class 'x' Comment: "italic #8f5902", # class: 'c' Comment.Preproc: "noitalic", # class: 'cp' Keyword: "bold #004461", # class: 'k' Keyword.Constant: "bold #004461", # class: 'kc' Keyword.Declaration: "bold #004461", # class: 'kd' Keyword.Namespace: "bold #004461", # class: 'kn' Keyword.Pseudo: "bold #004461", # class: 'kp' Keyword.Reserved: "bold #004461", # class: 'kr' Keyword.Type: "bold #004461", # class: 'kt' Operator: "#582800", # class: 'o' Operator.Word: "bold #004461", # class: 'ow' - like keywords Punctuation: "bold #000000", # class: 'p' # because special names such as Name.Class, Name.Function, etc. # are not recognized as such later in the parsing, we choose them # to look the same as ordinary variables. Name: "#000000", # class: 'n' Name.Attribute: "#c4a000", # class: 'na' - to be revised Name.Builtin: "#004461", # class: 'nb' Name.Builtin.Pseudo: "#3465a4", # class: 'bp' Name.Class: "#000000", # class: 'nc' - to be revised Name.Constant: "#000000", # class: 'no' - to be revised Name.Decorator: "#888", # class: 'nd' - to be revised Name.Entity: "#ce5c00", # class: 'ni' Name.Exception: "bold #cc0000", # class: 'ne' Name.Function: "#000000", # class: 'nf' Name.Property: "#000000", # class: 'py' Name.Label: "#f57900", # class: 'nl' Name.Namespace: "#000000", # class: 'nn' - to be revised Name.Other: "#000000", # class: 'nx' Name.Tag: "bold #004461", # class: 'nt' - like a keyword Name.Variable: "#000000", # class: 'nv' - to be revised Name.Variable.Class: "#000000", # class: 'vc' - to be revised Name.Variable.Global: "#000000", # class: 'vg' - to be revised Name.Variable.Instance: "#000000", # class: 'vi' - to be revised Number: "#990000", # class: 'm' Literal: "#000000", # class: 'l' Literal.Date: "#000000", # class: 'ld' String: "#4e9a06", # class: 's' String.Backtick: "#4e9a06", # class: 'sb' String.Char: "#4e9a06", # class: 'sc' String.Doc: "italic #8f5902", # class: 'sd' - like a comment String.Double: "#4e9a06", # class: 's2' String.Escape: "#4e9a06", # class: 'se' String.Heredoc: "#4e9a06", # class: 'sh' String.Interpol: "#4e9a06", # class: 'si' String.Other: "#4e9a06", # class: 'sx' String.Regex: "#4e9a06", # class: 'sr' String.Single: "#4e9a06", # class: 's1' String.Symbol: "#4e9a06", # class: 'ss' Generic: "#000000", # class: 'g' Generic.Deleted: "#a40000", # class: 'gd' Generic.Emph: "italic #000000", # class: 'ge' Generic.Error: "#ef2929", # class: 'gr' Generic.Heading: "bold #000080", # class: 'gh' Generic.Inserted: "#00A000", # class: 'gi' Generic.Output: "#888", # class: 'go' Generic.Prompt: "#745334", # class: 'gp' Generic.Strong: "bold #000000", # class: 'gs' Generic.Subheading: "bold #800080", # class: 'gu' Generic.Traceback: "bold #a40000", # class: 'gt' } python-pallets-sphinx-themes-2.3.0/src/pallets_sphinx_themes/themes/pocoo/ethicalads.html000066400000000000000000000000461470651307700320670ustar00rootroot00000000000000

python-pallets-sphinx-themes-2.3.0/src/pallets_sphinx_themes/themes/pocoo/layout.html000066400000000000000000000006331470651307700313050ustar00rootroot00000000000000{% extends "basic/layout.html" %} {% set metatags %} {{- metatags }} {%- endset %} {% block sidebarlogo %} {% if pagename != "index" or theme_index_sidebar_logo %} {{ super() }} {% endif %} {% endblock %} {% block relbar2 %}{% endblock %} {% block sidebar2 %} {{- super() }} {%- endblock %} python-pallets-sphinx-themes-2.3.0/src/pallets_sphinx_themes/themes/pocoo/localtoc.html000066400000000000000000000001021470651307700315570ustar00rootroot00000000000000{% if display_toc %}

Contents

{{ toc }} {%- endif %} python-pallets-sphinx-themes-2.3.0/src/pallets_sphinx_themes/themes/pocoo/project.html000066400000000000000000000002551470651307700314360ustar00rootroot00000000000000{% if project_links %}

Project Links

{%- endif %} python-pallets-sphinx-themes-2.3.0/src/pallets_sphinx_themes/themes/pocoo/relations.html000066400000000000000000000012051470651307700317640ustar00rootroot00000000000000

Navigation

python-pallets-sphinx-themes-2.3.0/src/pallets_sphinx_themes/themes/pocoo/static/000077500000000000000000000000001470651307700303675ustar00rootroot00000000000000python-pallets-sphinx-themes-2.3.0/src/pallets_sphinx_themes/themes/pocoo/static/describe_version.js000066400000000000000000000143131470651307700342540ustar00rootroot00000000000000/** * Match a PEP 440 version string. The full regex given in PEP 440 is not used. * This subset covers what we expect to encounter in our projects. */ const versionRe = new RegExp([ "^", "(?:(?[1-9][0-9]*)!)?", "(?(?:0|[1-9][0-9]*)(?:\\.(?:0|[1-9][0-9]*))*)", "(?:(?a|b|rc)(?0|[1-9][0-9]*))?", "(?:\\.post(?0|[1-9][0-9]*))?", "(?:\\.dev(?0|[1-9][0-9]*))?", "$", ].join("")) /** * Parse a PEP 440 version string into an object. * * @param {string} value * @returns {Object} parsed version information */ function parseVersion(value) { let {groups: {epoch, version, preL, preN, postN, devN}} = versionRe.exec(value) return { value: value, parts: [ parseInt(epoch) || 0, ...version.split(".").map(p => parseInt(p)) ], isPre: Boolean(preL), preL: preL || "", preN: parseInt(preN) || 0, isPost: Boolean(postN), postN: parseInt(postN) || 0, isDev: Boolean(devN), devN: parseInt(devN) || 0, } } /** * Compare two version objects. * * @param {Object} a left side of comparison * @param {Object} b right side of comparison * @returns {number} -1 less than, 0 equal to, 1 greater than */ function compareVersions(a, b) { for (let [i, an] of a.parts.entries()) { let bn = i < b.parts.length ? b.parts[i] : 0 if (an < bn) { return -1 } else if (an > bn) { return 1 } } if (a.parts.length < b.parts.length) { return -1 } return 0 } /** * Get the list of released versions for the project from PyPI. Prerelease and * development versions are discarded. The list is sorted in descending order, * highest version first. * * This will be called on every page load. To avoid making excessive requests to * PyPI, the result is cached for 1 day. PyPI also sends cache headers, so a * subsequent request may still be more efficient, but it only specifies caching * the full response for 5 minutes. * * @param {string} name The normalized PyPI project name to query. * @returns {Promise} A sorted list of version objects. */ async function getReleasedVersions(name) { // The response from PyPI is only cached for 5 minutes. Extend that to 1 day. let cacheTime = localStorage.getItem("describeVersion-time") let cacheResult = localStorage.getItem("describeVersion-result") // if there is a cached value if (cacheTime && cacheResult) { // if the cache is younger than 1 day if (Number(cacheTime) >= Date.now() - 86400000) { // Use the cached value instead of making another request. return JSON.parse(cacheResult) } } let response = await fetch( `https://pypi.org/simple/${name}/`, {"headers": {"Accept": "application/vnd.pypi.simple.v1+json"}} ) let data = await response.json() let result = data["versions"] .map(parseVersion) .filter(v => !(v.isPre || v.isDev)) .sort(compareVersions) .reverse() localStorage.setItem("describeVersion-time", Date.now().toString()) localStorage.setItem("describeVersion-result", JSON.stringify(result)) return result } /** * Get the highest released version of the project from PyPI, and compare the * version being documented. Returns a list of two values, the comparison * result and the highest version. * * @param name The normalized PyPI project name. * @param value The version being documented. * @returns {Promise<[number, Object|null]>} */ async function describeVersion(name, value) { if (value.endsWith(".x")) { value = value.slice(0, -2) } let currentVersion = parseVersion(value) let releasedVersions = await getReleasedVersions(name) if (releasedVersions.length === 0) { return [1, null] } let highestVersion = releasedVersions[0] let compared = compareVersions(currentVersion, highestVersion) if (compared === 1) { return [1, highestVersion] } // If the current version including trailing zeros is a prefix of the highest // version, then these are the stable docs. For example, 2.0.x becomes 2.0, // which is a prefix of 2.0.3. If we were just looking at the compare result, // it would incorrectly be marked as an old version. if (currentVersion.parts.every((n, i) => n === highestVersion.parts[i])) { return [0, highestVersion] } return [-1, highestVersion] } /** * Compare the version being documented to the highest released version, and * display a warning banner if it is not the highest version. * * @param project The normalized PyPI project name. * @param version The version being documented. * @returns {Promise} */ async function createBanner(project, version) { let [compared, stable] = await describeVersion(project, version) // No banner if this is the highest version or there are no other versions. if (compared === 0 || stable === null) { return } let banner = document.createElement("p") banner.className = "version-warning" if (compared === 1) { banner.textContent = "This is the development version. The stable version is " } else if (compared === -1) { banner.textContent = "This is an old version. The current version is " } let canonical = document.querySelector('link[rel="canonical"]') if (canonical !== null) { // If a canonical URL is available, the version is a link to it. let link = document.createElement("a") link.href = canonical.href link.textContent = stable.value banner.append(link, ".") } else { // Otherwise, the version is text only. banner.append(stable.value, ".") } document.getElementsByClassName("document")[0].prepend(banner) // Set scroll-padding-top to prevent the banner from overlapping anchors. // It's also set in CSS assuming the banner text is only 1 line. let bannerStyle = window.getComputedStyle(banner) let bannerMarginTop = parseFloat(bannerStyle["margin-top"]) let bannerMarginBottom = parseFloat(bannerStyle["margin-bottom"]) let height = banner.offsetHeight + bannerMarginTop + bannerMarginBottom document.documentElement.style["scroll-padding-top"] = `${height}px` } (() => { // currentScript is only available during init, not during callbacks. let {project, version} = document.currentScript.dataset document.addEventListener("DOMContentLoaded", async () => { await createBanner(project, version) }) })() python-pallets-sphinx-themes-2.3.0/src/pallets_sphinx_themes/themes/pocoo/static/pocoo.css000066400000000000000000000174731470651307700322340ustar00rootroot00000000000000@import url("basic.css"); /* -- page layout --------------------------------------------------- */ html { scroll-padding-top: calc(30px + 1em); /* see .version-warning selector for banner positioning */ } body { font-family: 'Garamond', 'Georgia', serif; font-size: 17px; background-color: #fff; color: #3e4349; margin: 0; padding: 0; } div.related { max-width: 1140px; margin: 10px auto; /* displayed on mobile */ display: none; } div.document { max-width: 1140px; margin: 10px auto; } div.documentwrapper { float: left; width: 100%; } div.bodywrapper { margin: 0 0 0 220px; } div.body { min-width: initial; max-width: initial; padding: 0 30px; } div.sphinxsidebarwrapper { padding: 10px; } div.sphinxsidebar { width: 220px; font-size: 14px; line-height: 1.5; color: #444; } div.sphinxsidebar li { overflow: hidden; text-overflow: ellipsis; } div.sphinxsidebar li:hover { overflow: visible; } div.sphinxsidebar a, div.sphinxsidebar a code { color: #444; border-color: #444; } div.sphinxsidebar a:hover { background-color:#fff; } div.sphinxsidebar p.logo { margin: 0; text-align: center; } div.sphinxsidebar h3, div.sphinxsidebar h4 { font-size: 24px; color: #444; } div.sphinxsidebar p.logo a, div.sphinxsidebar h3 a, div.sphinxsidebar p.logo a:hover, div.sphinxsidebar h3 a:hover { border: none; } div.sphinxsidebar p, div.sphinxsidebar h3, div.sphinxsidebar h4 { margin: 10px 0; } div.sphinxsidebar ul { margin: 10px 0; padding: 0; } div.sphinxsidebar input { border: 1px solid #999; font-size: 1em; } div.footer { max-width: 1140px; margin: 20px auto; font-size: 14px; text-align: right; color: #888; } div.footer a { color: #888; border-color: #888; } /* -- quick search -------------------------------------------------- */ div.sphinxsidebar #searchbox form { display: flex; } div.sphinxsidebar #searchbox form > div { display: flex; flex: 1 1 auto; } div.sphinxsidebar #searchbox input[type=text] { flex: 1 1 auto; width: 1% !important; } div.sphinxsidebar #searchbox input[type=submit] { border-left-width: 0; } /* -- version warning ----------------------------------------------- */ /* see html selector for scroll offset */ p.version-warning { top: 10px; position: sticky; margin: 10px 0; padding: 5px 10px; border-radius: 4px; letter-spacing: 1px; color: #fff; text-shadow: 0 0 2px #000; text-align: center; background: #d40 repeating-linear-gradient( 135deg, transparent, transparent 56px, rgba(255, 255, 255, 0.2) 56px, rgba(255, 255, 255, 0.2) 112px ); } p.version-warning a { color: #fff; border-color: #fff; } /* -- body styles --------------------------------------------------- */ a { text-decoration: underline; text-decoration-style: dotted; text-decoration-color: #000; text-decoration-thickness: 1px; } a:hover { text-decoration-style: solid; } h1, h2, h3, h4, h5, h6 { font-weight: normal; margin: 30px 0 10px; padding: 0; color: black; } div.body h1 { font-size: 240%; } div.body h2 { font-size: 180%; } div.body h3 { font-size: 150%; } div.body h4 { font-size: 130%; } div.body h5 { font-size: 100%; } div.body h6 { font-size: 100%; } div.body h1:first-of-type { margin-top: 0; } a.headerlink { color: #ddd; margin: 0 0.2em; padding: 0 0.2em; border: none; } a.headerlink:hover { color: #444; } div.body p, div.body dd, div.body li { line-height: 1.4; } img.screenshot { box-shadow: 2px 2px 4px #eee; } hr { border: 1px solid #999; } blockquote { margin: 0 0 0 30px; padding: 0; } ul, ol { margin: 10px 0 10px 30px; padding: 0; } a.footnote-reference { font-size: 0.7em; vertical-align: top; } /* -- admonitions --------------------------------------------------- */ div.admonition, div.topic { background-color: #fafafa; margin: 10px -10px; padding: 10px; border-top: 1px solid #ccc; border-right: none; border-bottom: 1px solid #ccc; border-left: none; } div.admonition p.admonition-title, div.topic p.topic-title { font-weight: normal; font-size: 24px; margin: 0 0 10px 0; padding: 0; line-height: 1; display: inline; } p.admonition-title::after { content: ":"; } div.admonition p.last, div.topic p:last-child { margin-bottom: 0; } div.danger, div.error { background-color: #fff0f0; border-color: #ffb0b0; } div.seealso { background-color: #fffff0; border-color: #f0f0a8; } /* -- changelog ----------------------------------------------------- */ details.changelog summary { cursor: pointer; font-style: italic; margin-bottom: 10px; } /* -- search highlight ---------------------------------------------- */ dt:target, .footnote:target, span.highlighted { background-color: #ffdf80; } rect.highlighted { fill: #ffdf80; } /* -- code displays ------------------------------------------------- */ pre, code { font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 0.9em; } pre { margin: 0; padding: 0; line-height: 1.3; } div.literal-block-wrapper { padding: 10px 0 0; } div.code-block-caption { padding: 0; } div.highlight, div.literal-block-wrapper div.highlight { margin: 10px -10px; padding: 10px; } code { color: #222; background: #e8eff0; } /* -- tables -------------------------------------------------------- */ table.docutils { border: 1px solid #888; box-shadow: 2px 2px 4px #eee; } table.docutils td, table.docutils th { border: 1px solid #888; padding: 0.25em 0.7em; } table.field-list, table.footnote { border: none; box-shadow: none; } table.footnote { margin: 15px 0; width: 100%; border: 1px solid #eee; background-color: #fafafa; font-size: 0.9em; } table.footnote + table.footnote { margin-top: -15px; border-top: none; } table.field-list th { padding: 0 0.8em 0 0; } table.field-list td { padding: 0; } table.footnote td.label { width: 0; padding: 0.3em 0 0.3em 0.5em; } table.footnote td { padding: 0.3em 0.5em; } /* -- responsive screen --------------------------------------------- */ @media screen and (max-width: 1139px) { p.version-warning { margin: 10px; } div.footer { margin: 20px 10px; } } /* -- small screen -------------------------------------------------- */ @media screen and (max-width: 767px) { body { padding: 0 20px; } div.related { display: block; } p.version-warning { margin: 10px 0; } div.documentwrapper { float: none; } div.bodywrapper { margin: 0; } div.body { min-height: 0; padding: 0; } div.sphinxsidebar { float: none; width: 100%; margin: 0 -20px -10px; padding: 0 20px; background-color: #333; color: #ccc; } div.sphinxsidebar a, div.sphinxsidebar a code, div.sphinxsidebar h3, div.sphinxsidebar h4, div.footer a { color: #ccc; border-color: #ccc; } div.sphinxsidebar p.logo { display: none; } div.footer { text-align: left; margin: 0 -20px; padding: 20px; background-color: #333; color: #ccc; } } /* https://github.com/twbs/bootstrap/blob /0e8831505ac845f3102fa2c5996a7141c9ab01ee /scss/mixins/_screen-reader.scss */ .hide-header > h1:first-child { position: absolute; width: 1px; height: 1px; padding: 0; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; } /* -- sphinx-tabs -------------------------------------------------- */ .sphinx-tabs { margin-bottom: 0; } .sphinx-tabs .ui.menu { font-family: 'Garamond', 'Georgia', serif !important; } .sphinx-tabs .ui.attached.menu { border-bottom: none } .sphinx-tabs .ui.tabular.menu .item { border-bottom: 2px solid transparent; border-left: none; border-right: none; border-top: none; padding: .3em 0.6em; } .sphinx-tabs .ui.attached.segment, .ui.segment { border: 0; padding: 0; } python-pallets-sphinx-themes-2.3.0/src/pallets_sphinx_themes/themes/pocoo/theme.conf000066400000000000000000000002651470651307700310540ustar00rootroot00000000000000[theme] inherit = basic stylesheet = pocoo.css pygments_style = pocoo sidebars = localtoc.html, relations.html, searchbox.html, ethicalads.html [options] index_sidebar_logo = True python-pallets-sphinx-themes-2.3.0/src/pallets_sphinx_themes/themes/werkzeug/000077500000000000000000000000001470651307700276245ustar00rootroot00000000000000python-pallets-sphinx-themes-2.3.0/src/pallets_sphinx_themes/themes/werkzeug/static/000077500000000000000000000000001470651307700311135ustar00rootroot00000000000000python-pallets-sphinx-themes-2.3.0/src/pallets_sphinx_themes/themes/werkzeug/static/werkzeug.css000066400000000000000000000003551470651307700334730ustar00rootroot00000000000000@import url("pocoo.css"); a, a.reference, a.footnote-reference { color: #185f6d; text-decoration-color: #185f6d; } a:hover { color: #2794aa; text-decoration-color: #2794aa; } p.version-warning { background-color: #ff8c08; } python-pallets-sphinx-themes-2.3.0/src/pallets_sphinx_themes/themes/werkzeug/theme.conf000066400000000000000000000000621470651307700315730ustar00rootroot00000000000000[theme] inherit = pocoo stylesheet = werkzeug.css python-pallets-sphinx-themes-2.3.0/tox.ini000066400000000000000000000012401470651307700206130ustar00rootroot00000000000000[tox] envlist = style [testenv] package = wheel wheel_build_env = .pkg constrain_package_deps = true use_frozen_constraints = true [testenv:style] deps = pre-commit skip_install = true commands = pre-commit run --all-files [testenv:update-actions] labels = update deps = gha-update commands = gha-update [testenv:update-pre_commit] labels = update deps = pre-commit skip_install = true commands = pre-commit autoupdate -j4 [testenv:update-requirements] labels = update deps = pip-tools skip_install = true change_dir = requirements commands = pip-compile build.in -q {posargs:-U} pip-compile docs.in -q {posargs:-U} pip-compile dev.in -q {posargs:-U}