diff --git a/.copier-answers.yml b/.copier-answers.yml deleted file mode 100644 index 76531124..00000000 --- a/.copier-answers.yml +++ /dev/null @@ -1,23 +0,0 @@ -# Changes here will be overwritten by Copier. -_commit: 1.4.5 -_src_path: gh:mkdocstrings/handler-template -author_email: dev@pawamoy.fr -author_fullname: Timothée Mazzucotelli -author_username: pawamoy -copyright_date: '2021' -copyright_holder: Timothée Mazzucotelli -copyright_holder_email: dev@pawamoy.fr -copyright_license: ISC -insiders: true -insiders_email: insiders@pawamoy.fr -insiders_repository_name: mkdocstrings-python -language: Python -project_description: A Python handler for mkdocstrings. -project_name: mkdocstrings-python -public_release: true -python_package_distribution_name: mkdocstrings-python -python_package_import_name: python -repository_name: python -repository_namespace: mkdocstrings -repository_provider: github.com - diff --git a/.envrc b/.envrc deleted file mode 100644 index f9d77ee3..00000000 --- a/.envrc +++ /dev/null @@ -1 +0,0 @@ -PATH_add scripts diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index 812789e6..00000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1,2 +0,0 @@ -github: pawamoy -polar: pawamoy diff --git a/.github/ISSUE_TEMPLATE/1-bug.md b/.github/ISSUE_TEMPLATE/1-bug.md deleted file mode 100644 index a0e35e01..00000000 --- a/.github/ISSUE_TEMPLATE/1-bug.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -name: Bug report -about: Create a bug report to help us improve. -title: "bug: " -labels: unconfirmed -assignees: [pawamoy] ---- - -### Description of the bug - - -### To Reproduce - - -``` -WRITE MRE / INSTRUCTIONS HERE -``` - -### Full traceback - - -
Full traceback - -```python -PASTE TRACEBACK HERE -``` - -
- -### Expected behavior - - -### Environment information - - -```bash -python -m mkdocstrings_handlers.python._internal.debug # | xclip -selection clipboard -``` - -PASTE MARKDOWN OUTPUT HERE - -### Additional context - diff --git a/.github/ISSUE_TEMPLATE/2-feature.md b/.github/ISSUE_TEMPLATE/2-feature.md deleted file mode 100644 index 2df98fbc..00000000 --- a/.github/ISSUE_TEMPLATE/2-feature.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project. -title: "feature: " -labels: feature -assignees: pawamoy ---- - -### Is your feature request related to a problem? Please describe. - - -### Describe the solution you'd like - - -### Describe alternatives you've considered - - -### Additional context - diff --git a/.github/ISSUE_TEMPLATE/3-docs.md b/.github/ISSUE_TEMPLATE/3-docs.md deleted file mode 100644 index 92ac8ec5..00000000 --- a/.github/ISSUE_TEMPLATE/3-docs.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -name: Documentation update -about: Point at unclear, missing or outdated documentation. -title: "docs: " -labels: docs -assignees: pawamoy ---- - -### Is something unclear, missing or outdated in our documentation? - - -### Relevant code snippets - - -### Link to the relevant documentation section - diff --git a/.github/ISSUE_TEMPLATE/4-change.md b/.github/ISSUE_TEMPLATE/4-change.md deleted file mode 100644 index dc9a8f17..00000000 --- a/.github/ISSUE_TEMPLATE/4-change.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -name: Change request -about: Suggest any other kind of change for this project. -title: "change: " -assignees: pawamoy ---- - -### Is your change request related to a problem? Please describe. - - -### Describe the solution you'd like - - -### Describe alternatives you've considered - - -### Additional context - diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml deleted file mode 100644 index 9c9765bc..00000000 --- a/.github/ISSUE_TEMPLATE/config.yml +++ /dev/null @@ -1,5 +0,0 @@ -blank_issues_enabled: false -contact_links: -- name: I have a question / I need help - url: https://github.com/mkdocstrings/python/discussions/new?category=q-a - about: Ask and answer questions in the Discussions tab. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 32767fde..00000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,146 +0,0 @@ -name: ci - -on: - push: - pull_request: - branches: - - main - -defaults: - run: - shell: bash - -env: - LANG: en_US.utf-8 - LC_ALL: en_US.utf-8 - PYTHONIOENCODING: UTF-8 - PYTHON_VERSIONS: "" - -jobs: - - quality: - - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - fetch-tags: true - - - name: Setup Python - uses: actions/setup-python@v5 - with: - python-version: "3.12" - - - name: Setup uv - uses: astral-sh/setup-uv@v5 - with: - enable-cache: true - cache-dependency-glob: pyproject.toml - - - name: Install dependencies - run: make setup - - - name: Check if the documentation builds correctly - run: make check-docs - - - name: Check the code quality - run: make check-quality - - - name: Check if the code is correctly typed - run: make check-types - - - name: Check for breaking changes in the API - run: make check-api - - - name: Store objects inventory for tests - uses: actions/upload-artifact@v4 - with: - name: objects.inv - path: site/objects.inv - - exclude-test-jobs: - runs-on: ubuntu-latest - outputs: - jobs: ${{ steps.exclude-jobs.outputs.jobs }} - steps: - - id: exclude-jobs - run: | - if ${{ github.repository_owner == 'pawamoy-insiders' }}; then - echo 'jobs=[ - {"os": "macos-latest"}, - {"os": "windows-latest"}, - {"python-version": "3.10"}, - {"python-version": "3.11"}, - {"python-version": "3.12"}, - {"python-version": "3.13"}, - {"python-version": "3.14"} - ]' | tr -d '[:space:]' >> $GITHUB_OUTPUT - else - echo 'jobs=[ - {"os": "macos-latest", "resolution": "lowest-direct"}, - {"os": "windows-latest", "resolution": "lowest-direct"} - ]' | tr -d '[:space:]' >> $GITHUB_OUTPUT - fi - - tests: - - needs: - - quality - - exclude-test-jobs - strategy: - max-parallel: 4 - matrix: - os: - - ubuntu-latest - - macos-latest - - windows-latest - python-version: - - "3.9" - - "3.10" - - "3.11" - - "3.12" - - "3.13" - - "3.14" - resolution: - - highest - - lowest-direct - exclude: ${{ fromJSON(needs.exclude-test-jobs.outputs.jobs) }} - runs-on: ${{ matrix.os }} - continue-on-error: ${{ matrix.python-version == '3.14' }} - - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - fetch-tags: true - - - name: Setup Python - uses: actions/setup-python@v5 - with: - python-version: ${{ matrix.python-version }} - allow-prereleases: true - - - name: Setup uv - uses: astral-sh/setup-uv@v5 - with: - enable-cache: true - cache-dependency-glob: pyproject.toml - cache-suffix: ${{ matrix.resolution }} - - - name: Install dependencies - env: - UV_RESOLUTION: ${{ matrix.resolution }} - run: make setup - - - name: Download objects inventory - uses: actions/download-artifact@v4 - with: - name: objects.inv - path: site/ - - - name: Run the test suite - run: make test diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index 3ef68f27..00000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,44 +0,0 @@ -name: release - -on: push -permissions: - contents: write - -jobs: - release: - runs-on: ubuntu-latest - if: startsWith(github.ref, 'refs/tags/') - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - fetch-tags: true - - name: Setup Python - uses: actions/setup-python@v5 - with: - python-version: "3.12" - - name: Setup uv - uses: astral-sh/setup-uv@v5 - - name: Build dists - if: github.repository_owner == 'pawamoy-insiders' - run: uv tool run --from build pyproject-build - - name: Upload dists artifact - uses: actions/upload-artifact@v4 - if: github.repository_owner == 'pawamoy-insiders' - with: - name: python-insiders - path: ./dist/* - - name: Prepare release notes - if: github.repository_owner != 'pawamoy-insiders' - run: uv tool run git-changelog --release-notes > release-notes.md - - name: Create release with assets - uses: softprops/action-gh-release@v2 - if: github.repository_owner == 'pawamoy-insiders' - with: - files: ./dist/* - - name: Create release - uses: softprops/action-gh-release@v2 - if: github.repository_owner != 'pawamoy-insiders' - with: - body_path: release-notes.md diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 9fea0472..00000000 --- a/.gitignore +++ /dev/null @@ -1,25 +0,0 @@ -# editors -.idea/ -.vscode/ - -# python -*.egg-info/ -*.py[cod] -.venv/ -.venvs/ -/build/ -/dist/ - -# tools -.coverage* -/.pdm-build/ -/htmlcov/ -/site/ -uv.lock - -# cache -.cache/ -.pytest_cache/ -.mypy_cache/ -.ruff_cache/ -__pycache__/ diff --git a/src/mkdocstrings_handlers/python/_internal/__init__.py b/.nojekyll similarity index 100% rename from src/mkdocstrings_handlers/python/_internal/__init__.py rename to .nojekyll diff --git a/404.html b/404.html new file mode 100644 index 00000000..1757f395 --- /dev/null +++ b/404.html @@ -0,0 +1 @@ + mkdocstrings-python

404 - Not found

\ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index b01d34c8..00000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,971 +0,0 @@ -# Changelog -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) -and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). - - -## [1.16.11](https://github.com/mkdocstrings/python/releases/tag/1.16.11) - 2025-05-24 - -[Compare with 1.16.10](https://github.com/mkdocstrings/python/compare/1.16.10...1.16.11) - -### Bug Fixes - -- Fix highlighting for signature with known special names like `__init__` ([7f95686](https://github.com/mkdocstrings/python/commit/7f956868f93a766346455fedb296c26787894d5c) by Timothée Mazzucotelli). [Issue-mkdocstrings-757](https://github.com/mkdocstrings/mkdocstrings/issues/757) -- Use default font-size for parameter headings ([0a35b20](https://github.com/mkdocstrings/python/commit/0a35b20a6050a28ba8492d93e5f9940a69462ce3) by Timothée Mazzucotelli). [Issue-mkdocstrings-697](https://github.com/mkdocstrings/mkdocstrings/issues/697) -- Prevent uppercasing H5 titles (by Material for MkDocs) ([ba66969](https://github.com/mkdocstrings/python/commit/ba669697daad5067ea5db3fdf8a2d5ba2f966b25) by Timothée Mazzucotelli). [Issue-mkdocstrings-697](https://github.com/mkdocstrings/mkdocstrings/issues/697), [Issue-276](https://github.com/mkdocstrings/python/issues/276) -- Use configured heading even when signature is not separated ([096960a](https://github.com/mkdocstrings/python/commit/096960abd79831d6fd45e2a7962dfd2bd49e4edd) by Timothée Mazzucotelli). [Issue-mkdocstrings-767](https://github.com/mkdocstrings/mkdocstrings/issues/767), [PR-278](https://github.com/mkdocstrings/python/pull/278) -- Render attribute names without full path in ToC ([d4e618a](https://github.com/mkdocstrings/python/commit/d4e618ab794747b84dced848b1be824639fea2b8) by David Lee). [Issue-271](https://github.com/mkdocstrings/python/issues/271), [PR-272](https://github.com/mkdocstrings/python/pull/272) - -## [1.16.10](https://github.com/mkdocstrings/python/releases/tag/1.16.10) - 2025-04-03 - -[Compare with 1.16.9](https://github.com/mkdocstrings/python/compare/1.16.9...1.16.10) - -### Bug Fixes - -- Fix inventory `base_url` being ignored ([8870eb9](https://github.com/mkdocstrings/python/commit/8870eb9af837666f59f96149c67c849e02f7ee25) by Stefan Mejlgaard). [Issue-268](https://github.com/mkdocstrings/python/issues/268), [PR-269](https://github.com/mkdocstrings/python/pull/269) - -## [1.16.9](https://github.com/mkdocstrings/python/releases/tag/1.16.9) - 2025-04-03 - -[Compare with 1.16.8](https://github.com/mkdocstrings/python/compare/1.16.8...1.16.9) - -### Bug Fixes - -- Use `toc_label` option in a few missing places ([337b46b](https://github.com/mkdocstrings/python/commit/337b46be912ff69e70b398bb252c8217c917db0a) by Timothée Mazzucotelli). [Issue-267](https://github.com/mkdocstrings/python/discussions/267) - -## [1.16.8](https://github.com/mkdocstrings/python/releases/tag/1.16.8) - 2025-03-24 - -[Compare with 1.16.7](https://github.com/mkdocstrings/python/compare/1.16.7...1.16.8) - -### Bug Fixes - -- Prevent infinite recursion by detecting parent-member cycles ([f3917e9](https://github.com/mkdocstrings/python/commit/f3917e9dd50ca7f94d0dd22b6e4e11885b4617e7) by Timothée Mazzucotelli). [Issue-griffe-368](https://github.com/mkdocstrings/griffe/issues/368) - -### Code Refactoring - -- Prepare feature for ordering by `__all__` value ([bfb5b30](https://github.com/mkdocstrings/python/commit/bfb5b303f4ea2187c15bccc688f7eba25e7edfcc) by Timothée Mazzucotelli). [Issue-219](https://github.com/mkdocstrings/python/issues/219) -- Sort objects without line numbers last instead of first ([681afb1](https://github.com/mkdocstrings/python/commit/681afb146225d98350a8eb2178aab07aec95fe6b) by Timothée Mazzucotelli). - -## [1.16.7](https://github.com/mkdocstrings/python/releases/tag/1.16.7) - 2025-03-20 - -[Compare with 1.16.6](https://github.com/mkdocstrings/python/compare/1.16.6...1.16.7) - -### Code Refactoring - -- Prepare `public` filtering method feature ([fde2019](https://github.com/mkdocstrings/python/commit/fde20191cab20f39d9e5e729a95cdfa3390b8f1f) by Timothée Mazzucotelli). [Issue-78](https://github.com/mkdocstrings/python/issues/78) - -## [1.16.6](https://github.com/mkdocstrings/python/releases/tag/1.16.6) - 2025-03-18 - -[Compare with 1.16.5](https://github.com/mkdocstrings/python/compare/1.16.5...1.16.6) - -### Deprecations - -Importing from submodules is now deprecated: the public API is fully exposed under the top-level `mkdocstrings_handler.python` module. - -### Bug Fixes - -- Add back default compiled filters (regression) ([2d83900](https://github.com/mkdocstrings/python/commit/2d83900c9e258399c90ecbac350ad03ff5d8f311) by Timothée Mazzucotelli). [Issue-264](https://github.com/mkdocstrings/python/issues/264) - -### Code Refactoring - -- Start logging warnings instead of info messages about deprecated use of templates ([7606f33](https://github.com/mkdocstrings/python/commit/7606f33559ced6962ecf9a1bc9aa76f24d87f515) by Timothée Mazzucotelli). -- Move modules into internal folder, expose API in top-level module ([93a68d0](https://github.com/mkdocstrings/python/commit/93a68d0d7afce38c78a8264189cfa812d737666c) by Timothée Mazzucotelli). - -## [1.16.5](https://github.com/mkdocstrings/python/releases/tag/1.16.5) - 2025-03-10 - -[Compare with 1.16.4](https://github.com/mkdocstrings/python/compare/1.16.4...1.16.5) - -### Code Refactoring - -- Prepare backlinks support ([56bf627](https://github.com/mkdocstrings/python/commit/56bf627b9483a12228b769ae4690b84733061ea5) by Timothée Mazzucotelli). [Issue-153](https://github.com/mkdocstrings/python/issues/153), [PR-252](https://github.com/mkdocstrings/python/pull/252) - -## [1.16.4](https://github.com/mkdocstrings/python/releases/tag/1.16.4) - 2025-03-10 - -[Compare with 1.16.3](https://github.com/mkdocstrings/python/compare/1.16.3...1.16.4) - -### Bug Fixes - -- Fix de-duplication of summary sections ([dc46ac9](https://github.com/mkdocstrings/python/commit/dc46ac9b4cfc642decd153dceb62e9f45c5c750e) by Timothée Mazzucotelli). - -## [1.16.3](https://github.com/mkdocstrings/python/releases/tag/1.16.3) - 2025-03-08 - -[Compare with 1.16.2](https://github.com/mkdocstrings/python/compare/1.16.2...1.16.3) - -### Build - -- Depend on mkdocstrings 0.28.3 ([9fa4f16](https://github.com/mkdocstrings/python/commit/9fa4f1636af240bb695661b7172f052cb11e0ec9) by Timothée Mazzucotelli). - -### Bug Fixes - -- De-duplicate summary sections ([a657d07](https://github.com/mkdocstrings/python/commit/a657d07499eb82d22337c169aa86b1cdd85543fa) by Timothée Mazzucotelli). [Issue-134](https://github.com/mkdocstrings/python/issues/134) - -### Code Refactoring - -- Import from top-level `mkdocstrings` module ([da2ba13](https://github.com/mkdocstrings/python/commit/da2ba13b1367ce107416d08f382fb9f2384c015c) by Timothée Mazzucotelli). - -## [1.16.2](https://github.com/mkdocstrings/python/releases/tag/1.16.2) - 2025-02-24 - -[Compare with 1.16.1](https://github.com/mkdocstrings/python/compare/1.16.1...1.16.2) - -### Build - -- Depend on mkdocs-autorefs >= 1.4 and mkdocstrings >= 0.28.2 ([ea1ab49](https://github.com/mkdocstrings/python/commit/ea1ab498be836c94eb695ace05c41357b12f2c95) by Timothée Mazzucotelli). - -## [1.16.1](https://github.com/mkdocstrings/python/releases/tag/1.16.1) - 2025-02-18 - -[Compare with 1.16.0](https://github.com/mkdocstrings/python/compare/1.16.0...1.16.1) - -### Bug Fixes - -- Give precedence to user-provided paths when they are already listed in `sys.path` ([0f497d1](https://github.com/mkdocstrings/python/commit/0f497d185ba1860c61555803bfc4b311a410bd39) by Timothée Mazzucotelli). [Issue-248](https://github.com/mkdocstrings/python/discussions/248) - -## [1.16.0](https://github.com/mkdocstrings/python/releases/tag/1.16.0) - 2025-02-17 - -[Compare with 1.15.1](https://github.com/mkdocstrings/python/compare/1.15.1...1.16.0) - -### Features - -- Add option to show/hide overloads ([4a5ee10](https://github.com/mkdocstrings/python/commit/4a5ee10c65de28b7921a56ef2c222d2f3417edaa) by Pete Stenger). [PR-250](https://github.com/mkdocstrings/python/pull/250) - -## [1.15.1](https://github.com/mkdocstrings/python/releases/tag/1.15.1) - 2025-02-17 - -[Compare with 1.15.0](https://github.com/mkdocstrings/python/compare/1.15.0...1.15.1) - -### Bug Fixes - -- Unwrap `Annotated` regardless of `signature_crossrefs` ([d809f1a](https://github.com/mkdocstrings/python/commit/d809f1a9e6a6f4eaf6fe4a18c2ec0e69e5716a12) by Timothée Mazzucotelli). [Issue-249](https://github.com/mkdocstrings/python/issues/249) - -## [1.15.0](https://github.com/mkdocstrings/python/releases/tag/1.15.0) - 2025-02-11 - -[Compare with 1.14.6](https://github.com/mkdocstrings/python/compare/1.14.6...1.15.0) - -### Features - -- Support cross-referencing constructor parameters in instance attribute values ([f07bf58](https://github.com/mkdocstrings/python/commit/f07bf58a7358dea106032c7da27098e7617eefa0) by Timothée Mazzucotelli). - -## [1.14.6](https://github.com/mkdocstrings/python/releases/tag/1.14.6) - 2025-02-07 - -[Compare with 1.14.5](https://github.com/mkdocstrings/python/compare/1.14.5...1.14.6) - -### Bug Fixes - -- Catch alias resolution errors when getting aliases for an identifier ([0aaa260](https://github.com/mkdocstrings/python/commit/0aaa260139afe2e3ab85d62224c90a389df64978) by Timothée Mazzucotelli). [Issue-358](https://github.com/mkdocstrings/griffe/discussions/358) - -### Code Refactoring - -- Improve translations for Simplified Chinese and Japanese ([753a0df](https://github.com/mkdocstrings/python/commit/753a0df8f91f1cf42fb7e56b7fdd312b2bd652ab) by Zhikang Yan). [PR-244](https://github.com/mkdocstrings/python/pull/244) - -## [1.14.5](https://github.com/mkdocstrings/python/releases/tag/1.14.5) - 2025-02-05 - -[Compare with 1.14.4](https://github.com/mkdocstrings/python/compare/1.14.4...1.14.5) - -### Bug Fixes - -- Remove type from property docstring summary in summary sections ([15f2cd4](https://github.com/mkdocstrings/python/commit/15f2cd48b79a1f062086a47ea0c6bc52d89786d8) by Uchechukwu Orji). [PR-242](https://github.com/mkdocstrings/python/pull/242) - -## [1.14.4](https://github.com/mkdocstrings/python/releases/tag/1.14.4) - 2025-02-04 - -[Compare with 1.14.3](https://github.com/mkdocstrings/python/compare/1.14.3...1.14.4) - -### Bug Fixes - -- Deactivate Pydantic validation on Python 3.9 is `eval-type-backport` is not available (for modern typing syntax support) ([0de0e5e](https://github.com/mkdocstrings/python/commit/0de0e5e57f8f22e039b0d19aad6341ce7ab3da9f) by Timothée Mazzucotelli). [Issue-241](https://github.com/mkdocstrings/python/issues/241) - -## [1.14.3](https://github.com/mkdocstrings/python/releases/tag/1.14.3) - 2025-02-04 - -[Compare with 1.14.2](https://github.com/mkdocstrings/python/compare/1.14.2...1.14.3) - -### Bug Fixes - -- Let dataclass implement `__init__` method, set extra fields in `get_options` ([477b9e4](https://github.com/mkdocstrings/python/commit/477b9e447ef9717c6edcb14bd4c53f9cacc555b8) by Timothée Mazzucotelli). - -## [1.14.2](https://github.com/mkdocstrings/python/releases/tag/1.14.2) - 2025-02-03 - -[Compare with 1.14.1](https://github.com/mkdocstrings/python/compare/1.14.1...1.14.2) - -### Bug Fixes - -- Deactivate Pydantic logic if v1 is installed instead of v2 ([c5ecd70](https://github.com/mkdocstrings/python/commit/c5ecd702b04417fa3d862806d608ea627b2e8ed9) by Timothée Mazzucotelli). [Issue-240](https://github.com/mkdocstrings/python/issues/240) - -## [1.14.1](https://github.com/mkdocstrings/python/releases/tag/1.14.1) - 2025-02-03 - -[Compare with 1.14.0](https://github.com/mkdocstrings/python/compare/1.14.0...1.14.1) - -### Bug Fixes - -- Fix type errors with options during collection and docstring parsing ([15ca6d8](https://github.com/mkdocstrings/python/commit/15ca6d8cbe8187ae2938b3cc3a6134d10c94a3aa) by Timothée Mazzucotelli). - -## [1.14.0](https://github.com/mkdocstrings/python/releases/tag/1.14.0) - 2025-02-03 - -[Compare with 1.13.0](https://github.com/mkdocstrings/python/compare/1.13.0...1.14.0) - -### Features - -- Add `heading` and `toc_label` options ([7cabacf](https://github.com/mkdocstrings/python/commit/7cabacf13735dbc5066793baf5820d61cd342dc8) by Yann Van Crombrugge). [Issue-mkdocstrings-725](https://github.com/mkdocstrings/mkdocstrings/issues/725), [PR-236](https://github.com/mkdocstrings/python/pull/236) -- Add `force_inspection` option to force dynamic analysis ([83823be](https://github.com/mkdocstrings/python/commit/83823be2146d6a2ecedc5fe9c0cfd84098d780ca) by Uchechukwu Orji). [Issue-94](https://github.com/mkdocstrings/python/issues/94), [PR-231](https://github.com/mkdocstrings/python/pull/231) - -### Code Refactoring - -- Use dataclasses for configuration/options and automate schema generation ([5ebeda6](https://github.com/mkdocstrings/python/commit/5ebeda6fce1b1bc7cb3f5e27a5a90ac394a3de0c) by Timothée Mazzucotelli). - -## [1.13.0](https://github.com/mkdocstrings/python/releases/tag/1.13.0) - 2024-12-26 - -[Compare with 1.12.2](https://github.com/mkdocstrings/python/compare/1.12.2...1.13.0) - -### Features - -- Allow using Ruff to format signatures and attribute values ([d67215c](https://github.com/mkdocstrings/python/commit/d67215c976938ef1e169f16dd0b6166067ebd7bc) by dm). [PR-216](https://github.com/mkdocstrings/python/pull/216) - -### Bug Fixes - -- Respect `show_signature_annotations` option for attribute signatures in headings ([e93d166](https://github.com/mkdocstrings/python/commit/e93d166a14d0944d30ff2f28f21f2262ac396bff) by Timothée Mazzucotelli). [Issue-griffe-pydantic#9](https://github.com/mkdocstrings/griffe-pydantic/issues/9) -- Handle `__init__` overloads when merging into class ([af6fab3](https://github.com/mkdocstrings/python/commit/af6fab31142204872ace716392dcb314b2cb5d0f) by Timothée Mazzucotelli). [Issue-212](https://github.com/mkdocstrings/python/issues/212) -- Actually check if a module is public when rendering auto-generated summary table for modules ([3bf55b2](https://github.com/mkdocstrings/python/commit/3bf55b22ce9a841242c55b2efcedbd8f3a99ccc9) by Timothée Mazzucotelli). [Issue-203](https://github.com/mkdocstrings/python/issues/203) -- Never render line numbers for signatures and attribute values ([a669f1c](https://github.com/mkdocstrings/python/commit/a669f1caefbd54305cc4610bdd57a529aa1208cf) by Timothée Mazzucotelli). [Issue-192](https://github.com/mkdocstrings/python/issues/192) -- Respect highlight's `linenums` config for `pycon` examples in docstrings ([53eb82a](https://github.com/mkdocstrings/python/commit/53eb82a21bbcaa959306e909bf0d4ac468f87580) by Timothée Mazzucotelli). [Related-to-#192](https://github.com/mkdocstrings/python/issues/192) -- Fix normalization of extension paths on the annoying operating system and Python 3.13 ([101a6dc](https://github.com/mkdocstrings/python/commit/101a6dc428da59a512da617a0a2453f2b6ef4387) by Timothée Mazzucotelli). -- Don't merge parent `__init__` docstring into class docstring if such inherited method wasn't selected through the `inherited_members` configuration option ([6c5b5c3](https://github.com/mkdocstrings/python/commit/6c5b5c341940af9425b3de0672ac400794b3f6e5) by Timothée Mazzucotelli). [Issue-189](https://github.com/mkdocstrings/python/issues/189) - -### Code Refactoring - -- Render `*` and `**` outside of cross-references in signatures ([c4506f0](https://github.com/mkdocstrings/python/commit/c4506f080e0c75cd32d6512c80f5016e82fc12bc) by Timothée Mazzucotelli). [Needed-for-PR-216](https://github.com/mkdocstrings/python/pull/216) - -## [1.12.2](https://github.com/mkdocstrings/python/releases/tag/1.12.2) - 2024-10-19 - -[Compare with 1.12.1](https://github.com/mkdocstrings/python/compare/1.12.1...1.12.2) - -### Bug Fixes - -- Always render cross-references outside of signatures ([73f11dc](https://github.com/mkdocstrings/python/commit/73f11dcc584a672af7e17738cba08a50f119176a) by Timothée Mazzucotelli). [Issue-mkdocstrings#700](https://github.com/mkdocstrings/mkdocstrings/issues/700) - -## [1.12.1](https://github.com/mkdocstrings/python/releases/tag/1.12.1) - 2024-10-14 - -[Compare with 1.12.0](https://github.com/mkdocstrings/python/compare/1.12.0...1.12.1) - -### Bug Fixes - -- Don't escape parameter default values ([9dee4d4](https://github.com/mkdocstrings/python/commit/9dee4d4f8e1258e99c19dc7b2b18d3e9090de79b) by Timothée Mazzucotelli). [Issue-191](https://github.com/mkdocstrings/python/issues/191) - -## [1.12.0](https://github.com/mkdocstrings/python/releases/tag/1.12.0) - 2024-10-12 - -[Compare with 1.11.1](https://github.com/mkdocstrings/python/compare/1.11.1...1.12.0) - -### Build - -- Drop support for Python 3.8 ([6615c91](https://github.com/mkdocstrings/python/commit/6615c91cdc035bc0c2fdd12f3952ff84f5e1c04e) by Timothée Mazzucotelli). - -### Features - -- Auto-summary of members ([7f9757d](https://github.com/mkdocstrings/python/commit/7f9757d1584555edebc56f1aefe6cc8242e6c8bb) by Timothée Mazzucotelli). -- Render function overloads ([0f2c25c](https://github.com/mkdocstrings/python/commit/0f2c25c9ed7f6c5c93ff13df214f02edfd3a4cb1) by Timothée Mazzucotelli). -- Parameter headings, more automatic cross-references ([0176b83](https://github.com/mkdocstrings/python/commit/0176b83f21ae02d345489c93cca3baf51f8bc58c) by Timothée Mazzucotelli). - -### Code Refactoring - -- Declare default CSS symbol colors under :host as well ([3b9dba2](https://github.com/mkdocstrings/python/commit/3b9dba2709a8668e379c6ce1536cb1714971b3f4) by James McDonnell). [PR-186](https://github.com/mkdocstrings/python/pull/186) - -## [1.11.1](https://github.com/mkdocstrings/python/releases/tag/1.11.1) - 2024-09-03 - -[Compare with 1.11.0](https://github.com/mkdocstrings/python/compare/1.11.0...1.11.1) - -### Code Refactoring - -- Prepare `relative_crossrefs` and `scoped_crossrefs` insiders features ([dd8b014](https://github.com/mkdocstrings/python/commit/dd8b014a8ab3decc31d4b08bc22fe68577e1a02c) by Timothée Mazzucotelli). - -## [1.11.0](https://github.com/mkdocstrings/python/releases/tag/1.11.0) - 2024-09-03 - -[Compare with 1.10.9](https://github.com/mkdocstrings/python/compare/1.10.9...1.11.0) - -### Features - -- Hook into autorefs to provide context around cross-ref errors ([bb4be5b](https://github.com/mkdocstrings/python/commit/bb4be5be1b85be50f46c7889231a2d4a3bd05165) by Timothée Mazzucotelli). - -## [1.10.9](https://github.com/mkdocstrings/python/releases/tag/1.10.9) - 2024-08-30 - -[Compare with 1.10.8](https://github.com/mkdocstrings/python/compare/1.10.8...1.10.9) - -### Build - -- Explicitly depend on mkdocs-autorefs to be able to specify lower bound ([2299ab5](https://github.com/mkdocstrings/python/commit/2299ab55641585d65babe0e116a6465b4736dcd9) by Timothée Mazzucotelli). - -### Code Refactoring - -- Use new autorefs syntax ([68cb72f](https://github.com/mkdocstrings/python/commit/68cb72f62253f54146ece621345b36c90d712913) by Timothée Mazzucotelli). - -## [1.10.8](https://github.com/mkdocstrings/python/releases/tag/1.10.8) - 2024-08-14 - -[Compare with 1.10.7](https://github.com/mkdocstrings/python/compare/1.10.7...1.10.8) - -### Build - -- Depend on Griffe 0.49 ([a87dcad](https://github.com/mkdocstrings/python/commit/a87dcad36065dc3171512e166ec632ee3e5b0a64) by Timothée Mazzucotelli). - -## [1.10.7](https://github.com/mkdocstrings/python/releases/tag/1.10.7) - 2024-07-25 - -[Compare with 1.10.6](https://github.com/mkdocstrings/python/compare/1.10.6...1.10.7) - -### Packaging - -- Include tests and all relevant files for downstream packaging in source distribution - -## [1.10.6](https://github.com/mkdocstrings/python/releases/tag/1.10.6) - 2024-07-25 - -[Compare with 1.10.5](https://github.com/mkdocstrings/python/compare/1.10.5...1.10.6) - -### Bug Fixes - -- Fix condition to display members (check all members, not just non-inherited ones) ([3d838a9](https://github.com/mkdocstrings/python/commit/3d838a96f77fa128cd6f2afa5ed0cb151ab225fd) by Timothée Mazzucotelli). - -### Code Refactoring - -- Update code for Griffe 0.48 (removing deprecation warnings) ([eff10cc](https://github.com/mkdocstrings/python/commit/eff10ccf0fa1b2e73df912048a15c2d6406a2c8b) by Timothée Mazzucotelli). [Issue-173](https://github.com/mkdocstrings/python/issues/173) - -## [1.10.5](https://github.com/mkdocstrings/python/releases/tag/1.10.5) - 2024-06-19 - -[Compare with 1.10.4](https://github.com/mkdocstrings/python/compare/1.10.4...1.10.5) - -### Bug Fixes - -- Mix both previous checks for displaying objects: not imported or public ([587963b](https://github.com/mkdocstrings/python/commit/587963ba53f765c9d7eefbc2fb80bdbb11164850) by Timothée Mazzucotelli). [Issue-294](https://github.com/mkdocstrings/griffe/issues/294) - -## [1.10.4](https://github.com/mkdocstrings/python/releases/tag/1.10.4) - 2024-06-18 - -[Compare with 1.10.3](https://github.com/mkdocstrings/python/compare/1.10.3...1.10.4) - -### Code Refactoring - -- Only filter out imported objects instead of non-public ones after applying filters ([e2f4b35](https://github.com/mkdocstrings/python/commit/e2f4b35d29eca6f68afbd2e728ef7542a2abc992) by Timothée Mazzucotelli). [Issue-mkdocstrings/griffe-294](https://github.com/mkdocstrings/griffe/issues/294) -- Update code for Griffe 0.46 to avoid deprecation warnings ([321b407](https://github.com/mkdocstrings/python/commit/321b407eb95195c44f3cf34d780784e0d6751998) by Timothée Mazzucotelli). -- Change `load_external_modules` default value to `None` to support new default mode in Griffe ([ae5896c](https://github.com/mkdocstrings/python/commit/ae5896c1604e9089162d0d63ec97a510a6bcef89) by Timothée Mazzucotelli). - -## [1.10.3](https://github.com/mkdocstrings/python/releases/tag/1.10.3) - 2024-05-22 - -[Compare with 1.10.2](https://github.com/mkdocstrings/python/compare/1.10.2...1.10.3) - -### Bug Fixes - -- Don't crash when rendering the source of an object whose lineno is none ([64df00b](https://github.com/mkdocstrings/python/commit/64df00b9b757e9642d65cf425d32f5a2e0d75f38) by Timothée Mazzucotelli). [Issue-163](https://github.com/mkdocstrings/python/issues/163) - -## [1.10.2](https://github.com/mkdocstrings/python/releases/tag/1.10.2) - 2024-05-16 - -[Compare with 1.10.1](https://github.com/mkdocstrings/python/compare/1.10.1...1.10.2) - -### Bug Fixes - -- Actually make use of custom .html.jinja templates ([5668abb](https://github.com/mkdocstrings/python/commit/5668abba15b13b86fe67f70f6b4004b7b1feeb4f) by Timothée Mazzucotelli). - -## [1.10.1](https://github.com/mkdocstrings/python/releases/tag/1.10.1) - 2024-05-14 - -[Compare with 1.10.0](https://github.com/mkdocstrings/python/compare/1.10.0...1.10.1) - -### Build - -- Depend on mkdocstrings 0.25 which adds support for parameter `once` when logging messages ([2bc156b](https://github.com/mkdocstrings/python/commit/2bc156bd6f231ae13066651f4490d1e9c2ce3ca2) by Timothée Mazzucotelli). - -### Code Refactoring - -- Set handler's name ([a71ab12](https://github.com/mkdocstrings/python/commit/a71ab12c8e52efe76e5c0a5e54065926a47cc0d2) by Timothée Mazzucotelli). -- Update `*.html` top-level templates to extend the `*.html.jinja` base templates ([a8c540e](https://github.com/mkdocstrings/python/commit/a8c540e95693e8500da884c32ad159b3bbaaa7ba) by Timothée Mazzucotelli). [Issue-151](https://github.com/mkdocstrings/python/issues/151) -- Update `*.html` base templates to extend their `*.html.jinja` counterpart, while overriding the `logs` block to issue a logging message (info) stating that extending `*.html` templates is deprecated ([e6f1b9c](https://github.com/mkdocstrings/python/commit/e6f1b9caf13754eca9dbb2f112727bef50876ed7) by Timothée Mazzucotelli). [Issue-151](https://github.com/mkdocstrings/python/issues/151) -- Add `*.html.jinja` top-level (overridable) templates, extending their base counterpart ([7c14924](https://github.com/mkdocstrings/python/commit/7c14924c406d7b5f4f1c22d03019d4c566018d2d) by Timothée Mazzucotelli). [Issue-151](https://github.com/mkdocstrings/python/issues/151) -- Add `*.html.jinja` base templates, which are copies of `*.html` templates, with an additional `logs` block, and using the updated `get_template` filter ([eced9a5](https://github.com/mkdocstrings/python/commit/eced9a54fc8a559b686cb1b1180a0d2e04ba452d) by Timothée Mazzucotelli). [Issue-151](https://github.com/mkdocstrings/python/issues/151) -- Update `get_template` filter to support both `*.html` and `*.html.jinja` templates, logging a message (info) when `*.html` templates are overridden by users ([3546fd7](https://github.com/mkdocstrings/python/commit/3546fd70b2d4e45f77b166b2e67c333acc8af0d2) by Timothée Mazzucotelli). [Issue-151](https://github.com/mkdocstrings/python/issues/151) -- Log a warning when base templates are overridden ([26e3d66](https://github.com/mkdocstrings/python/commit/26e3d66f5334a5aaff75bda030afe6dfa1cc94d7) by Timothée Mazzucotelli). [Issue-151](https://github.com/mkdocstrings/python/issues/151) - -## [1.10.0](https://github.com/mkdocstrings/python/releases/tag/1.10.0) - 2024-04-19 - -[Compare with 1.9.2](https://github.com/mkdocstrings/python/compare/1.9.2...1.10.0) - -### Features - -- Add CSS classes `doc-section-title` and `doc-section-item` in docstring sections ([d6e1d68](https://github.com/mkdocstrings/python/commit/d6e1d68c099e61c3bd6d93e583708335d84158f5) by Timothée Mazzucotelli). [Issue-17](https://github.com/mkdocstrings/python/issues/17) - -### Bug Fixes - -- Render enumeration instance name instead of just "value", allowing proper cross-reference ([11d81d8](https://github.com/mkdocstrings/python/commit/11d81d8e056b7c074eb3a1c47606867156a338fa) by Timothée Mazzucotelli). [Issue-124](https://github.com/mkdocstrings/python/issues/124) - -## [1.9.2](https://github.com/mkdocstrings/python/releases/tag/1.9.2) - 2024-04-02 - -[Compare with 1.9.1](https://github.com/mkdocstrings/python/compare/1.9.1...1.9.2) - -### Dependencies - -- Remove cap on Python-Markdown 3.6 now that ToC labels are fixed by mkdocstrings ([0c1e2c1](https://github.com/mkdocstrings/python/commit/0c1e2c15b2497d99974cbb9bd68f25056bb8451b) by Timothée Mazzucotelli). - -## [1.9.1](https://github.com/mkdocstrings/python/releases/tag/1.9.1) - 2024-04-02 - -[Compare with 1.9.0](https://github.com/mkdocstrings/python/compare/1.9.0...1.9.1) - -### Bug Fixes - -- Don't try loading packages from relative paths ([bd73497](https://github.com/mkdocstrings/python/commit/bd7349714059afb1295e743dbc82380fa797a032) by Timothée Mazzucotelli). [Issue-145](https://github.com/mkdocstrings/python/issues/145) - -### Code Refactoring - -- Allow first name in a separate signature to be highlighted as a function name ([f798a1e](https://github.com/mkdocstrings/python/commit/f798a1e19dbac548420dcbe1172e9a49232b615b) by Timothée Mazzucotelli). -- Maintain original Pygments color for cross-refs in signatures ([7c8b885](https://github.com/mkdocstrings/python/commit/7c8b885fa2b704e719016acb35791723ea3a496a) by Timothée Mazzucotelli). - -## [1.9.0](https://github.com/mkdocstrings/python/releases/tag/1.9.0) - 2024-03-13 - -[Compare with 1.8.0](https://github.com/mkdocstrings/python/compare/1.8.0...1.9.0) - -### Dependencies - -- Add upper bound on Python-Markdown 3.6 to temporarily prevent breaking changes ([cd93ee3](https://github.com/mkdocstrings/python/commit/cd93ee31418a2752667d43bb5a05d22284522c24) by Timothée Mazzucotelli). - -### Features - -- Add `show_labels` option to show/hide labels ([eaf9b82](https://github.com/mkdocstrings/python/commit/eaf9b8240069f7369f401fe048892043c8b173d3) by Viicos). [Issue #120](https://github.com/mkdocstrings/python/issues/120), [PR #130](https://github.com/mkdocstrings/python/pull/130) -- Add option to search for stubs packages ([0c6aa32](https://github.com/mkdocstrings/python/commit/0c6aa323c9e57b8348765a5daa11c79d0c5edb07) by Romain). [PR #128](https://github.com/mkdocstrings/python/pull/128), PR griffe#221: : https://github.com/mkdocstrings/griffe/pull/221 - -### Code Refactoring - -- Mark all Jinja blocks as scoped ([548bdad](https://github.com/mkdocstrings/python/commit/548bdaddd66ffc99b3b9a5a62228a2ff4ff0dd00) by Timothée Mazzucotelli). - -## [1.8.0](https://github.com/mkdocstrings/python/releases/tag/1.8.0) - 2024-01-08 - -[Compare with 1.7.5](https://github.com/mkdocstrings/python/compare/1.7.5...1.8.0) - -### Features - -- Release Insiders features of the $500/month funding goal ([bd30106](https://github.com/mkdocstrings/python/commit/bd301061fe9c647f9b91c2c9b4baa784c304eca7) by Timothée Mazzucotelli). - The features and projects related to *mkdocstrings-python* are: - - - [Cross-references for type annotations in signatures](https://mkdocstrings.github.io/python/usage/configuration/signatures/#signature_crossrefs) - - [Symbol types in headings and table of contents](https://mkdocstrings.github.io/python/usage/configuration/headings/#show_symbol_type_toc) - - [`griffe-inherited-docstrings`](https://mkdocstrings.github.io/griffe-inherited-docstrings/), a Griffe extension for inheriting docstrings - - [`griffe2md`](https://mkdocstrings.github.io/griffe2md/), a tool to output API docs to Markdown using Griffe - - See the complete list of features and projects here: - https://pawamoy.github.io/insiders/#500-plasmavac-user-guide. - -## [1.7.5](https://github.com/mkdocstrings/python/releases/tag/1.7.5) - 2023-11-21 - -[Compare with 1.7.4](https://github.com/mkdocstrings/python/compare/1.7.4...1.7.5) - -### Bug Fixes - -- Add missing translations (fallback theme) for ReadTheDocs ([2fb6513](https://github.com/mkdocstrings/python/commit/2fb651304d0a80fa9d6a8c77c16b3004bda22972) by Timothée Mazzucotelli). [Issue #115](https://github.com/mkdocstrings/python/issues/115) - -## [1.7.4](https://github.com/mkdocstrings/python/releases/tag/1.7.4) - 2023-11-12 - -[Compare with 1.7.3](https://github.com/mkdocstrings/python/compare/1.7.3...1.7.4) - -### Bug Fixes - -- Make extension paths relative to config file ([5035e92](https://github.com/mkdocstrings/python/commit/5035e9269fe11664fd25e438ac8f746721b3de0a) by Waylan Limberg). [PR #112](https://github.com/mkdocstrings/python/pull/112), Co-authored-by: Timothée Mazzucotelli - -### Code Refactoring - -- Prepare for Griffe 0.37 ([b5bb8a9](https://github.com/mkdocstrings/python/commit/b5bb8a982e7a2ec97c73335e453d0033bf4987b6) by Timothée Mazzucotelli). - -## [1.7.3](https://github.com/mkdocstrings/python/releases/tag/1.7.3) - 2023-10-09 - -[Compare with 1.7.2](https://github.com/mkdocstrings/python/compare/1.7.2...1.7.3) - -### Bug Fixes - -- Don't deepcopy the local config ([1300d2c](https://github.com/mkdocstrings/python/commit/1300d2c77dd49f5dea459ad844d72edcc856c4cd) by Timothée Mazzucotelli). - -## [1.7.2](https://github.com/mkdocstrings/python/releases/tag/1.7.2) - 2023-10-05 - -[Compare with 1.7.1](https://github.com/mkdocstrings/python/compare/1.7.1...1.7.2) - -### Bug Fixes - -- Prevent alias resolution error when source-ordering members ([67df10c](https://github.com/mkdocstrings/python/commit/67df10cbb86225e1e3efc251325cbff883a1ef3c) by Timothée Mazzucotelli). [Issue griffe#213](https://github.com/mkdocstrings/griffe/issues/213) - -### Code Refactoring - -- Use package relative filepath if filepath is not relative ([aa5a3f7](https://github.com/mkdocstrings/python/commit/aa5a3f7b0928498ba9da10ed1211d1e55b7f6c4b) by Timothée Mazzucotelli). [Discussion mkdocstrings#622](https://github.com/mkdocstrings/mkdocstrings/discussions/622) - -## [1.7.1](https://github.com/mkdocstrings/python/releases/tag/1.7.1) - 2023-09-28 - -[Compare with 1.7.0](https://github.com/mkdocstrings/python/compare/1.7.0...1.7.1) - -### Bug Fixes - -- Stop propagation of annotation to next parameter in signature template ([3a760ac](https://github.com/mkdocstrings/python/commit/3a760acacfabaef5abc658ee579e1c205e674994) by Timothée Mazzucotelli). [Issue #110](https://github.com/mkdocstrings/python/issues/110) - -### Code Refactoring - -- Look into inherited members for `__init__` methods when merging docstrings ([b97d51f](https://github.com/mkdocstrings/python/commit/b97d51f67c2ee3d1edfe6975274ead50fcb3fa8f) by Timothée Mazzucotelli). [Issue #106](https://github.com/mkdocstrings/python/issues/106) - -## [1.7.0](https://github.com/mkdocstrings/python/releases/tag/1.7.0) - 2023-09-14 - -[Compare with 1.6.3](https://github.com/mkdocstrings/python/compare/1.6.3...1.7.0) - -### Features - -- Add option to unwrap `Annotated` types ([53db04b](https://github.com/mkdocstrings/python/commit/53db04b6256db960aebc2a9f91129b82ca222e41) by Timothée Mazzucotelli). - -## [1.6.3](https://github.com/mkdocstrings/python/releases/tag/1.6.3) - 2023-09-11 - -[Compare with 1.6.2](https://github.com/mkdocstrings/python/compare/1.6.2...1.6.3) - -### Bug Fixes - -- Make `load_external_modules` a global-only option ([266f41f](https://github.com/mkdocstrings/python/commit/266f41f2033e034060001bc2bed376b4f3a8d7b8) by Timothée Mazzucotelli). [Issue #87](https://github.com/mkdocstrings/python/issues/87) -- Never fail when trying to format code with Black ([df24bbc](https://github.com/mkdocstrings/python/commit/df24bbc640886e1da2d00a3b58c1aa7736cb1eeb) by Timothée Mazzucotelli). - -### Code Refactoring - -- Wrap docstring section elements (list style) in code tags to prevent spell checker errors ([1ae8dd8](https://github.com/mkdocstrings/python/commit/1ae8dd89cddd67c09d7d30c59b9013516cea2924) by Timothée Mazzucotelli). - -## [1.6.2](https://github.com/mkdocstrings/python/releases/tag/1.6.2) - 2023-09-05 - -[Compare with 1.6.1](https://github.com/mkdocstrings/python/compare/1.6.1...1.6.2) - -### Bug Fixes - -- Don't render cross-ref spans when they're not enabled ([eed51ee](https://github.com/mkdocstrings/python/commit/eed51ee14bd973a08395f95377f9bd4cd38febfc) by Timothée Mazzucotelli). - -## [1.6.1](https://github.com/mkdocstrings/python/releases/tag/1.6.1) - 2023-09-04 - -[Compare with 1.6.0](https://github.com/mkdocstrings/python/compare/1.6.0...1.6.1) - -### Bug Fixes - -- Fix spacing for rendered named items in Yields, Receives and Returns sections (list style) ([e12688e](https://github.com/mkdocstrings/python/commit/e12688ecb7d868047f794300eb2638d052563e68) by Timothée Mazzucotelli). -- Fix rendering Receives sections as lists ([9ff7e68](https://github.com/mkdocstrings/python/commit/9ff7e68b58e2ab0829c73e4e62254325a4f766ac) by Timothée Mazzucotelli). - -## [1.6.0](https://github.com/mkdocstrings/python/releases/tag/1.6.0) - 2023-08-27 - -[Compare with 1.5.2](https://github.com/mkdocstrings/python/compare/1.5.2...1.6.0) - -### Features - -- Add `doc-signature` CSS class to separate signature code blocks ([b6c648f](https://github.com/mkdocstrings/python/commit/b6c648f554f2e0dce609afc2a2c1a3b27a4fbeba) by Timothée Mazzucotelli). - -### Code Refactoring - -- Add a `format_attribute` filter, preparing for cross-refs in attribute signatures ([8f0ade2](https://github.com/mkdocstrings/python/commit/8f0ade249638ee2f2d446f083c70b6c30799875a) by Timothée Mazzucotelli). - -## [1.5.2](https://github.com/mkdocstrings/python/releases/tag/1.5.2) - 2023-08-25 - -[Compare with 1.5.1](https://github.com/mkdocstrings/python/compare/1.5.1...1.5.2) - -### Bug Fixes - -- Regression in children template: fix condition for when members are specified ([beeebff](https://github.com/mkdocstrings/python/commit/beeebffa36288d1f71d122f78ecd9064b41a75d0) by Timothée Mazzucotelli). [Issue #100](https://github.com/mkdocstrings/python/issues/100) -- Prevent whitespace removal before highlight filter ([c6f36c0](https://github.com/mkdocstrings/python/commit/c6f36c0c9e5141800f8c5c988c9b67720fccccb8) by Timothée Mazzucotelli). - -### Code Refactoring - -- Never show full object path in ToC entry ([9aa758b](https://github.com/mkdocstrings/python/commit/9aa758bcc42dfcf7c416d87b8f7cd407b7fdf148) by Timothée Mazzucotelli). -- Sync templates with insiders, remove useless lines ([38b317f](https://github.com/mkdocstrings/python/commit/38b317f4fc74b583a4788721a5559c51a5a47d86) by Timothée Mazzucotelli). - -## [1.5.1](https://github.com/mkdocstrings/python/releases/tag/1.5.1) - 2023-08-24 - -[Compare with 1.5.0](https://github.com/mkdocstrings/python/compare/1.5.0...1.5.1) - -### Code Refactoring - -- Never show full path in separate signature since it would appear in the heading already ([9e02049](https://github.com/mkdocstrings/python/commit/9e0204930cf4dc973ba8eb41c471fc0132e1631f) by Timothée Mazzucotelli). -- Improve guessing whether an object is public ([35eb811](https://github.com/mkdocstrings/python/commit/35eb81162582d794f170cd7e8c68f10ecfd8ff9d) by Timothée Mazzucotelli). -- Always sort modules alphabetically as source order wouldn't make sense ([70c81ce](https://github.com/mkdocstrings/python/commit/70c81cebb62366cbfc6124bc84d1563db176afb6) by Timothée Mazzucotelli). -- Return anchors as a tuple, not a set, to preserve order ([736a2b5](https://github.com/mkdocstrings/python/commit/736a2b5e729d25bb184db8d42f2ad01025a5bc58) by Timothée Mazzucotelli). [Related-to #mkdocstrings/crystal#6](https://github.com/mkdocstrings/crystal/pull/6) - -## [1.5.0](https://github.com/mkdocstrings/python/releases/tag/1.5.0) - 2023-08-20 - -[Compare with 1.4.0](https://github.com/mkdocstrings/python/compare/1.4.0...1.5.0) - -### Features - -- Add support for new Griffe docstring sections: modules, classes, and functions (methods) ([d5337af](https://github.com/mkdocstrings/python/commit/d5337afdf68fc492b34f749aa69d1da33b49f9c2) by Timothée Mazzucotelli). - -## [1.4.0](https://github.com/mkdocstrings/python/releases/tag/1.4.0) - 2023-08-18 - -[Compare with 1.3.0](https://github.com/mkdocstrings/python/compare/1.3.0...1.4.0) - -### Features - -- Support new Griffe expressions (in v0.33) ([9b8e1b1](https://github.com/mkdocstrings/python/commit/9b8e1b1604b978cf2d89b7abf826cf4407f92394) by Timothée Mazzucotelli). - -### Code Refactoring - -- Deprecate `crossref` and `multi_crossref` filters ([4fe3d20](https://github.com/mkdocstrings/python/commit/4fe3d2051047061780e20683da6513a7c8d91829) by Timothée Mazzucotelli). - -## [1.3.0](https://github.com/mkdocstrings/python/releases/tag/1.3.0) - 2023-08-06 - -[Compare with 1.2.1](https://github.com/mkdocstrings/python/compare/1.2.1...1.3.0) - -### Dependencies - -- Set upper bound on Griffe (0.33) ([ad8c2a3](https://github.com/mkdocstrings/python/commit/ad8c2a3ac8daf0b0c06579b6ba667e05feffa247) by Timothée Mazzucotelli). See https://github.com/mkdocstrings/griffe/discussions/195. - -### Features - -- Show parameter default values within the "list" section style too ([55f08f3](https://github.com/mkdocstrings/python/commit/55f08f3e2cece815dd79d35c82515ba8003ec64c) by Antoine Dechaume). [PR #92](https://github.com/mkdocstrings/python/pull/92), Co-authored-by: Timothée Mazzucotelli - -## [1.2.1](https://github.com/mkdocstrings/python/releases/tag/1.2.1) - 2023-07-20 - -[Compare with 1.2.0](https://github.com/mkdocstrings/python/compare/1.2.0...1.2.1) - -### Bug Fixes - -- Fix members ordering when members are specified with a boolean ([c69f9c3](https://github.com/mkdocstrings/python/commit/c69f9c3b3ddde915619eded6620f7ddada977b00) by Timothée Mazzucotelli). [Issue #89](https://github.com/mkdocstrings/python/issues/89) - -## [1.2.0](https://github.com/mkdocstrings/python/releases/tag/1.2.0) - 2023-07-14 - -[Compare with 1.1.2](https://github.com/mkdocstrings/python/compare/1.1.2...1.2.0) - -### Features - -- Add Jinja blocks to module, class, function and attribute templates ([299fe48](https://github.com/mkdocstrings/python/commit/299fe483cc03ba76df29b843f88467f89db6dc72) by Timothée Mazzucotelli). -- Setup infrastructure for I18N, add translations for simplified chinese and japanese ([b053b29](https://github.com/mkdocstrings/python/commit/b053b2900ef5c0069b68ad19bda9aaa98141a525) by Nyuan Zhang). [PR #77](https://github.com/mkdocstrings/python/pull/77) -- Support inheritance ([ae42356](https://github.com/mkdocstrings/python/commit/ae4235689155a4b4f0c1e74b0014a466c6b1181f) by Timothée Mazzucotelli). [Issue mkdocstrings#157](https://github.com/mkdocstrings/mkdocstrings/issues/157), [Discussion mkdocstrings#536](https://github.com/mkdocstrings/mkdocstrings/discussions/536) - -### Bug Fixes - -- Don't show `None` as return annotation of class signatures ([3d8724e](https://github.com/mkdocstrings/python/commit/3d8724ed1f4d040d7a3d9d02784cf0d1f80445b2) by Timothée Mazzucotelli). [Issue #85](https://github.com/mkdocstrings/python/issues/85) -- Show labels in deterministic order ([02619a8](https://github.com/mkdocstrings/python/commit/02619a85ee4aab25f3241d983bdfff0534dd3f81) by Oleh Prypin). - -## [1.1.2](https://github.com/mkdocstrings/python/releases/tag/1.1.2) - 2023-06-04 - -[Compare with 1.1.1](https://github.com/mkdocstrings/python/compare/1.1.1...1.1.2) - -### Code Refactoring - -- Keep headings style consistent (CSS) ([92032e5](https://github.com/mkdocstrings/python/commit/92032e561861c3fc4e3fb0c6882bb076d0e6614d) by Timothée Mazzucotelli). - -## [1.1.1](https://github.com/mkdocstrings/python/releases/tag/1.1.1) - 2023-06-04 - -[Compare with 1.1.0](https://github.com/mkdocstrings/python/compare/1.1.0...1.1.1) - -### Bug Fixes - -- Fix mkdocs and readthedocs themes support ([14f18b2](https://github.com/mkdocstrings/python/commit/14f18b219f67f9b6d154d4a52051d8d7d7c49348) by Timothée Mazzucotelli). - -### Code Refactoring - -- Improve display of paragraphs in docstring sections ([439f5e6](https://github.com/mkdocstrings/python/commit/439f5e6984fe94c28324ca57fbd1a52ef8f55b62) by Timothée Mazzucotelli). - -## [1.1.0](https://github.com/mkdocstrings/python/releases/tag/1.1.0) - 2023-05-25 - -[Compare with 1.0.0](https://github.com/mkdocstrings/python/compare/1.0.0...1.1.0) - -### Features - -- Support custom templates through objects' extra data ([8ff2b06](https://github.com/mkdocstrings/python/commit/8ff2b06295e848b9c84867802eb845adf061dc10) by Timothée Mazzucotelli). [PR #70](https://github.com/mkdocstrings/python/pull/70) - -## [1.0.0](https://github.com/mkdocstrings/python/releases/tag/1.0.0) - 2023-05-11 - -[Compare with 0.10.1](https://github.com/mkdocstrings/python/compare/0.10.1...1.0.0) - -### Breaking changes - -- The signature of the [`format_signature` filter][mkdocstrings_handlers.python.do_format_signature] has changed. - If you override templates in your project to customize the output, - make sure to update the following templates so that they use - the new filter signature: - - - `class.html` - - `expression.html` - - `function.html` - - `signature.html` - - You can see how to use the filter in this commit's changes: - [f686f4e4](https://github.com/mkdocstrings/python/commit/f686f4e4599cea64686d4ef4863b507dd096a513). - -**We take this as an opportunity to go out of beta and bump the version to 1.0.0. -This will allow users to rely on semantic versioning.** - -### Bug Fixes - -- Bring compatibility with insiders signature crossrefs feature ([f686f4e](https://github.com/mkdocstrings/python/commit/f686f4e4599cea64686d4ef4863b507dd096a513) by Timothée Mazzucotelli). - -## [0.10.1](https://github.com/mkdocstrings/python/releases/tag/0.10.1) - 2023-05-07 - -[Compare with 0.10.0](https://github.com/mkdocstrings/python/compare/0.10.0...0.10.1) - -### Bug Fixes - -- Format signatures with full-path names ([685512d](https://github.com/mkdocstrings/python/commit/685512decf1a14c53fa6ca82048e65619aa6a463) by Timothée Mazzucotelli). - -## [0.10.0](https://github.com/mkdocstrings/python/releases/tag/0.10.0) - 2023-05-07 - -[Compare with 0.9.0](https://github.com/mkdocstrings/python/compare/0.9.0...0.10.0) - -### Features - -- Add option to disallow inspection ([40f2f26](https://github.com/mkdocstrings/python/commit/40f2f268876358941cf8221d01d219a0deb9de38) by Nyuan Zhang). [Issue #68](https://github.com/mkdocstrings/python/issues/68), [PR #69](https://github.com/mkdocstrings/python/pull/69) - -### Bug Fixes - -- Make admonitions open by default ([79cd153](https://github.com/mkdocstrings/python/commit/79cd153cfceec860f6ce08d30817c21031983238) by Timothée Mazzucotelli). [Issue #22](https://github.com/mkdocstrings/python/issues/22) - -### Code Refactoring - -- Match documented behavior for filtering (all members, list, none) ([c7f70c3](https://github.com/mkdocstrings/python/commit/c7f70c353c3dd2b82e1f34c70cd433e0bab4f6e6) by Timothée Mazzucotelli). -- Switch to an info level log for when black's not installed ([f593bb0](https://github.com/mkdocstrings/python/commit/f593bb06c63860be14d2025c4bd795e0c8976ce0) by Faster Speeding). -- Return anchors as a set ([e2b820c](https://github.com/mkdocstrings/python/commit/e2b820c5af3787518656d5f7f799ecb6b55aa033) by Timothée Mazzucotelli). - -## [0.9.0](https://github.com/mkdocstrings/python/releases/tag/0.9.0) - 2023-04-03 - -[Compare with 0.8.3](https://github.com/mkdocstrings/python/compare/0.8.3...0.9.0) - -### Features - -- Allow resolving alias to external modules ([02052e2](https://github.com/mkdocstrings/python/commit/02052e248b125a113ab788faa9a075adbdc92ca6) by Gilad). [PR #61](https://github.com/mkdocstrings/python/pull/61), [Follow-up of PR #60](https://github.com/mkdocstrings/python/pull/60) -- Allow pre-loading modules ([36002cb](https://github.com/mkdocstrings/python/commit/36002cb9c89fba35d23afb07a866dd8c6877f742) by Gilad). [Issue mkdocstrings/mkdocstrings#503](https://github.com/mkdocstrings/mkdocstrings/issues/503), [PR #60](https://github.com/mkdocstrings/python/pull/60) -- Add show options for docstrings ([a6c55fb](https://github.com/mkdocstrings/python/commit/a6c55fb52f362dd49b1a7e334a631f6ea3b1b963) by Jeremy Goh). [Issue mkdocstrings/mkdocstrings#466](https://github.com/mkdocstrings/mkdocstrings/issues/466), [PR #56](https://github.com/mkdocstrings/python/pull/56) -- Allow custom list of domains for inventories ([f5ea6fd](https://github.com/mkdocstrings/python/commit/f5ea6fd81f7a531e8a97bb0e48267188d72936c1) by Sorin Sbarnea). [Issue mkdocstrings/mkdocstrings#510](https://github.com/mkdocstrings/mkdocstrings/issues/510), [PR #49](https://github.com/mkdocstrings/python/pull/49) - -### Bug Fixes - -- Prevent alias resolution error when searching for anchors ([a190e2c](https://github.com/mkdocstrings/python/commit/a190e2c4a752e74a05ad03702837a0914c198742) by Timothée Mazzucotelli). [Issue #64](https://github.com/mkdocstrings/python/issues/64) - -### Code Refactoring - -- Support Griffe 0.26 ([075735c](https://github.com/mkdocstrings/python/commit/075735ce8d86921fbf092d7ad1d009bbb3a2e0bb) by Timothée Mazzucotelli). -- Log (debug) unresolved aliases ([9164742](https://github.com/mkdocstrings/python/commit/9164742f87362e8241dea11bec0fd96f6b9d9dda) by Timothée Mazzucotelli). - -## [0.8.3](https://github.com/mkdocstrings/python/releases/tag/0.8.3) - 2023-01-04 - -[Compare with 0.8.2](https://github.com/mkdocstrings/python/compare/0.8.2...0.8.3) - -### Code Refactoring -- Change "unresolved aliases" log level to DEBUG ([dccb818](https://github.com/mkdocstrings/python/commit/dccb818f51278cc8799e2187a615d999a3ab86fb) by Timothée Mazzucotelli). - - -## [0.8.2](https://github.com/mkdocstrings/python/releases/tag/0.8.2) - 2022-11-19 - -[Compare with 0.8.1](https://github.com/mkdocstrings/python/compare/0.8.1...0.8.2) - -### Bug Fixes -- Fix base directory used to expand globs ([34cfa4b](https://github.com/mkdocstrings/python/commit/34cfa4b41f264437a338e66f6060ceeee134ba15) by Florian Hofer). [PR #45](https://github.com/mkdocstrings/python/pull/45) - - -## [0.8.1](https://github.com/mkdocstrings/python/releases/tag/0.8.1) - 2022-11-19 - -[Compare with 0.8.0](https://github.com/mkdocstrings/python/compare/0.8.0...0.8.1) - -### Bug Fixes -- Expand globs relative to configuration file path ([0dc45ae](https://github.com/mkdocstrings/python/commit/0dc45aeb7c7f9b2f15118ebf1584baa06d365c9b) by David Vegh). [Issue #42](https://github.com/mkdocstrings/python/issues/42), [PR #43](https://github.com/mkdocstrings/python/pull/43) - - -## [0.8.0](https://github.com/mkdocstrings/python/releases/tag/0.8.0) - 2022-11-13 - -[Compare with 0.7.1](https://github.com/mkdocstrings/python/compare/0.7.1...0.8.0) - -### Features -- Add support for globs in paths configuration ([29edd02](https://github.com/mkdocstrings/python/commit/29edd02e7a4d83f6b7e8555d4d5b03a79882eb07) by Andrew Guenther). [Issue #33](https://github.com/mkdocstrings/python/issues/33), [PR #34](https://github.com/mkdocstrings/python/pull/34) - -### Code Refactoring -- Support Griffe 0.24 ([3b9f701](https://github.com/mkdocstrings/python/commit/3b9f7013a7367f18e4354c37f029f9caf3ad0a4e) by Timothée Mazzucotelli). - - -## [0.7.1](https://github.com/mkdocstrings/python/releases/tag/0.7.1) - 2022-06-12 - -[Compare with 0.7.0](https://github.com/mkdocstrings/python/compare/0.7.0...0.7.1) - -### Bug Fixes -- Fix rendering of `/` in signatures ([3e927e4](https://github.com/mkdocstrings/python/commit/3e927e43192710218fe69f67ff832936c856a678) by Timothée Mazzucotelli). [Issue #25](https://github.com/mkdocstrings/python/issues/25) - - -## [0.7.0](https://github.com/mkdocstrings/python/releases/tag/0.7.0) - 2022-05-28 - -[Compare with 0.6.6](https://github.com/mkdocstrings/python/compare/0.6.6...0.7.0) - -### Packaging / Dependencies -- Depend on mkdocstrings 0.19 ([b6a9a47](https://github.com/mkdocstrings/python/commit/b6a9a4799980c4590a7ce2838e12653f40e43be3) by Timothée Mazzucotelli). - -### Features -- Add config option for annotations paths verbosity ([b6c9893](https://github.com/mkdocstrings/python/commit/b6c989315fb028813a919319ad1818b0b1f597ac) by Timothée Mazzucotelli). -- Use sections titles in SpaCy-styled docstrings ([fe16b54](https://github.com/mkdocstrings/python/commit/fe16b54aea60473575343e3a3c428567b701bd7d) by Timothée Mazzucotelli). -- Wrap objects names in spans to allow custom styling ([0822ff9](https://github.com/mkdocstrings/python/commit/0822ff9d3ffd3fb71fb619a8b557160661eff9c3) by Timothée Mazzucotelli). [Issue mkdocstrings/mkdocstrings#240](https://github.com/mkdocstrings/mkdocstrings/issues/240) -- Add Jinja blocks around docstring section styles ([aaa79ee](https://github.com/mkdocstrings/python/commit/aaa79eea40d49a64a69badbe732bf5211fbf055a) by Timothée Mazzucotelli). -- Add members and filters options ([24a6136](https://github.com/mkdocstrings/python/commit/24a6136ee6c04a6a49ee74b20e65177868a10ea7) by Timothée Mazzucotelli). -- Add paths option ([dd41182](https://github.com/mkdocstrings/python/commit/dd41182c210f0bb2675ead162adaa01dbbb1949f) by Timothée Mazzucotelli). [Issue mkdocstrings/mkdocstrings#311](https://github.com/mkdocstrings/mkdocstrings/issues/311), [PR #20](https://github.com/mkdocstrings/python/issues/20) - -### Bug Fixes -- Fix CSS class on labels ([312a709](https://github.com/mkdocstrings/python/commit/312a7092394aab968032cf08195af7445a85052f) by Timothée Mazzucotelli). -- Fix categories rendering ([6407cf4](https://github.com/mkdocstrings/python/commit/6407cf4f2375c894e0c528e932e9b76774a6455e) by Timothée Mazzucotelli). [Issue #14](https://github.com/mkdocstrings/python/issues/14) - -### Code Refactoring -- Disable `show_submodules` by default ([480d0c3](https://github.com/mkdocstrings/python/commit/480d0c373904713313ec76b6e2570dbc35eb527b) by Timothée Mazzucotelli). -- Merge default configuration options in handler ([347ce76](https://github.com/mkdocstrings/python/commit/347ce76d074c0e3841df2d5162b54d3938d00453) by Timothée Mazzucotelli). -- Reduce number of template debug logs ([8fed314](https://github.com/mkdocstrings/python/commit/8fed314243e3981fc7b527c69cee628e87b10220) by Timothée Mazzucotelli). -- Respect `show_root_full_path` for ToC entries (hidden headings) ([8f4c853](https://github.com/mkdocstrings/python/commit/8f4c85328e8b4a45db77f9fc3e536a5008686f37) by Timothée Mazzucotelli). -- Bring consistency on headings style ([59104c4](https://github.com/mkdocstrings/python/commit/59104c4c51c86c774eed76d8508f9f4d3db5463f) by Timothée Mazzucotelli). -- Stop using deprecated base classes ([d5ea1c5](https://github.com/mkdocstrings/python/commit/d5ea1c5cf7884d8c019145f73685a84218e69840) by Timothée Mazzucotelli). - - -## [0.6.6](https://github.com/mkdocstrings/python/releases/tag/0.6.6) - 2022-03-06 - -[Compare with 0.6.5](https://github.com/mkdocstrings/python/compare/0.6.5...0.6.6) - -### Code Refactoring -- Always hide `self` and `cls` parameters ([7f579d1](https://github.com/mkdocstrings/python/commit/7f579d162e184adcfe25b2215bce4d38677f75b7) by Timothée Mazzucotelli). [Issue #7](https://github.com/mkdocstrings/python/issues/7) -- Use `pycon` for examples code blocks ([6545900](https://github.com/mkdocstrings/python/commit/6545900eecc67c8a6ddd343c497ac22fdd6a26e2) by Timothée Mazzucotelli). - - -## [0.6.5](https://github.com/mkdocstrings/python/releases/tag/0.6.5) - 2022-02-24 - -[Compare with 0.6.4](https://github.com/mkdocstrings/python/compare/0.6.4...0.6.5) - -### Bug Fixes -- Don't escape signatures return annotations ([ac54bfc](https://github.com/mkdocstrings/python/commit/ac54bfc5761337aa606fb1aa6575745062ce26f8) by Timothée Mazzucotelli). [Issue #6](https://github.com/mkdocstrings/python/issues/6) - - -## [0.6.4](https://github.com/mkdocstrings/python/releases/tag/0.6.4) - 2022-02-22 - -[Compare with 0.6.3](https://github.com/mkdocstrings/python/compare/0.6.3...0.6.4) - -### Bug Fixes -- Fix rendering of signature return annotation ([b92ba3b](https://github.com/mkdocstrings/python/commit/b92ba3b370388aa6c956bcc70ba87b7aebb91a4c) by Timothée Mazzucotelli). [Issue #4](https://github.com/mkdocstrings/python/issues/4) - - -## [0.6.3](https://github.com/mkdocstrings/python/releases/tag/0.6.3) - 2022-02-20 - -[Compare with 0.6.2](https://github.com/mkdocstrings/python/compare/0.6.2...0.6.3) - -### Bug Fixes -- Fix examples rendering ([a06a7e3](https://github.com/mkdocstrings/python/commit/a06a7e34c7017374c5bed41f4757ed86ae64cb2e) by Timothée Mazzucotelli). [Issue mkdocstrings/griffe#46](https://github.com/mkdocstrings/griffe/issues/46) - - -## [0.6.2](https://github.com/mkdocstrings/python/releases/tag/0.6.2) - 2022-02-17 - -[Compare with 0.6.1](https://github.com/mkdocstrings/python/compare/0.6.1...0.6.2) - -### Bug Fixes -- Catch alias resolution errors ([b734dd0](https://github.com/mkdocstrings/python/commit/b734dd0dcd72f5b985b3afce01e852c9c74e451a) by Timothée Mazzucotelli). - - -## [0.6.1](https://github.com/mkdocstrings/python/releases/tag/0.6.1) - 2022-02-17 - -[Compare with 0.6.0](https://github.com/mkdocstrings/python/compare/0.6.0...0.6.1) - -### Bug Fixes -- Don't pop from fallback config ([bde32af](https://github.com/mkdocstrings/python/commit/bde32afb5d99539813b1884a4c735de5845f62ae) by Timothée Mazzucotelli). -- Fix rendering init method source when merged into class ([4a20aea](https://github.com/mkdocstrings/python/commit/4a20aeaa60f3efbcb4781a369feef3b4826ff1df) by Timothée Mazzucotelli). - - -## [0.6.0](https://github.com/mkdocstrings/python/releases/tag/0.6.0) - 2022-02-13 - -[Compare with 0.5.4](https://github.com/mkdocstrings/python/compare/0.5.4...0.6.0) - -### Features -- Add option to merge `__init__` methods' docstrings into their classes' docstrings ([1b4d1c0](https://github.com/mkdocstrings/python/commit/1b4d1c0e9254fc51756caed3875fbc8c1da079a6) by Timothée Mazzucotelli). -- Support separate attribute signature ([e962b88](https://github.com/mkdocstrings/python/commit/e962b885f48570762c5bfcefc9b61e5fc1df1c70) by Timothée Mazzucotelli). - -### Bug Fixes -- Restore full cross-refs paths on hover ([ac11970](https://github.com/mkdocstrings/python/commit/ac1197062f2e23e819f144fe74a774d504d0ac49) by Timothée Mazzucotelli). -- Fix rendering of labels ([52919c5](https://github.com/mkdocstrings/python/commit/52919c559378a6006bbe931423c5f03eb5883eaf) by Timothée Mazzucotelli). - -### Code Refactoring -- Don't add trailing parentheses in functions heading when separate signature ([885696e](https://github.com/mkdocstrings/python/commit/885696e05606d07334e0428128ed688d54098da1) by Timothée Mazzucotelli). -- Use more explicit template debug messages ([f2122d7](https://github.com/mkdocstrings/python/commit/f2122d7fa119ed055ffe2b2bac72d2c643daca1c) by Timothée Mazzucotelli). - - -## [0.5.4](https://github.com/mkdocstrings/python/releases/tag/0.5.4) - 2022-02-13 - -[Compare with 0.5.3](https://github.com/mkdocstrings/python/compare/0.5.3...0.5.4) - -### Bug Fixes -- Don't load additional modules during fallback ([69b8e25](https://github.com/mkdocstrings/python/commit/69b8e25cddc9e256c5edb8843592a466023aa124) by Timothée Mazzucotelli). - - -## [0.5.3](https://github.com/mkdocstrings/python/releases/tag/0.5.3) - 2022-02-08 - -[Compare with 0.5.2](https://github.com/mkdocstrings/python/compare/0.5.2...0.5.3) - -### Bug Fixes -- Allow passing `null` as docstring style ([f526816](https://github.com/mkdocstrings/python/commit/f526816ef1d499795c647e6fe184ba91c1d41b1b) by Timothée Mazzucotelli). [Issue #2](https://github.com/mkdocstrings/python/issues/2) - - -## [0.5.2](https://github.com/mkdocstrings/python/releases/tag/0.5.2) - 2022-02-05 - -[Compare with 0.5.1](https://github.com/mkdocstrings/python/compare/0.5.1...0.5.2) - -### Dependencies -- Require at least mkdocstrings 0.18 ([7abdda4](https://github.com/mkdocstrings/python/commit/7abdda416e25128eec06f3b15aae5058fbc7320c) by Timothée Mazzucotelli). - - -## [0.5.1](https://github.com/mkdocstrings/python/releases/tag/0.5.1) - 2022-02-03 - -[Compare with 0.5.0](https://github.com/mkdocstrings/python/compare/0.5.0...0.5.1) - -### Dependencies -- Depend on Griffe >= 0.11.1 ([1303557](https://github.com/mkdocstrings/python/commit/1303557928a27a3d9b063baee9d698458f471357) by Timothée Mazzucotelli). - -### Code Refactoring -- Move handler into its own module ([b787e78](https://github.com/mkdocstrings/python/commit/b787e78e31652438039775850e55ea956c22e8d0) by Timothée Mazzucotelli). - - -## [0.5.0](https://github.com/mkdocstrings/python/releases/tag/0.5.0) - 2022-02-03 - -[Compare with 0.4.1](https://github.com/mkdocstrings/python/compare/0.4.1...0.5.0) - -### Features -- Allow changing docstring style of an object ([39240c1](https://github.com/mkdocstrings/python/commit/39240c1497dced15c03f9046138f2829fc10e139) by Timothée Mazzucotelli). - -### Bug Fixes -- Warn if Black is not installed when formatting signature ([b848277](https://github.com/mkdocstrings/python/commit/b84827789b2bf66a4b76ff63a514ec6ba98cae68) by Timothée Mazzucotelli). -- Fix missing default for `docstring_section_style` option ([774988e](https://github.com/mkdocstrings/python/commit/774988ef06a9bf3446949da63611ad7bc5a712fc) by Timothée Mazzucotelli). - -### Code Refactoring -- Change to new way of stripping paragraphs ([33d4594](https://github.com/mkdocstrings/python/commit/33d45945bf8ffce2435a6b3749795397fa7c3fc8) by Timothée Mazzucotelli). - - -## [0.4.1](https://github.com/mkdocstrings/python/releases/tag/0.4.1) - 2022-02-01 - -[Compare with 0.4.0](https://github.com/mkdocstrings/python/compare/0.4.0...0.4.1) - -### Bug Fixes -- Fix docstring admonitions rendering ([a24ae2e](https://github.com/mkdocstrings/python/commit/a24ae2e95f4c0451a44037120451cf06c973ba65) by Timothée Mazzucotelli). - - -## [0.4.0](https://github.com/mkdocstrings/python/releases/tag/0.4.0) - 2022-02-01 - -[Compare with 0.3.0](https://github.com/mkdocstrings/python/compare/0.3.0...0.4.0) - -### Code Refactoring -- Use the new `mkdocstrings_handlers` namespace ([23c9023](https://github.com/mkdocstrings/python/commit/23c9023780535251778077cd7d957c0067ecb0dc) by Timothée Mazzucotelli). - - -## [0.3.0](https://github.com/mkdocstrings/python/releases/tag/0.3.0) - 2022-01-14 - -[Compare with 0.2.0](https://github.com/mkdocstrings/python/compare/0.2.0...0.3.0) - -### Features -- Support griffe 0.10 ([28061de](https://github.com/mkdocstrings/python/commit/28061de20094c510f27bb375b2e1dc44a699809d) by Timothée Mazzucotelli). - -### Dependencies -- Require griffe 0.10 ([cfbd7bb](https://github.com/mkdocstrings/python/commit/cfbd7bb4761691ef36100962c775ed1d0a247514) by Timothée Mazzucotelli). - -### Code Refactoring -- Use new logger patching utility ([4cdb292](https://github.com/mkdocstrings/python/commit/4cdb2921b3a9292db3ef0663c63f148a4eec3966) by Timothée Mazzucotelli). - - -## [0.2.0](https://github.com/mkdocstrings/python/releases/tag/0.2.0) - 2021-12-28 - -[Compare with 0.1.0](https://github.com/mkdocstrings/python/compare/0.1.0...0.2.0) - -### Dependencies -- Depend on griffe >= 0.7.1 ([34f7ebd](https://github.com/mkdocstrings/python/commit/34f7ebd41f3ebda025ad87e3b52a7226fcb93720) by Timothée Mazzucotelli). -- Upgrade griffe, no upper bound ([8f0aa42](https://github.com/mkdocstrings/python/commit/8f0aa42eed07424a1377708897d92f9894f4abdb) by Timothée Mazzucotelli). - -### Features -- Add `show_signature` rendering option ([0f07c2e](https://github.com/mkdocstrings/python/commit/0f07c2e51a51a56eeb5d32fdf05dbed7243f0bc5) by Will Da Silva). - -### Bug Fixes -- Fix templates for named docstring elements ([47868a1](https://github.com/mkdocstrings/python/commit/47868a143bf2c462abd5ad85bd0ab8dca7bc5f82) by Timothée Mazzucotelli). - - -## [0.1.0](https://github.com/mkdocstrings/python/releases/tag/0.1.0) - 2021-12-19 - -[Compare with first commit](https://github.com/mkdocstrings/python/compare/0032f18c9f902c3e75e0e00114ca8fa6a810c8f5...0.1.0) - -### Features -- Implement handler and add templates ([dbb580a](https://github.com/mkdocstrings/python/commit/dbb580aa79f6b2f8a089c80bdc67d0f7457c2d30) by Timothée Mazzucotelli). - -### Bug Fixes -- Fix separate signature feature ([da6e81c](https://github.com/mkdocstrings/python/commit/da6e81c897899f09e1dae7bb8930ce6782aeb306) by Timothée Mazzucotelli). -- Fix signature template (parameters annotations) ([b34ead0](https://github.com/mkdocstrings/python/commit/b34ead008773880fd8d1d7a2a41768ec27820520) by Timothée Mazzucotelli). -- Only show source when present ([c270d68](https://github.com/mkdocstrings/python/commit/c270d68c9e17204606ae12a2159c04563a18ec2b) by Timothée Mazzucotelli). - -### Code Refactoring -- Return all known anchors ([9bbfe14](https://github.com/mkdocstrings/python/commit/9bbfe1442e2aab28bd6fb2618c943d3f698750ab) by Timothée Mazzucotelli). -- Update for griffe 0.4.0 ([831aabb](https://github.com/mkdocstrings/python/commit/831aabb135db7e75729954adc675af6379f58e24) by Timothée Mazzucotelli). diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md deleted file mode 100644 index 2d46305a..00000000 --- a/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,84 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation. - -We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. - -## Our Standards - -Examples of behavior that contributes to a positive environment for our community include: - -* Demonstrating empathy and kindness toward other people -* Being respectful of differing opinions, viewpoints, and experiences -* Giving and gracefully accepting constructive feedback -* Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience -* Focusing on what is best not just for us as individuals, but for the overall community - -Examples of unacceptable behavior include: - -* The use of sexualized language or imagery, and sexual attention or advances of any kind -* Trolling, insulting or derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or email address, without their explicit permission -* Other conduct which could reasonably be considered inappropriate in a professional setting - -## Enforcement Responsibilities - -Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. - -Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. - -## Scope - -This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at dev@pawamoy.fr. All complaints will be reviewed and investigated promptly and fairly. - -All community leaders are obligated to respect the privacy and security of the reporter of any incident. - -## Enforcement Guidelines - -Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct: - -### 1. Correction - -**Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. - -**Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested. - -### 2. Warning - -**Community Impact**: A violation through a single incident or series of actions. - -**Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban. - -### 3. Temporary Ban - -**Community Impact**: A serious violation of community standards, including sustained inappropriate behavior. - -**Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban. - -### 4. Permanent Ban - -**Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. - -**Consequence**: A permanent ban from any sort of public interaction within the community. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.1, available at [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. - -Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder][Mozilla CoC]. - -For answers to common questions about this code of conduct, see the FAQ at [https://www.contributor-covenant.org/faq][FAQ]. Translations are available at [https://www.contributor-covenant.org/translations][translations]. - -[homepage]: https://www.contributor-covenant.org -[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html -[Mozilla CoC]: https://github.com/mozilla/diversity -[FAQ]: https://www.contributor-covenant.org/faq -[translations]: https://www.contributor-covenant.org/translations - diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 920ae3a9..00000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,120 +0,0 @@ -# Contributing - -Contributions are welcome, and they are greatly appreciated! Every little bit helps, and credit will always be given. - -## Environment setup - -Nothing easier! - -Fork and clone the repository, then: - -```bash -cd python -make setup -``` - -> NOTE: If it fails for some reason, you'll need to install [uv](https://github.com/astral-sh/uv) manually. -> -> You can install it with: -> -> ```bash -> curl -LsSf https://astral.sh/uv/install.sh | sh -> ``` -> -> Now you can try running `make setup` again, or simply `uv sync`. - -You now have the dependencies installed. - -Run `make help` to see all the available actions! - -## Tasks - -The entry-point to run commands and tasks is the `make` Python script, located in the `scripts` directory. Try running `make` to show the available commands and tasks. The *commands* do not need the Python dependencies to be installed, -while the *tasks* do. The cross-platform tasks are written in Python, thanks to [duty](https://github.com/pawamoy/duty). - -If you work in VSCode, we provide [an action to configure VSCode](https://pawamoy.github.io/copier-uv/work/#vscode-setup) for the project. - -## Development - -As usual: - -1. create a new branch: `git switch -c feature-or-bugfix-name` -1. edit the code and/or the documentation - -**Before committing:** - -1. run `make format` to auto-format the code -1. run `make check` to check everything (fix any warning) -1. run `make test` to run the tests (fix any issue) -1. if you updated the documentation or the project dependencies: - 1. run `make docs` - 1. go to http://localhost:8000 and check that everything looks good -1. follow our [commit message convention](#commit-message-convention) - -If you are unsure about how to fix or ignore a warning, just let the continuous integration fail, and we will help you during review. - -Don't bother updating the changelog, we will take care of this. - -## Commit message convention - -Commit messages must follow our convention based on the [Angular style](https://gist.github.com/stephenparish/9941e89d80e2bc58a153#format-of-the-commit-message) or the [Karma convention](https://karma-runner.github.io/4.0/dev/git-commit-msg.html): - -``` -[(scope)]: Subject - -[Body] -``` - -**Subject and body must be valid Markdown.** Subject must have proper casing (uppercase for first letter if it makes sense), but no dot at the end, and no punctuation in general. - -Scope and body are optional. Type can be: - -- `build`: About packaging, building wheels, etc. -- `chore`: About packaging or repo/files management. -- `ci`: About Continuous Integration. -- `deps`: Dependencies update. -- `docs`: About documentation. -- `feat`: New feature. -- `fix`: Bug fix. -- `perf`: About performance. -- `refactor`: Changes that are not features or bug fixes. -- `style`: A change in code style/format. -- `tests`: About tests. - -If you write a body, please add trailers at the end (for example issues and PR references, or co-authors), without relying on GitHub's flavored Markdown: - -``` -Body. - -Issue #10: https://github.com/namespace/project/issues/10 -Related to PR namespace/other-project#15: https://github.com/namespace/other-project/pull/15 -``` - -These "trailers" must appear at the end of the body, without any blank lines between them. The trailer title can contain any character except colons `:`. We expect a full URI for each trailer, not just GitHub autolinks (for example, full GitHub URLs for commits and issues, not the hash or the #issue-number). - -We do not enforce a line length on commit messages summary and body, but please avoid very long summaries, and very long lines in the body, unless they are part of code blocks that must not be wrapped. - -## Pull requests guidelines - -Link to any related issue in the Pull Request message. - -During the review, we recommend using fixups: - -```bash -# SHA is the SHA of the commit you want to fix -git commit --fixup=SHA -``` - -Once all the changes are approved, you can squash your commits: - -```bash -git rebase -i --autosquash main -``` - -And force-push: - -```bash -git push -f -``` - -If this seems all too complicated, you can push or force-push each new commit, and we will squash them ourselves if needed, before merging. diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 8becbc45..00000000 --- a/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -ISC License - -Copyright (c) 2021, Timothée Mazzucotelli - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/Makefile b/Makefile deleted file mode 100644 index 5e88121d..00000000 --- a/Makefile +++ /dev/null @@ -1,28 +0,0 @@ -# If you have `direnv` loaded in your shell, and allow it in the repository, -# the `make` command will point at the `scripts/make` shell script. -# This Makefile is just here to allow auto-completion in the terminal. - -actions = \ - allrun \ - changelog \ - check \ - check-api \ - check-docs \ - check-quality \ - check-types \ - clean \ - coverage \ - docs \ - docs-deploy \ - format \ - help \ - multirun \ - release \ - run \ - setup \ - test \ - vscode - -.PHONY: $(actions) -$(actions): - @python scripts/make "$@" diff --git a/README.md b/README.md deleted file mode 100644 index 937a3a84..00000000 --- a/README.md +++ /dev/null @@ -1,79 +0,0 @@ -

mkdocstrings-python

- -

A Python handler for mkdocstrings.

- -[![ci](https://github.com/mkdocstrings/python/workflows/ci/badge.svg)](https://github.com/mkdocstrings/python/actions?query=workflow%3Aci) -[![documentation](https://img.shields.io/badge/docs-mkdocs-708FCC.svg?style=flat)](https://mkdocstrings.github.io/python/) -[![pypi version](https://img.shields.io/pypi/v/mkdocstrings-python.svg)](https://pypi.org/project/mkdocstrings-python/) -[![gitter](https://badges.gitter.im/join%20chat.svg)](https://app.gitter.im/#/room/#python:gitter.im) - ---- - -

- -The Python handler uses [Griffe](https://mkdocstrings.github.io/griffe) -to collect documentation from Python source code. -The word "griffe" can sometimes be used instead of "signature" in French. -Griffe is able to visit the Abstract Syntax Tree (AST) of the source code to extract useful information. -It is also able to execute the code (by importing it) and introspect objects in memory -when source code is not available. Finally, it can parse docstrings following different styles. - -## Installation - -You can install this handler as a *mkdocstrings* extra: - -```toml title="pyproject.toml" -# PEP 621 dependencies declaration -# adapt to your dependencies manager -[project] -dependencies = [ - "mkdocstrings[python]>=0.18", -] -``` - -You can also explicitly depend on the handler: - -```toml title="pyproject.toml" -# PEP 621 dependencies declaration -# adapt to your dependencies manager -[project] -dependencies = [ - "mkdocstrings-python", -] -``` - -## Preview - - -![mkdocstrings_python_gif](https://user-images.githubusercontent.com/3999221/77157838-7184db80-6aa2-11ea-9f9a-fe77405202de.gif) - -## Features - -- **Data collection from source code**: collection of the object-tree and the docstrings is done thanks to - [Griffe](https://github.com/mkdocstrings/griffe). - -- **Support for type annotations:** Griffe collects your type annotations and *mkdocstrings* uses them - to display parameter types or return types. It is even able to automatically add cross-references - to other objects from your API, from the standard library or third-party libraries! - See [how to load inventories](https://mkdocstrings.github.io/usage/#cross-references-to-other-projects-inventories) to enable it. - -- **Recursive documentation of Python objects:** just use the module dotted-path as an identifier, and you get the full - module docs. You don't need to inject documentation for each class, function, etc. - -- **Support for documented attributes:** attributes (variables) followed by a docstring (triple-quoted string) will - be recognized by Griffe in modules, classes and even in `__init__` methods. - -- **Multiple docstring-styles support:** common support for Google-style, Numpydoc-style, - and Sphinx-style docstrings. See [Griffe's documentation](https://mkdocstrings.github.io/griffe/docstrings/) on docstrings support. - -- **Admonition support in Google docstrings:** blocks like `Note:` or `Warning:` will be transformed - to their [admonition](https://squidfunk.github.io/mkdocs-material/reference/admonitions/) equivalent. - *We do not support nested admonitions in docstrings!* - -- **Every object has a TOC entry:** we render a heading for each object, meaning *MkDocs* picks them into the Table - of Contents, which is nicely displayed by the Material theme. Thanks to *mkdocstrings* cross-reference ability, - you can reference other objects within your docstrings, with the classic Markdown syntax: - `[this object][package.module.object]` or directly with `[package.module.object][]` - -- **Source code display:** *mkdocstrings* can add a collapsible div containing the highlighted source code - of the Python object. diff --git a/assets/_markdown_exec_pyodide.css b/assets/_markdown_exec_pyodide.css new file mode 100644 index 00000000..00dac3da --- /dev/null +++ b/assets/_markdown_exec_pyodide.css @@ -0,0 +1,55 @@ +html[data-theme="light"] { + @import "https://cdn.jsdelivr.net/npm/highlightjs-themes@1.0.0/tomorrow.css" +} + +html[data-theme="dark"] { + @import "https://cdn.jsdelivr.net/npm/highlightjs-themes@1.0.0/tomorrow-night-blue.min.css" +} + + +.ace_gutter { + z-index: 1; +} + +.pyodide-editor { + width: 100%; + min-height: 200px; + max-height: 400px; + font-size: .85em; +} + +.pyodide-editor-bar { + color: var(--md-primary-bg-color); + background-color: var(--md-primary-fg-color); + width: 100%; + font: monospace; + font-size: 0.75em; + padding: 2px 0 2px; +} + +.pyodide-bar-item { + padding: 0 18px 0; + display: inline-block; + width: 50%; +} + +.pyodide pre { + margin: 0; +} + +.pyodide-output { + width: 100%; + margin-bottom: -15px; + min-height: 46px; + max-height: 400px +} + +.pyodide-clickable { + cursor: pointer; + text-align: right; +} + +/* For themes other than Material. */ +.pyodide .twemoji svg { + width: 1rem; +} diff --git a/assets/_markdown_exec_pyodide.js b/assets/_markdown_exec_pyodide.js new file mode 100644 index 00000000..da3954b3 --- /dev/null +++ b/assets/_markdown_exec_pyodide.js @@ -0,0 +1,117 @@ +var _sessions = {}; + +function getSession(name, pyodide) { + if (!(name in _sessions)) { + _sessions[name] = pyodide.globals.get("dict")(); + } + return _sessions[name]; +} + +function writeOutput(element, string) { + element.innerHTML += string + '\n'; +} + +function clearOutput(element) { + element.innerHTML = ''; +} + +async function evaluatePython(pyodide, editor, output, session) { + pyodide.setStdout({ batched: (string) => { writeOutput(output, new Option(string).innerHTML); } }); + let result, code = editor.getValue(); + clearOutput(output); + try { + result = await pyodide.runPythonAsync(code, { globals: getSession(session, pyodide) }); + } catch (error) { + writeOutput(output, new Option(error.toString()).innerHTML); + } + if (result) writeOutput(output, new Option(result).innerHTML); + hljs.highlightElement(output); +} + +async function initPyodide() { + try { + let pyodide = await loadPyodide(); + await pyodide.loadPackage("micropip"); + return pyodide; + } catch(error) { + return null; + } +} + +function getTheme() { + return document.body.getAttribute('data-md-color-scheme'); +} + +function setTheme(editor, currentTheme, light, dark) { + // https://gist.github.com/RyanNutt/cb8d60997d97905f0b2aea6c3b5c8ee0 + if (currentTheme === "default") { + editor.setTheme("ace/theme/" + light); + document.querySelector(`link[title="light"]`).removeAttribute("disabled"); + document.querySelector(`link[title="dark"]`).setAttribute("disabled", "disabled"); + } else if (currentTheme === "slate") { + editor.setTheme("ace/theme/" + dark); + document.querySelector(`link[title="dark"]`).removeAttribute("disabled"); + document.querySelector(`link[title="light"]`).setAttribute("disabled", "disabled"); + } +} + +function updateTheme(editor, light, dark) { + // Create a new MutationObserver instance + const observer = new MutationObserver((mutations) => { + // Loop through the mutations that occurred + mutations.forEach((mutation) => { + // Check if the mutation was a change to the data-md-color-scheme attribute + if (mutation.attributeName === 'data-md-color-scheme') { + // Get the new value of the attribute + const newColorScheme = mutation.target.getAttribute('data-md-color-scheme'); + // Update the editor theme + setTheme(editor, newColorScheme, light, dark); + } + }); + }); + + // Configure the observer to watch for changes to the data-md-color-scheme attribute + observer.observe(document.body, { + attributes: true, + attributeFilter: ['data-md-color-scheme'], + }); +} + +async function setupPyodide(idPrefix, install = null, themeLight = 'tomorrow', themeDark = 'tomorrow_night', session = null) { + const editor = ace.edit(idPrefix + "editor"); + const run = document.getElementById(idPrefix + "run"); + const clear = document.getElementById(idPrefix + "clear"); + const output = document.getElementById(idPrefix + "output"); + + updateTheme(editor, themeLight, themeDark); + + editor.session.setMode("ace/mode/python"); + setTheme(editor, getTheme(), themeLight, themeDark); + + writeOutput(output, "Initializing..."); + let pyodide = await pyodidePromise; + if (install && install.length) { + try { + micropip = pyodide.pyimport("micropip"); + for (const package of install) + await micropip.install(package); + clearOutput(output); + } catch (error) { + clearOutput(output); + writeOutput(output, `Could not install one or more packages: ${install.join(", ")}\n`); + writeOutput(output, new Option(error.toString()).innerHTML); + } + } else { + clearOutput(output); + } + run.onclick = () => evaluatePython(pyodide, editor, output, session); + clear.onclick = () => clearOutput(output); + output.parentElement.parentElement.addEventListener("keydown", (event) => { + if (event.ctrlKey && event.key.toLowerCase() === 'enter') { + event.preventDefault(); + run.click(); + } + }); +} + +var pyodidePromise = initPyodide(); diff --git a/src/mkdocstrings_handlers/python/templates/material/style.css b/assets/_mkdocstrings.css similarity index 78% rename from src/mkdocstrings_handlers/python/templates/material/style.css rename to assets/_mkdocstrings.css index b8c3e639..d5c004a8 100644 --- a/src/mkdocstrings_handlers/python/templates/material/style.css +++ b/assets/_mkdocstrings.css @@ -1,3 +1,4 @@ + /* Avoid breaking parameter names, etc. in table cells. */ .doc-contents td code { word-break: normal !important; @@ -178,3 +179,27 @@ code.doc-symbol-module::after { color: inherit; border-bottom: 1px dotted currentcolor; } + +/* Source code blocks (admonitions). */ +:root { + --md-admonition-icon--mkdocstrings-source: url('data:image/svg+xml;charset=utf-8,') +} +.md-typeset .admonition.mkdocstrings-source, +.md-typeset details.mkdocstrings-source { + border: none; + padding: 0; +} +.md-typeset .admonition.mkdocstrings-source:focus-within, +.md-typeset details.mkdocstrings-source:focus-within { + box-shadow: none; +} +.md-typeset .mkdocstrings-source > .admonition-title, +.md-typeset .mkdocstrings-source > summary { + background-color: inherit; +} +.md-typeset .mkdocstrings-source > .admonition-title::before, +.md-typeset .mkdocstrings-source > summary::before { + background-color: var(--md-default-fg-color); + -webkit-mask-image: var(--md-admonition-icon--mkdocstrings-source); + mask-image: var(--md-admonition-icon--mkdocstrings-source); +} diff --git a/assets/images/favicon.png b/assets/images/favicon.png new file mode 100644 index 00000000..1cf13b9f Binary files /dev/null and b/assets/images/favicon.png differ diff --git a/assets/javascripts/bundle.eb438620.min.js b/assets/javascripts/bundle.eb438620.min.js new file mode 100644 index 00000000..b7df6e3e --- /dev/null +++ b/assets/javascripts/bundle.eb438620.min.js @@ -0,0 +1,3 @@ +"use strict";(()=>{var Zi=Object.create;var _r=Object.defineProperty;var ea=Object.getOwnPropertyDescriptor;var ta=Object.getOwnPropertyNames,Bt=Object.getOwnPropertySymbols,ra=Object.getPrototypeOf,Ar=Object.prototype.hasOwnProperty,bo=Object.prototype.propertyIsEnumerable;var ho=(e,t,r)=>t in e?_r(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,P=(e,t)=>{for(var r in t||(t={}))Ar.call(t,r)&&ho(e,r,t[r]);if(Bt)for(var r of Bt(t))bo.call(t,r)&&ho(e,r,t[r]);return e};var vo=(e,t)=>{var r={};for(var o in e)Ar.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(e!=null&&Bt)for(var o of Bt(e))t.indexOf(o)<0&&bo.call(e,o)&&(r[o]=e[o]);return r};var Cr=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var oa=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of ta(t))!Ar.call(e,n)&&n!==r&&_r(e,n,{get:()=>t[n],enumerable:!(o=ea(t,n))||o.enumerable});return e};var $t=(e,t,r)=>(r=e!=null?Zi(ra(e)):{},oa(t||!e||!e.__esModule?_r(r,"default",{value:e,enumerable:!0}):r,e));var go=(e,t,r)=>new Promise((o,n)=>{var i=c=>{try{a(r.next(c))}catch(p){n(p)}},s=c=>{try{a(r.throw(c))}catch(p){n(p)}},a=c=>c.done?o(c.value):Promise.resolve(c.value).then(i,s);a((r=r.apply(e,t)).next())});var xo=Cr((kr,yo)=>{(function(e,t){typeof kr=="object"&&typeof yo!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(kr,function(){"use strict";function e(r){var o=!0,n=!1,i=null,s={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function a(k){return!!(k&&k!==document&&k.nodeName!=="HTML"&&k.nodeName!=="BODY"&&"classList"in k&&"contains"in k.classList)}function c(k){var ut=k.type,je=k.tagName;return!!(je==="INPUT"&&s[ut]&&!k.readOnly||je==="TEXTAREA"&&!k.readOnly||k.isContentEditable)}function p(k){k.classList.contains("focus-visible")||(k.classList.add("focus-visible"),k.setAttribute("data-focus-visible-added",""))}function l(k){k.hasAttribute("data-focus-visible-added")&&(k.classList.remove("focus-visible"),k.removeAttribute("data-focus-visible-added"))}function f(k){k.metaKey||k.altKey||k.ctrlKey||(a(r.activeElement)&&p(r.activeElement),o=!0)}function u(k){o=!1}function d(k){a(k.target)&&(o||c(k.target))&&p(k.target)}function v(k){a(k.target)&&(k.target.classList.contains("focus-visible")||k.target.hasAttribute("data-focus-visible-added"))&&(n=!0,window.clearTimeout(i),i=window.setTimeout(function(){n=!1},100),l(k.target))}function S(k){document.visibilityState==="hidden"&&(n&&(o=!0),X())}function X(){document.addEventListener("mousemove",ee),document.addEventListener("mousedown",ee),document.addEventListener("mouseup",ee),document.addEventListener("pointermove",ee),document.addEventListener("pointerdown",ee),document.addEventListener("pointerup",ee),document.addEventListener("touchmove",ee),document.addEventListener("touchstart",ee),document.addEventListener("touchend",ee)}function re(){document.removeEventListener("mousemove",ee),document.removeEventListener("mousedown",ee),document.removeEventListener("mouseup",ee),document.removeEventListener("pointermove",ee),document.removeEventListener("pointerdown",ee),document.removeEventListener("pointerup",ee),document.removeEventListener("touchmove",ee),document.removeEventListener("touchstart",ee),document.removeEventListener("touchend",ee)}function ee(k){k.target.nodeName&&k.target.nodeName.toLowerCase()==="html"||(o=!1,re())}document.addEventListener("keydown",f,!0),document.addEventListener("mousedown",u,!0),document.addEventListener("pointerdown",u,!0),document.addEventListener("touchstart",u,!0),document.addEventListener("visibilitychange",S,!0),X(),r.addEventListener("focus",d,!0),r.addEventListener("blur",v,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var ro=Cr((jy,Rn)=>{"use strict";var qa=/["'&<>]/;Rn.exports=Ka;function Ka(e){var t=""+e,r=qa.exec(t);if(!r)return t;var o,n="",i=0,s=0;for(i=r.index;i{(function(t,r){typeof Nt=="object"&&typeof io=="object"?io.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Nt=="object"?Nt.ClipboardJS=r():t.ClipboardJS=r()})(Nt,function(){return function(){var e={686:function(o,n,i){"use strict";i.d(n,{default:function(){return Xi}});var s=i(279),a=i.n(s),c=i(370),p=i.n(c),l=i(817),f=i.n(l);function u(q){try{return document.execCommand(q)}catch(C){return!1}}var d=function(C){var _=f()(C);return u("cut"),_},v=d;function S(q){var C=document.documentElement.getAttribute("dir")==="rtl",_=document.createElement("textarea");_.style.fontSize="12pt",_.style.border="0",_.style.padding="0",_.style.margin="0",_.style.position="absolute",_.style[C?"right":"left"]="-9999px";var D=window.pageYOffset||document.documentElement.scrollTop;return _.style.top="".concat(D,"px"),_.setAttribute("readonly",""),_.value=q,_}var X=function(C,_){var D=S(C);_.container.appendChild(D);var N=f()(D);return u("copy"),D.remove(),N},re=function(C){var _=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},D="";return typeof C=="string"?D=X(C,_):C instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(C==null?void 0:C.type)?D=X(C.value,_):(D=f()(C),u("copy")),D},ee=re;function k(q){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?k=function(_){return typeof _}:k=function(_){return _&&typeof Symbol=="function"&&_.constructor===Symbol&&_!==Symbol.prototype?"symbol":typeof _},k(q)}var ut=function(){var C=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},_=C.action,D=_===void 0?"copy":_,N=C.container,G=C.target,We=C.text;if(D!=="copy"&&D!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(G!==void 0)if(G&&k(G)==="object"&&G.nodeType===1){if(D==="copy"&&G.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(D==="cut"&&(G.hasAttribute("readonly")||G.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(We)return ee(We,{container:N});if(G)return D==="cut"?v(G):ee(G,{container:N})},je=ut;function R(q){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?R=function(_){return typeof _}:R=function(_){return _&&typeof Symbol=="function"&&_.constructor===Symbol&&_!==Symbol.prototype?"symbol":typeof _},R(q)}function se(q,C){if(!(q instanceof C))throw new TypeError("Cannot call a class as a function")}function ce(q,C){for(var _=0;_0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof N.action=="function"?N.action:this.defaultAction,this.target=typeof N.target=="function"?N.target:this.defaultTarget,this.text=typeof N.text=="function"?N.text:this.defaultText,this.container=R(N.container)==="object"?N.container:document.body}},{key:"listenClick",value:function(N){var G=this;this.listener=p()(N,"click",function(We){return G.onClick(We)})}},{key:"onClick",value:function(N){var G=N.delegateTarget||N.currentTarget,We=this.action(G)||"copy",Yt=je({action:We,container:this.container,target:this.target(G),text:this.text(G)});this.emit(Yt?"success":"error",{action:We,text:Yt,trigger:G,clearSelection:function(){G&&G.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(N){return Mr("action",N)}},{key:"defaultTarget",value:function(N){var G=Mr("target",N);if(G)return document.querySelector(G)}},{key:"defaultText",value:function(N){return Mr("text",N)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(N){var G=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return ee(N,G)}},{key:"cut",value:function(N){return v(N)}},{key:"isSupported",value:function(){var N=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],G=typeof N=="string"?[N]:N,We=!!document.queryCommandSupported;return G.forEach(function(Yt){We=We&&!!document.queryCommandSupported(Yt)}),We}}]),_}(a()),Xi=Ji},828:function(o){var n=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function s(a,c){for(;a&&a.nodeType!==n;){if(typeof a.matches=="function"&&a.matches(c))return a;a=a.parentNode}}o.exports=s},438:function(o,n,i){var s=i(828);function a(l,f,u,d,v){var S=p.apply(this,arguments);return l.addEventListener(u,S,v),{destroy:function(){l.removeEventListener(u,S,v)}}}function c(l,f,u,d,v){return typeof l.addEventListener=="function"?a.apply(null,arguments):typeof u=="function"?a.bind(null,document).apply(null,arguments):(typeof l=="string"&&(l=document.querySelectorAll(l)),Array.prototype.map.call(l,function(S){return a(S,f,u,d,v)}))}function p(l,f,u,d){return function(v){v.delegateTarget=s(v.target,f),v.delegateTarget&&d.call(l,v)}}o.exports=c},879:function(o,n){n.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},n.nodeList=function(i){var s=Object.prototype.toString.call(i);return i!==void 0&&(s==="[object NodeList]"||s==="[object HTMLCollection]")&&"length"in i&&(i.length===0||n.node(i[0]))},n.string=function(i){return typeof i=="string"||i instanceof String},n.fn=function(i){var s=Object.prototype.toString.call(i);return s==="[object Function]"}},370:function(o,n,i){var s=i(879),a=i(438);function c(u,d,v){if(!u&&!d&&!v)throw new Error("Missing required arguments");if(!s.string(d))throw new TypeError("Second argument must be a String");if(!s.fn(v))throw new TypeError("Third argument must be a Function");if(s.node(u))return p(u,d,v);if(s.nodeList(u))return l(u,d,v);if(s.string(u))return f(u,d,v);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function p(u,d,v){return u.addEventListener(d,v),{destroy:function(){u.removeEventListener(d,v)}}}function l(u,d,v){return Array.prototype.forEach.call(u,function(S){S.addEventListener(d,v)}),{destroy:function(){Array.prototype.forEach.call(u,function(S){S.removeEventListener(d,v)})}}}function f(u,d,v){return a(document.body,u,d,v)}o.exports=c},817:function(o){function n(i){var s;if(i.nodeName==="SELECT")i.focus(),s=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var a=i.hasAttribute("readonly");a||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),a||i.removeAttribute("readonly"),s=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var c=window.getSelection(),p=document.createRange();p.selectNodeContents(i),c.removeAllRanges(),c.addRange(p),s=c.toString()}return s}o.exports=n},279:function(o){function n(){}n.prototype={on:function(i,s,a){var c=this.e||(this.e={});return(c[i]||(c[i]=[])).push({fn:s,ctx:a}),this},once:function(i,s,a){var c=this;function p(){c.off(i,p),s.apply(a,arguments)}return p._=s,this.on(i,p,a)},emit:function(i){var s=[].slice.call(arguments,1),a=((this.e||(this.e={}))[i]||[]).slice(),c=0,p=a.length;for(c;c0&&i[i.length-1])&&(p[0]===6||p[0]===2)){r=0;continue}if(p[0]===3&&(!i||p[1]>i[0]&&p[1]=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function K(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var o=r.call(e),n,i=[],s;try{for(;(t===void 0||t-- >0)&&!(n=o.next()).done;)i.push(n.value)}catch(a){s={error:a}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(s)throw s.error}}return i}function B(e,t,r){if(r||arguments.length===2)for(var o=0,n=t.length,i;o1||c(d,S)})},v&&(n[d]=v(n[d])))}function c(d,v){try{p(o[d](v))}catch(S){u(i[0][3],S)}}function p(d){d.value instanceof dt?Promise.resolve(d.value.v).then(l,f):u(i[0][2],d)}function l(d){c("next",d)}function f(d){c("throw",d)}function u(d,v){d(v),i.shift(),i.length&&c(i[0][0],i[0][1])}}function To(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof Oe=="function"?Oe(e):e[Symbol.iterator](),r={},o("next"),o("throw"),o("return"),r[Symbol.asyncIterator]=function(){return this},r);function o(i){r[i]=e[i]&&function(s){return new Promise(function(a,c){s=e[i](s),n(a,c,s.done,s.value)})}}function n(i,s,a,c){Promise.resolve(c).then(function(p){i({value:p,done:a})},s)}}function I(e){return typeof e=="function"}function yt(e){var t=function(o){Error.call(o),o.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var Jt=yt(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: +`+r.map(function(o,n){return n+1+") "+o.toString()}).join(` + `):"",this.name="UnsubscriptionError",this.errors=r}});function Ze(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var qe=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,o,n,i;if(!this.closed){this.closed=!0;var s=this._parentage;if(s)if(this._parentage=null,Array.isArray(s))try{for(var a=Oe(s),c=a.next();!c.done;c=a.next()){var p=c.value;p.remove(this)}}catch(S){t={error:S}}finally{try{c&&!c.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}else s.remove(this);var l=this.initialTeardown;if(I(l))try{l()}catch(S){i=S instanceof Jt?S.errors:[S]}var f=this._finalizers;if(f){this._finalizers=null;try{for(var u=Oe(f),d=u.next();!d.done;d=u.next()){var v=d.value;try{So(v)}catch(S){i=i!=null?i:[],S instanceof Jt?i=B(B([],K(i)),K(S.errors)):i.push(S)}}}catch(S){o={error:S}}finally{try{d&&!d.done&&(n=u.return)&&n.call(u)}finally{if(o)throw o.error}}}if(i)throw new Jt(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)So(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&Ze(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&Ze(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var $r=qe.EMPTY;function Xt(e){return e instanceof qe||e&&"closed"in e&&I(e.remove)&&I(e.add)&&I(e.unsubscribe)}function So(e){I(e)?e():e.unsubscribe()}var De={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var xt={setTimeout:function(e,t){for(var r=[],o=2;o0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var o=this,n=this,i=n.hasError,s=n.isStopped,a=n.observers;return i||s?$r:(this.currentObservers=null,a.push(r),new qe(function(){o.currentObservers=null,Ze(a,r)}))},t.prototype._checkFinalizedStatuses=function(r){var o=this,n=o.hasError,i=o.thrownError,s=o.isStopped;n?r.error(i):s&&r.complete()},t.prototype.asObservable=function(){var r=new F;return r.source=this,r},t.create=function(r,o){return new Ho(r,o)},t}(F);var Ho=function(e){ie(t,e);function t(r,o){var n=e.call(this)||this;return n.destination=r,n.source=o,n}return t.prototype.next=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.next)===null||n===void 0||n.call(o,r)},t.prototype.error=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.error)===null||n===void 0||n.call(o,r)},t.prototype.complete=function(){var r,o;(o=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||o===void 0||o.call(r)},t.prototype._subscribe=function(r){var o,n;return(n=(o=this.source)===null||o===void 0?void 0:o.subscribe(r))!==null&&n!==void 0?n:$r},t}(T);var jr=function(e){ie(t,e);function t(r){var o=e.call(this)||this;return o._value=r,o}return Object.defineProperty(t.prototype,"value",{get:function(){return this.getValue()},enumerable:!1,configurable:!0}),t.prototype._subscribe=function(r){var o=e.prototype._subscribe.call(this,r);return!o.closed&&r.next(this._value),o},t.prototype.getValue=function(){var r=this,o=r.hasError,n=r.thrownError,i=r._value;if(o)throw n;return this._throwIfClosed(),i},t.prototype.next=function(r){e.prototype.next.call(this,this._value=r)},t}(T);var Rt={now:function(){return(Rt.delegate||Date).now()},delegate:void 0};var It=function(e){ie(t,e);function t(r,o,n){r===void 0&&(r=1/0),o===void 0&&(o=1/0),n===void 0&&(n=Rt);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=o,i._timestampProvider=n,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=o===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,o),i}return t.prototype.next=function(r){var o=this,n=o.isStopped,i=o._buffer,s=o._infiniteTimeWindow,a=o._timestampProvider,c=o._windowTime;n||(i.push(r),!s&&i.push(a.now()+c)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var o=this._innerSubscribe(r),n=this,i=n._infiniteTimeWindow,s=n._buffer,a=s.slice(),c=0;c0?e.prototype.schedule.call(this,r,o):(this.delay=o,this.state=r,this.scheduler.flush(this),this)},t.prototype.execute=function(r,o){return o>0||this.closed?e.prototype.execute.call(this,r,o):this._execute(r,o)},t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!=null&&n>0||n==null&&this.delay>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.flush(this),0)},t}(St);var Ro=function(e){ie(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t}(Ot);var Dr=new Ro(Po);var Io=function(e){ie(t,e);function t(r,o){var n=e.call(this,r,o)||this;return n.scheduler=r,n.work=o,n}return t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!==null&&n>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.actions.push(this),r._scheduled||(r._scheduled=Tt.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,o,n){var i;if(n===void 0&&(n=0),n!=null?n>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,o,n);var s=r.actions;o!=null&&o===r._scheduled&&((i=s[s.length-1])===null||i===void 0?void 0:i.id)!==o&&(Tt.cancelAnimationFrame(o),r._scheduled=void 0)},t}(St);var Fo=function(e){ie(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var o;r?o=r.id:(o=this._scheduled,this._scheduled=void 0);var n=this.actions,i;r=r||n.shift();do if(i=r.execute(r.state,r.delay))break;while((r=n[0])&&r.id===o&&n.shift());if(this._active=!1,i){for(;(r=n[0])&&r.id===o&&n.shift();)r.unsubscribe();throw i}},t}(Ot);var ye=new Fo(Io);var y=new F(function(e){return e.complete()});function tr(e){return e&&I(e.schedule)}function Vr(e){return e[e.length-1]}function pt(e){return I(Vr(e))?e.pop():void 0}function Fe(e){return tr(Vr(e))?e.pop():void 0}function rr(e,t){return typeof Vr(e)=="number"?e.pop():t}var Lt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function or(e){return I(e==null?void 0:e.then)}function nr(e){return I(e[wt])}function ir(e){return Symbol.asyncIterator&&I(e==null?void 0:e[Symbol.asyncIterator])}function ar(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function fa(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var sr=fa();function cr(e){return I(e==null?void 0:e[sr])}function pr(e){return wo(this,arguments,function(){var r,o,n,i;return Gt(this,function(s){switch(s.label){case 0:r=e.getReader(),s.label=1;case 1:s.trys.push([1,,9,10]),s.label=2;case 2:return[4,dt(r.read())];case 3:return o=s.sent(),n=o.value,i=o.done,i?[4,dt(void 0)]:[3,5];case 4:return[2,s.sent()];case 5:return[4,dt(n)];case 6:return[4,s.sent()];case 7:return s.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function lr(e){return I(e==null?void 0:e.getReader)}function U(e){if(e instanceof F)return e;if(e!=null){if(nr(e))return ua(e);if(Lt(e))return da(e);if(or(e))return ha(e);if(ir(e))return jo(e);if(cr(e))return ba(e);if(lr(e))return va(e)}throw ar(e)}function ua(e){return new F(function(t){var r=e[wt]();if(I(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function da(e){return new F(function(t){for(var r=0;r=2;return function(o){return o.pipe(e?g(function(n,i){return e(n,i,o)}):be,Ee(1),r?Qe(t):tn(function(){return new fr}))}}function Yr(e){return e<=0?function(){return y}:E(function(t,r){var o=[];t.subscribe(w(r,function(n){o.push(n),e=2,!0))}function le(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new T}:t,o=e.resetOnError,n=o===void 0?!0:o,i=e.resetOnComplete,s=i===void 0?!0:i,a=e.resetOnRefCountZero,c=a===void 0?!0:a;return function(p){var l,f,u,d=0,v=!1,S=!1,X=function(){f==null||f.unsubscribe(),f=void 0},re=function(){X(),l=u=void 0,v=S=!1},ee=function(){var k=l;re(),k==null||k.unsubscribe()};return E(function(k,ut){d++,!S&&!v&&X();var je=u=u!=null?u:r();ut.add(function(){d--,d===0&&!S&&!v&&(f=Br(ee,c))}),je.subscribe(ut),!l&&d>0&&(l=new bt({next:function(R){return je.next(R)},error:function(R){S=!0,X(),f=Br(re,n,R),je.error(R)},complete:function(){v=!0,X(),f=Br(re,s),je.complete()}}),U(k).subscribe(l))})(p)}}function Br(e,t){for(var r=[],o=2;oe.next(document)),e}function M(e,t=document){return Array.from(t.querySelectorAll(e))}function j(e,t=document){let r=ue(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function ue(e,t=document){return t.querySelector(e)||void 0}function Ne(){var e,t,r,o;return(o=(r=(t=(e=document.activeElement)==null?void 0:e.shadowRoot)==null?void 0:t.activeElement)!=null?r:document.activeElement)!=null?o:void 0}var Ra=L(h(document.body,"focusin"),h(document.body,"focusout")).pipe(Ae(1),Q(void 0),m(()=>Ne()||document.body),Z(1));function Ye(e){return Ra.pipe(m(t=>e.contains(t)),Y())}function it(e,t){return H(()=>L(h(e,"mouseenter").pipe(m(()=>!0)),h(e,"mouseleave").pipe(m(()=>!1))).pipe(t?jt(r=>He(+!r*t)):be,Q(e.matches(":hover"))))}function sn(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)sn(e,r)}function x(e,t,...r){let o=document.createElement(e);if(t)for(let n of Object.keys(t))typeof t[n]!="undefined"&&(typeof t[n]!="boolean"?o.setAttribute(n,t[n]):o.setAttribute(n,""));for(let n of r)sn(o,n);return o}function br(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function _t(e){let t=x("script",{src:e});return H(()=>(document.head.appendChild(t),L(h(t,"load"),h(t,"error").pipe(b(()=>Nr(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(m(()=>{}),A(()=>document.head.removeChild(t)),Ee(1))))}var cn=new T,Ia=H(()=>typeof ResizeObserver=="undefined"?_t("https://unpkg.com/resize-observer-polyfill"):$(void 0)).pipe(m(()=>new ResizeObserver(e=>e.forEach(t=>cn.next(t)))),b(e=>L(tt,$(e)).pipe(A(()=>e.disconnect()))),Z(1));function de(e){return{width:e.offsetWidth,height:e.offsetHeight}}function Le(e){let t=e;for(;t.clientWidth===0&&t.parentElement;)t=t.parentElement;return Ia.pipe(O(r=>r.observe(t)),b(r=>cn.pipe(g(o=>o.target===t),A(()=>r.unobserve(t)))),m(()=>de(e)),Q(de(e)))}function At(e){return{width:e.scrollWidth,height:e.scrollHeight}}function vr(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}function pn(e){let t=[],r=e.parentElement;for(;r;)(e.clientWidth>r.clientWidth||e.clientHeight>r.clientHeight)&&t.push(r),r=(e=r).parentElement;return t.length===0&&t.push(document.documentElement),t}function Be(e){return{x:e.offsetLeft,y:e.offsetTop}}function ln(e){let t=e.getBoundingClientRect();return{x:t.x+window.scrollX,y:t.y+window.scrollY}}function mn(e){return L(h(window,"load"),h(window,"resize")).pipe($e(0,ye),m(()=>Be(e)),Q(Be(e)))}function gr(e){return{x:e.scrollLeft,y:e.scrollTop}}function Ge(e){return L(h(e,"scroll"),h(window,"scroll"),h(window,"resize")).pipe($e(0,ye),m(()=>gr(e)),Q(gr(e)))}var fn=new T,Fa=H(()=>$(new IntersectionObserver(e=>{for(let t of e)fn.next(t)},{threshold:0}))).pipe(b(e=>L(tt,$(e)).pipe(A(()=>e.disconnect()))),Z(1));function mt(e){return Fa.pipe(O(t=>t.observe(e)),b(t=>fn.pipe(g(({target:r})=>r===e),A(()=>t.unobserve(e)),m(({isIntersecting:r})=>r))))}function un(e,t=16){return Ge(e).pipe(m(({y:r})=>{let o=de(e),n=At(e);return r>=n.height-o.height-t}),Y())}var yr={drawer:j("[data-md-toggle=drawer]"),search:j("[data-md-toggle=search]")};function dn(e){return yr[e].checked}function at(e,t){yr[e].checked!==t&&yr[e].click()}function Je(e){let t=yr[e];return h(t,"change").pipe(m(()=>t.checked),Q(t.checked))}function ja(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function Ua(){return L(h(window,"compositionstart").pipe(m(()=>!0)),h(window,"compositionend").pipe(m(()=>!1))).pipe(Q(!1))}function hn(){let e=h(window,"keydown").pipe(g(t=>!(t.metaKey||t.ctrlKey)),m(t=>({mode:dn("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),g(({mode:t,type:r})=>{if(t==="global"){let o=Ne();if(typeof o!="undefined")return!ja(o,r)}return!0}),le());return Ua().pipe(b(t=>t?y:e))}function we(){return new URL(location.href)}function st(e,t=!1){if(V("navigation.instant")&&!t){let r=x("a",{href:e.href});document.body.appendChild(r),r.click(),r.remove()}else location.href=e.href}function bn(){return new T}function vn(){return location.hash.slice(1)}function gn(e){let t=x("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Zr(e){return L(h(window,"hashchange"),e).pipe(m(vn),Q(vn()),g(t=>t.length>0),Z(1))}function yn(e){return Zr(e).pipe(m(t=>ue(`[id="${t}"]`)),g(t=>typeof t!="undefined"))}function Wt(e){let t=matchMedia(e);return ur(r=>t.addListener(()=>r(t.matches))).pipe(Q(t.matches))}function xn(){let e=matchMedia("print");return L(h(window,"beforeprint").pipe(m(()=>!0)),h(window,"afterprint").pipe(m(()=>!1))).pipe(Q(e.matches))}function eo(e,t){return e.pipe(b(r=>r?t():y))}function to(e,t){return new F(r=>{let o=new XMLHttpRequest;return o.open("GET",`${e}`),o.responseType="blob",o.addEventListener("load",()=>{o.status>=200&&o.status<300?(r.next(o.response),r.complete()):r.error(new Error(o.statusText))}),o.addEventListener("error",()=>{r.error(new Error("Network error"))}),o.addEventListener("abort",()=>{r.complete()}),typeof(t==null?void 0:t.progress$)!="undefined"&&(o.addEventListener("progress",n=>{var i;if(n.lengthComputable)t.progress$.next(n.loaded/n.total*100);else{let s=(i=o.getResponseHeader("Content-Length"))!=null?i:0;t.progress$.next(n.loaded/+s*100)}}),t.progress$.next(5)),o.send(),()=>o.abort()})}function ze(e,t){return to(e,t).pipe(b(r=>r.text()),m(r=>JSON.parse(r)),Z(1))}function xr(e,t){let r=new DOMParser;return to(e,t).pipe(b(o=>o.text()),m(o=>r.parseFromString(o,"text/html")),Z(1))}function En(e,t){let r=new DOMParser;return to(e,t).pipe(b(o=>o.text()),m(o=>r.parseFromString(o,"text/xml")),Z(1))}function wn(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function Tn(){return L(h(window,"scroll",{passive:!0}),h(window,"resize",{passive:!0})).pipe(m(wn),Q(wn()))}function Sn(){return{width:innerWidth,height:innerHeight}}function On(){return h(window,"resize",{passive:!0}).pipe(m(Sn),Q(Sn()))}function Ln(){return z([Tn(),On()]).pipe(m(([e,t])=>({offset:e,size:t})),Z(1))}function Er(e,{viewport$:t,header$:r}){let o=t.pipe(ne("size")),n=z([o,r]).pipe(m(()=>Be(e)));return z([r,t,n]).pipe(m(([{height:i},{offset:s,size:a},{x:c,y:p}])=>({offset:{x:s.x-c,y:s.y-p+i},size:a})))}function Wa(e){return h(e,"message",t=>t.data)}function Da(e){let t=new T;return t.subscribe(r=>e.postMessage(r)),t}function Mn(e,t=new Worker(e)){let r=Wa(t),o=Da(t),n=new T;n.subscribe(o);let i=o.pipe(oe(),ae(!0));return n.pipe(oe(),Ve(r.pipe(W(i))),le())}var Va=j("#__config"),Ct=JSON.parse(Va.textContent);Ct.base=`${new URL(Ct.base,we())}`;function Te(){return Ct}function V(e){return Ct.features.includes(e)}function Me(e,t){return typeof t!="undefined"?Ct.translations[e].replace("#",t.toString()):Ct.translations[e]}function Ce(e,t=document){return j(`[data-md-component=${e}]`,t)}function me(e,t=document){return M(`[data-md-component=${e}]`,t)}function Na(e){let t=j(".md-typeset > :first-child",e);return h(t,"click",{once:!0}).pipe(m(()=>j(".md-typeset",e)),m(r=>({hash:__md_hash(r.innerHTML)})))}function _n(e){if(!V("announce.dismiss")||!e.childElementCount)return y;if(!e.hidden){let t=j(".md-typeset",e);__md_hash(t.innerHTML)===__md_get("__announce")&&(e.hidden=!0)}return H(()=>{let t=new T;return t.subscribe(({hash:r})=>{e.hidden=!0,__md_set("__announce",r)}),Na(e).pipe(O(r=>t.next(r)),A(()=>t.complete()),m(r=>P({ref:e},r)))})}function za(e,{target$:t}){return t.pipe(m(r=>({hidden:r!==e})))}function An(e,t){let r=new T;return r.subscribe(({hidden:o})=>{e.hidden=o}),za(e,t).pipe(O(o=>r.next(o)),A(()=>r.complete()),m(o=>P({ref:e},o)))}function Dt(e,t){return t==="inline"?x("div",{class:"md-tooltip md-tooltip--inline",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"})):x("div",{class:"md-tooltip",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"}))}function wr(...e){return x("div",{class:"md-tooltip2",role:"dialog"},x("div",{class:"md-tooltip2__inner md-typeset"},e))}function Cn(...e){return x("div",{class:"md-tooltip2",role:"tooltip"},x("div",{class:"md-tooltip2__inner md-typeset"},e))}function kn(e,t){if(t=t?`${t}_annotation_${e}`:void 0,t){let r=t?`#${t}`:void 0;return x("aside",{class:"md-annotation",tabIndex:0},Dt(t),x("a",{href:r,class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}else return x("aside",{class:"md-annotation",tabIndex:0},Dt(t),x("span",{class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}function Hn(e){return x("button",{class:"md-code__button",title:Me("clipboard.copy"),"data-clipboard-target":`#${e} > code`,"data-md-type":"copy"})}function $n(){return x("button",{class:"md-code__button",title:"Toggle line selection","data-md-type":"select"})}function Pn(){return x("nav",{class:"md-code__nav"})}var In=$t(ro());function oo(e,t){let r=t&2,o=t&1,n=Object.keys(e.terms).filter(c=>!e.terms[c]).reduce((c,p)=>[...c,x("del",null,(0,In.default)(p))," "],[]).slice(0,-1),i=Te(),s=new URL(e.location,i.base);V("search.highlight")&&s.searchParams.set("h",Object.entries(e.terms).filter(([,c])=>c).reduce((c,[p])=>`${c} ${p}`.trim(),""));let{tags:a}=Te();return x("a",{href:`${s}`,class:"md-search-result__link",tabIndex:-1},x("article",{class:"md-search-result__article md-typeset","data-md-score":e.score.toFixed(2)},r>0&&x("div",{class:"md-search-result__icon md-icon"}),r>0&&x("h1",null,e.title),r<=0&&x("h2",null,e.title),o>0&&e.text.length>0&&e.text,e.tags&&x("nav",{class:"md-tags"},e.tags.map(c=>{let p=a?c in a?`md-tag-icon md-tag--${a[c]}`:"md-tag-icon":"";return x("span",{class:`md-tag ${p}`},c)})),o>0&&n.length>0&&x("p",{class:"md-search-result__terms"},Me("search.result.term.missing"),": ",...n)))}function Fn(e){let t=e[0].score,r=[...e],o=Te(),n=r.findIndex(l=>!`${new URL(l.location,o.base)}`.includes("#")),[i]=r.splice(n,1),s=r.findIndex(l=>l.scoreoo(l,1)),...c.length?[x("details",{class:"md-search-result__more"},x("summary",{tabIndex:-1},x("div",null,c.length>0&&c.length===1?Me("search.result.more.one"):Me("search.result.more.other",c.length))),...c.map(l=>oo(l,1)))]:[]];return x("li",{class:"md-search-result__item"},p)}function jn(e){return x("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>x("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?br(r):r)))}function no(e){let t=`tabbed-control tabbed-control--${e}`;return x("div",{class:t,hidden:!0},x("button",{class:"tabbed-button",tabIndex:-1,"aria-hidden":"true"}))}function Un(e){return x("div",{class:"md-typeset__scrollwrap"},x("div",{class:"md-typeset__table"},e))}function Qa(e){var o;let t=Te(),r=new URL(`../${e.version}/`,t.base);return x("li",{class:"md-version__item"},x("a",{href:`${r}`,class:"md-version__link"},e.title,((o=t.version)==null?void 0:o.alias)&&e.aliases.length>0&&x("span",{class:"md-version__alias"},e.aliases[0])))}function Wn(e,t){var o;let r=Te();return e=e.filter(n=>{var i;return!((i=n.properties)!=null&&i.hidden)}),x("div",{class:"md-version"},x("button",{class:"md-version__current","aria-label":Me("select.version")},t.title,((o=r.version)==null?void 0:o.alias)&&t.aliases.length>0&&x("span",{class:"md-version__alias"},t.aliases[0])),x("ul",{class:"md-version__list"},e.map(Qa)))}var Ya=0;function Ba(e,t=250){let r=z([Ye(e),it(e,t)]).pipe(m(([n,i])=>n||i),Y()),o=H(()=>pn(e)).pipe(J(Ge),gt(1),Pe(r),m(()=>ln(e)));return r.pipe(Re(n=>n),b(()=>z([r,o])),m(([n,i])=>({active:n,offset:i})),le())}function Vt(e,t,r=250){let{content$:o,viewport$:n}=t,i=`__tooltip2_${Ya++}`;return H(()=>{let s=new T,a=new jr(!1);s.pipe(oe(),ae(!1)).subscribe(a);let c=a.pipe(jt(l=>He(+!l*250,Dr)),Y(),b(l=>l?o:y),O(l=>l.id=i),le());z([s.pipe(m(({active:l})=>l)),c.pipe(b(l=>it(l,250)),Q(!1))]).pipe(m(l=>l.some(f=>f))).subscribe(a);let p=a.pipe(g(l=>l),te(c,n),m(([l,f,{size:u}])=>{let d=e.getBoundingClientRect(),v=d.width/2;if(f.role==="tooltip")return{x:v,y:8+d.height};if(d.y>=u.height/2){let{height:S}=de(f);return{x:v,y:-16-S}}else return{x:v,y:16+d.height}}));return z([c,s,p]).subscribe(([l,{offset:f},u])=>{l.style.setProperty("--md-tooltip-host-x",`${f.x}px`),l.style.setProperty("--md-tooltip-host-y",`${f.y}px`),l.style.setProperty("--md-tooltip-x",`${u.x}px`),l.style.setProperty("--md-tooltip-y",`${u.y}px`),l.classList.toggle("md-tooltip2--top",u.y<0),l.classList.toggle("md-tooltip2--bottom",u.y>=0)}),a.pipe(g(l=>l),te(c,(l,f)=>f),g(l=>l.role==="tooltip")).subscribe(l=>{let f=de(j(":scope > *",l));l.style.setProperty("--md-tooltip-width",`${f.width}px`),l.style.setProperty("--md-tooltip-tail","0px")}),a.pipe(Y(),xe(ye),te(c)).subscribe(([l,f])=>{f.classList.toggle("md-tooltip2--active",l)}),z([a.pipe(g(l=>l)),c]).subscribe(([l,f])=>{f.role==="dialog"?(e.setAttribute("aria-controls",i),e.setAttribute("aria-haspopup","dialog")):e.setAttribute("aria-describedby",i)}),a.pipe(g(l=>!l)).subscribe(()=>{e.removeAttribute("aria-controls"),e.removeAttribute("aria-describedby"),e.removeAttribute("aria-haspopup")}),Ba(e,r).pipe(O(l=>s.next(l)),A(()=>s.complete()),m(l=>P({ref:e},l)))})}function Xe(e,{viewport$:t},r=document.body){return Vt(e,{content$:new F(o=>{let n=e.title,i=Cn(n);return o.next(i),e.removeAttribute("title"),r.append(i),()=>{i.remove(),e.setAttribute("title",n)}}),viewport$:t},0)}function Ga(e,t){let r=H(()=>z([mn(e),Ge(t)])).pipe(m(([{x:o,y:n},i])=>{let{width:s,height:a}=de(e);return{x:o-i.x+s/2,y:n-i.y+a/2}}));return Ye(e).pipe(b(o=>r.pipe(m(n=>({active:o,offset:n})),Ee(+!o||1/0))))}function Dn(e,t,{target$:r}){let[o,n]=Array.from(e.children);return H(()=>{let i=new T,s=i.pipe(oe(),ae(!0));return i.subscribe({next({offset:a}){e.style.setProperty("--md-tooltip-x",`${a.x}px`),e.style.setProperty("--md-tooltip-y",`${a.y}px`)},complete(){e.style.removeProperty("--md-tooltip-x"),e.style.removeProperty("--md-tooltip-y")}}),mt(e).pipe(W(s)).subscribe(a=>{e.toggleAttribute("data-md-visible",a)}),L(i.pipe(g(({active:a})=>a)),i.pipe(Ae(250),g(({active:a})=>!a))).subscribe({next({active:a}){a?e.prepend(o):o.remove()},complete(){e.prepend(o)}}),i.pipe($e(16,ye)).subscribe(({active:a})=>{o.classList.toggle("md-tooltip--active",a)}),i.pipe(gt(125,ye),g(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:a})=>a)).subscribe({next(a){a?e.style.setProperty("--md-tooltip-0",`${-a}px`):e.style.removeProperty("--md-tooltip-0")},complete(){e.style.removeProperty("--md-tooltip-0")}}),h(n,"click").pipe(W(s),g(a=>!(a.metaKey||a.ctrlKey))).subscribe(a=>{a.stopPropagation(),a.preventDefault()}),h(n,"mousedown").pipe(W(s),te(i)).subscribe(([a,{active:c}])=>{var p;if(a.button!==0||a.metaKey||a.ctrlKey)a.preventDefault();else if(c){a.preventDefault();let l=e.parentElement.closest(".md-annotation");l instanceof HTMLElement?l.focus():(p=Ne())==null||p.blur()}}),r.pipe(W(s),g(a=>a===o),nt(125)).subscribe(()=>e.focus()),Ga(e,t).pipe(O(a=>i.next(a)),A(()=>i.complete()),m(a=>P({ref:e},a)))})}function Ja(e){let t=Te();if(e.tagName!=="CODE")return[e];let r=[".c",".c1",".cm"];if(typeof t.annotate!="undefined"){let o=e.closest("[class|=language]");if(o)for(let n of Array.from(o.classList)){if(!n.startsWith("language-"))continue;let[,i]=n.split("-");i in t.annotate&&r.push(...t.annotate[i])}}return M(r.join(", "),e)}function Xa(e){let t=[];for(let r of Ja(e)){let o=[],n=document.createNodeIterator(r,NodeFilter.SHOW_TEXT);for(let i=n.nextNode();i;i=n.nextNode())o.push(i);for(let i of o){let s;for(;s=/(\(\d+\))(!)?/.exec(i.textContent);){let[,a,c]=s;if(typeof c=="undefined"){let p=i.splitText(s.index);i=p.splitText(a.length),t.push(p)}else{i.textContent=a,t.push(i);break}}}}return t}function Vn(e,t){t.append(...Array.from(e.childNodes))}function Tr(e,t,{target$:r,print$:o}){let n=t.closest("[id]"),i=n==null?void 0:n.id,s=new Map;for(let a of Xa(t)){let[,c]=a.textContent.match(/\((\d+)\)/);ue(`:scope > li:nth-child(${c})`,e)&&(s.set(c,kn(c,i)),a.replaceWith(s.get(c)))}return s.size===0?y:H(()=>{let a=new T,c=a.pipe(oe(),ae(!0)),p=[];for(let[l,f]of s)p.push([j(".md-typeset",f),j(`:scope > li:nth-child(${l})`,e)]);return o.pipe(W(c)).subscribe(l=>{e.hidden=!l,e.classList.toggle("md-annotation-list",l);for(let[f,u]of p)l?Vn(f,u):Vn(u,f)}),L(...[...s].map(([,l])=>Dn(l,t,{target$:r}))).pipe(A(()=>a.complete()),le())})}function Nn(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return Nn(t)}}function zn(e,t){return H(()=>{let r=Nn(e);return typeof r!="undefined"?Tr(r,e,t):y})}var Kn=$t(ao());var Za=0,qn=L(h(window,"keydown").pipe(m(()=>!0)),L(h(window,"keyup"),h(window,"contextmenu")).pipe(m(()=>!1))).pipe(Q(!1),Z(1));function Qn(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return Qn(t)}}function es(e){return Le(e).pipe(m(({width:t})=>({scrollable:At(e).width>t})),ne("scrollable"))}function Yn(e,t){let{matches:r}=matchMedia("(hover)"),o=H(()=>{let n=new T,i=n.pipe(Yr(1));n.subscribe(({scrollable:d})=>{d&&r?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")});let s=[],a=e.closest("pre"),c=a.closest("[id]"),p=c?c.id:Za++;a.id=`__code_${p}`;let l=[],f=e.closest(".highlight");if(f instanceof HTMLElement){let d=Qn(f);if(typeof d!="undefined"&&(f.classList.contains("annotate")||V("content.code.annotate"))){let v=Tr(d,e,t);l.push(Le(f).pipe(W(i),m(({width:S,height:X})=>S&&X),Y(),b(S=>S?v:y)))}}let u=M(":scope > span[id]",e);if(u.length&&(e.classList.add("md-code__content"),e.closest(".select")||V("content.code.select")&&!e.closest(".no-select"))){let d=+u[0].id.split("-").pop(),v=$n();s.push(v),V("content.tooltips")&&l.push(Xe(v,{viewport$}));let S=h(v,"click").pipe(Ut(R=>!R,!1),O(()=>v.blur()),le());S.subscribe(R=>{v.classList.toggle("md-code__button--active",R)});let X=fe(u).pipe(J(R=>it(R).pipe(m(se=>[R,se]))));S.pipe(b(R=>R?X:y)).subscribe(([R,se])=>{let ce=ue(".hll.select",R);if(ce&&!se)ce.replaceWith(...Array.from(ce.childNodes));else if(!ce&&se){let he=document.createElement("span");he.className="hll select",he.append(...Array.from(R.childNodes).slice(1)),R.append(he)}});let re=fe(u).pipe(J(R=>h(R,"mousedown").pipe(O(se=>se.preventDefault()),m(()=>R)))),ee=S.pipe(b(R=>R?re:y),te(qn),m(([R,se])=>{var he;let ce=u.indexOf(R)+d;if(se===!1)return[ce,ce];{let Se=M(".hll",e).map(Ue=>u.indexOf(Ue.parentElement)+d);return(he=window.getSelection())==null||he.removeAllRanges(),[Math.min(ce,...Se),Math.max(ce,...Se)]}})),k=Zr(y).pipe(g(R=>R.startsWith(`__codelineno-${p}-`)));k.subscribe(R=>{let[,,se]=R.split("-"),ce=se.split(":").map(Se=>+Se-d+1);ce.length===1&&ce.push(ce[0]);for(let Se of M(".hll:not(.select)",e))Se.replaceWith(...Array.from(Se.childNodes));let he=u.slice(ce[0]-1,ce[1]);for(let Se of he){let Ue=document.createElement("span");Ue.className="hll",Ue.append(...Array.from(Se.childNodes).slice(1)),Se.append(Ue)}}),k.pipe(Ee(1),xe(pe)).subscribe(R=>{if(R.includes(":")){let se=document.getElementById(R.split(":")[0]);se&&setTimeout(()=>{let ce=se,he=-64;for(;ce!==document.body;)he+=ce.offsetTop,ce=ce.offsetParent;window.scrollTo({top:he})},1)}});let je=fe(M('a[href^="#__codelineno"]',f)).pipe(J(R=>h(R,"click").pipe(O(se=>se.preventDefault()),m(()=>R)))).pipe(W(i),te(qn),m(([R,se])=>{let he=+j(`[id="${R.hash.slice(1)}"]`).parentElement.id.split("-").pop();if(se===!1)return[he,he];{let Se=M(".hll",e).map(Ue=>+Ue.parentElement.id.split("-").pop());return[Math.min(he,...Se),Math.max(he,...Se)]}}));L(ee,je).subscribe(R=>{let se=`#__codelineno-${p}-`;R[0]===R[1]?se+=R[0]:se+=`${R[0]}:${R[1]}`,history.replaceState({},"",se),window.dispatchEvent(new HashChangeEvent("hashchange",{newURL:window.location.origin+window.location.pathname+se,oldURL:window.location.href}))})}if(Kn.default.isSupported()&&(e.closest(".copy")||V("content.code.copy")&&!e.closest(".no-copy"))){let d=Hn(a.id);s.push(d),V("content.tooltips")&&l.push(Xe(d,{viewport$}))}if(s.length){let d=Pn();d.append(...s),a.insertBefore(d,e)}return es(e).pipe(O(d=>n.next(d)),A(()=>n.complete()),m(d=>P({ref:e},d)),Ve(L(...l).pipe(W(i))))});return V("content.lazy")?mt(e).pipe(g(n=>n),Ee(1),b(()=>o)):o}function ts(e,{target$:t,print$:r}){let o=!0;return L(t.pipe(m(n=>n.closest("details:not([open])")),g(n=>e===n),m(()=>({action:"open",reveal:!0}))),r.pipe(g(n=>n||!o),O(()=>o=e.open),m(n=>({action:n?"open":"close"}))))}function Bn(e,t){return H(()=>{let r=new T;return r.subscribe(({action:o,reveal:n})=>{e.toggleAttribute("open",o==="open"),n&&e.scrollIntoView()}),ts(e,t).pipe(O(o=>r.next(o)),A(()=>r.complete()),m(o=>P({ref:e},o)))})}var Gn=0;function rs(e){let t=document.createElement("h3");t.innerHTML=e.innerHTML;let r=[t],o=e.nextElementSibling;for(;o&&!(o instanceof HTMLHeadingElement);)r.push(o),o=o.nextElementSibling;return r}function os(e,t){for(let r of M("[href], [src]",e))for(let o of["href","src"]){let n=r.getAttribute(o);if(n&&!/^(?:[a-z]+:)?\/\//i.test(n)){r[o]=new URL(r.getAttribute(o),t).toString();break}}for(let r of M("[name^=__], [for]",e))for(let o of["id","for","name"]){let n=r.getAttribute(o);n&&r.setAttribute(o,`${n}$preview_${Gn}`)}return Gn++,$(e)}function Jn(e,t){let{sitemap$:r}=t;if(!(e instanceof HTMLAnchorElement))return y;if(!(V("navigation.instant.preview")||e.hasAttribute("data-preview")))return y;e.removeAttribute("title");let o=z([Ye(e),it(e)]).pipe(m(([i,s])=>i||s),Y(),g(i=>i));return rt([r,o]).pipe(b(([i])=>{let s=new URL(e.href);return s.search=s.hash="",i.has(`${s}`)?$(s):y}),b(i=>xr(i).pipe(b(s=>os(s,i)))),b(i=>{let s=e.hash?`article [id="${e.hash.slice(1)}"]`:"article h1",a=ue(s,i);return typeof a=="undefined"?y:$(rs(a))})).pipe(b(i=>{let s=new F(a=>{let c=wr(...i);return a.next(c),document.body.append(c),()=>c.remove()});return Vt(e,P({content$:s},t))}))}var Xn=".node circle,.node ellipse,.node path,.node polygon,.node rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}marker{fill:var(--md-mermaid-edge-color)!important}.edgeLabel .label rect{fill:#0000}.flowchartTitleText{fill:var(--md-mermaid-label-fg-color)}.label{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.label foreignObject{line-height:normal;overflow:visible}.label div .edgeLabel{color:var(--md-mermaid-label-fg-color)}.edgeLabel,.edgeLabel p,.label div .edgeLabel{background-color:var(--md-mermaid-label-bg-color)}.edgeLabel,.edgeLabel p{fill:var(--md-mermaid-label-bg-color);color:var(--md-mermaid-edge-color)}.edgePath .path,.flowchart-link{stroke:var(--md-mermaid-edge-color);stroke-width:.05rem}.edgePath .arrowheadPath{fill:var(--md-mermaid-edge-color);stroke:none}.cluster rect{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}.cluster span{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}g #flowchart-circleEnd,g #flowchart-circleStart,g #flowchart-crossEnd,g #flowchart-crossStart,g #flowchart-pointEnd,g #flowchart-pointStart{stroke:none}.classDiagramTitleText{fill:var(--md-mermaid-label-fg-color)}g.classGroup line,g.classGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.classGroup text{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.classLabel .box{fill:var(--md-mermaid-label-bg-color);background-color:var(--md-mermaid-label-bg-color);opacity:1}.classLabel .label{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node .divider{stroke:var(--md-mermaid-node-fg-color)}.relation{stroke:var(--md-mermaid-edge-color)}.cardinality{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.cardinality text{fill:inherit!important}defs marker.marker.composition.class path,defs marker.marker.dependency.class path,defs marker.marker.extension.class path{fill:var(--md-mermaid-edge-color)!important;stroke:var(--md-mermaid-edge-color)!important}defs marker.marker.aggregation.class path{fill:var(--md-mermaid-label-bg-color)!important;stroke:var(--md-mermaid-edge-color)!important}.statediagramTitleText{fill:var(--md-mermaid-label-fg-color)}g.stateGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.stateGroup .state-title{fill:var(--md-mermaid-label-fg-color)!important;font-family:var(--md-mermaid-font-family)}g.stateGroup .composit{fill:var(--md-mermaid-label-bg-color)}.nodeLabel,.nodeLabel p{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}a .nodeLabel{text-decoration:underline}.node circle.state-end,.node circle.state-start,.start-state{fill:var(--md-mermaid-edge-color);stroke:none}.end-state-inner,.end-state-outer{fill:var(--md-mermaid-edge-color)}.end-state-inner,.node circle.state-end{stroke:var(--md-mermaid-label-bg-color)}.transition{stroke:var(--md-mermaid-edge-color)}[id^=state-fork] rect,[id^=state-join] rect{fill:var(--md-mermaid-edge-color)!important;stroke:none!important}.statediagram-cluster.statediagram-cluster .inner{fill:var(--md-default-bg-color)}.statediagram-cluster rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.statediagram-state rect.divider{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}defs #statediagram-barbEnd{stroke:var(--md-mermaid-edge-color)}[id^=entity] path,[id^=entity] rect{fill:var(--md-default-bg-color)}.relationshipLine{stroke:var(--md-mermaid-edge-color)}defs .marker.oneOrMore.er *,defs .marker.onlyOne.er *,defs .marker.zeroOrMore.er *,defs .marker.zeroOrOne.er *{stroke:var(--md-mermaid-edge-color)!important}text:not([class]):last-child{fill:var(--md-mermaid-label-fg-color)}.actor{fill:var(--md-mermaid-sequence-actor-bg-color);stroke:var(--md-mermaid-sequence-actor-border-color)}text.actor>tspan{fill:var(--md-mermaid-sequence-actor-fg-color);font-family:var(--md-mermaid-font-family)}line{stroke:var(--md-mermaid-sequence-actor-line-color)}.actor-man circle,.actor-man line{fill:var(--md-mermaid-sequence-actorman-bg-color);stroke:var(--md-mermaid-sequence-actorman-line-color)}.messageLine0,.messageLine1{stroke:var(--md-mermaid-sequence-message-line-color)}.note{fill:var(--md-mermaid-sequence-note-bg-color);stroke:var(--md-mermaid-sequence-note-border-color)}.loopText,.loopText>tspan,.messageText,.noteText>tspan{stroke:none;font-family:var(--md-mermaid-font-family)!important}.messageText{fill:var(--md-mermaid-sequence-message-fg-color)}.loopText,.loopText>tspan{fill:var(--md-mermaid-sequence-loop-fg-color)}.noteText>tspan{fill:var(--md-mermaid-sequence-note-fg-color)}#arrowhead path{fill:var(--md-mermaid-sequence-message-line-color);stroke:none}.loopLine{fill:var(--md-mermaid-sequence-loop-bg-color);stroke:var(--md-mermaid-sequence-loop-border-color)}.labelBox{fill:var(--md-mermaid-sequence-label-bg-color);stroke:none}.labelText,.labelText>span{fill:var(--md-mermaid-sequence-label-fg-color);font-family:var(--md-mermaid-font-family)}.sequenceNumber{fill:var(--md-mermaid-sequence-number-fg-color)}rect.rect{fill:var(--md-mermaid-sequence-box-bg-color);stroke:none}rect.rect+text.text{fill:var(--md-mermaid-sequence-box-fg-color)}defs #sequencenumber{fill:var(--md-mermaid-sequence-number-bg-color)!important}";var so,is=0;function as(){return typeof mermaid=="undefined"||mermaid instanceof Element?_t("https://unpkg.com/mermaid@11/dist/mermaid.min.js"):$(void 0)}function Zn(e){return e.classList.remove("mermaid"),so||(so=as().pipe(O(()=>mermaid.initialize({startOnLoad:!1,themeCSS:Xn,sequence:{actorFontSize:"16px",messageFontSize:"16px",noteFontSize:"16px"}})),m(()=>{}),Z(1))),so.subscribe(()=>go(null,null,function*(){e.classList.add("mermaid");let t=`__mermaid_${is++}`,r=x("div",{class:"mermaid"}),o=e.textContent,{svg:n,fn:i}=yield mermaid.render(t,o),s=r.attachShadow({mode:"closed"});s.innerHTML=n,e.replaceWith(r),i==null||i(s)})),so.pipe(m(()=>({ref:e})))}var ei=x("table");function ti(e){return e.replaceWith(ei),ei.replaceWith(Un(e)),$({ref:e})}function ss(e){let t=e.find(r=>r.checked)||e[0];return L(...e.map(r=>h(r,"change").pipe(m(()=>j(`label[for="${r.id}"]`))))).pipe(Q(j(`label[for="${t.id}"]`)),m(r=>({active:r})))}function ri(e,{viewport$:t,target$:r}){let o=j(".tabbed-labels",e),n=M(":scope > input",e),i=no("prev");e.append(i);let s=no("next");return e.append(s),H(()=>{let a=new T,c=a.pipe(oe(),ae(!0));z([a,Le(e),mt(e)]).pipe(W(c),$e(1,ye)).subscribe({next([{active:p},l]){let f=Be(p),{width:u}=de(p);e.style.setProperty("--md-indicator-x",`${f.x}px`),e.style.setProperty("--md-indicator-width",`${u}px`);let d=gr(o);(f.xd.x+l.width)&&o.scrollTo({left:Math.max(0,f.x-16),behavior:"smooth"})},complete(){e.style.removeProperty("--md-indicator-x"),e.style.removeProperty("--md-indicator-width")}}),z([Ge(o),Le(o)]).pipe(W(c)).subscribe(([p,l])=>{let f=At(o);i.hidden=p.x<16,s.hidden=p.x>f.width-l.width-16}),L(h(i,"click").pipe(m(()=>-1)),h(s,"click").pipe(m(()=>1))).pipe(W(c)).subscribe(p=>{let{width:l}=de(o);o.scrollBy({left:l*p,behavior:"smooth"})}),r.pipe(W(c),g(p=>n.includes(p))).subscribe(p=>p.click()),o.classList.add("tabbed-labels--linked");for(let p of n){let l=j(`label[for="${p.id}"]`);l.replaceChildren(x("a",{href:`#${l.htmlFor}`,tabIndex:-1},...Array.from(l.childNodes))),h(l.firstElementChild,"click").pipe(W(c),g(f=>!(f.metaKey||f.ctrlKey)),O(f=>{f.preventDefault(),f.stopPropagation()})).subscribe(()=>{history.replaceState({},"",`#${l.htmlFor}`),l.click()})}return V("content.tabs.link")&&a.pipe(Ie(1),te(t)).subscribe(([{active:p},{offset:l}])=>{let f=p.innerText.trim();if(p.hasAttribute("data-md-switching"))p.removeAttribute("data-md-switching");else{let u=e.offsetTop-l.y;for(let v of M("[data-tabs]"))for(let S of M(":scope > input",v)){let X=j(`label[for="${S.id}"]`);if(X!==p&&X.innerText.trim()===f){X.setAttribute("data-md-switching",""),S.click();break}}window.scrollTo({top:e.offsetTop-u});let d=__md_get("__tabs")||[];__md_set("__tabs",[...new Set([f,...d])])}}),a.pipe(W(c)).subscribe(()=>{for(let p of M("audio, video",e))p.pause()}),ss(n).pipe(O(p=>a.next(p)),A(()=>a.complete()),m(p=>P({ref:e},p)))}).pipe(et(pe))}function oi(e,t){let{viewport$:r,target$:o,print$:n}=t;return L(...M(".annotate:not(.highlight)",e).map(i=>zn(i,{target$:o,print$:n})),...M("pre:not(.mermaid) > code",e).map(i=>Yn(i,{target$:o,print$:n})),...M("a",e).map(i=>Jn(i,t)),...M("pre.mermaid",e).map(i=>Zn(i)),...M("table:not([class])",e).map(i=>ti(i)),...M("details",e).map(i=>Bn(i,{target$:o,print$:n})),...M("[data-tabs]",e).map(i=>ri(i,{viewport$:r,target$:o})),...M("[title]:not([data-preview])",e).filter(()=>V("content.tooltips")).map(i=>Xe(i,{viewport$:r})),...M(".footnote-ref",e).filter(()=>V("content.footnote.tooltips")).map(i=>Vt(i,{content$:new F(s=>{let a=new URL(i.href).hash.slice(1),c=Array.from(document.getElementById(a).cloneNode(!0).children),p=wr(...c);return s.next(p),document.body.append(p),()=>p.remove()}),viewport$:r})))}function cs(e,{alert$:t}){return t.pipe(b(r=>L($(!0),$(!1).pipe(nt(2e3))).pipe(m(o=>({message:r,active:o})))))}function ni(e,t){let r=j(".md-typeset",e);return H(()=>{let o=new T;return o.subscribe(({message:n,active:i})=>{e.classList.toggle("md-dialog--active",i),r.textContent=n}),cs(e,t).pipe(O(n=>o.next(n)),A(()=>o.complete()),m(n=>P({ref:e},n)))})}var ps=0;function ls(e,t){document.body.append(e);let{width:r}=de(e);e.style.setProperty("--md-tooltip-width",`${r}px`),e.remove();let o=vr(t),n=typeof o!="undefined"?Ge(o):$({x:0,y:0}),i=L(Ye(t),it(t)).pipe(Y());return z([i,n]).pipe(m(([s,a])=>{let{x:c,y:p}=Be(t),l=de(t),f=t.closest("table");return f&&t.parentElement&&(c+=f.offsetLeft+t.parentElement.offsetLeft,p+=f.offsetTop+t.parentElement.offsetTop),{active:s,offset:{x:c-a.x+l.width/2-r/2,y:p-a.y+l.height+8}}}))}function ii(e){let t=e.title;if(!t.length)return y;let r=`__tooltip_${ps++}`,o=Dt(r,"inline"),n=j(".md-typeset",o);return n.innerHTML=t,H(()=>{let i=new T;return i.subscribe({next({offset:s}){o.style.setProperty("--md-tooltip-x",`${s.x}px`),o.style.setProperty("--md-tooltip-y",`${s.y}px`)},complete(){o.style.removeProperty("--md-tooltip-x"),o.style.removeProperty("--md-tooltip-y")}}),L(i.pipe(g(({active:s})=>s)),i.pipe(Ae(250),g(({active:s})=>!s))).subscribe({next({active:s}){s?(e.insertAdjacentElement("afterend",o),e.setAttribute("aria-describedby",r),e.removeAttribute("title")):(o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t))},complete(){o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t)}}),i.pipe($e(16,ye)).subscribe(({active:s})=>{o.classList.toggle("md-tooltip--active",s)}),i.pipe(gt(125,ye),g(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:s})=>s)).subscribe({next(s){s?o.style.setProperty("--md-tooltip-0",`${-s}px`):o.style.removeProperty("--md-tooltip-0")},complete(){o.style.removeProperty("--md-tooltip-0")}}),ls(o,e).pipe(O(s=>i.next(s)),A(()=>i.complete()),m(s=>P({ref:e},s)))}).pipe(et(pe))}function ms({viewport$:e}){if(!V("header.autohide"))return $(!1);let t=e.pipe(m(({offset:{y:n}})=>n),ot(2,1),m(([n,i])=>[nMath.abs(i-n.y)>100),m(([,[n]])=>n),Y()),o=Je("search");return z([e,o]).pipe(m(([{offset:n},i])=>n.y>400&&!i),Y(),b(n=>n?r:$(!1)),Q(!1))}function ai(e,t){return H(()=>z([Le(e),ms(t)])).pipe(m(([{height:r},o])=>({height:r,hidden:o})),Y((r,o)=>r.height===o.height&&r.hidden===o.hidden),Z(1))}function si(e,{header$:t,main$:r}){return H(()=>{let o=new T,n=o.pipe(oe(),ae(!0));o.pipe(ne("active"),Pe(t)).subscribe(([{active:s},{hidden:a}])=>{e.classList.toggle("md-header--shadow",s&&!a),e.hidden=a});let i=fe(M("[title]",e)).pipe(g(()=>V("content.tooltips")),J(s=>ii(s)));return r.subscribe(o),t.pipe(W(n),m(s=>P({ref:e},s)),Ve(i.pipe(W(n))))})}function fs(e,{viewport$:t,header$:r}){return Er(e,{viewport$:t,header$:r}).pipe(m(({offset:{y:o}})=>{let{height:n}=de(e);return{active:o>=n}}),ne("active"))}function ci(e,t){return H(()=>{let r=new T;r.subscribe({next({active:n}){e.classList.toggle("md-header__title--active",n)},complete(){e.classList.remove("md-header__title--active")}});let o=ue(".md-content h1");return typeof o=="undefined"?y:fs(o,t).pipe(O(n=>r.next(n)),A(()=>r.complete()),m(n=>P({ref:e},n)))})}function pi(e,{viewport$:t,header$:r}){let o=r.pipe(m(({height:i})=>i),Y()),n=o.pipe(b(()=>Le(e).pipe(m(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),ne("bottom"))));return z([o,n,t]).pipe(m(([i,{top:s,bottom:a},{offset:{y:c},size:{height:p}}])=>(p=Math.max(0,p-Math.max(0,s-c,i)-Math.max(0,p+c-a)),{offset:s-i,height:p,active:s-i<=c})),Y((i,s)=>i.offset===s.offset&&i.height===s.height&&i.active===s.active))}function us(e){let t=__md_get("__palette")||{index:e.findIndex(o=>matchMedia(o.getAttribute("data-md-color-media")).matches)},r=Math.max(0,Math.min(t.index,e.length-1));return $(...e).pipe(J(o=>h(o,"change").pipe(m(()=>o))),Q(e[r]),m(o=>({index:e.indexOf(o),color:{media:o.getAttribute("data-md-color-media"),scheme:o.getAttribute("data-md-color-scheme"),primary:o.getAttribute("data-md-color-primary"),accent:o.getAttribute("data-md-color-accent")}})),Z(1))}function li(e){let t=M("input",e),r=x("meta",{name:"theme-color"});document.head.appendChild(r);let o=x("meta",{name:"color-scheme"});document.head.appendChild(o);let n=Wt("(prefers-color-scheme: light)");return H(()=>{let i=new T;return i.subscribe(s=>{if(document.body.setAttribute("data-md-color-switching",""),s.color.media==="(prefers-color-scheme)"){let a=matchMedia("(prefers-color-scheme: light)"),c=document.querySelector(a.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");s.color.scheme=c.getAttribute("data-md-color-scheme"),s.color.primary=c.getAttribute("data-md-color-primary"),s.color.accent=c.getAttribute("data-md-color-accent")}for(let[a,c]of Object.entries(s.color))document.body.setAttribute(`data-md-color-${a}`,c);for(let a=0;as.key==="Enter"),te(i,(s,a)=>a)).subscribe(({index:s})=>{s=(s+1)%t.length,t[s].click(),t[s].focus()}),i.pipe(m(()=>{let s=Ce("header"),a=window.getComputedStyle(s);return o.content=a.colorScheme,a.backgroundColor.match(/\d+/g).map(c=>(+c).toString(16).padStart(2,"0")).join("")})).subscribe(s=>r.content=`#${s}`),i.pipe(xe(pe)).subscribe(()=>{document.body.removeAttribute("data-md-color-switching")}),us(t).pipe(W(n.pipe(Ie(1))),vt(),O(s=>i.next(s)),A(()=>i.complete()),m(s=>P({ref:e},s)))})}function mi(e,{progress$:t}){return H(()=>{let r=new T;return r.subscribe(({value:o})=>{e.style.setProperty("--md-progress-value",`${o}`)}),t.pipe(O(o=>r.next({value:o})),A(()=>r.complete()),m(o=>({ref:e,value:o})))})}function fi(e,t){return e.protocol=t.protocol,e.hostname=t.hostname,e}function ds(e,t){let r=new Map;for(let o of M("url",e)){let n=j("loc",o),i=[fi(new URL(n.textContent),t)];r.set(`${i[0]}`,i);for(let s of M("[rel=alternate]",o)){let a=s.getAttribute("href");a!=null&&i.push(fi(new URL(a),t))}}return r}function kt(e){return En(new URL("sitemap.xml",e)).pipe(m(t=>ds(t,new URL(e))),ve(()=>$(new Map)),le())}function ui({document$:e}){let t=new Map;e.pipe(b(()=>M("link[rel=alternate]")),m(r=>new URL(r.href)),g(r=>!t.has(r.toString())),J(r=>kt(r).pipe(m(o=>[r,o]),ve(()=>y)))).subscribe(([r,o])=>{t.set(r.toString().replace(/\/$/,""),o)}),h(document.body,"click").pipe(g(r=>!r.metaKey&&!r.ctrlKey),b(r=>{if(r.target instanceof Element){let o=r.target.closest("a");if(o&&!o.target){let n=[...t].find(([f])=>o.href.startsWith(`${f}/`));if(typeof n=="undefined")return y;let[i,s]=n,a=we();if(a.href.startsWith(i))return y;let c=Te(),p=a.href.replace(c.base,"");p=`${i}/${p}`;let l=s.has(p.split("#")[0])?new URL(p,c.base):new URL(i);return r.preventDefault(),$(l)}}return y})).subscribe(r=>st(r,!0))}var co=$t(ao());function hs(e){e.setAttribute("data-md-copying","");let t=e.closest("[data-copy]"),r=t?t.getAttribute("data-copy"):e.innerText;return e.removeAttribute("data-md-copying"),r.trimEnd()}function di({alert$:e}){co.default.isSupported()&&new F(t=>{new co.default("[data-clipboard-target], [data-clipboard-text]",{text:r=>r.getAttribute("data-clipboard-text")||hs(j(r.getAttribute("data-clipboard-target")))}).on("success",r=>t.next(r))}).pipe(O(t=>{t.trigger.focus()}),m(()=>Me("clipboard.copied"))).subscribe(e)}function hi(e,t){if(!(e.target instanceof Element))return y;let r=e.target.closest("a");if(r===null)return y;if(r.target||e.metaKey||e.ctrlKey)return y;let o=new URL(r.href);return o.search=o.hash="",t.has(`${o}`)?(e.preventDefault(),$(r)):y}function bi(e){let t=new Map;for(let r of M(":scope > *",e.head))t.set(r.outerHTML,r);return t}function vi(e){for(let t of M("[href], [src]",e))for(let r of["href","src"]){let o=t.getAttribute(r);if(o&&!/^(?:[a-z]+:)?\/\//i.test(o)){t[r]=t[r];break}}return $(e)}function bs(e){for(let o of["[data-md-component=announce]","[data-md-component=container]","[data-md-component=header-topic]","[data-md-component=outdated]","[data-md-component=logo]","[data-md-component=skip]",...V("navigation.tabs.sticky")?["[data-md-component=tabs]"]:[]]){let n=ue(o),i=ue(o,e);typeof n!="undefined"&&typeof i!="undefined"&&n.replaceWith(i)}let t=bi(document);for(let[o,n]of bi(e))t.has(o)?t.delete(o):document.head.appendChild(n);for(let o of t.values()){let n=o.getAttribute("name");n!=="theme-color"&&n!=="color-scheme"&&o.remove()}let r=Ce("container");return Ke(M("script",r)).pipe(b(o=>{let n=e.createElement("script");if(o.src){for(let i of o.getAttributeNames())n.setAttribute(i,o.getAttribute(i));return o.replaceWith(n),new F(i=>{n.onload=()=>i.complete()})}else return n.textContent=o.textContent,o.replaceWith(n),y}),oe(),ae(document))}function gi({sitemap$:e,location$:t,viewport$:r,progress$:o}){if(location.protocol==="file:")return y;$(document).subscribe(vi);let n=h(document.body,"click").pipe(Pe(e),b(([a,c])=>hi(a,c)),m(({href:a})=>new URL(a)),le()),i=h(window,"popstate").pipe(m(we),le());n.pipe(te(r)).subscribe(([a,{offset:c}])=>{history.replaceState(c,""),history.pushState(null,"",a)}),L(n,i).subscribe(t);let s=t.pipe(ne("pathname"),b(a=>xr(a,{progress$:o}).pipe(ve(()=>(st(a,!0),y)))),b(vi),b(bs),le());return L(s.pipe(te(t,(a,c)=>c)),s.pipe(b(()=>t),ne("hash")),t.pipe(Y((a,c)=>a.pathname===c.pathname&&a.hash===c.hash),b(()=>n),O(()=>history.back()))).subscribe(a=>{var c,p;history.state!==null||!a.hash?window.scrollTo(0,(p=(c=history.state)==null?void 0:c.y)!=null?p:0):(history.scrollRestoration="auto",gn(a.hash),history.scrollRestoration="manual")}),t.subscribe(()=>{history.scrollRestoration="manual"}),h(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}),r.pipe(ne("offset"),Ae(100)).subscribe(({offset:a})=>{history.replaceState(a,"")}),V("navigation.instant.prefetch")&&L(h(document.body,"mousemove"),h(document.body,"focusin")).pipe(Pe(e),b(([a,c])=>hi(a,c)),Ae(25),Qr(({href:a})=>a),hr(a=>{let c=document.createElement("link");return c.rel="prefetch",c.href=a.toString(),document.head.appendChild(c),h(c,"load").pipe(m(()=>c),Ee(1))})).subscribe(a=>a.remove()),s}var yi=$t(ro());function xi(e){let t=e.separator.split("|").map(n=>n.replace(/(\(\?[!=<][^)]+\))/g,"").length===0?"\uFFFD":n).join("|"),r=new RegExp(t,"img"),o=(n,i,s)=>`${i}${s}`;return n=>{n=n.replace(/[\s*+\-:~^]+/g," ").trim();let i=new RegExp(`(^|${e.separator}|)(${n.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return s=>(0,yi.default)(s).replace(i,o).replace(/<\/mark>(\s+)]*>/img,"$1")}}function zt(e){return e.type===1}function Sr(e){return e.type===3}function Ei(e,t){let r=Mn(e);return L($(location.protocol!=="file:"),Je("search")).pipe(Re(o=>o),b(()=>t)).subscribe(({config:o,docs:n})=>r.next({type:0,data:{config:o,docs:n,options:{suggest:V("search.suggest")}}})),r}function wi(e){var l;let{selectedVersionSitemap:t,selectedVersionBaseURL:r,currentLocation:o,currentBaseURL:n}=e,i=(l=po(n))==null?void 0:l.pathname;if(i===void 0)return;let s=ys(o.pathname,i);if(s===void 0)return;let a=Es(t.keys());if(!t.has(a))return;let c=po(s,a);if(!c||!t.has(c.href))return;let p=po(s,r);if(p)return p.hash=o.hash,p.search=o.search,p}function po(e,t){try{return new URL(e,t)}catch(r){return}}function ys(e,t){if(e.startsWith(t))return e.slice(t.length)}function xs(e,t){let r=Math.min(e.length,t.length),o;for(o=0;oy)),o=r.pipe(m(n=>{let[,i]=t.base.match(/([^/]+)\/?$/);return n.find(({version:s,aliases:a})=>s===i||a.includes(i))||n[0]}));r.pipe(m(n=>new Map(n.map(i=>[`${new URL(`../${i.version}/`,t.base)}`,i]))),b(n=>h(document.body,"click").pipe(g(i=>!i.metaKey&&!i.ctrlKey),te(o),b(([i,s])=>{if(i.target instanceof Element){let a=i.target.closest("a");if(a&&!a.target&&n.has(a.href)){let c=a.href;return!i.target.closest(".md-version")&&n.get(c)===s?y:(i.preventDefault(),$(new URL(c)))}}return y}),b(i=>kt(i).pipe(m(s=>{var a;return(a=wi({selectedVersionSitemap:s,selectedVersionBaseURL:i,currentLocation:we(),currentBaseURL:t.base}))!=null?a:i})))))).subscribe(n=>st(n,!0)),z([r,o]).subscribe(([n,i])=>{j(".md-header__topic").appendChild(Wn(n,i))}),e.pipe(b(()=>o)).subscribe(n=>{var a;let i=new URL(t.base),s=__md_get("__outdated",sessionStorage,i);if(s===null){s=!0;let c=((a=t.version)==null?void 0:a.default)||"latest";Array.isArray(c)||(c=[c]);e:for(let p of c)for(let l of n.aliases.concat(n.version))if(new RegExp(p,"i").test(l)){s=!1;break e}__md_set("__outdated",s,sessionStorage,i)}if(s)for(let c of me("outdated"))c.hidden=!1})}function ws(e,{worker$:t}){let{searchParams:r}=we();r.has("q")&&(at("search",!0),e.value=r.get("q"),e.focus(),Je("search").pipe(Re(i=>!i)).subscribe(()=>{let i=we();i.searchParams.delete("q"),history.replaceState({},"",`${i}`)}));let o=Ye(e),n=L(t.pipe(Re(zt)),h(e,"keyup"),o).pipe(m(()=>e.value),Y());return z([n,o]).pipe(m(([i,s])=>({value:i,focus:s})),Z(1))}function Si(e,{worker$:t}){let r=new T,o=r.pipe(oe(),ae(!0));z([t.pipe(Re(zt)),r],(i,s)=>s).pipe(ne("value")).subscribe(({value:i})=>t.next({type:2,data:i})),r.pipe(ne("focus")).subscribe(({focus:i})=>{i&&at("search",i)}),h(e.form,"reset").pipe(W(o)).subscribe(()=>e.focus());let n=j("header [for=__search]");return h(n,"click").subscribe(()=>e.focus()),ws(e,{worker$:t}).pipe(O(i=>r.next(i)),A(()=>r.complete()),m(i=>P({ref:e},i)),Z(1))}function Oi(e,{worker$:t,query$:r}){let o=new T,n=un(e.parentElement).pipe(g(Boolean)),i=e.parentElement,s=j(":scope > :first-child",e),a=j(":scope > :last-child",e);Je("search").subscribe(l=>a.setAttribute("role",l?"list":"presentation")),o.pipe(te(r),Gr(t.pipe(Re(zt)))).subscribe(([{items:l},{value:f}])=>{switch(l.length){case 0:s.textContent=f.length?Me("search.result.none"):Me("search.result.placeholder");break;case 1:s.textContent=Me("search.result.one");break;default:let u=br(l.length);s.textContent=Me("search.result.other",u)}});let c=o.pipe(O(()=>a.innerHTML=""),b(({items:l})=>L($(...l.slice(0,10)),$(...l.slice(10)).pipe(ot(4),Xr(n),b(([f])=>f)))),m(Fn),le());return c.subscribe(l=>a.appendChild(l)),c.pipe(J(l=>{let f=ue("details",l);return typeof f=="undefined"?y:h(f,"toggle").pipe(W(o),m(()=>f))})).subscribe(l=>{l.open===!1&&l.offsetTop<=i.scrollTop&&i.scrollTo({top:l.offsetTop})}),t.pipe(g(Sr),m(({data:l})=>l)).pipe(O(l=>o.next(l)),A(()=>o.complete()),m(l=>P({ref:e},l)))}function Ts(e,{query$:t}){return t.pipe(m(({value:r})=>{let o=we();return o.hash="",r=r.replace(/\s+/g,"+").replace(/&/g,"%26").replace(/=/g,"%3D"),o.search=`q=${r}`,{url:o}}))}function Li(e,t){let r=new T,o=r.pipe(oe(),ae(!0));return r.subscribe(({url:n})=>{e.setAttribute("data-clipboard-text",e.href),e.href=`${n}`}),h(e,"click").pipe(W(o)).subscribe(n=>n.preventDefault()),Ts(e,t).pipe(O(n=>r.next(n)),A(()=>r.complete()),m(n=>P({ref:e},n)))}function Mi(e,{worker$:t,keyboard$:r}){let o=new T,n=Ce("search-query"),i=L(h(n,"keydown"),h(n,"focus")).pipe(xe(pe),m(()=>n.value),Y());return o.pipe(Pe(i),m(([{suggest:a},c])=>{let p=c.split(/([\s-]+)/);if(a!=null&&a.length&&p[p.length-1]){let l=a[a.length-1];l.startsWith(p[p.length-1])&&(p[p.length-1]=l)}else p.length=0;return p})).subscribe(a=>e.innerHTML=a.join("").replace(/\s/g," ")),r.pipe(g(({mode:a})=>a==="search")).subscribe(a=>{switch(a.type){case"ArrowRight":e.innerText.length&&n.selectionStart===n.value.length&&(n.value=e.innerText);break}}),t.pipe(g(Sr),m(({data:a})=>a)).pipe(O(a=>o.next(a)),A(()=>o.complete()),m(()=>({ref:e})))}function _i(e,{index$:t,keyboard$:r}){let o=Te();try{let n=Ei(o.search,t),i=Ce("search-query",e),s=Ce("search-result",e);h(e,"click").pipe(g(({target:c})=>c instanceof Element&&!!c.closest("a"))).subscribe(()=>at("search",!1)),r.pipe(g(({mode:c})=>c==="search")).subscribe(c=>{let p=Ne();switch(c.type){case"Enter":if(p===i){let l=new Map;for(let f of M(":first-child [href]",s)){let u=f.firstElementChild;l.set(f,parseFloat(u.getAttribute("data-md-score")))}if(l.size){let[[f]]=[...l].sort(([,u],[,d])=>d-u);f.click()}c.claim()}break;case"Escape":case"Tab":at("search",!1),i.blur();break;case"ArrowUp":case"ArrowDown":if(typeof p=="undefined")i.focus();else{let l=[i,...M(":not(details) > [href], summary, details[open] [href]",s)],f=Math.max(0,(Math.max(0,l.indexOf(p))+l.length+(c.type==="ArrowUp"?-1:1))%l.length);l[f].focus()}c.claim();break;default:i!==Ne()&&i.focus()}}),r.pipe(g(({mode:c})=>c==="global")).subscribe(c=>{switch(c.type){case"f":case"s":case"/":i.focus(),i.select(),c.claim();break}});let a=Si(i,{worker$:n});return L(a,Oi(s,{worker$:n,query$:a})).pipe(Ve(...me("search-share",e).map(c=>Li(c,{query$:a})),...me("search-suggest",e).map(c=>Mi(c,{worker$:n,keyboard$:r}))))}catch(n){return e.hidden=!0,tt}}function Ai(e,{index$:t,location$:r}){return z([t,r.pipe(Q(we()),g(o=>!!o.searchParams.get("h")))]).pipe(m(([o,n])=>xi(o.config)(n.searchParams.get("h"))),m(o=>{var s;let n=new Map,i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT);for(let a=i.nextNode();a;a=i.nextNode())if((s=a.parentElement)!=null&&s.offsetHeight){let c=a.textContent,p=o(c);p.length>c.length&&n.set(a,p)}for(let[a,c]of n){let{childNodes:p}=x("span",null,c);a.replaceWith(...Array.from(p))}return{ref:e,nodes:n}}))}function Ss(e,{viewport$:t,main$:r}){let o=e.closest(".md-grid"),n=o.offsetTop-o.parentElement.offsetTop;return z([r,t]).pipe(m(([{offset:i,height:s},{offset:{y:a}}])=>(s=s+Math.min(n,Math.max(0,a-i))-n,{height:s,locked:a>=i+n})),Y((i,s)=>i.height===s.height&&i.locked===s.locked))}function lo(e,o){var n=o,{header$:t}=n,r=vo(n,["header$"]);let i=j(".md-sidebar__scrollwrap",e),{y:s}=Be(i);return H(()=>{let a=new T,c=a.pipe(oe(),ae(!0)),p=a.pipe($e(0,ye));return p.pipe(te(t)).subscribe({next([{height:l},{height:f}]){i.style.height=`${l-2*s}px`,e.style.top=`${f}px`},complete(){i.style.height="",e.style.top=""}}),p.pipe(Re()).subscribe(()=>{for(let l of M(".md-nav__link--active[href]",e)){if(!l.clientHeight)continue;let f=l.closest(".md-sidebar__scrollwrap");if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:d}=de(f);f.scrollTo({top:u-d/2})}}}),fe(M("label[tabindex]",e)).pipe(J(l=>h(l,"click").pipe(xe(pe),m(()=>l),W(c)))).subscribe(l=>{let f=j(`[id="${l.htmlFor}"]`);j(`[aria-labelledby="${l.id}"]`).setAttribute("aria-expanded",`${f.checked}`)}),V("content.tooltips")&&fe(M("abbr[title]",e)).pipe(J(l=>Xe(l,{viewport$})),W(c)).subscribe(),Ss(e,r).pipe(O(l=>a.next(l)),A(()=>a.complete()),m(l=>P({ref:e},l)))})}function Ci(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return rt(ze(`${r}/releases/latest`).pipe(ve(()=>y),m(o=>({version:o.tag_name})),Qe({})),ze(r).pipe(ve(()=>y),m(o=>({stars:o.stargazers_count,forks:o.forks_count})),Qe({}))).pipe(m(([o,n])=>P(P({},o),n)))}else{let r=`https://api.github.com/users/${e}`;return ze(r).pipe(m(o=>({repositories:o.public_repos})),Qe({}))}}function ki(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return rt(ze(`${r}/releases/permalink/latest`).pipe(ve(()=>y),m(({tag_name:o})=>({version:o})),Qe({})),ze(r).pipe(ve(()=>y),m(({star_count:o,forks_count:n})=>({stars:o,forks:n})),Qe({}))).pipe(m(([o,n])=>P(P({},o),n)))}function Hi(e){let t=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);if(t){let[,r,o]=t;return Ci(r,o)}if(t=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i),t){let[,r,o]=t;return ki(r,o)}return y}var Os;function Ls(e){return Os||(Os=H(()=>{let t=__md_get("__source",sessionStorage);if(t)return $(t);if(me("consent").length){let o=__md_get("__consent");if(!(o&&o.github))return y}return Hi(e.href).pipe(O(o=>__md_set("__source",o,sessionStorage)))}).pipe(ve(()=>y),g(t=>Object.keys(t).length>0),m(t=>({facts:t})),Z(1)))}function $i(e){let t=j(":scope > :last-child",e);return H(()=>{let r=new T;return r.subscribe(({facts:o})=>{t.appendChild(jn(o)),t.classList.add("md-source__repository--active")}),Ls(e).pipe(O(o=>r.next(o)),A(()=>r.complete()),m(o=>P({ref:e},o)))})}function Ms(e,{viewport$:t,header$:r}){return Le(document.body).pipe(b(()=>Er(e,{header$:r,viewport$:t})),m(({offset:{y:o}})=>({hidden:o>=10})),ne("hidden"))}function Pi(e,t){return H(()=>{let r=new T;return r.subscribe({next({hidden:o}){e.hidden=o},complete(){e.hidden=!1}}),(V("navigation.tabs.sticky")?$({hidden:!1}):Ms(e,t)).pipe(O(o=>r.next(o)),A(()=>r.complete()),m(o=>P({ref:e},o)))})}function _s(e,{viewport$:t,header$:r}){let o=new Map,n=M(".md-nav__link",e);for(let a of n){let c=decodeURIComponent(a.hash.substring(1)),p=ue(`[id="${c}"]`);typeof p!="undefined"&&o.set(a,p)}let i=r.pipe(ne("height"),m(({height:a})=>{let c=Ce("main"),p=j(":scope > :first-child",c);return a+.8*(p.offsetTop-c.offsetTop)}),le());return Le(document.body).pipe(ne("height"),b(a=>H(()=>{let c=[];return $([...o].reduce((p,[l,f])=>{for(;c.length&&o.get(c[c.length-1]).tagName>=f.tagName;)c.pop();let u=f.offsetTop;for(;!u&&f.parentElement;)f=f.parentElement,u=f.offsetTop;let d=f.offsetParent;for(;d;d=d.offsetParent)u+=d.offsetTop;return p.set([...c=[...c,l]].reverse(),u)},new Map))}).pipe(m(c=>new Map([...c].sort(([,p],[,l])=>p-l))),Pe(i),b(([c,p])=>t.pipe(Ut(([l,f],{offset:{y:u},size:d})=>{let v=u+d.height>=Math.floor(a.height);for(;f.length;){let[,S]=f[0];if(S-p=u&&!v)f=[l.pop(),...f];else break}return[l,f]},[[],[...c]]),Y((l,f)=>l[0]===f[0]&&l[1]===f[1])))))).pipe(m(([a,c])=>({prev:a.map(([p])=>p),next:c.map(([p])=>p)})),Q({prev:[],next:[]}),ot(2,1),m(([a,c])=>a.prev.length{let i=new T,s=i.pipe(oe(),ae(!0));if(i.subscribe(({prev:a,next:c})=>{for(let[p]of c)p.classList.remove("md-nav__link--passed"),p.classList.remove("md-nav__link--active");for(let[p,[l]]of a.entries())l.classList.add("md-nav__link--passed"),l.classList.toggle("md-nav__link--active",p===a.length-1)}),V("toc.follow")){let a=L(t.pipe(Ae(1),m(()=>{})),t.pipe(Ae(250),m(()=>"smooth")));i.pipe(g(({prev:c})=>c.length>0),Pe(o.pipe(xe(pe))),te(a)).subscribe(([[{prev:c}],p])=>{let[l]=c[c.length-1];if(l.offsetHeight){let f=vr(l);if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:d}=de(f);f.scrollTo({top:u-d/2,behavior:p})}}})}return V("navigation.tracking")&&t.pipe(W(s),ne("offset"),Ae(250),Ie(1),W(n.pipe(Ie(1))),vt({delay:250}),te(i)).subscribe(([,{prev:a}])=>{let c=we(),p=a[a.length-1];if(p&&p.length){let[l]=p,{hash:f}=new URL(l.href);c.hash!==f&&(c.hash=f,history.replaceState({},"",`${c}`))}else c.hash="",history.replaceState({},"",`${c}`)}),_s(e,{viewport$:t,header$:r}).pipe(O(a=>i.next(a)),A(()=>i.complete()),m(a=>P({ref:e},a)))})}function As(e,{viewport$:t,main$:r,target$:o}){let n=t.pipe(m(({offset:{y:s}})=>s),ot(2,1),m(([s,a])=>s>a&&a>0),Y()),i=r.pipe(m(({active:s})=>s));return z([i,n]).pipe(m(([s,a])=>!(s&&a)),Y(),W(o.pipe(Ie(1))),ae(!0),vt({delay:250}),m(s=>({hidden:s})))}function Ii(e,{viewport$:t,header$:r,main$:o,target$:n}){let i=new T,s=i.pipe(oe(),ae(!0));return i.subscribe({next({hidden:a}){e.hidden=a,a?(e.setAttribute("tabindex","-1"),e.blur()):e.removeAttribute("tabindex")},complete(){e.style.top="",e.hidden=!0,e.removeAttribute("tabindex")}}),r.pipe(W(s),ne("height")).subscribe(({height:a})=>{e.style.top=`${a+16}px`}),h(e,"click").subscribe(a=>{a.preventDefault(),window.scrollTo({top:0})}),As(e,{viewport$:t,main$:o,target$:n}).pipe(O(a=>i.next(a)),A(()=>i.complete()),m(a=>P({ref:e},a)))}function Fi({document$:e,viewport$:t}){e.pipe(b(()=>M(".md-ellipsis")),J(r=>mt(r).pipe(W(e.pipe(Ie(1))),g(o=>o),m(()=>r),Ee(1))),g(r=>r.offsetWidth{let o=r.innerText,n=r.closest("a")||r;return n.title=o,V("content.tooltips")?Xe(n,{viewport$:t}).pipe(W(e.pipe(Ie(1))),A(()=>n.removeAttribute("title"))):y})).subscribe(),V("content.tooltips")&&e.pipe(b(()=>M(".md-status")),J(r=>Xe(r,{viewport$:t}))).subscribe()}function ji({document$:e,tablet$:t}){e.pipe(b(()=>M(".md-toggle--indeterminate")),O(r=>{r.indeterminate=!0,r.checked=!1}),J(r=>h(r,"change").pipe(Jr(()=>r.classList.contains("md-toggle--indeterminate")),m(()=>r))),te(t)).subscribe(([r,o])=>{r.classList.remove("md-toggle--indeterminate"),o&&(r.checked=!1)})}function Cs(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function Ui({document$:e}){e.pipe(b(()=>M("[data-md-scrollfix]")),O(t=>t.removeAttribute("data-md-scrollfix")),g(Cs),J(t=>h(t,"touchstart").pipe(m(()=>t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function Wi({viewport$:e,tablet$:t}){z([Je("search"),t]).pipe(m(([r,o])=>r&&!o),b(r=>$(r).pipe(nt(r?400:100))),te(e)).subscribe(([r,{offset:{y:o}}])=>{if(r)document.body.setAttribute("data-md-scrolllock",""),document.body.style.top=`-${o}px`;else{let n=-1*parseInt(document.body.style.top,10);document.body.removeAttribute("data-md-scrolllock"),document.body.style.top="",n&&window.scrollTo(0,n)}})}Object.entries||(Object.entries=function(e){let t=[];for(let r of Object.keys(e))t.push([r,e[r]]);return t});Object.values||(Object.values=function(e){let t=[];for(let r of Object.keys(e))t.push(e[r]);return t});typeof Element!="undefined"&&(Element.prototype.scrollTo||(Element.prototype.scrollTo=function(e,t){typeof e=="object"?(this.scrollLeft=e.left,this.scrollTop=e.top):(this.scrollLeft=e,this.scrollTop=t)}),Element.prototype.replaceWith||(Element.prototype.replaceWith=function(...e){let t=this.parentNode;if(t){e.length===0&&t.removeChild(this);for(let r=e.length-1;r>=0;r--){let o=e[r];typeof o=="string"?o=document.createTextNode(o):o.parentNode&&o.parentNode.removeChild(o),r?t.insertBefore(this.previousSibling,o):t.replaceChild(o,this)}}}));function ks(){return location.protocol==="file:"?_t(`${new URL("search/search_index.js",Or.base)}`).pipe(m(()=>__index),Z(1)):ze(new URL("search/search_index.json",Or.base))}document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var ct=an(),Kt=bn(),Ht=yn(Kt),mo=hn(),ke=Ln(),Lr=Wt("(min-width: 960px)"),Vi=Wt("(min-width: 1220px)"),Ni=xn(),Or=Te(),zi=document.forms.namedItem("search")?ks():tt,fo=new T;di({alert$:fo});ui({document$:ct});var uo=new T,qi=kt(Or.base);V("navigation.instant")&&gi({sitemap$:qi,location$:Kt,viewport$:ke,progress$:uo}).subscribe(ct);var Di;((Di=Or.version)==null?void 0:Di.provider)==="mike"&&Ti({document$:ct});L(Kt,Ht).pipe(nt(125)).subscribe(()=>{at("drawer",!1),at("search",!1)});mo.pipe(g(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=ue("link[rel=prev]");typeof t!="undefined"&&st(t);break;case"n":case".":let r=ue("link[rel=next]");typeof r!="undefined"&&st(r);break;case"Enter":let o=Ne();o instanceof HTMLLabelElement&&o.click()}});Fi({viewport$:ke,document$:ct});ji({document$:ct,tablet$:Lr});Ui({document$:ct});Wi({viewport$:ke,tablet$:Lr});var ft=ai(Ce("header"),{viewport$:ke}),qt=ct.pipe(m(()=>Ce("main")),b(e=>pi(e,{viewport$:ke,header$:ft})),Z(1)),Hs=L(...me("consent").map(e=>An(e,{target$:Ht})),...me("dialog").map(e=>ni(e,{alert$:fo})),...me("palette").map(e=>li(e)),...me("progress").map(e=>mi(e,{progress$:uo})),...me("search").map(e=>_i(e,{index$:zi,keyboard$:mo})),...me("source").map(e=>$i(e))),$s=H(()=>L(...me("announce").map(e=>_n(e)),...me("content").map(e=>oi(e,{sitemap$:qi,viewport$:ke,target$:Ht,print$:Ni})),...me("content").map(e=>V("search.highlight")?Ai(e,{index$:zi,location$:Kt}):y),...me("header").map(e=>si(e,{viewport$:ke,header$:ft,main$:qt})),...me("header-title").map(e=>ci(e,{viewport$:ke,header$:ft})),...me("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?eo(Vi,()=>lo(e,{viewport$:ke,header$:ft,main$:qt})):eo(Lr,()=>lo(e,{viewport$:ke,header$:ft,main$:qt}))),...me("tabs").map(e=>Pi(e,{viewport$:ke,header$:ft})),...me("toc").map(e=>Ri(e,{viewport$:ke,header$:ft,main$:qt,target$:Ht})),...me("top").map(e=>Ii(e,{viewport$:ke,header$:ft,main$:qt,target$:Ht})))),Ki=ct.pipe(b(()=>$s),Ve(Hs),Z(1));Ki.subscribe();window.document$=ct;window.location$=Kt;window.target$=Ht;window.keyboard$=mo;window.viewport$=ke;window.tablet$=Lr;window.screen$=Vi;window.print$=Ni;window.alert$=fo;window.progress$=uo;window.component$=Ki;})(); diff --git a/assets/javascripts/lunr/min/lunr.ar.min.js b/assets/javascripts/lunr/min/lunr.ar.min.js new file mode 100644 index 00000000..9b06c26c --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.ar.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ar=function(){this.pipeline.reset(),this.pipeline.add(e.ar.trimmer,e.ar.stopWordFilter,e.ar.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ar.stemmer))},e.ar.wordCharacters="ء-ٛٱـ",e.ar.trimmer=e.trimmerSupport.generateTrimmer(e.ar.wordCharacters),e.Pipeline.registerFunction(e.ar.trimmer,"trimmer-ar"),e.ar.stemmer=function(){var e=this;return e.result=!1,e.preRemoved=!1,e.sufRemoved=!1,e.pre={pre1:"ف ك ب و س ل ن ا ي ت",pre2:"ال لل",pre3:"بال وال فال تال كال ولل",pre4:"فبال كبال وبال وكال"},e.suf={suf1:"ه ك ت ن ا ي",suf2:"نك نه ها وك يا اه ون ين تن تم نا وا ان كم كن ني نن ما هم هن تك ته ات يه",suf3:"تين كهم نيه نهم ونه وها يهم ونا ونك وني وهم تكم تنا تها تني تهم كما كها ناه نكم هنا تان يها",suf4:"كموه ناها ونني ونهم تكما تموه تكاه كماه ناكم ناهم نيها وننا"},e.patterns=JSON.parse('{"pt43":[{"pt":[{"c":"ا","l":1}]},{"pt":[{"c":"ا,ت,ن,ي","l":0}],"mPt":[{"c":"ف","l":0,"m":1},{"c":"ع","l":1,"m":2},{"c":"ل","l":2,"m":3}]},{"pt":[{"c":"و","l":2}],"mPt":[{"c":"ف","l":0,"m":0},{"c":"ع","l":1,"m":1},{"c":"ل","l":2,"m":3}]},{"pt":[{"c":"ا","l":2}]},{"pt":[{"c":"ي","l":2}],"mPt":[{"c":"ف","l":0,"m":0},{"c":"ع","l":1,"m":1},{"c":"ا","l":2},{"c":"ل","l":3,"m":3}]},{"pt":[{"c":"م","l":0}]}],"pt53":[{"pt":[{"c":"ت","l":0},{"c":"ا","l":2}]},{"pt":[{"c":"ا,ن,ت,ي","l":0},{"c":"ت","l":2}],"mPt":[{"c":"ا","l":0},{"c":"ف","l":1,"m":1},{"c":"ت","l":2},{"c":"ع","l":3,"m":3},{"c":"ا","l":4},{"c":"ل","l":5,"m":4}]},{"pt":[{"c":"ا","l":0},{"c":"ا","l":2}],"mPt":[{"c":"ا","l":0},{"c":"ف","l":1,"m":1},{"c":"ع","l":2,"m":3},{"c":"ل","l":3,"m":4},{"c":"ا","l":4},{"c":"ل","l":5,"m":4}]},{"pt":[{"c":"ا","l":0},{"c":"ا","l":3}],"mPt":[{"c":"ف","l":0,"m":1},{"c":"ع","l":1,"m":2},{"c":"ل","l":2,"m":4}]},{"pt":[{"c":"ا","l":3},{"c":"ن","l":4}]},{"pt":[{"c":"ت","l":0},{"c":"ي","l":3}]},{"pt":[{"c":"م","l":0},{"c":"و","l":3}]},{"pt":[{"c":"ا","l":1},{"c":"و","l":3}]},{"pt":[{"c":"و","l":1},{"c":"ا","l":2}]},{"pt":[{"c":"م","l":0},{"c":"ا","l":3}]},{"pt":[{"c":"م","l":0},{"c":"ي","l":3}]},{"pt":[{"c":"ا","l":2},{"c":"ن","l":3}]},{"pt":[{"c":"م","l":0},{"c":"ن","l":1}],"mPt":[{"c":"ا","l":0},{"c":"ن","l":1},{"c":"ف","l":2,"m":2},{"c":"ع","l":3,"m":3},{"c":"ا","l":4},{"c":"ل","l":5,"m":4}]},{"pt":[{"c":"م","l":0},{"c":"ت","l":2}],"mPt":[{"c":"ا","l":0},{"c":"ف","l":1,"m":1},{"c":"ت","l":2},{"c":"ع","l":3,"m":3},{"c":"ا","l":4},{"c":"ل","l":5,"m":4}]},{"pt":[{"c":"م","l":0},{"c":"ا","l":2}]},{"pt":[{"c":"م","l":1},{"c":"ا","l":3}]},{"pt":[{"c":"ي,ت,ا,ن","l":0},{"c":"ت","l":1}],"mPt":[{"c":"ف","l":0,"m":2},{"c":"ع","l":1,"m":3},{"c":"ا","l":2},{"c":"ل","l":3,"m":4}]},{"pt":[{"c":"ت,ي,ا,ن","l":0},{"c":"ت","l":2}],"mPt":[{"c":"ا","l":0},{"c":"ف","l":1,"m":1},{"c":"ت","l":2},{"c":"ع","l":3,"m":3},{"c":"ا","l":4},{"c":"ل","l":5,"m":4}]},{"pt":[{"c":"ا","l":2},{"c":"ي","l":3}]},{"pt":[{"c":"ا,ي,ت,ن","l":0},{"c":"ن","l":1}],"mPt":[{"c":"ا","l":0},{"c":"ن","l":1},{"c":"ف","l":2,"m":2},{"c":"ع","l":3,"m":3},{"c":"ا","l":4},{"c":"ل","l":5,"m":4}]},{"pt":[{"c":"ا","l":3},{"c":"ء","l":4}]}],"pt63":[{"pt":[{"c":"ا","l":0},{"c":"ت","l":2},{"c":"ا","l":4}]},{"pt":[{"c":"ا,ت,ن,ي","l":0},{"c":"س","l":1},{"c":"ت","l":2}],"mPt":[{"c":"ا","l":0},{"c":"س","l":1},{"c":"ت","l":2},{"c":"ف","l":3,"m":3},{"c":"ع","l":4,"m":4},{"c":"ا","l":5},{"c":"ل","l":6,"m":5}]},{"pt":[{"c":"ا,ن,ت,ي","l":0},{"c":"و","l":3}]},{"pt":[{"c":"م","l":0},{"c":"س","l":1},{"c":"ت","l":2}],"mPt":[{"c":"ا","l":0},{"c":"س","l":1},{"c":"ت","l":2},{"c":"ف","l":3,"m":3},{"c":"ع","l":4,"m":4},{"c":"ا","l":5},{"c":"ل","l":6,"m":5}]},{"pt":[{"c":"ي","l":1},{"c":"ي","l":3},{"c":"ا","l":4},{"c":"ء","l":5}]},{"pt":[{"c":"ا","l":0},{"c":"ن","l":1},{"c":"ا","l":4}]}],"pt54":[{"pt":[{"c":"ت","l":0}]},{"pt":[{"c":"ا,ي,ت,ن","l":0}],"mPt":[{"c":"ا","l":0},{"c":"ف","l":1,"m":1},{"c":"ع","l":2,"m":2},{"c":"ل","l":3,"m":3},{"c":"ر","l":4,"m":4},{"c":"ا","l":5},{"c":"ر","l":6,"m":4}]},{"pt":[{"c":"م","l":0}],"mPt":[{"c":"ا","l":0},{"c":"ف","l":1,"m":1},{"c":"ع","l":2,"m":2},{"c":"ل","l":3,"m":3},{"c":"ر","l":4,"m":4},{"c":"ا","l":5},{"c":"ر","l":6,"m":4}]},{"pt":[{"c":"ا","l":2}]},{"pt":[{"c":"ا","l":0},{"c":"ن","l":2}]}],"pt64":[{"pt":[{"c":"ا","l":0},{"c":"ا","l":4}]},{"pt":[{"c":"م","l":0},{"c":"ت","l":1}]}],"pt73":[{"pt":[{"c":"ا","l":0},{"c":"س","l":1},{"c":"ت","l":2},{"c":"ا","l":5}]}],"pt75":[{"pt":[{"c":"ا","l":0},{"c":"ا","l":5}]}]}'),e.execArray=["cleanWord","removeDiacritics","cleanAlef","removeStopWords","normalizeHamzaAndAlef","removeStartWaw","removePre432","removeEndTaa","wordCheck"],e.stem=function(){var r=0;for(e.result=!1,e.preRemoved=!1,e.sufRemoved=!1;r=0)return!0},e.normalizeHamzaAndAlef=function(){return e.word=e.word.replace("ؤ","ء"),e.word=e.word.replace("ئ","ء"),e.word=e.word.replace(/([\u0627])\1+/gi,"ا"),!1},e.removeEndTaa=function(){return!(e.word.length>2)||(e.word=e.word.replace(/[\u0627]$/,""),e.word=e.word.replace("ة",""),!1)},e.removeStartWaw=function(){return e.word.length>3&&"و"==e.word[0]&&"و"==e.word[1]&&(e.word=e.word.slice(1)),!1},e.removePre432=function(){var r=e.word;if(e.word.length>=7){var t=new RegExp("^("+e.pre.pre4.split(" ").join("|")+")");e.word=e.word.replace(t,"")}if(e.word==r&&e.word.length>=6){var c=new RegExp("^("+e.pre.pre3.split(" ").join("|")+")");e.word=e.word.replace(c,"")}if(e.word==r&&e.word.length>=5){var l=new RegExp("^("+e.pre.pre2.split(" ").join("|")+")");e.word=e.word.replace(l,"")}return r!=e.word&&(e.preRemoved=!0),!1},e.patternCheck=function(r){for(var t=0;t3){var t=new RegExp("^("+e.pre.pre1.split(" ").join("|")+")");e.word=e.word.replace(t,"")}return r!=e.word&&(e.preRemoved=!0),!1},e.removeSuf1=function(){var r=e.word;if(0==e.sufRemoved&&e.word.length>3){var t=new RegExp("("+e.suf.suf1.split(" ").join("|")+")$");e.word=e.word.replace(t,"")}return r!=e.word&&(e.sufRemoved=!0),!1},e.removeSuf432=function(){var r=e.word;if(e.word.length>=6){var t=new RegExp("("+e.suf.suf4.split(" ").join("|")+")$");e.word=e.word.replace(t,"")}if(e.word==r&&e.word.length>=5){var c=new RegExp("("+e.suf.suf3.split(" ").join("|")+")$");e.word=e.word.replace(c,"")}if(e.word==r&&e.word.length>=4){var l=new RegExp("("+e.suf.suf2.split(" ").join("|")+")$");e.word=e.word.replace(l,"")}return r!=e.word&&(e.sufRemoved=!0),!1},e.wordCheck=function(){for(var r=(e.word,[e.removeSuf432,e.removeSuf1,e.removePre1]),t=0,c=!1;e.word.length>=7&&!e.result&&t=f.limit)return;f.cursor++}for(;!f.out_grouping(w,97,248);){if(f.cursor>=f.limit)return;f.cursor++}d=f.cursor,d=d&&(r=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,e=f.find_among_b(c,32),f.limit_backward=r,e))switch(f.bra=f.cursor,e){case 1:f.slice_del();break;case 2:f.in_grouping_b(p,97,229)&&f.slice_del()}}function t(){var e,r=f.limit-f.cursor;f.cursor>=d&&(e=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,f.find_among_b(l,4)?(f.bra=f.cursor,f.limit_backward=e,f.cursor=f.limit-r,f.cursor>f.limit_backward&&(f.cursor--,f.bra=f.cursor,f.slice_del())):f.limit_backward=e)}function s(){var e,r,i,n=f.limit-f.cursor;if(f.ket=f.cursor,f.eq_s_b(2,"st")&&(f.bra=f.cursor,f.eq_s_b(2,"ig")&&f.slice_del()),f.cursor=f.limit-n,f.cursor>=d&&(r=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,e=f.find_among_b(m,5),f.limit_backward=r,e))switch(f.bra=f.cursor,e){case 1:f.slice_del(),i=f.limit-f.cursor,t(),f.cursor=f.limit-i;break;case 2:f.slice_from("løs")}}function o(){var e;f.cursor>=d&&(e=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,f.out_grouping_b(w,97,248)?(f.bra=f.cursor,u=f.slice_to(u),f.limit_backward=e,f.eq_v_b(u)&&f.slice_del()):f.limit_backward=e)}var a,d,u,c=[new r("hed",-1,1),new r("ethed",0,1),new r("ered",-1,1),new r("e",-1,1),new r("erede",3,1),new r("ende",3,1),new r("erende",5,1),new r("ene",3,1),new r("erne",3,1),new r("ere",3,1),new r("en",-1,1),new r("heden",10,1),new r("eren",10,1),new r("er",-1,1),new r("heder",13,1),new r("erer",13,1),new r("s",-1,2),new r("heds",16,1),new r("es",16,1),new r("endes",18,1),new r("erendes",19,1),new r("enes",18,1),new r("ernes",18,1),new r("eres",18,1),new r("ens",16,1),new r("hedens",24,1),new r("erens",24,1),new r("ers",16,1),new r("ets",16,1),new r("erets",28,1),new r("et",-1,1),new r("eret",30,1)],l=[new r("gd",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1)],m=[new r("ig",-1,1),new r("lig",0,1),new r("elig",1,1),new r("els",-1,1),new r("løst",-1,2)],w=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],p=[239,254,42,3,0,0,0,0,0,0,0,0,0,0,0,0,16],f=new i;this.setCurrent=function(e){f.setCurrent(e)},this.getCurrent=function(){return f.getCurrent()},this.stem=function(){var r=f.cursor;return e(),f.limit_backward=r,f.cursor=f.limit,n(),f.cursor=f.limit,t(),f.cursor=f.limit,s(),f.cursor=f.limit,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.da.stemmer,"stemmer-da"),e.da.stopWordFilter=e.generateStopWordFilter("ad af alle alt anden at blev blive bliver da de dem den denne der deres det dette dig din disse dog du efter eller en end er et for fra ham han hans har havde have hende hendes her hos hun hvad hvis hvor i ikke ind jeg jer jo kunne man mange med meget men mig min mine mit mod ned noget nogle nu når og også om op os over på selv sig sin sine sit skal skulle som sådan thi til ud under var vi vil ville vor være været".split(" ")),e.Pipeline.registerFunction(e.da.stopWordFilter,"stopWordFilter-da")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.de.min.js b/assets/javascripts/lunr/min/lunr.de.min.js new file mode 100644 index 00000000..f3b5c108 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.de.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `German` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.de=function(){this.pipeline.reset(),this.pipeline.add(e.de.trimmer,e.de.stopWordFilter,e.de.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.de.stemmer))},e.de.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.de.trimmer=e.trimmerSupport.generateTrimmer(e.de.wordCharacters),e.Pipeline.registerFunction(e.de.trimmer,"trimmer-de"),e.de.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,i=new function(){function e(e,r,n){return!(!v.eq_s(1,e)||(v.ket=v.cursor,!v.in_grouping(p,97,252)))&&(v.slice_from(r),v.cursor=n,!0)}function i(){for(var r,n,i,s,t=v.cursor;;)if(r=v.cursor,v.bra=r,v.eq_s(1,"ß"))v.ket=v.cursor,v.slice_from("ss");else{if(r>=v.limit)break;v.cursor=r+1}for(v.cursor=t;;)for(n=v.cursor;;){if(i=v.cursor,v.in_grouping(p,97,252)){if(s=v.cursor,v.bra=s,e("u","U",i))break;if(v.cursor=s,e("y","Y",i))break}if(i>=v.limit)return void(v.cursor=n);v.cursor=i+1}}function s(){for(;!v.in_grouping(p,97,252);){if(v.cursor>=v.limit)return!0;v.cursor++}for(;!v.out_grouping(p,97,252);){if(v.cursor>=v.limit)return!0;v.cursor++}return!1}function t(){m=v.limit,l=m;var e=v.cursor+3;0<=e&&e<=v.limit&&(d=e,s()||(m=v.cursor,m=v.limit)return;v.cursor++}}}function c(){return m<=v.cursor}function u(){return l<=v.cursor}function a(){var e,r,n,i,s=v.limit-v.cursor;if(v.ket=v.cursor,(e=v.find_among_b(w,7))&&(v.bra=v.cursor,c()))switch(e){case 1:v.slice_del();break;case 2:v.slice_del(),v.ket=v.cursor,v.eq_s_b(1,"s")&&(v.bra=v.cursor,v.eq_s_b(3,"nis")&&v.slice_del());break;case 3:v.in_grouping_b(g,98,116)&&v.slice_del()}if(v.cursor=v.limit-s,v.ket=v.cursor,(e=v.find_among_b(f,4))&&(v.bra=v.cursor,c()))switch(e){case 1:v.slice_del();break;case 2:if(v.in_grouping_b(k,98,116)){var t=v.cursor-3;v.limit_backward<=t&&t<=v.limit&&(v.cursor=t,v.slice_del())}}if(v.cursor=v.limit-s,v.ket=v.cursor,(e=v.find_among_b(_,8))&&(v.bra=v.cursor,u()))switch(e){case 1:v.slice_del(),v.ket=v.cursor,v.eq_s_b(2,"ig")&&(v.bra=v.cursor,r=v.limit-v.cursor,v.eq_s_b(1,"e")||(v.cursor=v.limit-r,u()&&v.slice_del()));break;case 2:n=v.limit-v.cursor,v.eq_s_b(1,"e")||(v.cursor=v.limit-n,v.slice_del());break;case 3:if(v.slice_del(),v.ket=v.cursor,i=v.limit-v.cursor,!v.eq_s_b(2,"er")&&(v.cursor=v.limit-i,!v.eq_s_b(2,"en")))break;v.bra=v.cursor,c()&&v.slice_del();break;case 4:v.slice_del(),v.ket=v.cursor,e=v.find_among_b(b,2),e&&(v.bra=v.cursor,u()&&1==e&&v.slice_del())}}var d,l,m,h=[new r("",-1,6),new r("U",0,2),new r("Y",0,1),new r("ä",0,3),new r("ö",0,4),new r("ü",0,5)],w=[new r("e",-1,2),new r("em",-1,1),new r("en",-1,2),new r("ern",-1,1),new r("er",-1,1),new r("s",-1,3),new r("es",5,2)],f=[new r("en",-1,1),new r("er",-1,1),new r("st",-1,2),new r("est",2,1)],b=[new r("ig",-1,1),new r("lich",-1,1)],_=[new r("end",-1,1),new r("ig",-1,2),new r("ung",-1,1),new r("lich",-1,3),new r("isch",-1,2),new r("ik",-1,2),new r("heit",-1,3),new r("keit",-1,4)],p=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32,8],g=[117,30,5],k=[117,30,4],v=new n;this.setCurrent=function(e){v.setCurrent(e)},this.getCurrent=function(){return v.getCurrent()},this.stem=function(){var e=v.cursor;return i(),v.cursor=e,t(),v.limit_backward=e,v.cursor=v.limit,a(),v.cursor=v.limit_backward,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.de.stemmer,"stemmer-de"),e.de.stopWordFilter=e.generateStopWordFilter("aber alle allem allen aller alles als also am an ander andere anderem anderen anderer anderes anderm andern anderr anders auch auf aus bei bin bis bist da damit dann das dasselbe dazu daß dein deine deinem deinen deiner deines dem demselben den denn denselben der derer derselbe derselben des desselben dessen dich die dies diese dieselbe dieselben diesem diesen dieser dieses dir doch dort du durch ein eine einem einen einer eines einig einige einigem einigen einiger einiges einmal er es etwas euch euer eure eurem euren eurer eures für gegen gewesen hab habe haben hat hatte hatten hier hin hinter ich ihm ihn ihnen ihr ihre ihrem ihren ihrer ihres im in indem ins ist jede jedem jeden jeder jedes jene jenem jenen jener jenes jetzt kann kein keine keinem keinen keiner keines können könnte machen man manche manchem manchen mancher manches mein meine meinem meinen meiner meines mich mir mit muss musste nach nicht nichts noch nun nur ob oder ohne sehr sein seine seinem seinen seiner seines selbst sich sie sind so solche solchem solchen solcher solches soll sollte sondern sonst um und uns unse unsem unsen unser unses unter viel vom von vor war waren warst was weg weil weiter welche welchem welchen welcher welches wenn werde werden wie wieder will wir wird wirst wo wollen wollte während würde würden zu zum zur zwar zwischen über".split(" ")),e.Pipeline.registerFunction(e.de.stopWordFilter,"stopWordFilter-de")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.du.min.js b/assets/javascripts/lunr/min/lunr.du.min.js new file mode 100644 index 00000000..49a0f3f0 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.du.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Dutch` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");console.warn('[Lunr Languages] Please use the "nl" instead of the "du". The "nl" code is the standard code for Dutch language, and "du" will be removed in the next major versions.'),e.du=function(){this.pipeline.reset(),this.pipeline.add(e.du.trimmer,e.du.stopWordFilter,e.du.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.du.stemmer))},e.du.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.du.trimmer=e.trimmerSupport.generateTrimmer(e.du.wordCharacters),e.Pipeline.registerFunction(e.du.trimmer,"trimmer-du"),e.du.stemmer=function(){var r=e.stemmerSupport.Among,i=e.stemmerSupport.SnowballProgram,n=new function(){function e(){for(var e,r,i,o=C.cursor;;){if(C.bra=C.cursor,e=C.find_among(b,11))switch(C.ket=C.cursor,e){case 1:C.slice_from("a");continue;case 2:C.slice_from("e");continue;case 3:C.slice_from("i");continue;case 4:C.slice_from("o");continue;case 5:C.slice_from("u");continue;case 6:if(C.cursor>=C.limit)break;C.cursor++;continue}break}for(C.cursor=o,C.bra=o,C.eq_s(1,"y")?(C.ket=C.cursor,C.slice_from("Y")):C.cursor=o;;)if(r=C.cursor,C.in_grouping(q,97,232)){if(i=C.cursor,C.bra=i,C.eq_s(1,"i"))C.ket=C.cursor,C.in_grouping(q,97,232)&&(C.slice_from("I"),C.cursor=r);else if(C.cursor=i,C.eq_s(1,"y"))C.ket=C.cursor,C.slice_from("Y"),C.cursor=r;else if(n(r))break}else if(n(r))break}function n(e){return C.cursor=e,e>=C.limit||(C.cursor++,!1)}function o(){_=C.limit,f=_,t()||(_=C.cursor,_<3&&(_=3),t()||(f=C.cursor))}function t(){for(;!C.in_grouping(q,97,232);){if(C.cursor>=C.limit)return!0;C.cursor++}for(;!C.out_grouping(q,97,232);){if(C.cursor>=C.limit)return!0;C.cursor++}return!1}function s(){for(var e;;)if(C.bra=C.cursor,e=C.find_among(p,3))switch(C.ket=C.cursor,e){case 1:C.slice_from("y");break;case 2:C.slice_from("i");break;case 3:if(C.cursor>=C.limit)return;C.cursor++}}function u(){return _<=C.cursor}function c(){return f<=C.cursor}function a(){var e=C.limit-C.cursor;C.find_among_b(g,3)&&(C.cursor=C.limit-e,C.ket=C.cursor,C.cursor>C.limit_backward&&(C.cursor--,C.bra=C.cursor,C.slice_del()))}function l(){var e;w=!1,C.ket=C.cursor,C.eq_s_b(1,"e")&&(C.bra=C.cursor,u()&&(e=C.limit-C.cursor,C.out_grouping_b(q,97,232)&&(C.cursor=C.limit-e,C.slice_del(),w=!0,a())))}function m(){var e;u()&&(e=C.limit-C.cursor,C.out_grouping_b(q,97,232)&&(C.cursor=C.limit-e,C.eq_s_b(3,"gem")||(C.cursor=C.limit-e,C.slice_del(),a())))}function d(){var e,r,i,n,o,t,s=C.limit-C.cursor;if(C.ket=C.cursor,e=C.find_among_b(h,5))switch(C.bra=C.cursor,e){case 1:u()&&C.slice_from("heid");break;case 2:m();break;case 3:u()&&C.out_grouping_b(z,97,232)&&C.slice_del()}if(C.cursor=C.limit-s,l(),C.cursor=C.limit-s,C.ket=C.cursor,C.eq_s_b(4,"heid")&&(C.bra=C.cursor,c()&&(r=C.limit-C.cursor,C.eq_s_b(1,"c")||(C.cursor=C.limit-r,C.slice_del(),C.ket=C.cursor,C.eq_s_b(2,"en")&&(C.bra=C.cursor,m())))),C.cursor=C.limit-s,C.ket=C.cursor,e=C.find_among_b(k,6))switch(C.bra=C.cursor,e){case 1:if(c()){if(C.slice_del(),i=C.limit-C.cursor,C.ket=C.cursor,C.eq_s_b(2,"ig")&&(C.bra=C.cursor,c()&&(n=C.limit-C.cursor,!C.eq_s_b(1,"e")))){C.cursor=C.limit-n,C.slice_del();break}C.cursor=C.limit-i,a()}break;case 2:c()&&(o=C.limit-C.cursor,C.eq_s_b(1,"e")||(C.cursor=C.limit-o,C.slice_del()));break;case 3:c()&&(C.slice_del(),l());break;case 4:c()&&C.slice_del();break;case 5:c()&&w&&C.slice_del()}C.cursor=C.limit-s,C.out_grouping_b(j,73,232)&&(t=C.limit-C.cursor,C.find_among_b(v,4)&&C.out_grouping_b(q,97,232)&&(C.cursor=C.limit-t,C.ket=C.cursor,C.cursor>C.limit_backward&&(C.cursor--,C.bra=C.cursor,C.slice_del())))}var f,_,w,b=[new r("",-1,6),new r("á",0,1),new r("ä",0,1),new r("é",0,2),new r("ë",0,2),new r("í",0,3),new r("ï",0,3),new r("ó",0,4),new r("ö",0,4),new r("ú",0,5),new r("ü",0,5)],p=[new r("",-1,3),new r("I",0,2),new r("Y",0,1)],g=[new r("dd",-1,-1),new r("kk",-1,-1),new r("tt",-1,-1)],h=[new r("ene",-1,2),new r("se",-1,3),new r("en",-1,2),new r("heden",2,1),new r("s",-1,3)],k=[new r("end",-1,1),new r("ig",-1,2),new r("ing",-1,1),new r("lijk",-1,3),new r("baar",-1,4),new r("bar",-1,5)],v=[new r("aa",-1,-1),new r("ee",-1,-1),new r("oo",-1,-1),new r("uu",-1,-1)],q=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],j=[1,0,0,17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],z=[17,67,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],C=new i;this.setCurrent=function(e){C.setCurrent(e)},this.getCurrent=function(){return C.getCurrent()},this.stem=function(){var r=C.cursor;return e(),C.cursor=r,o(),C.limit_backward=r,C.cursor=C.limit,d(),C.cursor=C.limit_backward,s(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.du.stemmer,"stemmer-du"),e.du.stopWordFilter=e.generateStopWordFilter(" aan al alles als altijd andere ben bij daar dan dat de der deze die dit doch doen door dus een eens en er ge geen geweest haar had heb hebben heeft hem het hier hij hoe hun iemand iets ik in is ja je kan kon kunnen maar me meer men met mij mijn moet na naar niet niets nog nu of om omdat onder ons ook op over reeds te tegen toch toen tot u uit uw van veel voor want waren was wat werd wezen wie wil worden wordt zal ze zelf zich zij zijn zo zonder zou".split(" ")),e.Pipeline.registerFunction(e.du.stopWordFilter,"stopWordFilter-du")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.el.min.js b/assets/javascripts/lunr/min/lunr.el.min.js new file mode 100644 index 00000000..ace017bd --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.el.min.js @@ -0,0 +1 @@ +!function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.el=function(){this.pipeline.reset(),void 0===this.searchPipeline&&this.pipeline.add(e.el.trimmer,e.el.normilizer),this.pipeline.add(e.el.stopWordFilter,e.el.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.el.stemmer))},e.el.wordCharacters="A-Za-zΑαΒβΓγΔδΕεΖζΗηΘθΙιΚκΛλΜμΝνΞξΟοΠπΡρΣσςΤτΥυΦφΧχΨψΩωΆάΈέΉήΊίΌόΎύΏώΪΐΫΰΐΰ",e.el.trimmer=e.trimmerSupport.generateTrimmer(e.el.wordCharacters),e.Pipeline.registerFunction(e.el.trimmer,"trimmer-el"),e.el.stemmer=function(){function e(e){return s.test(e)}function t(e){return/[ΑΕΗΙΟΥΩ]$/.test(e)}function r(e){return/[ΑΕΗΙΟΩ]$/.test(e)}function n(n){var s=n;if(n.length<3)return s;if(!e(n))return s;if(i.indexOf(n)>=0)return s;var u=new RegExp("(.*)("+Object.keys(l).join("|")+")$"),o=u.exec(s);return null!==o&&(s=o[1]+l[o[2]]),null!==(o=/^(.+?)(ΑΔΕΣ|ΑΔΩΝ)$/.exec(s))&&(s=o[1],/(ΟΚ|ΜΑΜ|ΜΑΝ|ΜΠΑΜΠ|ΠΑΤΕΡ|ΓΙΑΓΙ|ΝΤΑΝΤ|ΚΥΡ|ΘΕΙ|ΠΕΘΕΡ|ΜΟΥΣΑΜ|ΚΑΠΛΑΜ|ΠΑΡ|ΨΑΡ|ΤΖΟΥΡ|ΤΑΜΠΟΥΡ|ΓΑΛΑΤ|ΦΑΦΛΑΤ)$/.test(o[1])||(s+="ΑΔ")),null!==(o=/^(.+?)(ΕΔΕΣ|ΕΔΩΝ)$/.exec(s))&&(s=o[1],/(ΟΠ|ΙΠ|ΕΜΠ|ΥΠ|ΓΗΠ|ΔΑΠ|ΚΡΑΣΠ|ΜΙΛ)$/.test(o[1])&&(s+="ΕΔ")),null!==(o=/^(.+?)(ΟΥΔΕΣ|ΟΥΔΩΝ)$/.exec(s))&&(s=o[1],/(ΑΡΚ|ΚΑΛΙΑΚ|ΠΕΤΑΛ|ΛΙΧ|ΠΛΕΞ|ΣΚ|Σ|ΦΛ|ΦΡ|ΒΕΛ|ΛΟΥΛ|ΧΝ|ΣΠ|ΤΡΑΓ|ΦΕ)$/.test(o[1])&&(s+="ΟΥΔ")),null!==(o=/^(.+?)(ΕΩΣ|ΕΩΝ|ΕΑΣ|ΕΑ)$/.exec(s))&&(s=o[1],/^(Θ|Δ|ΕΛ|ΓΑΛ|Ν|Π|ΙΔ|ΠΑΡ|ΣΤΕΡ|ΟΡΦ|ΑΝΔΡ|ΑΝΤΡ)$/.test(o[1])&&(s+="Ε")),null!==(o=/^(.+?)(ΕΙΟ|ΕΙΟΣ|ΕΙΟΙ|ΕΙΑ|ΕΙΑΣ|ΕΙΕΣ|ΕΙΟΥ|ΕΙΟΥΣ|ΕΙΩΝ)$/.exec(s))&&o[1].length>4&&(s=o[1]),null!==(o=/^(.+?)(ΙΟΥΣ|ΙΑΣ|ΙΕΣ|ΙΟΣ|ΙΟΥ|ΙΟΙ|ΙΩΝ|ΙΟΝ|ΙΑ|ΙΟ)$/.exec(s))&&(s=o[1],(t(s)||s.length<2||/^(ΑΓ|ΑΓΓΕΛ|ΑΓΡ|ΑΕΡ|ΑΘΛ|ΑΚΟΥΣ|ΑΞ|ΑΣ|Β|ΒΙΒΛ|ΒΥΤ|Γ|ΓΙΑΓ|ΓΩΝ|Δ|ΔΑΝ|ΔΗΛ|ΔΗΜ|ΔΟΚΙΜ|ΕΛ|ΖΑΧΑΡ|ΗΛ|ΗΠ|ΙΔ|ΙΣΚ|ΙΣΤ|ΙΟΝ|ΙΩΝ|ΚΙΜΩΛ|ΚΟΛΟΝ|ΚΟΡ|ΚΤΗΡ|ΚΥΡ|ΛΑΓ|ΛΟΓ|ΜΑΓ|ΜΠΑΝ|ΜΠΡ|ΝΑΥΤ|ΝΟΤ|ΟΠΑΛ|ΟΞ|ΟΡ|ΟΣ|ΠΑΝΑΓ|ΠΑΤΡ|ΠΗΛ|ΠΗΝ|ΠΛΑΙΣ|ΠΟΝΤ|ΡΑΔ|ΡΟΔ|ΣΚ|ΣΚΟΡΠ|ΣΟΥΝ|ΣΠΑΝ|ΣΤΑΔ|ΣΥΡ|ΤΗΛ|ΤΙΜ|ΤΟΚ|ΤΟΠ|ΤΡΟΧ|ΦΙΛ|ΦΩΤ|Χ|ΧΙΛ|ΧΡΩΜ|ΧΩΡ)$/.test(o[1]))&&(s+="Ι"),/^(ΠΑΛ)$/.test(o[1])&&(s+="ΑΙ")),null!==(o=/^(.+?)(ΙΚΟΣ|ΙΚΟΝ|ΙΚΕΙΣ|ΙΚΟΙ|ΙΚΕΣ|ΙΚΟΥΣ|ΙΚΗ|ΙΚΗΣ|ΙΚΟ|ΙΚΑ|ΙΚΟΥ|ΙΚΩΝ|ΙΚΩΣ)$/.exec(s))&&(s=o[1],(t(s)||/^(ΑΔ|ΑΛ|ΑΜΑΝ|ΑΜΕΡ|ΑΜΜΟΧΑΛ|ΑΝΗΘ|ΑΝΤΙΔ|ΑΠΛ|ΑΤΤ|ΑΦΡ|ΒΑΣ|ΒΡΩΜ|ΓΕΝ|ΓΕΡ|Δ|ΔΙΚΑΝ|ΔΥΤ|ΕΙΔ|ΕΝΔ|ΕΞΩΔ|ΗΘ|ΘΕΤ|ΚΑΛΛΙΝ|ΚΑΛΠ|ΚΑΤΑΔ|ΚΟΥΖΙΝ|ΚΡ|ΚΩΔ|ΛΟΓ|Μ|ΜΕΡ|ΜΟΝΑΔ|ΜΟΥΛ|ΜΟΥΣ|ΜΠΑΓΙΑΤ|ΜΠΑΝ|ΜΠΟΛ|ΜΠΟΣ|ΜΥΣΤ|Ν|ΝΙΤ|ΞΙΚ|ΟΠΤ|ΠΑΝ|ΠΕΤΣ|ΠΙΚΑΝΤ|ΠΙΤΣ|ΠΛΑΣΤ|ΠΛΙΑΤΣ|ΠΟΝΤ|ΠΟΣΤΕΛΝ|ΠΡΩΤΟΔ|ΣΕΡΤ|ΣΗΜΑΝΤ|ΣΤΑΤ|ΣΥΝΑΔ|ΣΥΝΟΜΗΛ|ΤΕΛ|ΤΕΧΝ|ΤΡΟΠ|ΤΣΑΜ|ΥΠΟΔ|Φ|ΦΙΛΟΝ|ΦΥΛΟΔ|ΦΥΣ|ΧΑΣ)$/.test(o[1])||/(ΦΟΙΝ)$/.test(o[1]))&&(s+="ΙΚ")),"ΑΓΑΜΕ"===s&&(s="ΑΓΑΜ"),null!==(o=/^(.+?)(ΑΓΑΜΕ|ΗΣΑΜΕ|ΟΥΣΑΜΕ|ΗΚΑΜΕ|ΗΘΗΚΑΜΕ)$/.exec(s))&&(s=o[1]),null!==(o=/^(.+?)(ΑΜΕ)$/.exec(s))&&(s=o[1],/^(ΑΝΑΠ|ΑΠΟΘ|ΑΠΟΚ|ΑΠΟΣΤ|ΒΟΥΒ|ΞΕΘ|ΟΥΛ|ΠΕΘ|ΠΙΚΡ|ΠΟΤ|ΣΙΧ|Χ)$/.test(o[1])&&(s+="ΑΜ")),null!==(o=/^(.+?)(ΑΓΑΝΕ|ΗΣΑΝΕ|ΟΥΣΑΝΕ|ΙΟΝΤΑΝΕ|ΙΟΤΑΝΕ|ΙΟΥΝΤΑΝΕ|ΟΝΤΑΝΕ|ΟΤΑΝΕ|ΟΥΝΤΑΝΕ|ΗΚΑΝΕ|ΗΘΗΚΑΝΕ)$/.exec(s))&&(s=o[1],/^(ΤΡ|ΤΣ)$/.test(o[1])&&(s+="ΑΓΑΝ")),null!==(o=/^(.+?)(ΑΝΕ)$/.exec(s))&&(s=o[1],(r(s)||/^(ΒΕΤΕΡ|ΒΟΥΛΚ|ΒΡΑΧΜ|Γ|ΔΡΑΔΟΥΜ|Θ|ΚΑΛΠΟΥΖ|ΚΑΣΤΕΛ|ΚΟΡΜΟΡ|ΛΑΟΠΛ|ΜΩΑΜΕΘ|Μ|ΜΟΥΣΟΥΛΜΑΝ|ΟΥΛ|Π|ΠΕΛΕΚ|ΠΛ|ΠΟΛΙΣ|ΠΟΡΤΟΛ|ΣΑΡΑΚΑΤΣ|ΣΟΥΛΤ|ΤΣΑΡΛΑΤ|ΟΡΦ|ΤΣΙΓΓ|ΤΣΟΠ|ΦΩΤΟΣΤΕΦ|Χ|ΨΥΧΟΠΛ|ΑΓ|ΟΡΦ|ΓΑΛ|ΓΕΡ|ΔΕΚ|ΔΙΠΛ|ΑΜΕΡΙΚΑΝ|ΟΥΡ|ΠΙΘ|ΠΟΥΡΙΤ|Σ|ΖΩΝΤ|ΙΚ|ΚΑΣΤ|ΚΟΠ|ΛΙΧ|ΛΟΥΘΗΡ|ΜΑΙΝΤ|ΜΕΛ|ΣΙΓ|ΣΠ|ΣΤΕΓ|ΤΡΑΓ|ΤΣΑΓ|Φ|ΕΡ|ΑΔΑΠ|ΑΘΙΓΓ|ΑΜΗΧ|ΑΝΙΚ|ΑΝΟΡΓ|ΑΠΗΓ|ΑΠΙΘ|ΑΤΣΙΓΓ|ΒΑΣ|ΒΑΣΚ|ΒΑΘΥΓΑΛ|ΒΙΟΜΗΧ|ΒΡΑΧΥΚ|ΔΙΑΤ|ΔΙΑΦ|ΕΝΟΡΓ|ΘΥΣ|ΚΑΠΝΟΒΙΟΜΗΧ|ΚΑΤΑΓΑΛ|ΚΛΙΒ|ΚΟΙΛΑΡΦ|ΛΙΒ|ΜΕΓΛΟΒΙΟΜΗΧ|ΜΙΚΡΟΒΙΟΜΗΧ|ΝΤΑΒ|ΞΗΡΟΚΛΙΒ|ΟΛΙΓΟΔΑΜ|ΟΛΟΓΑΛ|ΠΕΝΤΑΡΦ|ΠΕΡΗΦ|ΠΕΡΙΤΡ|ΠΛΑΤ|ΠΟΛΥΔΑΠ|ΠΟΛΥΜΗΧ|ΣΤΕΦ|ΤΑΒ|ΤΕΤ|ΥΠΕΡΗΦ|ΥΠΟΚΟΠ|ΧΑΜΗΛΟΔΑΠ|ΨΗΛΟΤΑΒ)$/.test(o[1]))&&(s+="ΑΝ")),null!==(o=/^(.+?)(ΗΣΕΤΕ)$/.exec(s))&&(s=o[1]),null!==(o=/^(.+?)(ΕΤΕ)$/.exec(s))&&(s=o[1],(r(s)||/(ΟΔ|ΑΙΡ|ΦΟΡ|ΤΑΘ|ΔΙΑΘ|ΣΧ|ΕΝΔ|ΕΥΡ|ΤΙΘ|ΥΠΕΡΘ|ΡΑΘ|ΕΝΘ|ΡΟΘ|ΣΘ|ΠΥΡ|ΑΙΝ|ΣΥΝΔ|ΣΥΝ|ΣΥΝΘ|ΧΩΡ|ΠΟΝ|ΒΡ|ΚΑΘ|ΕΥΘ|ΕΚΘ|ΝΕΤ|ΡΟΝ|ΑΡΚ|ΒΑΡ|ΒΟΛ|ΩΦΕΛ)$/.test(o[1])||/^(ΑΒΑΡ|ΒΕΝ|ΕΝΑΡ|ΑΒΡ|ΑΔ|ΑΘ|ΑΝ|ΑΠΛ|ΒΑΡΟΝ|ΝΤΡ|ΣΚ|ΚΟΠ|ΜΠΟΡ|ΝΙΦ|ΠΑΓ|ΠΑΡΑΚΑΛ|ΣΕΡΠ|ΣΚΕΛ|ΣΥΡΦ|ΤΟΚ|Υ|Δ|ΕΜ|ΘΑΡΡ|Θ)$/.test(o[1]))&&(s+="ΕΤ")),null!==(o=/^(.+?)(ΟΝΤΑΣ|ΩΝΤΑΣ)$/.exec(s))&&(s=o[1],/^ΑΡΧ$/.test(o[1])&&(s+="ΟΝΤ"),/ΚΡΕ$/.test(o[1])&&(s+="ΩΝΤ")),null!==(o=/^(.+?)(ΟΜΑΣΤΕ|ΙΟΜΑΣΤΕ)$/.exec(s))&&(s=o[1],/^ΟΝ$/.test(o[1])&&(s+="ΟΜΑΣΤ")),null!==(o=/^(.+?)(ΙΕΣΤΕ)$/.exec(s))&&(s=o[1],/^(Π|ΑΠ|ΣΥΜΠ|ΑΣΥΜΠ|ΑΚΑΤΑΠ|ΑΜΕΤΑΜΦ)$/.test(o[1])&&(s+="ΙΕΣΤ")),null!==(o=/^(.+?)(ΕΣΤΕ)$/.exec(s))&&(s=o[1],/^(ΑΛ|ΑΡ|ΕΚΤΕΛ|Ζ|Μ|Ξ|ΠΑΡΑΚΑΛ|ΠΡΟ|ΝΙΣ)$/.test(o[1])&&(s+="ΕΣΤ")),null!==(o=/^(.+?)(ΗΘΗΚΑ|ΗΘΗΚΕΣ|ΗΘΗΚΕ)$/.exec(s))&&(s=o[1]),null!==(o=/^(.+?)(ΗΚΑ|ΗΚΕΣ|ΗΚΕ)$/.exec(s))&&(s=o[1],(/(ΣΚΩΛ|ΣΚΟΥΛ|ΝΑΡΘ|ΣΦ|ΟΘ|ΠΙΘ)$/.test(o[1])||/^(ΔΙΑΘ|Θ|ΠΑΡΑΚΑΤΑΘ|ΠΡΟΣΘ|ΣΥΝΘ)$/.test(o[1]))&&(s+="ΗΚ")),null!==(o=/^(.+?)(ΟΥΣΑ|ΟΥΣΕΣ|ΟΥΣΕ)$/.exec(s))&&(s=o[1],(t(s)||/^(ΦΑΡΜΑΚ|ΧΑΔ|ΑΓΚ|ΑΝΑΡΡ|ΒΡΟΜ|ΕΚΛΙΠ|ΛΑΜΠΙΔ|ΛΕΧ|Μ|ΠΑΤ|Ρ|Λ|ΜΕΔ|ΜΕΣΑΖ|ΥΠΟΤΕΙΝ|ΑΜ|ΑΙΘ|ΑΝΗΚ|ΔΕΣΠΟΖ|ΕΝΔΙΑΦΕΡ)$/.test(o[1])||/(ΠΟΔΑΡ|ΒΛΕΠ|ΠΑΝΤΑΧ|ΦΡΥΔ|ΜΑΝΤΙΛ|ΜΑΛΛ|ΚΥΜΑΤ|ΛΑΧ|ΛΗΓ|ΦΑΓ|ΟΜ|ΠΡΩΤ)$/.test(o[1]))&&(s+="ΟΥΣ")),null!==(o=/^(.+?)(ΑΓΑ|ΑΓΕΣ|ΑΓΕ)$/.exec(s))&&(s=o[1],(/^(ΑΒΑΣΤ|ΠΟΛΥΦ|ΑΔΗΦ|ΠΑΜΦ|Ρ|ΑΣΠ|ΑΦ|ΑΜΑΛ|ΑΜΑΛΛΙ|ΑΝΥΣΤ|ΑΠΕΡ|ΑΣΠΑΡ|ΑΧΑΡ|ΔΕΡΒΕΝ|ΔΡΟΣΟΠ|ΞΕΦ|ΝΕΟΠ|ΝΟΜΟΤ|ΟΛΟΠ|ΟΜΟΤ|ΠΡΟΣΤ|ΠΡΟΣΩΠΟΠ|ΣΥΜΠ|ΣΥΝΤ|Τ|ΥΠΟΤ|ΧΑΡ|ΑΕΙΠ|ΑΙΜΟΣΤ|ΑΝΥΠ|ΑΠΟΤ|ΑΡΤΙΠ|ΔΙΑΤ|ΕΝ|ΕΠΙΤ|ΚΡΟΚΑΛΟΠ|ΣΙΔΗΡΟΠ|Λ|ΝΑΥ|ΟΥΛΑΜ|ΟΥΡ|Π|ΤΡ|Μ)$/.test(o[1])||/(ΟΦ|ΠΕΛ|ΧΟΡΤ|ΛΛ|ΣΦ|ΡΠ|ΦΡ|ΠΡ|ΛΟΧ|ΣΜΗΝ)$/.test(o[1])&&!/^(ΨΟΦ|ΝΑΥΛΟΧ)$/.test(o[1])||/(ΚΟΛΛ)$/.test(o[1]))&&(s+="ΑΓ")),null!==(o=/^(.+?)(ΗΣΕ|ΗΣΟΥ|ΗΣΑ)$/.exec(s))&&(s=o[1],/^(Ν|ΧΕΡΣΟΝ|ΔΩΔΕΚΑΝ|ΕΡΗΜΟΝ|ΜΕΓΑΛΟΝ|ΕΠΤΑΝ|Ι)$/.test(o[1])&&(s+="ΗΣ")),null!==(o=/^(.+?)(ΗΣΤΕ)$/.exec(s))&&(s=o[1],/^(ΑΣΒ|ΣΒ|ΑΧΡ|ΧΡ|ΑΠΛ|ΑΕΙΜΝ|ΔΥΣΧΡ|ΕΥΧΡ|ΚΟΙΝΟΧΡ|ΠΑΛΙΜΨ)$/.test(o[1])&&(s+="ΗΣΤ")),null!==(o=/^(.+?)(ΟΥΝΕ|ΗΣΟΥΝΕ|ΗΘΟΥΝΕ)$/.exec(s))&&(s=o[1],/^(Ν|Ρ|ΣΠΙ|ΣΤΡΑΒΟΜΟΥΤΣ|ΚΑΚΟΜΟΥΤΣ|ΕΞΩΝ)$/.test(o[1])&&(s+="ΟΥΝ")),null!==(o=/^(.+?)(ΟΥΜΕ|ΗΣΟΥΜΕ|ΗΘΟΥΜΕ)$/.exec(s))&&(s=o[1],/^(ΠΑΡΑΣΟΥΣ|Φ|Χ|ΩΡΙΟΠΛ|ΑΖ|ΑΛΛΟΣΟΥΣ|ΑΣΟΥΣ)$/.test(o[1])&&(s+="ΟΥΜ")),null!=(o=/^(.+?)(ΜΑΤΟΙ|ΜΑΤΟΥΣ|ΜΑΤΟ|ΜΑΤΑ|ΜΑΤΩΣ|ΜΑΤΩΝ|ΜΑΤΟΣ|ΜΑΤΕΣ|ΜΑΤΗ|ΜΑΤΗΣ|ΜΑΤΟΥ)$/.exec(s))&&(s=o[1]+"Μ",/^(ΓΡΑΜ)$/.test(o[1])?s+="Α":/^(ΓΕ|ΣΤΑ)$/.test(o[1])&&(s+="ΑΤ")),null!==(o=/^(.+?)(ΟΥΑ)$/.exec(s))&&(s=o[1]+"ΟΥ"),n.length===s.length&&null!==(o=/^(.+?)(Α|ΑΓΑΤΕ|ΑΓΑΝ|ΑΕΙ|ΑΜΑΙ|ΑΝ|ΑΣ|ΑΣΑΙ|ΑΤΑΙ|ΑΩ|Ε|ΕΙ|ΕΙΣ|ΕΙΤΕ|ΕΣΑΙ|ΕΣ|ΕΤΑΙ|Ι|ΙΕΜΑΙ|ΙΕΜΑΣΤΕ|ΙΕΤΑΙ|ΙΕΣΑΙ|ΙΕΣΑΣΤΕ|ΙΟΜΑΣΤΑΝ|ΙΟΜΟΥΝ|ΙΟΜΟΥΝΑ|ΙΟΝΤΑΝ|ΙΟΝΤΟΥΣΑΝ|ΙΟΣΑΣΤΑΝ|ΙΟΣΑΣΤΕ|ΙΟΣΟΥΝ|ΙΟΣΟΥΝΑ|ΙΟΤΑΝ|ΙΟΥΜΑ|ΙΟΥΜΑΣΤΕ|ΙΟΥΝΤΑΙ|ΙΟΥΝΤΑΝ|Η|ΗΔΕΣ|ΗΔΩΝ|ΗΘΕΙ|ΗΘΕΙΣ|ΗΘΕΙΤΕ|ΗΘΗΚΑΤΕ|ΗΘΗΚΑΝ|ΗΘΟΥΝ|ΗΘΩ|ΗΚΑΤΕ|ΗΚΑΝ|ΗΣ|ΗΣΑΝ|ΗΣΑΤΕ|ΗΣΕΙ|ΗΣΕΣ|ΗΣΟΥΝ|ΗΣΩ|Ο|ΟΙ|ΟΜΑΙ|ΟΜΑΣΤΑΝ|ΟΜΟΥΝ|ΟΜΟΥΝΑ|ΟΝΤΑΙ|ΟΝΤΑΝ|ΟΝΤΟΥΣΑΝ|ΟΣ|ΟΣΑΣΤΑΝ|ΟΣΑΣΤΕ|ΟΣΟΥΝ|ΟΣΟΥΝΑ|ΟΤΑΝ|ΟΥ|ΟΥΜΑΙ|ΟΥΜΑΣΤΕ|ΟΥΝ|ΟΥΝΤΑΙ|ΟΥΝΤΑΝ|ΟΥΣ|ΟΥΣΑΝ|ΟΥΣΑΤΕ|Υ||ΥΑ|ΥΣ|Ω|ΩΝ|ΟΙΣ)$/.exec(s))&&(s=o[1]),null!=(o=/^(.+?)(ΕΣΤΕΡ|ΕΣΤΑΤ|ΟΤΕΡ|ΟΤΑΤ|ΥΤΕΡ|ΥΤΑΤ|ΩΤΕΡ|ΩΤΑΤ)$/.exec(s))&&(/^(ΕΞ|ΕΣ|ΑΝ|ΚΑΤ|Κ|ΠΡ)$/.test(o[1])||(s=o[1]),/^(ΚΑ|Μ|ΕΛΕ|ΛΕ|ΔΕ)$/.test(o[1])&&(s+="ΥΤ")),s}var l={"ΦΑΓΙΑ":"ΦΑ","ΦΑΓΙΟΥ":"ΦΑ","ΦΑΓΙΩΝ":"ΦΑ","ΣΚΑΓΙΑ":"ΣΚΑ","ΣΚΑΓΙΟΥ":"ΣΚΑ","ΣΚΑΓΙΩΝ":"ΣΚΑ","ΣΟΓΙΟΥ":"ΣΟ","ΣΟΓΙΑ":"ΣΟ","ΣΟΓΙΩΝ":"ΣΟ","ΤΑΤΟΓΙΑ":"ΤΑΤΟ","ΤΑΤΟΓΙΟΥ":"ΤΑΤΟ","ΤΑΤΟΓΙΩΝ":"ΤΑΤΟ","ΚΡΕΑΣ":"ΚΡΕ","ΚΡΕΑΤΟΣ":"ΚΡΕ","ΚΡΕΑΤΑ":"ΚΡΕ","ΚΡΕΑΤΩΝ":"ΚΡΕ","ΠΕΡΑΣ":"ΠΕΡ","ΠΕΡΑΤΟΣ":"ΠΕΡ","ΠΕΡΑΤΑ":"ΠΕΡ","ΠΕΡΑΤΩΝ":"ΠΕΡ","ΤΕΡΑΣ":"ΤΕΡ","ΤΕΡΑΤΟΣ":"ΤΕΡ","ΤΕΡΑΤΑ":"ΤΕΡ","ΤΕΡΑΤΩΝ":"ΤΕΡ","ΦΩΣ":"ΦΩ","ΦΩΤΟΣ":"ΦΩ","ΦΩΤΑ":"ΦΩ","ΦΩΤΩΝ":"ΦΩ","ΚΑΘΕΣΤΩΣ":"ΚΑΘΕΣΤ","ΚΑΘΕΣΤΩΤΟΣ":"ΚΑΘΕΣΤ","ΚΑΘΕΣΤΩΤΑ":"ΚΑΘΕΣΤ","ΚΑΘΕΣΤΩΤΩΝ":"ΚΑΘΕΣΤ","ΓΕΓΟΝΟΣ":"ΓΕΓΟΝ","ΓΕΓΟΝΟΤΟΣ":"ΓΕΓΟΝ","ΓΕΓΟΝΟΤΑ":"ΓΕΓΟΝ","ΓΕΓΟΝΟΤΩΝ":"ΓΕΓΟΝ","ΕΥΑ":"ΕΥ"},i=["ΑΚΡΙΒΩΣ","ΑΛΑ","ΑΛΛΑ","ΑΛΛΙΩΣ","ΑΛΛΟΤΕ","ΑΜΑ","ΑΝΩ","ΑΝΑ","ΑΝΑΜΕΣΑ","ΑΝΑΜΕΤΑΞΥ","ΑΝΕΥ","ΑΝΤΙ","ΑΝΤΙΠΕΡΑ","ΑΝΤΙΟ","ΑΞΑΦΝΑ","ΑΠΟ","ΑΠΟΨΕ","ΑΡΑ","ΑΡΑΓΕ","ΑΥΡΙΟ","ΑΦΟΙ","ΑΦΟΥ","ΑΦΟΤΟΥ","ΒΡΕ","ΓΕΙΑ","ΓΙΑ","ΓΙΑΤΙ","ΓΡΑΜΜΑ","ΔΕΗ","ΔΕΝ","ΔΗΛΑΔΗ","ΔΙΧΩΣ","ΔΥΟ","ΕΑΝ","ΕΓΩ","ΕΔΩ","ΕΔΑ","ΕΙΘΕ","ΕΙΜΑΙ","ΕΙΜΑΣΤΕ","ΕΙΣΑΙ","ΕΙΣΑΣΤΕ","ΕΙΝΑΙ","ΕΙΣΤΕ","ΕΙΤΕ","ΕΚΕΙ","ΕΚΟ","ΕΛΑ","ΕΜΑΣ","ΕΜΕΙΣ","ΕΝΤΕΛΩΣ","ΕΝΤΟΣ","ΕΝΤΩΜΕΤΑΞΥ","ΕΝΩ","ΕΞΙ","ΕΞΙΣΟΥ","ΕΞΗΣ","ΕΞΩ","ΕΟΚ","ΕΠΑΝΩ","ΕΠΕΙΔΗ","ΕΠΕΙΤΑ","ΕΠΙ","ΕΠΙΣΗΣ","ΕΠΟΜΕΝΩΣ","ΕΠΤΑ","ΕΣΑΣ","ΕΣΕΙΣ","ΕΣΤΩ","ΕΣΥ","ΕΣΩ","ΕΤΣΙ","ΕΥΓΕ","ΕΦΕ","ΕΦΕΞΗΣ","ΕΧΤΕΣ","ΕΩΣ","ΗΔΗ","ΗΜΙ","ΗΠΑ","ΗΤΟΙ","ΘΕΣ","ΙΔΙΩΣ","ΙΔΗ","ΙΚΑ","ΙΣΩΣ","ΚΑΘΕ","ΚΑΘΕΤΙ","ΚΑΘΟΛΟΥ","ΚΑΘΩΣ","ΚΑΙ","ΚΑΝ","ΚΑΠΟΤΕ","ΚΑΠΟΥ","ΚΑΤΑ","ΚΑΤΙ","ΚΑΤΟΠΙΝ","ΚΑΤΩ","ΚΕΙ","ΚΙΧ","ΚΚΕ","ΚΟΛΑΝ","ΚΥΡΙΩΣ","ΚΩΣ","ΜΑΚΑΡΙ","ΜΑΛΙΣΤΑ","ΜΑΛΛΟΝ","ΜΑΙ","ΜΑΟ","ΜΑΟΥΣ","ΜΑΣ","ΜΕΘΑΥΡΙΟ","ΜΕΣ","ΜΕΣΑ","ΜΕΤΑ","ΜΕΤΑΞΥ","ΜΕΧΡΙ","ΜΗΔΕ","ΜΗΝ","ΜΗΠΩΣ","ΜΗΤΕ","ΜΙΑ","ΜΙΑΣ","ΜΙΣ","ΜΜΕ","ΜΟΛΟΝΟΤΙ","ΜΟΥ","ΜΠΑ","ΜΠΑΣ","ΜΠΟΥΦΑΝ","ΜΠΡΟΣ","ΝΑΙ","ΝΕΣ","ΝΤΑ","ΝΤΕ","ΞΑΝΑ","ΟΗΕ","ΟΚΤΩ","ΟΜΩΣ","ΟΝΕ","ΟΠΑ","ΟΠΟΥ","ΟΠΩΣ","ΟΣΟ","ΟΤΑΝ","ΟΤΕ","ΟΤΙ","ΟΥΤΕ","ΟΧΙ","ΠΑΛΙ","ΠΑΝ","ΠΑΝΟ","ΠΑΝΤΟΤΕ","ΠΑΝΤΟΥ","ΠΑΝΤΩΣ","ΠΑΝΩ","ΠΑΡΑ","ΠΕΡΑ","ΠΕΡΙ","ΠΕΡΙΠΟΥ","ΠΙΑ","ΠΙΟ","ΠΙΣΩ","ΠΛΑΙ","ΠΛΕΟΝ","ΠΛΗΝ","ΠΟΤΕ","ΠΟΥ","ΠΡΟ","ΠΡΟΣ","ΠΡΟΧΤΕΣ","ΠΡΟΧΘΕΣ","ΡΟΔΙ","ΠΩΣ","ΣΑΙ","ΣΑΣ","ΣΑΝ","ΣΕΙΣ","ΣΙΑ","ΣΚΙ","ΣΟΙ","ΣΟΥ","ΣΡΙ","ΣΥΝ","ΣΥΝΑΜΑ","ΣΧΕΔΟΝ","ΤΑΔΕ","ΤΑΞΙ","ΤΑΧΑ","ΤΕΙ","ΤΗΝ","ΤΗΣ","ΤΙΠΟΤΑ","ΤΙΠΟΤΕ","ΤΙΣ","ΤΟΝ","ΤΟΤΕ","ΤΟΥ","ΤΟΥΣ","ΤΣΑ","ΤΣΕ","ΤΣΙ","ΤΣΟΥ","ΤΩΝ","ΥΠΟ","ΥΠΟΨΗ","ΥΠΟΨΙΝ","ΥΣΤΕΡΑ","ΦΕΤΟΣ","ΦΙΣ","ΦΠΑ","ΧΑΦ","ΧΘΕΣ","ΧΤΕΣ","ΧΩΡΙΣ","ΩΣ","ΩΣΑΝ","ΩΣΟΤΟΥ","ΩΣΠΟΥ","ΩΣΤΕ","ΩΣΤΟΣΟ"],s=new RegExp("^[ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ]+$");return function(e){return"function"==typeof e.update?e.update(function(e){return n(e.toUpperCase()).toLowerCase()}):n(e.toUpperCase()).toLowerCase()}}(),e.Pipeline.registerFunction(e.el.stemmer,"stemmer-el"),e.el.stopWordFilter=e.generateStopWordFilter("αλλα αν αντι απο αυτα αυτεσ αυτη αυτο αυτοι αυτοσ αυτουσ αυτων για δε δεν εαν ειμαι ειμαστε ειναι εισαι ειστε εκεινα εκεινεσ εκεινη εκεινο εκεινοι εκεινοσ εκεινουσ εκεινων ενω επι η θα ισωσ κ και κατα κι μα με μετα μη μην να ο οι ομωσ οπωσ οσο οτι παρα ποια ποιεσ ποιο ποιοι ποιοσ ποιουσ ποιων που προσ πωσ σε στη στην στο στον τα την τησ το τον τοτε του των ωσ".split(" ")),e.Pipeline.registerFunction(e.el.stopWordFilter,"stopWordFilter-el"),e.el.normilizer=function(){var e={"Ά":"Α","ά":"α","Έ":"Ε","έ":"ε","Ή":"Η","ή":"η","Ί":"Ι","ί":"ι","Ό":"Ο","ο":"ο","Ύ":"Υ","ύ":"υ","Ώ":"Ω","ώ":"ω","Ϊ":"Ι","ϊ":"ι","Ϋ":"Υ","ϋ":"υ","ΐ":"ι","ΰ":"υ"};return function(t){if("function"==typeof t.update)return t.update(function(t){for(var r="",n=0;n=A.limit)return!0;A.cursor++}return!1}return!0}function n(){if(A.in_grouping(x,97,252)){var s=A.cursor;if(e()){if(A.cursor=s,!A.in_grouping(x,97,252))return!0;for(;!A.out_grouping(x,97,252);){if(A.cursor>=A.limit)return!0;A.cursor++}}return!1}return!0}function i(){var s,r=A.cursor;if(n()){if(A.cursor=r,!A.out_grouping(x,97,252))return;if(s=A.cursor,e()){if(A.cursor=s,!A.in_grouping(x,97,252)||A.cursor>=A.limit)return;A.cursor++}}g=A.cursor}function a(){for(;!A.in_grouping(x,97,252);){if(A.cursor>=A.limit)return!1;A.cursor++}for(;!A.out_grouping(x,97,252);){if(A.cursor>=A.limit)return!1;A.cursor++}return!0}function t(){var e=A.cursor;g=A.limit,p=g,v=g,i(),A.cursor=e,a()&&(p=A.cursor,a()&&(v=A.cursor))}function o(){for(var e;;){if(A.bra=A.cursor,e=A.find_among(k,6))switch(A.ket=A.cursor,e){case 1:A.slice_from("a");continue;case 2:A.slice_from("e");continue;case 3:A.slice_from("i");continue;case 4:A.slice_from("o");continue;case 5:A.slice_from("u");continue;case 6:if(A.cursor>=A.limit)break;A.cursor++;continue}break}}function u(){return g<=A.cursor}function w(){return p<=A.cursor}function c(){return v<=A.cursor}function m(){var e;if(A.ket=A.cursor,A.find_among_b(y,13)&&(A.bra=A.cursor,(e=A.find_among_b(q,11))&&u()))switch(e){case 1:A.bra=A.cursor,A.slice_from("iendo");break;case 2:A.bra=A.cursor,A.slice_from("ando");break;case 3:A.bra=A.cursor,A.slice_from("ar");break;case 4:A.bra=A.cursor,A.slice_from("er");break;case 5:A.bra=A.cursor,A.slice_from("ir");break;case 6:A.slice_del();break;case 7:A.eq_s_b(1,"u")&&A.slice_del()}}function l(e,s){if(!c())return!0;A.slice_del(),A.ket=A.cursor;var r=A.find_among_b(e,s);return r&&(A.bra=A.cursor,1==r&&c()&&A.slice_del()),!1}function d(e){return!c()||(A.slice_del(),A.ket=A.cursor,A.eq_s_b(2,e)&&(A.bra=A.cursor,c()&&A.slice_del()),!1)}function b(){var e;if(A.ket=A.cursor,e=A.find_among_b(S,46)){switch(A.bra=A.cursor,e){case 1:if(!c())return!1;A.slice_del();break;case 2:if(d("ic"))return!1;break;case 3:if(!c())return!1;A.slice_from("log");break;case 4:if(!c())return!1;A.slice_from("u");break;case 5:if(!c())return!1;A.slice_from("ente");break;case 6:if(!w())return!1;A.slice_del(),A.ket=A.cursor,e=A.find_among_b(C,4),e&&(A.bra=A.cursor,c()&&(A.slice_del(),1==e&&(A.ket=A.cursor,A.eq_s_b(2,"at")&&(A.bra=A.cursor,c()&&A.slice_del()))));break;case 7:if(l(P,3))return!1;break;case 8:if(l(F,3))return!1;break;case 9:if(d("at"))return!1}return!0}return!1}function f(){var e,s;if(A.cursor>=g&&(s=A.limit_backward,A.limit_backward=g,A.ket=A.cursor,e=A.find_among_b(W,12),A.limit_backward=s,e)){if(A.bra=A.cursor,1==e){if(!A.eq_s_b(1,"u"))return!1;A.slice_del()}return!0}return!1}function _(){var e,s,r,n;if(A.cursor>=g&&(s=A.limit_backward,A.limit_backward=g,A.ket=A.cursor,e=A.find_among_b(L,96),A.limit_backward=s,e))switch(A.bra=A.cursor,e){case 1:r=A.limit-A.cursor,A.eq_s_b(1,"u")?(n=A.limit-A.cursor,A.eq_s_b(1,"g")?A.cursor=A.limit-n:A.cursor=A.limit-r):A.cursor=A.limit-r,A.bra=A.cursor;case 2:A.slice_del()}}function h(){var e,s;if(A.ket=A.cursor,e=A.find_among_b(z,8))switch(A.bra=A.cursor,e){case 1:u()&&A.slice_del();break;case 2:u()&&(A.slice_del(),A.ket=A.cursor,A.eq_s_b(1,"u")&&(A.bra=A.cursor,s=A.limit-A.cursor,A.eq_s_b(1,"g")&&(A.cursor=A.limit-s,u()&&A.slice_del())))}}var v,p,g,k=[new s("",-1,6),new s("á",0,1),new s("é",0,2),new s("í",0,3),new s("ó",0,4),new s("ú",0,5)],y=[new s("la",-1,-1),new s("sela",0,-1),new s("le",-1,-1),new s("me",-1,-1),new s("se",-1,-1),new s("lo",-1,-1),new s("selo",5,-1),new s("las",-1,-1),new s("selas",7,-1),new s("les",-1,-1),new s("los",-1,-1),new s("selos",10,-1),new s("nos",-1,-1)],q=[new s("ando",-1,6),new s("iendo",-1,6),new s("yendo",-1,7),new s("ándo",-1,2),new s("iéndo",-1,1),new s("ar",-1,6),new s("er",-1,6),new s("ir",-1,6),new s("ár",-1,3),new s("ér",-1,4),new s("ír",-1,5)],C=[new s("ic",-1,-1),new s("ad",-1,-1),new s("os",-1,-1),new s("iv",-1,1)],P=[new s("able",-1,1),new s("ible",-1,1),new s("ante",-1,1)],F=[new s("ic",-1,1),new s("abil",-1,1),new s("iv",-1,1)],S=[new s("ica",-1,1),new s("ancia",-1,2),new s("encia",-1,5),new s("adora",-1,2),new s("osa",-1,1),new s("ista",-1,1),new s("iva",-1,9),new s("anza",-1,1),new s("logía",-1,3),new s("idad",-1,8),new s("able",-1,1),new s("ible",-1,1),new s("ante",-1,2),new s("mente",-1,7),new s("amente",13,6),new s("ación",-1,2),new s("ución",-1,4),new s("ico",-1,1),new s("ismo",-1,1),new s("oso",-1,1),new s("amiento",-1,1),new s("imiento",-1,1),new s("ivo",-1,9),new s("ador",-1,2),new s("icas",-1,1),new s("ancias",-1,2),new s("encias",-1,5),new s("adoras",-1,2),new s("osas",-1,1),new s("istas",-1,1),new s("ivas",-1,9),new s("anzas",-1,1),new s("logías",-1,3),new s("idades",-1,8),new s("ables",-1,1),new s("ibles",-1,1),new s("aciones",-1,2),new s("uciones",-1,4),new s("adores",-1,2),new s("antes",-1,2),new s("icos",-1,1),new s("ismos",-1,1),new s("osos",-1,1),new s("amientos",-1,1),new s("imientos",-1,1),new s("ivos",-1,9)],W=[new s("ya",-1,1),new s("ye",-1,1),new s("yan",-1,1),new s("yen",-1,1),new s("yeron",-1,1),new s("yendo",-1,1),new s("yo",-1,1),new s("yas",-1,1),new s("yes",-1,1),new s("yais",-1,1),new s("yamos",-1,1),new s("yó",-1,1)],L=[new s("aba",-1,2),new s("ada",-1,2),new s("ida",-1,2),new s("ara",-1,2),new s("iera",-1,2),new s("ía",-1,2),new s("aría",5,2),new s("ería",5,2),new s("iría",5,2),new s("ad",-1,2),new s("ed",-1,2),new s("id",-1,2),new s("ase",-1,2),new s("iese",-1,2),new s("aste",-1,2),new s("iste",-1,2),new s("an",-1,2),new s("aban",16,2),new s("aran",16,2),new s("ieran",16,2),new s("ían",16,2),new s("arían",20,2),new s("erían",20,2),new s("irían",20,2),new s("en",-1,1),new s("asen",24,2),new s("iesen",24,2),new s("aron",-1,2),new s("ieron",-1,2),new s("arán",-1,2),new s("erán",-1,2),new s("irán",-1,2),new s("ado",-1,2),new s("ido",-1,2),new s("ando",-1,2),new s("iendo",-1,2),new s("ar",-1,2),new s("er",-1,2),new s("ir",-1,2),new s("as",-1,2),new s("abas",39,2),new s("adas",39,2),new s("idas",39,2),new s("aras",39,2),new s("ieras",39,2),new s("ías",39,2),new s("arías",45,2),new s("erías",45,2),new s("irías",45,2),new s("es",-1,1),new s("ases",49,2),new s("ieses",49,2),new s("abais",-1,2),new s("arais",-1,2),new s("ierais",-1,2),new s("íais",-1,2),new s("aríais",55,2),new s("eríais",55,2),new s("iríais",55,2),new s("aseis",-1,2),new s("ieseis",-1,2),new s("asteis",-1,2),new s("isteis",-1,2),new s("áis",-1,2),new s("éis",-1,1),new s("aréis",64,2),new s("eréis",64,2),new s("iréis",64,2),new s("ados",-1,2),new s("idos",-1,2),new s("amos",-1,2),new s("ábamos",70,2),new s("áramos",70,2),new s("iéramos",70,2),new s("íamos",70,2),new s("aríamos",74,2),new s("eríamos",74,2),new s("iríamos",74,2),new s("emos",-1,1),new s("aremos",78,2),new s("eremos",78,2),new s("iremos",78,2),new s("ásemos",78,2),new s("iésemos",78,2),new s("imos",-1,2),new s("arás",-1,2),new s("erás",-1,2),new s("irás",-1,2),new s("ís",-1,2),new s("ará",-1,2),new s("erá",-1,2),new s("irá",-1,2),new s("aré",-1,2),new s("eré",-1,2),new s("iré",-1,2),new s("ió",-1,2)],z=[new s("a",-1,1),new s("e",-1,2),new s("o",-1,1),new s("os",-1,1),new s("á",-1,1),new s("é",-1,2),new s("í",-1,1),new s("ó",-1,1)],x=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,1,17,4,10],A=new r;this.setCurrent=function(e){A.setCurrent(e)},this.getCurrent=function(){return A.getCurrent()},this.stem=function(){var e=A.cursor;return t(),A.limit_backward=e,A.cursor=A.limit,m(),A.cursor=A.limit,b()||(A.cursor=A.limit,f()||(A.cursor=A.limit,_())),A.cursor=A.limit,h(),A.cursor=A.limit_backward,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.es.stemmer,"stemmer-es"),e.es.stopWordFilter=e.generateStopWordFilter("a al algo algunas algunos ante antes como con contra cual cuando de del desde donde durante e el ella ellas ellos en entre era erais eran eras eres es esa esas ese eso esos esta estaba estabais estaban estabas estad estada estadas estado estados estamos estando estar estaremos estará estarán estarás estaré estaréis estaría estaríais estaríamos estarían estarías estas este estemos esto estos estoy estuve estuviera estuvierais estuvieran estuvieras estuvieron estuviese estuvieseis estuviesen estuvieses estuvimos estuviste estuvisteis estuviéramos estuviésemos estuvo está estábamos estáis están estás esté estéis estén estés fue fuera fuerais fueran fueras fueron fuese fueseis fuesen fueses fui fuimos fuiste fuisteis fuéramos fuésemos ha habida habidas habido habidos habiendo habremos habrá habrán habrás habré habréis habría habríais habríamos habrían habrías habéis había habíais habíamos habían habías han has hasta hay haya hayamos hayan hayas hayáis he hemos hube hubiera hubierais hubieran hubieras hubieron hubiese hubieseis hubiesen hubieses hubimos hubiste hubisteis hubiéramos hubiésemos hubo la las le les lo los me mi mis mucho muchos muy más mí mía mías mío míos nada ni no nos nosotras nosotros nuestra nuestras nuestro nuestros o os otra otras otro otros para pero poco por porque que quien quienes qué se sea seamos sean seas seremos será serán serás seré seréis sería seríais seríamos serían serías seáis sido siendo sin sobre sois somos son soy su sus suya suyas suyo suyos sí también tanto te tendremos tendrá tendrán tendrás tendré tendréis tendría tendríais tendríamos tendrían tendrías tened tenemos tenga tengamos tengan tengas tengo tengáis tenida tenidas tenido tenidos teniendo tenéis tenía teníais teníamos tenían tenías ti tiene tienen tienes todo todos tu tus tuve tuviera tuvierais tuvieran tuvieras tuvieron tuviese tuvieseis tuviesen tuvieses tuvimos tuviste tuvisteis tuviéramos tuviésemos tuvo tuya tuyas tuyo tuyos tú un una uno unos vosotras vosotros vuestra vuestras vuestro vuestros y ya yo él éramos".split(" ")),e.Pipeline.registerFunction(e.es.stopWordFilter,"stopWordFilter-es")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.fi.min.js b/assets/javascripts/lunr/min/lunr.fi.min.js new file mode 100644 index 00000000..29f5dfce --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.fi.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Finnish` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(i,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e():e()(i.lunr)}(this,function(){return function(i){if(void 0===i)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===i.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");i.fi=function(){this.pipeline.reset(),this.pipeline.add(i.fi.trimmer,i.fi.stopWordFilter,i.fi.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(i.fi.stemmer))},i.fi.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",i.fi.trimmer=i.trimmerSupport.generateTrimmer(i.fi.wordCharacters),i.Pipeline.registerFunction(i.fi.trimmer,"trimmer-fi"),i.fi.stemmer=function(){var e=i.stemmerSupport.Among,r=i.stemmerSupport.SnowballProgram,n=new function(){function i(){f=A.limit,d=f,n()||(f=A.cursor,n()||(d=A.cursor))}function n(){for(var i;;){if(i=A.cursor,A.in_grouping(W,97,246))break;if(A.cursor=i,i>=A.limit)return!0;A.cursor++}for(A.cursor=i;!A.out_grouping(W,97,246);){if(A.cursor>=A.limit)return!0;A.cursor++}return!1}function t(){return d<=A.cursor}function s(){var i,e;if(A.cursor>=f)if(e=A.limit_backward,A.limit_backward=f,A.ket=A.cursor,i=A.find_among_b(h,10)){switch(A.bra=A.cursor,A.limit_backward=e,i){case 1:if(!A.in_grouping_b(x,97,246))return;break;case 2:if(!t())return}A.slice_del()}else A.limit_backward=e}function o(){var i,e,r;if(A.cursor>=f)if(e=A.limit_backward,A.limit_backward=f,A.ket=A.cursor,i=A.find_among_b(v,9))switch(A.bra=A.cursor,A.limit_backward=e,i){case 1:r=A.limit-A.cursor,A.eq_s_b(1,"k")||(A.cursor=A.limit-r,A.slice_del());break;case 2:A.slice_del(),A.ket=A.cursor,A.eq_s_b(3,"kse")&&(A.bra=A.cursor,A.slice_from("ksi"));break;case 3:A.slice_del();break;case 4:A.find_among_b(p,6)&&A.slice_del();break;case 5:A.find_among_b(g,6)&&A.slice_del();break;case 6:A.find_among_b(j,2)&&A.slice_del()}else A.limit_backward=e}function l(){return A.find_among_b(q,7)}function a(){return A.eq_s_b(1,"i")&&A.in_grouping_b(L,97,246)}function u(){var i,e,r;if(A.cursor>=f)if(e=A.limit_backward,A.limit_backward=f,A.ket=A.cursor,i=A.find_among_b(C,30)){switch(A.bra=A.cursor,A.limit_backward=e,i){case 1:if(!A.eq_s_b(1,"a"))return;break;case 2:case 9:if(!A.eq_s_b(1,"e"))return;break;case 3:if(!A.eq_s_b(1,"i"))return;break;case 4:if(!A.eq_s_b(1,"o"))return;break;case 5:if(!A.eq_s_b(1,"ä"))return;break;case 6:if(!A.eq_s_b(1,"ö"))return;break;case 7:if(r=A.limit-A.cursor,!l()&&(A.cursor=A.limit-r,!A.eq_s_b(2,"ie"))){A.cursor=A.limit-r;break}if(A.cursor=A.limit-r,A.cursor<=A.limit_backward){A.cursor=A.limit-r;break}A.cursor--,A.bra=A.cursor;break;case 8:if(!A.in_grouping_b(W,97,246)||!A.out_grouping_b(W,97,246))return}A.slice_del(),k=!0}else A.limit_backward=e}function c(){var i,e,r;if(A.cursor>=d)if(e=A.limit_backward,A.limit_backward=d,A.ket=A.cursor,i=A.find_among_b(P,14)){if(A.bra=A.cursor,A.limit_backward=e,1==i){if(r=A.limit-A.cursor,A.eq_s_b(2,"po"))return;A.cursor=A.limit-r}A.slice_del()}else A.limit_backward=e}function m(){var i;A.cursor>=f&&(i=A.limit_backward,A.limit_backward=f,A.ket=A.cursor,A.find_among_b(F,2)?(A.bra=A.cursor,A.limit_backward=i,A.slice_del()):A.limit_backward=i)}function w(){var i,e,r,n,t,s;if(A.cursor>=f){if(e=A.limit_backward,A.limit_backward=f,A.ket=A.cursor,A.eq_s_b(1,"t")&&(A.bra=A.cursor,r=A.limit-A.cursor,A.in_grouping_b(W,97,246)&&(A.cursor=A.limit-r,A.slice_del(),A.limit_backward=e,n=A.limit-A.cursor,A.cursor>=d&&(A.cursor=d,t=A.limit_backward,A.limit_backward=A.cursor,A.cursor=A.limit-n,A.ket=A.cursor,i=A.find_among_b(S,2))))){if(A.bra=A.cursor,A.limit_backward=t,1==i){if(s=A.limit-A.cursor,A.eq_s_b(2,"po"))return;A.cursor=A.limit-s}return void A.slice_del()}A.limit_backward=e}}function _(){var i,e,r,n;if(A.cursor>=f){for(i=A.limit_backward,A.limit_backward=f,e=A.limit-A.cursor,l()&&(A.cursor=A.limit-e,A.ket=A.cursor,A.cursor>A.limit_backward&&(A.cursor--,A.bra=A.cursor,A.slice_del())),A.cursor=A.limit-e,A.ket=A.cursor,A.in_grouping_b(y,97,228)&&(A.bra=A.cursor,A.out_grouping_b(W,97,246)&&A.slice_del()),A.cursor=A.limit-e,A.ket=A.cursor,A.eq_s_b(1,"j")&&(A.bra=A.cursor,r=A.limit-A.cursor,A.eq_s_b(1,"o")?A.slice_del():(A.cursor=A.limit-r,A.eq_s_b(1,"u")&&A.slice_del())),A.cursor=A.limit-e,A.ket=A.cursor,A.eq_s_b(1,"o")&&(A.bra=A.cursor,A.eq_s_b(1,"j")&&A.slice_del()),A.cursor=A.limit-e,A.limit_backward=i;;){if(n=A.limit-A.cursor,A.out_grouping_b(W,97,246)){A.cursor=A.limit-n;break}if(A.cursor=A.limit-n,A.cursor<=A.limit_backward)return;A.cursor--}A.ket=A.cursor,A.cursor>A.limit_backward&&(A.cursor--,A.bra=A.cursor,b=A.slice_to(),A.eq_v_b(b)&&A.slice_del())}}var k,b,d,f,h=[new e("pa",-1,1),new e("sti",-1,2),new e("kaan",-1,1),new e("han",-1,1),new e("kin",-1,1),new e("hän",-1,1),new e("kään",-1,1),new e("ko",-1,1),new e("pä",-1,1),new e("kö",-1,1)],p=[new e("lla",-1,-1),new e("na",-1,-1),new e("ssa",-1,-1),new e("ta",-1,-1),new e("lta",3,-1),new e("sta",3,-1)],g=[new e("llä",-1,-1),new e("nä",-1,-1),new e("ssä",-1,-1),new e("tä",-1,-1),new e("ltä",3,-1),new e("stä",3,-1)],j=[new e("lle",-1,-1),new e("ine",-1,-1)],v=[new e("nsa",-1,3),new e("mme",-1,3),new e("nne",-1,3),new e("ni",-1,2),new e("si",-1,1),new e("an",-1,4),new e("en",-1,6),new e("än",-1,5),new e("nsä",-1,3)],q=[new e("aa",-1,-1),new e("ee",-1,-1),new e("ii",-1,-1),new e("oo",-1,-1),new e("uu",-1,-1),new e("ää",-1,-1),new e("öö",-1,-1)],C=[new e("a",-1,8),new e("lla",0,-1),new e("na",0,-1),new e("ssa",0,-1),new e("ta",0,-1),new e("lta",4,-1),new e("sta",4,-1),new e("tta",4,9),new e("lle",-1,-1),new e("ine",-1,-1),new e("ksi",-1,-1),new e("n",-1,7),new e("han",11,1),new e("den",11,-1,a),new e("seen",11,-1,l),new e("hen",11,2),new e("tten",11,-1,a),new e("hin",11,3),new e("siin",11,-1,a),new e("hon",11,4),new e("hän",11,5),new e("hön",11,6),new e("ä",-1,8),new e("llä",22,-1),new e("nä",22,-1),new e("ssä",22,-1),new e("tä",22,-1),new e("ltä",26,-1),new e("stä",26,-1),new e("ttä",26,9)],P=[new e("eja",-1,-1),new e("mma",-1,1),new e("imma",1,-1),new e("mpa",-1,1),new e("impa",3,-1),new e("mmi",-1,1),new e("immi",5,-1),new e("mpi",-1,1),new e("impi",7,-1),new e("ejä",-1,-1),new e("mmä",-1,1),new e("immä",10,-1),new e("mpä",-1,1),new e("impä",12,-1)],F=[new e("i",-1,-1),new e("j",-1,-1)],S=[new e("mma",-1,1),new e("imma",0,-1)],y=[17,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8],W=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],L=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],x=[17,97,24,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],A=new r;this.setCurrent=function(i){A.setCurrent(i)},this.getCurrent=function(){return A.getCurrent()},this.stem=function(){var e=A.cursor;return i(),k=!1,A.limit_backward=e,A.cursor=A.limit,s(),A.cursor=A.limit,o(),A.cursor=A.limit,u(),A.cursor=A.limit,c(),A.cursor=A.limit,k?(m(),A.cursor=A.limit):(A.cursor=A.limit,w(),A.cursor=A.limit),_(),!0}};return function(i){return"function"==typeof i.update?i.update(function(i){return n.setCurrent(i),n.stem(),n.getCurrent()}):(n.setCurrent(i),n.stem(),n.getCurrent())}}(),i.Pipeline.registerFunction(i.fi.stemmer,"stemmer-fi"),i.fi.stopWordFilter=i.generateStopWordFilter("ei eivät emme en et ette että he heidän heidät heihin heille heillä heiltä heissä heistä heitä hän häneen hänelle hänellä häneltä hänen hänessä hänestä hänet häntä itse ja johon joiden joihin joiksi joilla joille joilta joina joissa joista joita joka joksi jolla jolle jolta jona jonka jos jossa josta jota jotka kanssa keiden keihin keiksi keille keillä keiltä keinä keissä keistä keitä keneen keneksi kenelle kenellä keneltä kenen kenenä kenessä kenestä kenet ketkä ketkä ketä koska kuin kuka kun me meidän meidät meihin meille meillä meiltä meissä meistä meitä mihin miksi mikä mille millä miltä minkä minkä minua minulla minulle minulta minun minussa minusta minut minuun minä minä missä mistä mitkä mitä mukaan mutta ne niiden niihin niiksi niille niillä niiltä niin niin niinä niissä niistä niitä noiden noihin noiksi noilla noille noilta noin noina noissa noista noita nuo nyt näiden näihin näiksi näille näillä näiltä näinä näissä näistä näitä nämä ole olemme olen olet olette oli olimme olin olisi olisimme olisin olisit olisitte olisivat olit olitte olivat olla olleet ollut on ovat poikki se sekä sen siihen siinä siitä siksi sille sillä sillä siltä sinua sinulla sinulle sinulta sinun sinussa sinusta sinut sinuun sinä sinä sitä tai te teidän teidät teihin teille teillä teiltä teissä teistä teitä tuo tuohon tuoksi tuolla tuolle tuolta tuon tuona tuossa tuosta tuota tähän täksi tälle tällä tältä tämä tämän tänä tässä tästä tätä vaan vai vaikka yli".split(" ")),i.Pipeline.registerFunction(i.fi.stopWordFilter,"stopWordFilter-fi")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.fr.min.js b/assets/javascripts/lunr/min/lunr.fr.min.js new file mode 100644 index 00000000..68cd0094 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.fr.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `French` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.fr=function(){this.pipeline.reset(),this.pipeline.add(e.fr.trimmer,e.fr.stopWordFilter,e.fr.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.fr.stemmer))},e.fr.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.fr.trimmer=e.trimmerSupport.generateTrimmer(e.fr.wordCharacters),e.Pipeline.registerFunction(e.fr.trimmer,"trimmer-fr"),e.fr.stemmer=function(){var r=e.stemmerSupport.Among,s=e.stemmerSupport.SnowballProgram,i=new function(){function e(e,r,s){return!(!W.eq_s(1,e)||(W.ket=W.cursor,!W.in_grouping(F,97,251)))&&(W.slice_from(r),W.cursor=s,!0)}function i(e,r,s){return!!W.eq_s(1,e)&&(W.ket=W.cursor,W.slice_from(r),W.cursor=s,!0)}function n(){for(var r,s;;){if(r=W.cursor,W.in_grouping(F,97,251)){if(W.bra=W.cursor,s=W.cursor,e("u","U",r))continue;if(W.cursor=s,e("i","I",r))continue;if(W.cursor=s,i("y","Y",r))continue}if(W.cursor=r,W.bra=r,!e("y","Y",r)){if(W.cursor=r,W.eq_s(1,"q")&&(W.bra=W.cursor,i("u","U",r)))continue;if(W.cursor=r,r>=W.limit)return;W.cursor++}}}function t(){for(;!W.in_grouping(F,97,251);){if(W.cursor>=W.limit)return!0;W.cursor++}for(;!W.out_grouping(F,97,251);){if(W.cursor>=W.limit)return!0;W.cursor++}return!1}function u(){var e=W.cursor;if(q=W.limit,g=q,p=q,W.in_grouping(F,97,251)&&W.in_grouping(F,97,251)&&W.cursor=W.limit){W.cursor=q;break}W.cursor++}while(!W.in_grouping(F,97,251))}q=W.cursor,W.cursor=e,t()||(g=W.cursor,t()||(p=W.cursor))}function o(){for(var e,r;;){if(r=W.cursor,W.bra=r,!(e=W.find_among(h,4)))break;switch(W.ket=W.cursor,e){case 1:W.slice_from("i");break;case 2:W.slice_from("u");break;case 3:W.slice_from("y");break;case 4:if(W.cursor>=W.limit)return;W.cursor++}}}function c(){return q<=W.cursor}function a(){return g<=W.cursor}function l(){return p<=W.cursor}function w(){var e,r;if(W.ket=W.cursor,e=W.find_among_b(C,43)){switch(W.bra=W.cursor,e){case 1:if(!l())return!1;W.slice_del();break;case 2:if(!l())return!1;W.slice_del(),W.ket=W.cursor,W.eq_s_b(2,"ic")&&(W.bra=W.cursor,l()?W.slice_del():W.slice_from("iqU"));break;case 3:if(!l())return!1;W.slice_from("log");break;case 4:if(!l())return!1;W.slice_from("u");break;case 5:if(!l())return!1;W.slice_from("ent");break;case 6:if(!c())return!1;if(W.slice_del(),W.ket=W.cursor,e=W.find_among_b(z,6))switch(W.bra=W.cursor,e){case 1:l()&&(W.slice_del(),W.ket=W.cursor,W.eq_s_b(2,"at")&&(W.bra=W.cursor,l()&&W.slice_del()));break;case 2:l()?W.slice_del():a()&&W.slice_from("eux");break;case 3:l()&&W.slice_del();break;case 4:c()&&W.slice_from("i")}break;case 7:if(!l())return!1;if(W.slice_del(),W.ket=W.cursor,e=W.find_among_b(y,3))switch(W.bra=W.cursor,e){case 1:l()?W.slice_del():W.slice_from("abl");break;case 2:l()?W.slice_del():W.slice_from("iqU");break;case 3:l()&&W.slice_del()}break;case 8:if(!l())return!1;if(W.slice_del(),W.ket=W.cursor,W.eq_s_b(2,"at")&&(W.bra=W.cursor,l()&&(W.slice_del(),W.ket=W.cursor,W.eq_s_b(2,"ic")))){W.bra=W.cursor,l()?W.slice_del():W.slice_from("iqU");break}break;case 9:W.slice_from("eau");break;case 10:if(!a())return!1;W.slice_from("al");break;case 11:if(l())W.slice_del();else{if(!a())return!1;W.slice_from("eux")}break;case 12:if(!a()||!W.out_grouping_b(F,97,251))return!1;W.slice_del();break;case 13:return c()&&W.slice_from("ant"),!1;case 14:return c()&&W.slice_from("ent"),!1;case 15:return r=W.limit-W.cursor,W.in_grouping_b(F,97,251)&&c()&&(W.cursor=W.limit-r,W.slice_del()),!1}return!0}return!1}function f(){var e,r;if(W.cursor=q){if(s=W.limit_backward,W.limit_backward=q,W.ket=W.cursor,e=W.find_among_b(P,7))switch(W.bra=W.cursor,e){case 1:if(l()){if(i=W.limit-W.cursor,!W.eq_s_b(1,"s")&&(W.cursor=W.limit-i,!W.eq_s_b(1,"t")))break;W.slice_del()}break;case 2:W.slice_from("i");break;case 3:W.slice_del();break;case 4:W.eq_s_b(2,"gu")&&W.slice_del()}W.limit_backward=s}}function b(){var e=W.limit-W.cursor;W.find_among_b(U,5)&&(W.cursor=W.limit-e,W.ket=W.cursor,W.cursor>W.limit_backward&&(W.cursor--,W.bra=W.cursor,W.slice_del()))}function d(){for(var e,r=1;W.out_grouping_b(F,97,251);)r--;if(r<=0){if(W.ket=W.cursor,e=W.limit-W.cursor,!W.eq_s_b(1,"é")&&(W.cursor=W.limit-e,!W.eq_s_b(1,"è")))return;W.bra=W.cursor,W.slice_from("e")}}function k(){if(!w()&&(W.cursor=W.limit,!f()&&(W.cursor=W.limit,!m())))return W.cursor=W.limit,void _();W.cursor=W.limit,W.ket=W.cursor,W.eq_s_b(1,"Y")?(W.bra=W.cursor,W.slice_from("i")):(W.cursor=W.limit,W.eq_s_b(1,"ç")&&(W.bra=W.cursor,W.slice_from("c")))}var p,g,q,v=[new r("col",-1,-1),new r("par",-1,-1),new r("tap",-1,-1)],h=[new r("",-1,4),new r("I",0,1),new r("U",0,2),new r("Y",0,3)],z=[new r("iqU",-1,3),new r("abl",-1,3),new r("Ièr",-1,4),new r("ièr",-1,4),new r("eus",-1,2),new r("iv",-1,1)],y=[new r("ic",-1,2),new r("abil",-1,1),new r("iv",-1,3)],C=[new r("iqUe",-1,1),new r("atrice",-1,2),new r("ance",-1,1),new r("ence",-1,5),new r("logie",-1,3),new r("able",-1,1),new r("isme",-1,1),new r("euse",-1,11),new r("iste",-1,1),new r("ive",-1,8),new r("if",-1,8),new r("usion",-1,4),new r("ation",-1,2),new r("ution",-1,4),new r("ateur",-1,2),new r("iqUes",-1,1),new r("atrices",-1,2),new r("ances",-1,1),new r("ences",-1,5),new r("logies",-1,3),new r("ables",-1,1),new r("ismes",-1,1),new r("euses",-1,11),new r("istes",-1,1),new r("ives",-1,8),new r("ifs",-1,8),new r("usions",-1,4),new r("ations",-1,2),new r("utions",-1,4),new r("ateurs",-1,2),new r("ments",-1,15),new r("ements",30,6),new r("issements",31,12),new r("ités",-1,7),new r("ment",-1,15),new r("ement",34,6),new r("issement",35,12),new r("amment",34,13),new r("emment",34,14),new r("aux",-1,10),new r("eaux",39,9),new r("eux",-1,1),new r("ité",-1,7)],x=[new r("ira",-1,1),new r("ie",-1,1),new r("isse",-1,1),new r("issante",-1,1),new r("i",-1,1),new r("irai",4,1),new r("ir",-1,1),new r("iras",-1,1),new r("ies",-1,1),new r("îmes",-1,1),new r("isses",-1,1),new r("issantes",-1,1),new r("îtes",-1,1),new r("is",-1,1),new r("irais",13,1),new r("issais",13,1),new r("irions",-1,1),new r("issions",-1,1),new r("irons",-1,1),new r("issons",-1,1),new r("issants",-1,1),new r("it",-1,1),new r("irait",21,1),new r("issait",21,1),new r("issant",-1,1),new r("iraIent",-1,1),new r("issaIent",-1,1),new r("irent",-1,1),new r("issent",-1,1),new r("iront",-1,1),new r("ît",-1,1),new r("iriez",-1,1),new r("issiez",-1,1),new r("irez",-1,1),new r("issez",-1,1)],I=[new r("a",-1,3),new r("era",0,2),new r("asse",-1,3),new r("ante",-1,3),new r("ée",-1,2),new r("ai",-1,3),new r("erai",5,2),new r("er",-1,2),new r("as",-1,3),new r("eras",8,2),new r("âmes",-1,3),new r("asses",-1,3),new r("antes",-1,3),new r("âtes",-1,3),new r("ées",-1,2),new r("ais",-1,3),new r("erais",15,2),new r("ions",-1,1),new r("erions",17,2),new r("assions",17,3),new r("erons",-1,2),new r("ants",-1,3),new r("és",-1,2),new r("ait",-1,3),new r("erait",23,2),new r("ant",-1,3),new r("aIent",-1,3),new r("eraIent",26,2),new r("èrent",-1,2),new r("assent",-1,3),new r("eront",-1,2),new r("ât",-1,3),new r("ez",-1,2),new r("iez",32,2),new r("eriez",33,2),new r("assiez",33,3),new r("erez",32,2),new r("é",-1,2)],P=[new r("e",-1,3),new r("Ière",0,2),new r("ière",0,2),new r("ion",-1,1),new r("Ier",-1,2),new r("ier",-1,2),new r("ë",-1,4)],U=[new r("ell",-1,-1),new r("eill",-1,-1),new r("enn",-1,-1),new r("onn",-1,-1),new r("ett",-1,-1)],F=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,128,130,103,8,5],S=[1,65,20,0,0,0,0,0,0,0,0,0,0,0,0,0,128],W=new s;this.setCurrent=function(e){W.setCurrent(e)},this.getCurrent=function(){return W.getCurrent()},this.stem=function(){var e=W.cursor;return n(),W.cursor=e,u(),W.limit_backward=e,W.cursor=W.limit,k(),W.cursor=W.limit,b(),W.cursor=W.limit,d(),W.cursor=W.limit_backward,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.fr.stemmer,"stemmer-fr"),e.fr.stopWordFilter=e.generateStopWordFilter("ai aie aient aies ait as au aura aurai auraient aurais aurait auras aurez auriez aurions aurons auront aux avaient avais avait avec avez aviez avions avons ayant ayez ayons c ce ceci celà ces cet cette d dans de des du elle en es est et eu eue eues eurent eus eusse eussent eusses eussiez eussions eut eux eûmes eût eûtes furent fus fusse fussent fusses fussiez fussions fut fûmes fût fûtes ici il ils j je l la le les leur leurs lui m ma mais me mes moi mon même n ne nos notre nous on ont ou par pas pour qu que quel quelle quelles quels qui s sa sans se sera serai seraient serais serait seras serez seriez serions serons seront ses soi soient sois soit sommes son sont soyez soyons suis sur t ta te tes toi ton tu un une vos votre vous y à étaient étais était étant étiez étions été étée étées étés êtes".split(" ")),e.Pipeline.registerFunction(e.fr.stopWordFilter,"stopWordFilter-fr")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.he.min.js b/assets/javascripts/lunr/min/lunr.he.min.js new file mode 100644 index 00000000..b863d3ea --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.he.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.he=function(){this.pipeline.reset(),this.pipeline.add(e.he.trimmer,e.he.stopWordFilter,e.he.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.he.stemmer))},e.he.wordCharacters="֑-״א-תa-zA-Za-zA-Z0-90-9",e.he.trimmer=e.trimmerSupport.generateTrimmer(e.he.wordCharacters),e.Pipeline.registerFunction(e.he.trimmer,"trimmer-he"),e.he.stemmer=function(){var e=this;return e.result=!1,e.preRemoved=!1,e.sufRemoved=!1,e.pre={pre1:"ה ו י ת",pre2:"ב כ ל מ ש כש",pre3:"הב הכ הל המ הש בש לכ",pre4:"וב וכ ול ומ וש",pre5:"מה שה כל",pre6:"מב מכ מל ממ מש",pre7:"בה בו בי בת כה כו כי כת לה לו לי לת",pre8:"ובה ובו ובי ובת וכה וכו וכי וכת ולה ולו ולי ולת"},e.suf={suf1:"ך כ ם ן נ",suf2:"ים ות וך וכ ום ון ונ הם הן יכ יך ינ ים",suf3:"תי תך תכ תם תן תנ",suf4:"ותי ותך ותכ ותם ותן ותנ",suf5:"נו כם כן הם הן",suf6:"ונו וכם וכן והם והן",suf7:"תכם תכן תנו תהם תהן",suf8:"הוא היא הם הן אני אתה את אנו אתם אתן",suf9:"ני נו כי כו כם כן תי תך תכ תם תן",suf10:"י ך כ ם ן נ ת"},e.patterns=JSON.parse('{"hebrewPatterns": [{"pt1": [{"c": "ה", "l": 0}]}, {"pt2": [{"c": "ו", "l": 0}]}, {"pt3": [{"c": "י", "l": 0}]}, {"pt4": [{"c": "ת", "l": 0}]}, {"pt5": [{"c": "מ", "l": 0}]}, {"pt6": [{"c": "ל", "l": 0}]}, {"pt7": [{"c": "ב", "l": 0}]}, {"pt8": [{"c": "כ", "l": 0}]}, {"pt9": [{"c": "ש", "l": 0}]}, {"pt10": [{"c": "כש", "l": 0}]}, {"pt11": [{"c": "בה", "l": 0}]}, {"pt12": [{"c": "וב", "l": 0}]}, {"pt13": [{"c": "וכ", "l": 0}]}, {"pt14": [{"c": "ול", "l": 0}]}, {"pt15": [{"c": "ומ", "l": 0}]}, {"pt16": [{"c": "וש", "l": 0}]}, {"pt17": [{"c": "הב", "l": 0}]}, {"pt18": [{"c": "הכ", "l": 0}]}, {"pt19": [{"c": "הל", "l": 0}]}, {"pt20": [{"c": "המ", "l": 0}]}, {"pt21": [{"c": "הש", "l": 0}]}, {"pt22": [{"c": "מה", "l": 0}]}, {"pt23": [{"c": "שה", "l": 0}]}, {"pt24": [{"c": "כל", "l": 0}]}]}'),e.execArray=["cleanWord","removeDiacritics","removeStopWords","normalizeHebrewCharacters"],e.stem=function(){var r=0;for(e.result=!1,e.preRemoved=!1,e.sufRemoved=!1;r=0)return!0},e.normalizeHebrewCharacters=function(){return e.word=e.word.replace("ך","כ"),e.word=e.word.replace("ם","מ"),e.word=e.word.replace("ן","נ"),e.word=e.word.replace("ף","פ"),e.word=e.word.replace("ץ","צ"),!1},function(r){return"function"==typeof r.update?r.update(function(r){return e.setCurrent(r),e.stem(),e.getCurrent()}):(e.setCurrent(r),e.stem(),e.getCurrent())}}(),e.Pipeline.registerFunction(e.he.stemmer,"stemmer-he"),e.he.stopWordFilter=e.generateStopWordFilter("אבל או אולי אותו אותי אותך אותם אותן אותנו אז אחר אחרות אחרי אחריכן אחרים אחרת אי איזה איך אין איפה אל אלה אלו אם אנחנו אני אף אפשר את אתה אתכם אתכן אתם אתן באיזה באיזו בגלל בין בלבד בעבור בעזרת בכל בכן בלי במידה במקום שבו ברוב בשביל בשעה ש בתוך גם דרך הוא היא היה היי היכן היתה היתי הם הן הנה הסיבה שבגללה הרי ואילו ואת זאת זה זות יהיה יוכל יוכלו יותר מדי יכול יכולה יכולות יכולים יכל יכלה יכלו יש כאן כאשר כולם כולן כזה כי כיצד כך כל כלל כמו כן כפי כש לא לאו לאיזותך לאן לבין לה להיות להם להן לו לזה לזות לי לך לכם לכן למה למעלה למעלה מ למטה למטה מ למעט למקום שבו למרות לנו לעבר לעיכן לפיכך לפני מאד מאחורי מאיזו סיבה מאין מאיפה מבלי מבעד מדוע מה מהיכן מול מחוץ מי מידע מכאן מכל מכן מלבד מן מנין מסוגל מעט מעטים מעל מצד מקום בו מתחת מתי נגד נגר נו עד עז על עלי עליו עליה עליהם עליך עלינו עם עצמה עצמהם עצמהן עצמו עצמי עצמם עצמן עצמנו פה רק שוב של שלה שלהם שלהן שלו שלי שלך שלכה שלכם שלכן שלנו שם תהיה תחת".split(" ")),e.Pipeline.registerFunction(e.he.stopWordFilter,"stopWordFilter-he")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.hi.min.js b/assets/javascripts/lunr/min/lunr.hi.min.js new file mode 100644 index 00000000..7dbc4140 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.hi.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.hi=function(){this.pipeline.reset(),this.pipeline.add(e.hi.trimmer,e.hi.stopWordFilter,e.hi.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.hi.stemmer))},e.hi.wordCharacters="ऀ-ःऄ-एऐ-टठ-यर-िी-ॏॐ-य़ॠ-९॰-ॿa-zA-Za-zA-Z0-90-9",e.hi.trimmer=e.trimmerSupport.generateTrimmer(e.hi.wordCharacters),e.Pipeline.registerFunction(e.hi.trimmer,"trimmer-hi"),e.hi.stopWordFilter=e.generateStopWordFilter("अत अपना अपनी अपने अभी अंदर आदि आप इत्यादि इन इनका इन्हीं इन्हें इन्हों इस इसका इसकी इसके इसमें इसी इसे उन उनका उनकी उनके उनको उन्हीं उन्हें उन्हों उस उसके उसी उसे एक एवं एस ऐसे और कई कर करता करते करना करने करें कहते कहा का काफ़ी कि कितना किन्हें किन्हों किया किर किस किसी किसे की कुछ कुल के को कोई कौन कौनसा गया घर जब जहाँ जा जितना जिन जिन्हें जिन्हों जिस जिसे जीधर जैसा जैसे जो तक तब तरह तिन तिन्हें तिन्हों तिस तिसे तो था थी थे दबारा दिया दुसरा दूसरे दो द्वारा न नके नहीं ना निहायत नीचे ने पर पहले पूरा पे फिर बनी बही बहुत बाद बाला बिलकुल भी भीतर मगर मानो मे में यदि यह यहाँ यही या यिह ये रखें रहा रहे ऱ्वासा लिए लिये लेकिन व वग़ैरह वर्ग वह वहाँ वहीं वाले वुह वे वो सकता सकते सबसे सभी साथ साबुत साभ सारा से सो संग ही हुआ हुई हुए है हैं हो होता होती होते होना होने".split(" ")),e.hi.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var r=e.wordcut;r.init(),e.hi.tokenizer=function(i){if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(r){return isLunr2?new e.Token(r.toLowerCase()):r.toLowerCase()});var t=i.toString().toLowerCase().replace(/^\s+/,"");return r.cut(t).split("|")},e.Pipeline.registerFunction(e.hi.stemmer,"stemmer-hi"),e.Pipeline.registerFunction(e.hi.stopWordFilter,"stopWordFilter-hi")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.hu.min.js b/assets/javascripts/lunr/min/lunr.hu.min.js new file mode 100644 index 00000000..ed9d909f --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.hu.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Hungarian` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n():n()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.hu=function(){this.pipeline.reset(),this.pipeline.add(e.hu.trimmer,e.hu.stopWordFilter,e.hu.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.hu.stemmer))},e.hu.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.hu.trimmer=e.trimmerSupport.generateTrimmer(e.hu.wordCharacters),e.Pipeline.registerFunction(e.hu.trimmer,"trimmer-hu"),e.hu.stemmer=function(){var n=e.stemmerSupport.Among,r=e.stemmerSupport.SnowballProgram,i=new function(){function e(){var e,n=L.cursor;if(d=L.limit,L.in_grouping(W,97,252))for(;;){if(e=L.cursor,L.out_grouping(W,97,252))return L.cursor=e,L.find_among(g,8)||(L.cursor=e,e=L.limit)return void(d=e);L.cursor++}if(L.cursor=n,L.out_grouping(W,97,252)){for(;!L.in_grouping(W,97,252);){if(L.cursor>=L.limit)return;L.cursor++}d=L.cursor}}function i(){return d<=L.cursor}function a(){var e;if(L.ket=L.cursor,(e=L.find_among_b(h,2))&&(L.bra=L.cursor,i()))switch(e){case 1:L.slice_from("a");break;case 2:L.slice_from("e")}}function t(){var e=L.limit-L.cursor;return!!L.find_among_b(p,23)&&(L.cursor=L.limit-e,!0)}function s(){if(L.cursor>L.limit_backward){L.cursor--,L.ket=L.cursor;var e=L.cursor-1;L.limit_backward<=e&&e<=L.limit&&(L.cursor=e,L.bra=e,L.slice_del())}}function c(){var e;if(L.ket=L.cursor,(e=L.find_among_b(_,2))&&(L.bra=L.cursor,i())){if((1==e||2==e)&&!t())return;L.slice_del(),s()}}function o(){L.ket=L.cursor,L.find_among_b(v,44)&&(L.bra=L.cursor,i()&&(L.slice_del(),a()))}function w(){var e;if(L.ket=L.cursor,(e=L.find_among_b(z,3))&&(L.bra=L.cursor,i()))switch(e){case 1:L.slice_from("e");break;case 2:case 3:L.slice_from("a")}}function l(){var e;if(L.ket=L.cursor,(e=L.find_among_b(y,6))&&(L.bra=L.cursor,i()))switch(e){case 1:case 2:L.slice_del();break;case 3:L.slice_from("a");break;case 4:L.slice_from("e")}}function u(){var e;if(L.ket=L.cursor,(e=L.find_among_b(j,2))&&(L.bra=L.cursor,i())){if((1==e||2==e)&&!t())return;L.slice_del(),s()}}function m(){var e;if(L.ket=L.cursor,(e=L.find_among_b(C,7))&&(L.bra=L.cursor,i()))switch(e){case 1:L.slice_from("a");break;case 2:L.slice_from("e");break;case 3:case 4:case 5:case 6:case 7:L.slice_del()}}function k(){var e;if(L.ket=L.cursor,(e=L.find_among_b(P,12))&&(L.bra=L.cursor,i()))switch(e){case 1:case 4:case 7:case 9:L.slice_del();break;case 2:case 5:case 8:L.slice_from("e");break;case 3:case 6:L.slice_from("a")}}function f(){var e;if(L.ket=L.cursor,(e=L.find_among_b(F,31))&&(L.bra=L.cursor,i()))switch(e){case 1:case 4:case 7:case 8:case 9:case 12:case 13:case 16:case 17:case 18:L.slice_del();break;case 2:case 5:case 10:case 14:case 19:L.slice_from("a");break;case 3:case 6:case 11:case 15:case 20:L.slice_from("e")}}function b(){var e;if(L.ket=L.cursor,(e=L.find_among_b(S,42))&&(L.bra=L.cursor,i()))switch(e){case 1:case 4:case 5:case 6:case 9:case 10:case 11:case 14:case 15:case 16:case 17:case 20:case 21:case 24:case 25:case 26:case 29:L.slice_del();break;case 2:case 7:case 12:case 18:case 22:case 27:L.slice_from("a");break;case 3:case 8:case 13:case 19:case 23:case 28:L.slice_from("e")}}var d,g=[new n("cs",-1,-1),new n("dzs",-1,-1),new n("gy",-1,-1),new n("ly",-1,-1),new n("ny",-1,-1),new n("sz",-1,-1),new n("ty",-1,-1),new n("zs",-1,-1)],h=[new n("á",-1,1),new n("é",-1,2)],p=[new n("bb",-1,-1),new n("cc",-1,-1),new n("dd",-1,-1),new n("ff",-1,-1),new n("gg",-1,-1),new n("jj",-1,-1),new n("kk",-1,-1),new n("ll",-1,-1),new n("mm",-1,-1),new n("nn",-1,-1),new n("pp",-1,-1),new n("rr",-1,-1),new n("ccs",-1,-1),new n("ss",-1,-1),new n("zzs",-1,-1),new n("tt",-1,-1),new n("vv",-1,-1),new n("ggy",-1,-1),new n("lly",-1,-1),new n("nny",-1,-1),new n("tty",-1,-1),new n("ssz",-1,-1),new n("zz",-1,-1)],_=[new n("al",-1,1),new n("el",-1,2)],v=[new n("ba",-1,-1),new n("ra",-1,-1),new n("be",-1,-1),new n("re",-1,-1),new n("ig",-1,-1),new n("nak",-1,-1),new n("nek",-1,-1),new n("val",-1,-1),new n("vel",-1,-1),new n("ul",-1,-1),new n("nál",-1,-1),new n("nél",-1,-1),new n("ból",-1,-1),new n("ról",-1,-1),new n("tól",-1,-1),new n("bõl",-1,-1),new n("rõl",-1,-1),new n("tõl",-1,-1),new n("ül",-1,-1),new n("n",-1,-1),new n("an",19,-1),new n("ban",20,-1),new n("en",19,-1),new n("ben",22,-1),new n("képpen",22,-1),new n("on",19,-1),new n("ön",19,-1),new n("képp",-1,-1),new n("kor",-1,-1),new n("t",-1,-1),new n("at",29,-1),new n("et",29,-1),new n("ként",29,-1),new n("anként",32,-1),new n("enként",32,-1),new n("onként",32,-1),new n("ot",29,-1),new n("ért",29,-1),new n("öt",29,-1),new n("hez",-1,-1),new n("hoz",-1,-1),new n("höz",-1,-1),new n("vá",-1,-1),new n("vé",-1,-1)],z=[new n("án",-1,2),new n("én",-1,1),new n("ánként",-1,3)],y=[new n("stul",-1,2),new n("astul",0,1),new n("ástul",0,3),new n("stül",-1,2),new n("estül",3,1),new n("éstül",3,4)],j=[new n("á",-1,1),new n("é",-1,2)],C=[new n("k",-1,7),new n("ak",0,4),new n("ek",0,6),new n("ok",0,5),new n("ák",0,1),new n("ék",0,2),new n("ök",0,3)],P=[new n("éi",-1,7),new n("áéi",0,6),new n("ééi",0,5),new n("é",-1,9),new n("ké",3,4),new n("aké",4,1),new n("eké",4,1),new n("oké",4,1),new n("áké",4,3),new n("éké",4,2),new n("öké",4,1),new n("éé",3,8)],F=[new n("a",-1,18),new n("ja",0,17),new n("d",-1,16),new n("ad",2,13),new n("ed",2,13),new n("od",2,13),new n("ád",2,14),new n("éd",2,15),new n("öd",2,13),new n("e",-1,18),new n("je",9,17),new n("nk",-1,4),new n("unk",11,1),new n("ánk",11,2),new n("énk",11,3),new n("ünk",11,1),new n("uk",-1,8),new n("juk",16,7),new n("ájuk",17,5),new n("ük",-1,8),new n("jük",19,7),new n("éjük",20,6),new n("m",-1,12),new n("am",22,9),new n("em",22,9),new n("om",22,9),new n("ám",22,10),new n("ém",22,11),new n("o",-1,18),new n("á",-1,19),new n("é",-1,20)],S=[new n("id",-1,10),new n("aid",0,9),new n("jaid",1,6),new n("eid",0,9),new n("jeid",3,6),new n("áid",0,7),new n("éid",0,8),new n("i",-1,15),new n("ai",7,14),new n("jai",8,11),new n("ei",7,14),new n("jei",10,11),new n("ái",7,12),new n("éi",7,13),new n("itek",-1,24),new n("eitek",14,21),new n("jeitek",15,20),new n("éitek",14,23),new n("ik",-1,29),new n("aik",18,26),new n("jaik",19,25),new n("eik",18,26),new n("jeik",21,25),new n("áik",18,27),new n("éik",18,28),new n("ink",-1,20),new n("aink",25,17),new n("jaink",26,16),new n("eink",25,17),new n("jeink",28,16),new n("áink",25,18),new n("éink",25,19),new n("aitok",-1,21),new n("jaitok",32,20),new n("áitok",-1,22),new n("im",-1,5),new n("aim",35,4),new n("jaim",36,1),new n("eim",35,4),new n("jeim",38,1),new n("áim",35,2),new n("éim",35,3)],W=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,1,17,52,14],L=new r;this.setCurrent=function(e){L.setCurrent(e)},this.getCurrent=function(){return L.getCurrent()},this.stem=function(){var n=L.cursor;return e(),L.limit_backward=n,L.cursor=L.limit,c(),L.cursor=L.limit,o(),L.cursor=L.limit,w(),L.cursor=L.limit,l(),L.cursor=L.limit,u(),L.cursor=L.limit,k(),L.cursor=L.limit,f(),L.cursor=L.limit,b(),L.cursor=L.limit,m(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.hu.stemmer,"stemmer-hu"),e.hu.stopWordFilter=e.generateStopWordFilter("a abban ahhoz ahogy ahol aki akik akkor alatt amely amelyek amelyekben amelyeket amelyet amelynek ami amikor amit amolyan amíg annak arra arról az azok azon azonban azt aztán azután azzal azért be belül benne bár cikk cikkek cikkeket csak de e ebben eddig egy egyes egyetlen egyik egyre egyéb egész ehhez ekkor el ellen elsõ elég elõ elõször elõtt emilyen ennek erre ez ezek ezen ezt ezzel ezért fel felé hanem hiszen hogy hogyan igen ill ill. illetve ilyen ilyenkor ismét ison itt jobban jó jól kell kellett keressünk keresztül ki kívül között közül legalább legyen lehet lehetett lenne lenni lesz lett maga magát majd majd meg mellett mely melyek mert mi mikor milyen minden mindenki mindent mindig mint mintha mit mivel miért most már más másik még míg nagy nagyobb nagyon ne nekem neki nem nincs néha néhány nélkül olyan ott pedig persze rá s saját sem semmi sok sokat sokkal szemben szerint szinte számára talán tehát teljes tovább továbbá több ugyanis utolsó után utána vagy vagyis vagyok valaki valami valamint való van vannak vele vissza viszont volna volt voltak voltam voltunk által általában át én éppen és így õ õk õket össze úgy új újabb újra".split(" ")),e.Pipeline.registerFunction(e.hu.stopWordFilter,"stopWordFilter-hu")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.hy.min.js b/assets/javascripts/lunr/min/lunr.hy.min.js new file mode 100644 index 00000000..b37f7929 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.hy.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.hy=function(){this.pipeline.reset(),this.pipeline.add(e.hy.trimmer,e.hy.stopWordFilter)},e.hy.wordCharacters="[A-Za-z԰-֏ff-ﭏ]",e.hy.trimmer=e.trimmerSupport.generateTrimmer(e.hy.wordCharacters),e.Pipeline.registerFunction(e.hy.trimmer,"trimmer-hy"),e.hy.stopWordFilter=e.generateStopWordFilter("դու և եք էիր էիք հետո նաև նրանք որը վրա է որ պիտի են այս մեջ ն իր ու ի այդ որոնք այն կամ էր մի ես համար այլ իսկ էին ենք հետ ին թ էինք մենք նրա նա դուք եմ էի ըստ որպես ում".split(" ")),e.Pipeline.registerFunction(e.hy.stopWordFilter,"stopWordFilter-hy"),e.hy.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}(),e.Pipeline.registerFunction(e.hy.stemmer,"stemmer-hy")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.it.min.js b/assets/javascripts/lunr/min/lunr.it.min.js new file mode 100644 index 00000000..344b6a3c --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.it.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Italian` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.it=function(){this.pipeline.reset(),this.pipeline.add(e.it.trimmer,e.it.stopWordFilter,e.it.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.it.stemmer))},e.it.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.it.trimmer=e.trimmerSupport.generateTrimmer(e.it.wordCharacters),e.Pipeline.registerFunction(e.it.trimmer,"trimmer-it"),e.it.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,i=new function(){function e(e,r,n){return!(!x.eq_s(1,e)||(x.ket=x.cursor,!x.in_grouping(L,97,249)))&&(x.slice_from(r),x.cursor=n,!0)}function i(){for(var r,n,i,o,t=x.cursor;;){if(x.bra=x.cursor,r=x.find_among(h,7))switch(x.ket=x.cursor,r){case 1:x.slice_from("à");continue;case 2:x.slice_from("è");continue;case 3:x.slice_from("ì");continue;case 4:x.slice_from("ò");continue;case 5:x.slice_from("ù");continue;case 6:x.slice_from("qU");continue;case 7:if(x.cursor>=x.limit)break;x.cursor++;continue}break}for(x.cursor=t;;)for(n=x.cursor;;){if(i=x.cursor,x.in_grouping(L,97,249)){if(x.bra=x.cursor,o=x.cursor,e("u","U",i))break;if(x.cursor=o,e("i","I",i))break}if(x.cursor=i,x.cursor>=x.limit)return void(x.cursor=n);x.cursor++}}function o(e){if(x.cursor=e,!x.in_grouping(L,97,249))return!1;for(;!x.out_grouping(L,97,249);){if(x.cursor>=x.limit)return!1;x.cursor++}return!0}function t(){if(x.in_grouping(L,97,249)){var e=x.cursor;if(x.out_grouping(L,97,249)){for(;!x.in_grouping(L,97,249);){if(x.cursor>=x.limit)return o(e);x.cursor++}return!0}return o(e)}return!1}function s(){var e,r=x.cursor;if(!t()){if(x.cursor=r,!x.out_grouping(L,97,249))return;if(e=x.cursor,x.out_grouping(L,97,249)){for(;!x.in_grouping(L,97,249);){if(x.cursor>=x.limit)return x.cursor=e,void(x.in_grouping(L,97,249)&&x.cursor=x.limit)return;x.cursor++}k=x.cursor}function a(){for(;!x.in_grouping(L,97,249);){if(x.cursor>=x.limit)return!1;x.cursor++}for(;!x.out_grouping(L,97,249);){if(x.cursor>=x.limit)return!1;x.cursor++}return!0}function u(){var e=x.cursor;k=x.limit,p=k,g=k,s(),x.cursor=e,a()&&(p=x.cursor,a()&&(g=x.cursor))}function c(){for(var e;;){if(x.bra=x.cursor,!(e=x.find_among(q,3)))break;switch(x.ket=x.cursor,e){case 1:x.slice_from("i");break;case 2:x.slice_from("u");break;case 3:if(x.cursor>=x.limit)return;x.cursor++}}}function w(){return k<=x.cursor}function l(){return p<=x.cursor}function m(){return g<=x.cursor}function f(){var e;if(x.ket=x.cursor,x.find_among_b(C,37)&&(x.bra=x.cursor,(e=x.find_among_b(z,5))&&w()))switch(e){case 1:x.slice_del();break;case 2:x.slice_from("e")}}function v(){var e;if(x.ket=x.cursor,!(e=x.find_among_b(S,51)))return!1;switch(x.bra=x.cursor,e){case 1:if(!m())return!1;x.slice_del();break;case 2:if(!m())return!1;x.slice_del(),x.ket=x.cursor,x.eq_s_b(2,"ic")&&(x.bra=x.cursor,m()&&x.slice_del());break;case 3:if(!m())return!1;x.slice_from("log");break;case 4:if(!m())return!1;x.slice_from("u");break;case 5:if(!m())return!1;x.slice_from("ente");break;case 6:if(!w())return!1;x.slice_del();break;case 7:if(!l())return!1;x.slice_del(),x.ket=x.cursor,e=x.find_among_b(P,4),e&&(x.bra=x.cursor,m()&&(x.slice_del(),1==e&&(x.ket=x.cursor,x.eq_s_b(2,"at")&&(x.bra=x.cursor,m()&&x.slice_del()))));break;case 8:if(!m())return!1;x.slice_del(),x.ket=x.cursor,e=x.find_among_b(F,3),e&&(x.bra=x.cursor,1==e&&m()&&x.slice_del());break;case 9:if(!m())return!1;x.slice_del(),x.ket=x.cursor,x.eq_s_b(2,"at")&&(x.bra=x.cursor,m()&&(x.slice_del(),x.ket=x.cursor,x.eq_s_b(2,"ic")&&(x.bra=x.cursor,m()&&x.slice_del())))}return!0}function b(){var e,r;x.cursor>=k&&(r=x.limit_backward,x.limit_backward=k,x.ket=x.cursor,e=x.find_among_b(W,87),e&&(x.bra=x.cursor,1==e&&x.slice_del()),x.limit_backward=r)}function d(){var e=x.limit-x.cursor;if(x.ket=x.cursor,x.in_grouping_b(y,97,242)&&(x.bra=x.cursor,w()&&(x.slice_del(),x.ket=x.cursor,x.eq_s_b(1,"i")&&(x.bra=x.cursor,w()))))return void x.slice_del();x.cursor=x.limit-e}function _(){d(),x.ket=x.cursor,x.eq_s_b(1,"h")&&(x.bra=x.cursor,x.in_grouping_b(U,99,103)&&w()&&x.slice_del())}var g,p,k,h=[new r("",-1,7),new r("qu",0,6),new r("á",0,1),new r("é",0,2),new r("í",0,3),new r("ó",0,4),new r("ú",0,5)],q=[new r("",-1,3),new r("I",0,1),new r("U",0,2)],C=[new r("la",-1,-1),new r("cela",0,-1),new r("gliela",0,-1),new r("mela",0,-1),new r("tela",0,-1),new r("vela",0,-1),new r("le",-1,-1),new r("cele",6,-1),new r("gliele",6,-1),new r("mele",6,-1),new r("tele",6,-1),new r("vele",6,-1),new r("ne",-1,-1),new r("cene",12,-1),new r("gliene",12,-1),new r("mene",12,-1),new r("sene",12,-1),new r("tene",12,-1),new r("vene",12,-1),new r("ci",-1,-1),new r("li",-1,-1),new r("celi",20,-1),new r("glieli",20,-1),new r("meli",20,-1),new r("teli",20,-1),new r("veli",20,-1),new r("gli",20,-1),new r("mi",-1,-1),new r("si",-1,-1),new r("ti",-1,-1),new r("vi",-1,-1),new r("lo",-1,-1),new r("celo",31,-1),new r("glielo",31,-1),new r("melo",31,-1),new r("telo",31,-1),new r("velo",31,-1)],z=[new r("ando",-1,1),new r("endo",-1,1),new r("ar",-1,2),new r("er",-1,2),new r("ir",-1,2)],P=[new r("ic",-1,-1),new r("abil",-1,-1),new r("os",-1,-1),new r("iv",-1,1)],F=[new r("ic",-1,1),new r("abil",-1,1),new r("iv",-1,1)],S=[new r("ica",-1,1),new r("logia",-1,3),new r("osa",-1,1),new r("ista",-1,1),new r("iva",-1,9),new r("anza",-1,1),new r("enza",-1,5),new r("ice",-1,1),new r("atrice",7,1),new r("iche",-1,1),new r("logie",-1,3),new r("abile",-1,1),new r("ibile",-1,1),new r("usione",-1,4),new r("azione",-1,2),new r("uzione",-1,4),new r("atore",-1,2),new r("ose",-1,1),new r("ante",-1,1),new r("mente",-1,1),new r("amente",19,7),new r("iste",-1,1),new r("ive",-1,9),new r("anze",-1,1),new r("enze",-1,5),new r("ici",-1,1),new r("atrici",25,1),new r("ichi",-1,1),new r("abili",-1,1),new r("ibili",-1,1),new r("ismi",-1,1),new r("usioni",-1,4),new r("azioni",-1,2),new r("uzioni",-1,4),new r("atori",-1,2),new r("osi",-1,1),new r("anti",-1,1),new r("amenti",-1,6),new r("imenti",-1,6),new r("isti",-1,1),new r("ivi",-1,9),new r("ico",-1,1),new r("ismo",-1,1),new r("oso",-1,1),new r("amento",-1,6),new r("imento",-1,6),new r("ivo",-1,9),new r("ità",-1,8),new r("istà",-1,1),new r("istè",-1,1),new r("istì",-1,1)],W=[new r("isca",-1,1),new r("enda",-1,1),new r("ata",-1,1),new r("ita",-1,1),new r("uta",-1,1),new r("ava",-1,1),new r("eva",-1,1),new r("iva",-1,1),new r("erebbe",-1,1),new r("irebbe",-1,1),new r("isce",-1,1),new r("ende",-1,1),new r("are",-1,1),new r("ere",-1,1),new r("ire",-1,1),new r("asse",-1,1),new r("ate",-1,1),new r("avate",16,1),new r("evate",16,1),new r("ivate",16,1),new r("ete",-1,1),new r("erete",20,1),new r("irete",20,1),new r("ite",-1,1),new r("ereste",-1,1),new r("ireste",-1,1),new r("ute",-1,1),new r("erai",-1,1),new r("irai",-1,1),new r("isci",-1,1),new r("endi",-1,1),new r("erei",-1,1),new r("irei",-1,1),new r("assi",-1,1),new r("ati",-1,1),new r("iti",-1,1),new r("eresti",-1,1),new r("iresti",-1,1),new r("uti",-1,1),new r("avi",-1,1),new r("evi",-1,1),new r("ivi",-1,1),new r("isco",-1,1),new r("ando",-1,1),new r("endo",-1,1),new r("Yamo",-1,1),new r("iamo",-1,1),new r("avamo",-1,1),new r("evamo",-1,1),new r("ivamo",-1,1),new r("eremo",-1,1),new r("iremo",-1,1),new r("assimo",-1,1),new r("ammo",-1,1),new r("emmo",-1,1),new r("eremmo",54,1),new r("iremmo",54,1),new r("immo",-1,1),new r("ano",-1,1),new r("iscano",58,1),new r("avano",58,1),new r("evano",58,1),new r("ivano",58,1),new r("eranno",-1,1),new r("iranno",-1,1),new r("ono",-1,1),new r("iscono",65,1),new r("arono",65,1),new r("erono",65,1),new r("irono",65,1),new r("erebbero",-1,1),new r("irebbero",-1,1),new r("assero",-1,1),new r("essero",-1,1),new r("issero",-1,1),new r("ato",-1,1),new r("ito",-1,1),new r("uto",-1,1),new r("avo",-1,1),new r("evo",-1,1),new r("ivo",-1,1),new r("ar",-1,1),new r("ir",-1,1),new r("erà",-1,1),new r("irà",-1,1),new r("erò",-1,1),new r("irò",-1,1)],L=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,128,128,8,2,1],y=[17,65,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,8,2],U=[17],x=new n;this.setCurrent=function(e){x.setCurrent(e)},this.getCurrent=function(){return x.getCurrent()},this.stem=function(){var e=x.cursor;return i(),x.cursor=e,u(),x.limit_backward=e,x.cursor=x.limit,f(),x.cursor=x.limit,v()||(x.cursor=x.limit,b()),x.cursor=x.limit,_(),x.cursor=x.limit_backward,c(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.it.stemmer,"stemmer-it"),e.it.stopWordFilter=e.generateStopWordFilter("a abbia abbiamo abbiano abbiate ad agl agli ai al all alla alle allo anche avemmo avendo avesse avessero avessi avessimo aveste avesti avete aveva avevamo avevano avevate avevi avevo avrai avranno avrebbe avrebbero avrei avremmo avremo avreste avresti avrete avrà avrò avuta avute avuti avuto c che chi ci coi col come con contro cui da dagl dagli dai dal dall dalla dalle dallo degl degli dei del dell della delle dello di dov dove e ebbe ebbero ebbi ed era erano eravamo eravate eri ero essendo faccia facciamo facciano facciate faccio facemmo facendo facesse facessero facessi facessimo faceste facesti faceva facevamo facevano facevate facevi facevo fai fanno farai faranno farebbe farebbero farei faremmo faremo fareste faresti farete farà farò fece fecero feci fosse fossero fossi fossimo foste fosti fu fui fummo furono gli ha hai hanno ho i il in io l la le lei li lo loro lui ma mi mia mie miei mio ne negl negli nei nel nell nella nelle nello noi non nostra nostre nostri nostro o per perché più quale quanta quante quanti quanto quella quelle quelli quello questa queste questi questo sarai saranno sarebbe sarebbero sarei saremmo saremo sareste saresti sarete sarà sarò se sei si sia siamo siano siate siete sono sta stai stando stanno starai staranno starebbe starebbero starei staremmo staremo stareste staresti starete starà starò stava stavamo stavano stavate stavi stavo stemmo stesse stessero stessi stessimo steste stesti stette stettero stetti stia stiamo stiano stiate sto su sua sue sugl sugli sui sul sull sulla sulle sullo suo suoi ti tra tu tua tue tuo tuoi tutti tutto un una uno vi voi vostra vostre vostri vostro è".split(" ")),e.Pipeline.registerFunction(e.it.stopWordFilter,"stopWordFilter-it")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.ja.min.js b/assets/javascripts/lunr/min/lunr.ja.min.js new file mode 100644 index 00000000..5f254ebe --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.ja.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r="2"==e.version[0];e.ja=function(){this.pipeline.reset(),this.pipeline.add(e.ja.trimmer,e.ja.stopWordFilter,e.ja.stemmer),r?this.tokenizer=e.ja.tokenizer:(e.tokenizer&&(e.tokenizer=e.ja.tokenizer),this.tokenizerFn&&(this.tokenizerFn=e.ja.tokenizer))};var t=new e.TinySegmenter;e.ja.tokenizer=function(i){var n,o,s,p,a,u,m,l,c,f;if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(t){return r?new e.Token(t.toLowerCase()):t.toLowerCase()});for(o=i.toString().toLowerCase().replace(/^\s+/,""),n=o.length-1;n>=0;n--)if(/\S/.test(o.charAt(n))){o=o.substring(0,n+1);break}for(a=[],s=o.length,c=0,l=0;c<=s;c++)if(u=o.charAt(c),m=c-l,u.match(/\s/)||c==s){if(m>0)for(p=t.segment(o.slice(l,c)).filter(function(e){return!!e}),f=l,n=0;n=C.limit)break;C.cursor++;continue}break}for(C.cursor=o,C.bra=o,C.eq_s(1,"y")?(C.ket=C.cursor,C.slice_from("Y")):C.cursor=o;;)if(e=C.cursor,C.in_grouping(q,97,232)){if(i=C.cursor,C.bra=i,C.eq_s(1,"i"))C.ket=C.cursor,C.in_grouping(q,97,232)&&(C.slice_from("I"),C.cursor=e);else if(C.cursor=i,C.eq_s(1,"y"))C.ket=C.cursor,C.slice_from("Y"),C.cursor=e;else if(n(e))break}else if(n(e))break}function n(r){return C.cursor=r,r>=C.limit||(C.cursor++,!1)}function o(){_=C.limit,d=_,t()||(_=C.cursor,_<3&&(_=3),t()||(d=C.cursor))}function t(){for(;!C.in_grouping(q,97,232);){if(C.cursor>=C.limit)return!0;C.cursor++}for(;!C.out_grouping(q,97,232);){if(C.cursor>=C.limit)return!0;C.cursor++}return!1}function s(){for(var r;;)if(C.bra=C.cursor,r=C.find_among(p,3))switch(C.ket=C.cursor,r){case 1:C.slice_from("y");break;case 2:C.slice_from("i");break;case 3:if(C.cursor>=C.limit)return;C.cursor++}}function u(){return _<=C.cursor}function c(){return d<=C.cursor}function a(){var r=C.limit-C.cursor;C.find_among_b(g,3)&&(C.cursor=C.limit-r,C.ket=C.cursor,C.cursor>C.limit_backward&&(C.cursor--,C.bra=C.cursor,C.slice_del()))}function l(){var r;w=!1,C.ket=C.cursor,C.eq_s_b(1,"e")&&(C.bra=C.cursor,u()&&(r=C.limit-C.cursor,C.out_grouping_b(q,97,232)&&(C.cursor=C.limit-r,C.slice_del(),w=!0,a())))}function m(){var r;u()&&(r=C.limit-C.cursor,C.out_grouping_b(q,97,232)&&(C.cursor=C.limit-r,C.eq_s_b(3,"gem")||(C.cursor=C.limit-r,C.slice_del(),a())))}function f(){var r,e,i,n,o,t,s=C.limit-C.cursor;if(C.ket=C.cursor,r=C.find_among_b(h,5))switch(C.bra=C.cursor,r){case 1:u()&&C.slice_from("heid");break;case 2:m();break;case 3:u()&&C.out_grouping_b(j,97,232)&&C.slice_del()}if(C.cursor=C.limit-s,l(),C.cursor=C.limit-s,C.ket=C.cursor,C.eq_s_b(4,"heid")&&(C.bra=C.cursor,c()&&(e=C.limit-C.cursor,C.eq_s_b(1,"c")||(C.cursor=C.limit-e,C.slice_del(),C.ket=C.cursor,C.eq_s_b(2,"en")&&(C.bra=C.cursor,m())))),C.cursor=C.limit-s,C.ket=C.cursor,r=C.find_among_b(k,6))switch(C.bra=C.cursor,r){case 1:if(c()){if(C.slice_del(),i=C.limit-C.cursor,C.ket=C.cursor,C.eq_s_b(2,"ig")&&(C.bra=C.cursor,c()&&(n=C.limit-C.cursor,!C.eq_s_b(1,"e")))){C.cursor=C.limit-n,C.slice_del();break}C.cursor=C.limit-i,a()}break;case 2:c()&&(o=C.limit-C.cursor,C.eq_s_b(1,"e")||(C.cursor=C.limit-o,C.slice_del()));break;case 3:c()&&(C.slice_del(),l());break;case 4:c()&&C.slice_del();break;case 5:c()&&w&&C.slice_del()}C.cursor=C.limit-s,C.out_grouping_b(z,73,232)&&(t=C.limit-C.cursor,C.find_among_b(v,4)&&C.out_grouping_b(q,97,232)&&(C.cursor=C.limit-t,C.ket=C.cursor,C.cursor>C.limit_backward&&(C.cursor--,C.bra=C.cursor,C.slice_del())))}var d,_,w,b=[new e("",-1,6),new e("á",0,1),new e("ä",0,1),new e("é",0,2),new e("ë",0,2),new e("í",0,3),new e("ï",0,3),new e("ó",0,4),new e("ö",0,4),new e("ú",0,5),new e("ü",0,5)],p=[new e("",-1,3),new e("I",0,2),new e("Y",0,1)],g=[new e("dd",-1,-1),new e("kk",-1,-1),new e("tt",-1,-1)],h=[new e("ene",-1,2),new e("se",-1,3),new e("en",-1,2),new e("heden",2,1),new e("s",-1,3)],k=[new e("end",-1,1),new e("ig",-1,2),new e("ing",-1,1),new e("lijk",-1,3),new e("baar",-1,4),new e("bar",-1,5)],v=[new e("aa",-1,-1),new e("ee",-1,-1),new e("oo",-1,-1),new e("uu",-1,-1)],q=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],z=[1,0,0,17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],j=[17,67,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],C=new i;this.setCurrent=function(r){C.setCurrent(r)},this.getCurrent=function(){return C.getCurrent()},this.stem=function(){var e=C.cursor;return r(),C.cursor=e,o(),C.limit_backward=e,C.cursor=C.limit,f(),C.cursor=C.limit_backward,s(),!0}};return function(r){return"function"==typeof r.update?r.update(function(r){return n.setCurrent(r),n.stem(),n.getCurrent()}):(n.setCurrent(r),n.stem(),n.getCurrent())}}(),r.Pipeline.registerFunction(r.nl.stemmer,"stemmer-nl"),r.nl.stopWordFilter=r.generateStopWordFilter(" aan al alles als altijd andere ben bij daar dan dat de der deze die dit doch doen door dus een eens en er ge geen geweest haar had heb hebben heeft hem het hier hij hoe hun iemand iets ik in is ja je kan kon kunnen maar me meer men met mij mijn moet na naar niet niets nog nu of om omdat onder ons ook op over reeds te tegen toch toen tot u uit uw van veel voor want waren was wat werd wezen wie wil worden wordt zal ze zelf zich zij zijn zo zonder zou".split(" ")),r.Pipeline.registerFunction(r.nl.stopWordFilter,"stopWordFilter-nl")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.no.min.js b/assets/javascripts/lunr/min/lunr.no.min.js new file mode 100644 index 00000000..92bc7e4e --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.no.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Norwegian` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.no=function(){this.pipeline.reset(),this.pipeline.add(e.no.trimmer,e.no.stopWordFilter,e.no.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.no.stemmer))},e.no.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.no.trimmer=e.trimmerSupport.generateTrimmer(e.no.wordCharacters),e.Pipeline.registerFunction(e.no.trimmer,"trimmer-no"),e.no.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,i=new function(){function e(){var e,r=w.cursor+3;if(a=w.limit,0<=r||r<=w.limit){for(s=r;;){if(e=w.cursor,w.in_grouping(d,97,248)){w.cursor=e;break}if(e>=w.limit)return;w.cursor=e+1}for(;!w.out_grouping(d,97,248);){if(w.cursor>=w.limit)return;w.cursor++}a=w.cursor,a=a&&(r=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,e=w.find_among_b(m,29),w.limit_backward=r,e))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:n=w.limit-w.cursor,w.in_grouping_b(c,98,122)?w.slice_del():(w.cursor=w.limit-n,w.eq_s_b(1,"k")&&w.out_grouping_b(d,97,248)&&w.slice_del());break;case 3:w.slice_from("er")}}function t(){var e,r=w.limit-w.cursor;w.cursor>=a&&(e=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,w.find_among_b(u,2)?(w.bra=w.cursor,w.limit_backward=e,w.cursor=w.limit-r,w.cursor>w.limit_backward&&(w.cursor--,w.bra=w.cursor,w.slice_del())):w.limit_backward=e)}function o(){var e,r;w.cursor>=a&&(r=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,e=w.find_among_b(l,11),e?(w.bra=w.cursor,w.limit_backward=r,1==e&&w.slice_del()):w.limit_backward=r)}var s,a,m=[new r("a",-1,1),new r("e",-1,1),new r("ede",1,1),new r("ande",1,1),new r("ende",1,1),new r("ane",1,1),new r("ene",1,1),new r("hetene",6,1),new r("erte",1,3),new r("en",-1,1),new r("heten",9,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",12,1),new r("s",-1,2),new r("as",14,1),new r("es",14,1),new r("edes",16,1),new r("endes",16,1),new r("enes",16,1),new r("hetenes",19,1),new r("ens",14,1),new r("hetens",21,1),new r("ers",14,1),new r("ets",14,1),new r("et",-1,1),new r("het",25,1),new r("ert",-1,3),new r("ast",-1,1)],u=[new r("dt",-1,-1),new r("vt",-1,-1)],l=[new r("leg",-1,1),new r("eleg",0,1),new r("ig",-1,1),new r("eig",2,1),new r("lig",2,1),new r("elig",4,1),new r("els",-1,1),new r("lov",-1,1),new r("elov",7,1),new r("slov",7,1),new r("hetslov",9,1)],d=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],c=[119,125,149,1],w=new n;this.setCurrent=function(e){w.setCurrent(e)},this.getCurrent=function(){return w.getCurrent()},this.stem=function(){var r=w.cursor;return e(),w.limit_backward=r,w.cursor=w.limit,i(),w.cursor=w.limit,t(),w.cursor=w.limit,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.no.stemmer,"stemmer-no"),e.no.stopWordFilter=e.generateStopWordFilter("alle at av bare begge ble blei bli blir blitt både båe da de deg dei deim deira deires dem den denne der dere deres det dette di din disse ditt du dykk dykkar då eg ein eit eitt eller elles en enn er et ett etter for fordi fra før ha hadde han hans har hennar henne hennes her hjå ho hoe honom hoss hossen hun hva hvem hver hvilke hvilken hvis hvor hvordan hvorfor i ikke ikkje ikkje ingen ingi inkje inn inni ja jeg kan kom korleis korso kun kunne kva kvar kvarhelst kven kvi kvifor man mange me med medan meg meget mellom men mi min mine mitt mot mykje ned no noe noen noka noko nokon nokor nokre nå når og også om opp oss over på samme seg selv si si sia sidan siden sin sine sitt sjøl skal skulle slik so som som somme somt så sånn til um upp ut uten var vart varte ved vere verte vi vil ville vore vors vort vår være være vært å".split(" ")),e.Pipeline.registerFunction(e.no.stopWordFilter,"stopWordFilter-no")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.pt.min.js b/assets/javascripts/lunr/min/lunr.pt.min.js new file mode 100644 index 00000000..6c16996d --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.pt.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Portuguese` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.pt=function(){this.pipeline.reset(),this.pipeline.add(e.pt.trimmer,e.pt.stopWordFilter,e.pt.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.pt.stemmer))},e.pt.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.pt.trimmer=e.trimmerSupport.generateTrimmer(e.pt.wordCharacters),e.Pipeline.registerFunction(e.pt.trimmer,"trimmer-pt"),e.pt.stemmer=function(){var r=e.stemmerSupport.Among,s=e.stemmerSupport.SnowballProgram,n=new function(){function e(){for(var e;;){if(z.bra=z.cursor,e=z.find_among(k,3))switch(z.ket=z.cursor,e){case 1:z.slice_from("a~");continue;case 2:z.slice_from("o~");continue;case 3:if(z.cursor>=z.limit)break;z.cursor++;continue}break}}function n(){if(z.out_grouping(y,97,250)){for(;!z.in_grouping(y,97,250);){if(z.cursor>=z.limit)return!0;z.cursor++}return!1}return!0}function i(){if(z.in_grouping(y,97,250))for(;!z.out_grouping(y,97,250);){if(z.cursor>=z.limit)return!1;z.cursor++}return g=z.cursor,!0}function o(){var e,r,s=z.cursor;if(z.in_grouping(y,97,250))if(e=z.cursor,n()){if(z.cursor=e,i())return}else g=z.cursor;if(z.cursor=s,z.out_grouping(y,97,250)){if(r=z.cursor,n()){if(z.cursor=r,!z.in_grouping(y,97,250)||z.cursor>=z.limit)return;z.cursor++}g=z.cursor}}function t(){for(;!z.in_grouping(y,97,250);){if(z.cursor>=z.limit)return!1;z.cursor++}for(;!z.out_grouping(y,97,250);){if(z.cursor>=z.limit)return!1;z.cursor++}return!0}function a(){var e=z.cursor;g=z.limit,b=g,h=g,o(),z.cursor=e,t()&&(b=z.cursor,t()&&(h=z.cursor))}function u(){for(var e;;){if(z.bra=z.cursor,e=z.find_among(q,3))switch(z.ket=z.cursor,e){case 1:z.slice_from("ã");continue;case 2:z.slice_from("õ");continue;case 3:if(z.cursor>=z.limit)break;z.cursor++;continue}break}}function w(){return g<=z.cursor}function m(){return b<=z.cursor}function c(){return h<=z.cursor}function l(){var e;if(z.ket=z.cursor,!(e=z.find_among_b(F,45)))return!1;switch(z.bra=z.cursor,e){case 1:if(!c())return!1;z.slice_del();break;case 2:if(!c())return!1;z.slice_from("log");break;case 3:if(!c())return!1;z.slice_from("u");break;case 4:if(!c())return!1;z.slice_from("ente");break;case 5:if(!m())return!1;z.slice_del(),z.ket=z.cursor,e=z.find_among_b(j,4),e&&(z.bra=z.cursor,c()&&(z.slice_del(),1==e&&(z.ket=z.cursor,z.eq_s_b(2,"at")&&(z.bra=z.cursor,c()&&z.slice_del()))));break;case 6:if(!c())return!1;z.slice_del(),z.ket=z.cursor,e=z.find_among_b(C,3),e&&(z.bra=z.cursor,1==e&&c()&&z.slice_del());break;case 7:if(!c())return!1;z.slice_del(),z.ket=z.cursor,e=z.find_among_b(P,3),e&&(z.bra=z.cursor,1==e&&c()&&z.slice_del());break;case 8:if(!c())return!1;z.slice_del(),z.ket=z.cursor,z.eq_s_b(2,"at")&&(z.bra=z.cursor,c()&&z.slice_del());break;case 9:if(!w()||!z.eq_s_b(1,"e"))return!1;z.slice_from("ir")}return!0}function f(){var e,r;if(z.cursor>=g){if(r=z.limit_backward,z.limit_backward=g,z.ket=z.cursor,e=z.find_among_b(S,120))return z.bra=z.cursor,1==e&&z.slice_del(),z.limit_backward=r,!0;z.limit_backward=r}return!1}function d(){var e;z.ket=z.cursor,(e=z.find_among_b(W,7))&&(z.bra=z.cursor,1==e&&w()&&z.slice_del())}function v(e,r){if(z.eq_s_b(1,e)){z.bra=z.cursor;var s=z.limit-z.cursor;if(z.eq_s_b(1,r))return z.cursor=z.limit-s,w()&&z.slice_del(),!1}return!0}function p(){var e;if(z.ket=z.cursor,e=z.find_among_b(L,4))switch(z.bra=z.cursor,e){case 1:w()&&(z.slice_del(),z.ket=z.cursor,z.limit-z.cursor,v("u","g")&&v("i","c"));break;case 2:z.slice_from("c")}}function _(){if(!l()&&(z.cursor=z.limit,!f()))return z.cursor=z.limit,void d();z.cursor=z.limit,z.ket=z.cursor,z.eq_s_b(1,"i")&&(z.bra=z.cursor,z.eq_s_b(1,"c")&&(z.cursor=z.limit,w()&&z.slice_del()))}var h,b,g,k=[new r("",-1,3),new r("ã",0,1),new r("õ",0,2)],q=[new r("",-1,3),new r("a~",0,1),new r("o~",0,2)],j=[new r("ic",-1,-1),new r("ad",-1,-1),new r("os",-1,-1),new r("iv",-1,1)],C=[new r("ante",-1,1),new r("avel",-1,1),new r("ível",-1,1)],P=[new r("ic",-1,1),new r("abil",-1,1),new r("iv",-1,1)],F=[new r("ica",-1,1),new r("ância",-1,1),new r("ência",-1,4),new r("ira",-1,9),new r("adora",-1,1),new r("osa",-1,1),new r("ista",-1,1),new r("iva",-1,8),new r("eza",-1,1),new r("logía",-1,2),new r("idade",-1,7),new r("ante",-1,1),new r("mente",-1,6),new r("amente",12,5),new r("ável",-1,1),new r("ível",-1,1),new r("ución",-1,3),new r("ico",-1,1),new r("ismo",-1,1),new r("oso",-1,1),new r("amento",-1,1),new r("imento",-1,1),new r("ivo",-1,8),new r("aça~o",-1,1),new r("ador",-1,1),new r("icas",-1,1),new r("ências",-1,4),new r("iras",-1,9),new r("adoras",-1,1),new r("osas",-1,1),new r("istas",-1,1),new r("ivas",-1,8),new r("ezas",-1,1),new r("logías",-1,2),new r("idades",-1,7),new r("uciones",-1,3),new r("adores",-1,1),new r("antes",-1,1),new r("aço~es",-1,1),new r("icos",-1,1),new r("ismos",-1,1),new r("osos",-1,1),new r("amentos",-1,1),new r("imentos",-1,1),new r("ivos",-1,8)],S=[new r("ada",-1,1),new r("ida",-1,1),new r("ia",-1,1),new r("aria",2,1),new r("eria",2,1),new r("iria",2,1),new r("ara",-1,1),new r("era",-1,1),new r("ira",-1,1),new r("ava",-1,1),new r("asse",-1,1),new r("esse",-1,1),new r("isse",-1,1),new r("aste",-1,1),new r("este",-1,1),new r("iste",-1,1),new r("ei",-1,1),new r("arei",16,1),new r("erei",16,1),new r("irei",16,1),new r("am",-1,1),new r("iam",20,1),new r("ariam",21,1),new r("eriam",21,1),new r("iriam",21,1),new r("aram",20,1),new r("eram",20,1),new r("iram",20,1),new r("avam",20,1),new r("em",-1,1),new r("arem",29,1),new r("erem",29,1),new r("irem",29,1),new r("assem",29,1),new r("essem",29,1),new r("issem",29,1),new r("ado",-1,1),new r("ido",-1,1),new r("ando",-1,1),new r("endo",-1,1),new r("indo",-1,1),new r("ara~o",-1,1),new r("era~o",-1,1),new r("ira~o",-1,1),new r("ar",-1,1),new r("er",-1,1),new r("ir",-1,1),new r("as",-1,1),new r("adas",47,1),new r("idas",47,1),new r("ias",47,1),new r("arias",50,1),new r("erias",50,1),new r("irias",50,1),new r("aras",47,1),new r("eras",47,1),new r("iras",47,1),new r("avas",47,1),new r("es",-1,1),new r("ardes",58,1),new r("erdes",58,1),new r("irdes",58,1),new r("ares",58,1),new r("eres",58,1),new r("ires",58,1),new r("asses",58,1),new r("esses",58,1),new r("isses",58,1),new r("astes",58,1),new r("estes",58,1),new r("istes",58,1),new r("is",-1,1),new r("ais",71,1),new r("eis",71,1),new r("areis",73,1),new r("ereis",73,1),new r("ireis",73,1),new r("áreis",73,1),new r("éreis",73,1),new r("íreis",73,1),new r("ásseis",73,1),new r("ésseis",73,1),new r("ísseis",73,1),new r("áveis",73,1),new r("íeis",73,1),new r("aríeis",84,1),new r("eríeis",84,1),new r("iríeis",84,1),new r("ados",-1,1),new r("idos",-1,1),new r("amos",-1,1),new r("áramos",90,1),new r("éramos",90,1),new r("íramos",90,1),new r("ávamos",90,1),new r("íamos",90,1),new r("aríamos",95,1),new r("eríamos",95,1),new r("iríamos",95,1),new r("emos",-1,1),new r("aremos",99,1),new r("eremos",99,1),new r("iremos",99,1),new r("ássemos",99,1),new r("êssemos",99,1),new r("íssemos",99,1),new r("imos",-1,1),new r("armos",-1,1),new r("ermos",-1,1),new r("irmos",-1,1),new r("ámos",-1,1),new r("arás",-1,1),new r("erás",-1,1),new r("irás",-1,1),new r("eu",-1,1),new r("iu",-1,1),new r("ou",-1,1),new r("ará",-1,1),new r("erá",-1,1),new r("irá",-1,1)],W=[new r("a",-1,1),new r("i",-1,1),new r("o",-1,1),new r("os",-1,1),new r("á",-1,1),new r("í",-1,1),new r("ó",-1,1)],L=[new r("e",-1,1),new r("ç",-1,2),new r("é",-1,1),new r("ê",-1,1)],y=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,3,19,12,2],z=new s;this.setCurrent=function(e){z.setCurrent(e)},this.getCurrent=function(){return z.getCurrent()},this.stem=function(){var r=z.cursor;return e(),z.cursor=r,a(),z.limit_backward=r,z.cursor=z.limit,_(),z.cursor=z.limit,p(),z.cursor=z.limit_backward,u(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.pt.stemmer,"stemmer-pt"),e.pt.stopWordFilter=e.generateStopWordFilter("a ao aos aquela aquelas aquele aqueles aquilo as até com como da das de dela delas dele deles depois do dos e ela elas ele eles em entre era eram essa essas esse esses esta estamos estas estava estavam este esteja estejam estejamos estes esteve estive estivemos estiver estivera estiveram estiverem estivermos estivesse estivessem estivéramos estivéssemos estou está estávamos estão eu foi fomos for fora foram forem formos fosse fossem fui fôramos fôssemos haja hajam hajamos havemos hei houve houvemos houver houvera houveram houverei houverem houveremos houveria houveriam houvermos houverá houverão houveríamos houvesse houvessem houvéramos houvéssemos há hão isso isto já lhe lhes mais mas me mesmo meu meus minha minhas muito na nas nem no nos nossa nossas nosso nossos num numa não nós o os ou para pela pelas pelo pelos por qual quando que quem se seja sejam sejamos sem serei seremos seria seriam será serão seríamos seu seus somos sou sua suas são só também te tem temos tenha tenham tenhamos tenho terei teremos teria teriam terá terão teríamos teu teus teve tinha tinham tive tivemos tiver tivera tiveram tiverem tivermos tivesse tivessem tivéramos tivéssemos tu tua tuas tém tínhamos um uma você vocês vos à às éramos".split(" ")),e.Pipeline.registerFunction(e.pt.stopWordFilter,"stopWordFilter-pt")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.ro.min.js b/assets/javascripts/lunr/min/lunr.ro.min.js new file mode 100644 index 00000000..72771401 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.ro.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Romanian` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,i){"function"==typeof define&&define.amd?define(i):"object"==typeof exports?module.exports=i():i()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ro=function(){this.pipeline.reset(),this.pipeline.add(e.ro.trimmer,e.ro.stopWordFilter,e.ro.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ro.stemmer))},e.ro.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.ro.trimmer=e.trimmerSupport.generateTrimmer(e.ro.wordCharacters),e.Pipeline.registerFunction(e.ro.trimmer,"trimmer-ro"),e.ro.stemmer=function(){var i=e.stemmerSupport.Among,r=e.stemmerSupport.SnowballProgram,n=new function(){function e(e,i){L.eq_s(1,e)&&(L.ket=L.cursor,L.in_grouping(W,97,259)&&L.slice_from(i))}function n(){for(var i,r;;){if(i=L.cursor,L.in_grouping(W,97,259)&&(r=L.cursor,L.bra=r,e("u","U"),L.cursor=r,e("i","I")),L.cursor=i,L.cursor>=L.limit)break;L.cursor++}}function t(){if(L.out_grouping(W,97,259)){for(;!L.in_grouping(W,97,259);){if(L.cursor>=L.limit)return!0;L.cursor++}return!1}return!0}function a(){if(L.in_grouping(W,97,259))for(;!L.out_grouping(W,97,259);){if(L.cursor>=L.limit)return!0;L.cursor++}return!1}function o(){var e,i,r=L.cursor;if(L.in_grouping(W,97,259)){if(e=L.cursor,!t())return void(h=L.cursor);if(L.cursor=e,!a())return void(h=L.cursor)}L.cursor=r,L.out_grouping(W,97,259)&&(i=L.cursor,t()&&(L.cursor=i,L.in_grouping(W,97,259)&&L.cursor=L.limit)return!1;L.cursor++}for(;!L.out_grouping(W,97,259);){if(L.cursor>=L.limit)return!1;L.cursor++}return!0}function c(){var e=L.cursor;h=L.limit,k=h,g=h,o(),L.cursor=e,u()&&(k=L.cursor,u()&&(g=L.cursor))}function s(){for(var e;;){if(L.bra=L.cursor,e=L.find_among(z,3))switch(L.ket=L.cursor,e){case 1:L.slice_from("i");continue;case 2:L.slice_from("u");continue;case 3:if(L.cursor>=L.limit)break;L.cursor++;continue}break}}function w(){return h<=L.cursor}function m(){return k<=L.cursor}function l(){return g<=L.cursor}function f(){var e,i;if(L.ket=L.cursor,(e=L.find_among_b(C,16))&&(L.bra=L.cursor,m()))switch(e){case 1:L.slice_del();break;case 2:L.slice_from("a");break;case 3:L.slice_from("e");break;case 4:L.slice_from("i");break;case 5:i=L.limit-L.cursor,L.eq_s_b(2,"ab")||(L.cursor=L.limit-i,L.slice_from("i"));break;case 6:L.slice_from("at");break;case 7:L.slice_from("aţi")}}function p(){var e,i=L.limit-L.cursor;if(L.ket=L.cursor,(e=L.find_among_b(P,46))&&(L.bra=L.cursor,m())){switch(e){case 1:L.slice_from("abil");break;case 2:L.slice_from("ibil");break;case 3:L.slice_from("iv");break;case 4:L.slice_from("ic");break;case 5:L.slice_from("at");break;case 6:L.slice_from("it")}return _=!0,L.cursor=L.limit-i,!0}return!1}function d(){var e,i;for(_=!1;;)if(i=L.limit-L.cursor,!p()){L.cursor=L.limit-i;break}if(L.ket=L.cursor,(e=L.find_among_b(F,62))&&(L.bra=L.cursor,l())){switch(e){case 1:L.slice_del();break;case 2:L.eq_s_b(1,"ţ")&&(L.bra=L.cursor,L.slice_from("t"));break;case 3:L.slice_from("ist")}_=!0}}function b(){var e,i,r;if(L.cursor>=h){if(i=L.limit_backward,L.limit_backward=h,L.ket=L.cursor,e=L.find_among_b(q,94))switch(L.bra=L.cursor,e){case 1:if(r=L.limit-L.cursor,!L.out_grouping_b(W,97,259)&&(L.cursor=L.limit-r,!L.eq_s_b(1,"u")))break;case 2:L.slice_del()}L.limit_backward=i}}function v(){var e;L.ket=L.cursor,(e=L.find_among_b(S,5))&&(L.bra=L.cursor,w()&&1==e&&L.slice_del())}var _,g,k,h,z=[new i("",-1,3),new i("I",0,1),new i("U",0,2)],C=[new i("ea",-1,3),new i("aţia",-1,7),new i("aua",-1,2),new i("iua",-1,4),new i("aţie",-1,7),new i("ele",-1,3),new i("ile",-1,5),new i("iile",6,4),new i("iei",-1,4),new i("atei",-1,6),new i("ii",-1,4),new i("ului",-1,1),new i("ul",-1,1),new i("elor",-1,3),new i("ilor",-1,4),new i("iilor",14,4)],P=[new i("icala",-1,4),new i("iciva",-1,4),new i("ativa",-1,5),new i("itiva",-1,6),new i("icale",-1,4),new i("aţiune",-1,5),new i("iţiune",-1,6),new i("atoare",-1,5),new i("itoare",-1,6),new i("ătoare",-1,5),new i("icitate",-1,4),new i("abilitate",-1,1),new i("ibilitate",-1,2),new i("ivitate",-1,3),new i("icive",-1,4),new i("ative",-1,5),new i("itive",-1,6),new i("icali",-1,4),new i("atori",-1,5),new i("icatori",18,4),new i("itori",-1,6),new i("ători",-1,5),new i("icitati",-1,4),new i("abilitati",-1,1),new i("ivitati",-1,3),new i("icivi",-1,4),new i("ativi",-1,5),new i("itivi",-1,6),new i("icităi",-1,4),new i("abilităi",-1,1),new i("ivităi",-1,3),new i("icităţi",-1,4),new i("abilităţi",-1,1),new i("ivităţi",-1,3),new i("ical",-1,4),new i("ator",-1,5),new i("icator",35,4),new i("itor",-1,6),new i("ător",-1,5),new i("iciv",-1,4),new i("ativ",-1,5),new i("itiv",-1,6),new i("icală",-1,4),new i("icivă",-1,4),new i("ativă",-1,5),new i("itivă",-1,6)],F=[new i("ica",-1,1),new i("abila",-1,1),new i("ibila",-1,1),new i("oasa",-1,1),new i("ata",-1,1),new i("ita",-1,1),new i("anta",-1,1),new i("ista",-1,3),new i("uta",-1,1),new i("iva",-1,1),new i("ic",-1,1),new i("ice",-1,1),new i("abile",-1,1),new i("ibile",-1,1),new i("isme",-1,3),new i("iune",-1,2),new i("oase",-1,1),new i("ate",-1,1),new i("itate",17,1),new i("ite",-1,1),new i("ante",-1,1),new i("iste",-1,3),new i("ute",-1,1),new i("ive",-1,1),new i("ici",-1,1),new i("abili",-1,1),new i("ibili",-1,1),new i("iuni",-1,2),new i("atori",-1,1),new i("osi",-1,1),new i("ati",-1,1),new i("itati",30,1),new i("iti",-1,1),new i("anti",-1,1),new i("isti",-1,3),new i("uti",-1,1),new i("işti",-1,3),new i("ivi",-1,1),new i("ităi",-1,1),new i("oşi",-1,1),new i("ităţi",-1,1),new i("abil",-1,1),new i("ibil",-1,1),new i("ism",-1,3),new i("ator",-1,1),new i("os",-1,1),new i("at",-1,1),new i("it",-1,1),new i("ant",-1,1),new i("ist",-1,3),new i("ut",-1,1),new i("iv",-1,1),new i("ică",-1,1),new i("abilă",-1,1),new i("ibilă",-1,1),new i("oasă",-1,1),new i("ată",-1,1),new i("ită",-1,1),new i("antă",-1,1),new i("istă",-1,3),new i("ută",-1,1),new i("ivă",-1,1)],q=[new i("ea",-1,1),new i("ia",-1,1),new i("esc",-1,1),new i("ăsc",-1,1),new i("ind",-1,1),new i("ând",-1,1),new i("are",-1,1),new i("ere",-1,1),new i("ire",-1,1),new i("âre",-1,1),new i("se",-1,2),new i("ase",10,1),new i("sese",10,2),new i("ise",10,1),new i("use",10,1),new i("âse",10,1),new i("eşte",-1,1),new i("ăşte",-1,1),new i("eze",-1,1),new i("ai",-1,1),new i("eai",19,1),new i("iai",19,1),new i("sei",-1,2),new i("eşti",-1,1),new i("ăşti",-1,1),new i("ui",-1,1),new i("ezi",-1,1),new i("âi",-1,1),new i("aşi",-1,1),new i("seşi",-1,2),new i("aseşi",29,1),new i("seseşi",29,2),new i("iseşi",29,1),new i("useşi",29,1),new i("âseşi",29,1),new i("işi",-1,1),new i("uşi",-1,1),new i("âşi",-1,1),new i("aţi",-1,2),new i("eaţi",38,1),new i("iaţi",38,1),new i("eţi",-1,2),new i("iţi",-1,2),new i("âţi",-1,2),new i("arăţi",-1,1),new i("serăţi",-1,2),new i("aserăţi",45,1),new i("seserăţi",45,2),new i("iserăţi",45,1),new i("userăţi",45,1),new i("âserăţi",45,1),new i("irăţi",-1,1),new i("urăţi",-1,1),new i("ârăţi",-1,1),new i("am",-1,1),new i("eam",54,1),new i("iam",54,1),new i("em",-1,2),new i("asem",57,1),new i("sesem",57,2),new i("isem",57,1),new i("usem",57,1),new i("âsem",57,1),new i("im",-1,2),new i("âm",-1,2),new i("ăm",-1,2),new i("arăm",65,1),new i("serăm",65,2),new i("aserăm",67,1),new i("seserăm",67,2),new i("iserăm",67,1),new i("userăm",67,1),new i("âserăm",67,1),new i("irăm",65,1),new i("urăm",65,1),new i("ârăm",65,1),new i("au",-1,1),new i("eau",76,1),new i("iau",76,1),new i("indu",-1,1),new i("ându",-1,1),new i("ez",-1,1),new i("ească",-1,1),new i("ară",-1,1),new i("seră",-1,2),new i("aseră",84,1),new i("seseră",84,2),new i("iseră",84,1),new i("useră",84,1),new i("âseră",84,1),new i("iră",-1,1),new i("ură",-1,1),new i("âră",-1,1),new i("ează",-1,1)],S=[new i("a",-1,1),new i("e",-1,1),new i("ie",1,1),new i("i",-1,1),new i("ă",-1,1)],W=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,2,32,0,0,4],L=new r;this.setCurrent=function(e){L.setCurrent(e)},this.getCurrent=function(){return L.getCurrent()},this.stem=function(){var e=L.cursor;return n(),L.cursor=e,c(),L.limit_backward=e,L.cursor=L.limit,f(),L.cursor=L.limit,d(),L.cursor=L.limit,_||(L.cursor=L.limit,b(),L.cursor=L.limit),v(),L.cursor=L.limit_backward,s(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.ro.stemmer,"stemmer-ro"),e.ro.stopWordFilter=e.generateStopWordFilter("acea aceasta această aceea acei aceia acel acela acele acelea acest acesta aceste acestea aceşti aceştia acolo acord acum ai aia aibă aici al ale alea altceva altcineva am ar are asemenea asta astea astăzi asupra au avea avem aveţi azi aş aşadar aţi bine bucur bună ca care caut ce cel ceva chiar cinci cine cineva contra cu cum cumva curând curînd când cât câte câtva câţi cînd cît cîte cîtva cîţi că căci cărei căror cărui către da dacă dar datorită dată dau de deci deja deoarece departe deşi din dinaintea dintr- dintre doi doilea două drept după dă ea ei el ele eram este eu eşti face fata fi fie fiecare fii fim fiu fiţi frumos fără graţie halbă iar ieri la le li lor lui lângă lîngă mai mea mei mele mereu meu mi mie mine mult multă mulţi mulţumesc mâine mîine mă ne nevoie nici nicăieri nimeni nimeri nimic nişte noastre noastră noi noroc nostru nouă noştri nu opt ori oricare orice oricine oricum oricând oricât oricînd oricît oriunde patra patru patrulea pe pentru peste pic poate pot prea prima primul prin puţin puţina puţină până pînă rog sa sale sau se spate spre sub sunt suntem sunteţi sută sînt sîntem sînteţi să săi său ta tale te timp tine toate toată tot totuşi toţi trei treia treilea tu tăi tău un una unde undeva unei uneia unele uneori unii unor unora unu unui unuia unul vi voastre voastră voi vostru vouă voştri vreme vreo vreun vă zece zero zi zice îi îl îmi împotriva în înainte înaintea încotro încât încît între întrucât întrucît îţi ăla ălea ăsta ăstea ăştia şapte şase şi ştiu ţi ţie".split(" ")),e.Pipeline.registerFunction(e.ro.stopWordFilter,"stopWordFilter-ro")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.ru.min.js b/assets/javascripts/lunr/min/lunr.ru.min.js new file mode 100644 index 00000000..186cc485 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.ru.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Russian` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n():n()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ru=function(){this.pipeline.reset(),this.pipeline.add(e.ru.trimmer,e.ru.stopWordFilter,e.ru.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ru.stemmer))},e.ru.wordCharacters="Ѐ-҄҇-ԯᴫᵸⷠ-ⷿꙀ-ꚟ︮︯",e.ru.trimmer=e.trimmerSupport.generateTrimmer(e.ru.wordCharacters),e.Pipeline.registerFunction(e.ru.trimmer,"trimmer-ru"),e.ru.stemmer=function(){var n=e.stemmerSupport.Among,r=e.stemmerSupport.SnowballProgram,t=new function(){function e(){for(;!W.in_grouping(S,1072,1103);){if(W.cursor>=W.limit)return!1;W.cursor++}return!0}function t(){for(;!W.out_grouping(S,1072,1103);){if(W.cursor>=W.limit)return!1;W.cursor++}return!0}function w(){b=W.limit,_=b,e()&&(b=W.cursor,t()&&e()&&t()&&(_=W.cursor))}function i(){return _<=W.cursor}function u(e,n){var r,t;if(W.ket=W.cursor,r=W.find_among_b(e,n)){switch(W.bra=W.cursor,r){case 1:if(t=W.limit-W.cursor,!W.eq_s_b(1,"а")&&(W.cursor=W.limit-t,!W.eq_s_b(1,"я")))return!1;case 2:W.slice_del()}return!0}return!1}function o(){return u(h,9)}function s(e,n){var r;return W.ket=W.cursor,!!(r=W.find_among_b(e,n))&&(W.bra=W.cursor,1==r&&W.slice_del(),!0)}function c(){return s(g,26)}function m(){return!!c()&&(u(C,8),!0)}function f(){return s(k,2)}function l(){return u(P,46)}function a(){s(v,36)}function p(){var e;W.ket=W.cursor,(e=W.find_among_b(F,2))&&(W.bra=W.cursor,i()&&1==e&&W.slice_del())}function d(){var e;if(W.ket=W.cursor,e=W.find_among_b(q,4))switch(W.bra=W.cursor,e){case 1:if(W.slice_del(),W.ket=W.cursor,!W.eq_s_b(1,"н"))break;W.bra=W.cursor;case 2:if(!W.eq_s_b(1,"н"))break;case 3:W.slice_del()}}var _,b,h=[new n("в",-1,1),new n("ив",0,2),new n("ыв",0,2),new n("вши",-1,1),new n("ивши",3,2),new n("ывши",3,2),new n("вшись",-1,1),new n("ившись",6,2),new n("ывшись",6,2)],g=[new n("ее",-1,1),new n("ие",-1,1),new n("ое",-1,1),new n("ые",-1,1),new n("ими",-1,1),new n("ыми",-1,1),new n("ей",-1,1),new n("ий",-1,1),new n("ой",-1,1),new n("ый",-1,1),new n("ем",-1,1),new n("им",-1,1),new n("ом",-1,1),new n("ым",-1,1),new n("его",-1,1),new n("ого",-1,1),new n("ему",-1,1),new n("ому",-1,1),new n("их",-1,1),new n("ых",-1,1),new n("ею",-1,1),new n("ою",-1,1),new n("ую",-1,1),new n("юю",-1,1),new n("ая",-1,1),new n("яя",-1,1)],C=[new n("ем",-1,1),new n("нн",-1,1),new n("вш",-1,1),new n("ивш",2,2),new n("ывш",2,2),new n("щ",-1,1),new n("ющ",5,1),new n("ующ",6,2)],k=[new n("сь",-1,1),new n("ся",-1,1)],P=[new n("ла",-1,1),new n("ила",0,2),new n("ыла",0,2),new n("на",-1,1),new n("ена",3,2),new n("ете",-1,1),new n("ите",-1,2),new n("йте",-1,1),new n("ейте",7,2),new n("уйте",7,2),new n("ли",-1,1),new n("или",10,2),new n("ыли",10,2),new n("й",-1,1),new n("ей",13,2),new n("уй",13,2),new n("л",-1,1),new n("ил",16,2),new n("ыл",16,2),new n("ем",-1,1),new n("им",-1,2),new n("ым",-1,2),new n("н",-1,1),new n("ен",22,2),new n("ло",-1,1),new n("ило",24,2),new n("ыло",24,2),new n("но",-1,1),new n("ено",27,2),new n("нно",27,1),new n("ет",-1,1),new n("ует",30,2),new n("ит",-1,2),new n("ыт",-1,2),new n("ют",-1,1),new n("уют",34,2),new n("ят",-1,2),new n("ны",-1,1),new n("ены",37,2),new n("ть",-1,1),new n("ить",39,2),new n("ыть",39,2),new n("ешь",-1,1),new n("ишь",-1,2),new n("ю",-1,2),new n("ую",44,2)],v=[new n("а",-1,1),new n("ев",-1,1),new n("ов",-1,1),new n("е",-1,1),new n("ие",3,1),new n("ье",3,1),new n("и",-1,1),new n("еи",6,1),new n("ии",6,1),new n("ами",6,1),new n("ями",6,1),new n("иями",10,1),new n("й",-1,1),new n("ей",12,1),new n("ией",13,1),new n("ий",12,1),new n("ой",12,1),new n("ам",-1,1),new n("ем",-1,1),new n("ием",18,1),new n("ом",-1,1),new n("ям",-1,1),new n("иям",21,1),new n("о",-1,1),new n("у",-1,1),new n("ах",-1,1),new n("ях",-1,1),new n("иях",26,1),new n("ы",-1,1),new n("ь",-1,1),new n("ю",-1,1),new n("ию",30,1),new n("ью",30,1),new n("я",-1,1),new n("ия",33,1),new n("ья",33,1)],F=[new n("ост",-1,1),new n("ость",-1,1)],q=[new n("ейше",-1,1),new n("н",-1,2),new n("ейш",-1,1),new n("ь",-1,3)],S=[33,65,8,232],W=new r;this.setCurrent=function(e){W.setCurrent(e)},this.getCurrent=function(){return W.getCurrent()},this.stem=function(){return w(),W.cursor=W.limit,!(W.cursor=i&&(e-=i,t[e>>3]&1<<(7&e)))return this.cursor++,!0}return!1},in_grouping_b:function(t,i,s){if(this.cursor>this.limit_backward){var e=r.charCodeAt(this.cursor-1);if(e<=s&&e>=i&&(e-=i,t[e>>3]&1<<(7&e)))return this.cursor--,!0}return!1},out_grouping:function(t,i,s){if(this.cursors||e>3]&1<<(7&e)))return this.cursor++,!0}return!1},out_grouping_b:function(t,i,s){if(this.cursor>this.limit_backward){var e=r.charCodeAt(this.cursor-1);if(e>s||e>3]&1<<(7&e)))return this.cursor--,!0}return!1},eq_s:function(t,i){if(this.limit-this.cursor>1),f=0,l=o0||e==s||c)break;c=!0}}for(;;){var _=t[s];if(o>=_.s_size){if(this.cursor=n+_.s_size,!_.method)return _.result;var b=_.method();if(this.cursor=n+_.s_size,b)return _.result}if((s=_.substring_i)<0)return 0}},find_among_b:function(t,i){for(var s=0,e=i,n=this.cursor,u=this.limit_backward,o=0,h=0,c=!1;;){for(var a=s+(e-s>>1),f=0,l=o=0;m--){if(n-l==u){f=-1;break}if(f=r.charCodeAt(n-1-l)-_.s[m])break;l++}if(f<0?(e=a,h=l):(s=a,o=l),e-s<=1){if(s>0||e==s||c)break;c=!0}}for(;;){var _=t[s];if(o>=_.s_size){if(this.cursor=n-_.s_size,!_.method)return _.result;var b=_.method();if(this.cursor=n-_.s_size,b)return _.result}if((s=_.substring_i)<0)return 0}},replace_s:function(t,i,s){var e=s.length-(i-t),n=r.substring(0,t),u=r.substring(i);return r=n+s+u,this.limit+=e,this.cursor>=i?this.cursor+=e:this.cursor>t&&(this.cursor=t),e},slice_check:function(){if(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>r.length)throw"faulty slice operation"},slice_from:function(r){this.slice_check(),this.replace_s(this.bra,this.ket,r)},slice_del:function(){this.slice_from("")},insert:function(r,t,i){var s=this.replace_s(r,t,i);r<=this.bra&&(this.bra+=s),r<=this.ket&&(this.ket+=s)},slice_to:function(){return this.slice_check(),r.substring(this.bra,this.ket)},eq_v_b:function(r){return this.eq_s_b(r.length,r)}}}},r.trimmerSupport={generateTrimmer:function(r){var t=new RegExp("^[^"+r+"]+"),i=new RegExp("[^"+r+"]+$");return function(r){return"function"==typeof r.update?r.update(function(r){return r.replace(t,"").replace(i,"")}):r.replace(t,"").replace(i,"")}}}}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.sv.min.js b/assets/javascripts/lunr/min/lunr.sv.min.js new file mode 100644 index 00000000..3e5eb640 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.sv.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Swedish` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.sv=function(){this.pipeline.reset(),this.pipeline.add(e.sv.trimmer,e.sv.stopWordFilter,e.sv.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.sv.stemmer))},e.sv.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.sv.trimmer=e.trimmerSupport.generateTrimmer(e.sv.wordCharacters),e.Pipeline.registerFunction(e.sv.trimmer,"trimmer-sv"),e.sv.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,t=new function(){function e(){var e,r=w.cursor+3;if(o=w.limit,0<=r||r<=w.limit){for(a=r;;){if(e=w.cursor,w.in_grouping(l,97,246)){w.cursor=e;break}if(w.cursor=e,w.cursor>=w.limit)return;w.cursor++}for(;!w.out_grouping(l,97,246);){if(w.cursor>=w.limit)return;w.cursor++}o=w.cursor,o=o&&(w.limit_backward=o,w.cursor=w.limit,w.ket=w.cursor,e=w.find_among_b(u,37),w.limit_backward=r,e))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:w.in_grouping_b(d,98,121)&&w.slice_del()}}function i(){var e=w.limit_backward;w.cursor>=o&&(w.limit_backward=o,w.cursor=w.limit,w.find_among_b(c,7)&&(w.cursor=w.limit,w.ket=w.cursor,w.cursor>w.limit_backward&&(w.bra=--w.cursor,w.slice_del())),w.limit_backward=e)}function s(){var e,r;if(w.cursor>=o){if(r=w.limit_backward,w.limit_backward=o,w.cursor=w.limit,w.ket=w.cursor,e=w.find_among_b(m,5))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:w.slice_from("lös");break;case 3:w.slice_from("full")}w.limit_backward=r}}var a,o,u=[new r("a",-1,1),new r("arna",0,1),new r("erna",0,1),new r("heterna",2,1),new r("orna",0,1),new r("ad",-1,1),new r("e",-1,1),new r("ade",6,1),new r("ande",6,1),new r("arne",6,1),new r("are",6,1),new r("aste",6,1),new r("en",-1,1),new r("anden",12,1),new r("aren",12,1),new r("heten",12,1),new r("ern",-1,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",18,1),new r("or",-1,1),new r("s",-1,2),new r("as",21,1),new r("arnas",22,1),new r("ernas",22,1),new r("ornas",22,1),new r("es",21,1),new r("ades",26,1),new r("andes",26,1),new r("ens",21,1),new r("arens",29,1),new r("hetens",29,1),new r("erns",21,1),new r("at",-1,1),new r("andet",-1,1),new r("het",-1,1),new r("ast",-1,1)],c=[new r("dd",-1,-1),new r("gd",-1,-1),new r("nn",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1),new r("tt",-1,-1)],m=[new r("ig",-1,1),new r("lig",0,1),new r("els",-1,1),new r("fullt",-1,3),new r("löst",-1,2)],l=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,24,0,32],d=[119,127,149],w=new n;this.setCurrent=function(e){w.setCurrent(e)},this.getCurrent=function(){return w.getCurrent()},this.stem=function(){var r=w.cursor;return e(),w.limit_backward=r,w.cursor=w.limit,t(),w.cursor=w.limit,i(),w.cursor=w.limit,s(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return t.setCurrent(e),t.stem(),t.getCurrent()}):(t.setCurrent(e),t.stem(),t.getCurrent())}}(),e.Pipeline.registerFunction(e.sv.stemmer,"stemmer-sv"),e.sv.stopWordFilter=e.generateStopWordFilter("alla allt att av blev bli blir blivit de dem den denna deras dess dessa det detta dig din dina ditt du där då efter ej eller en er era ert ett från för ha hade han hans har henne hennes hon honom hur här i icke ingen inom inte jag ju kan kunde man med mellan men mig min mina mitt mot mycket ni nu när någon något några och om oss på samma sedan sig sin sina sitta själv skulle som så sådan sådana sådant till under upp ut utan vad var vara varför varit varje vars vart vem vi vid vilka vilkas vilken vilket vår våra vårt än är åt över".split(" ")),e.Pipeline.registerFunction(e.sv.stopWordFilter,"stopWordFilter-sv")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.ta.min.js b/assets/javascripts/lunr/min/lunr.ta.min.js new file mode 100644 index 00000000..a644bed2 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.ta.min.js @@ -0,0 +1 @@ +!function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ta=function(){this.pipeline.reset(),this.pipeline.add(e.ta.trimmer,e.ta.stopWordFilter,e.ta.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ta.stemmer))},e.ta.wordCharacters="஀-உஊ-ஏஐ-ஙச-ட஠-னப-யர-ஹ஺-ிீ-௉ொ-௏ௐ-௙௚-௟௠-௩௪-௯௰-௹௺-௿a-zA-Za-zA-Z0-90-9",e.ta.trimmer=e.trimmerSupport.generateTrimmer(e.ta.wordCharacters),e.Pipeline.registerFunction(e.ta.trimmer,"trimmer-ta"),e.ta.stopWordFilter=e.generateStopWordFilter("அங்கு அங்கே அது அதை அந்த அவர் அவர்கள் அவள் அவன் அவை ஆக ஆகவே ஆகையால் ஆதலால் ஆதலினால் ஆனாலும் ஆனால் இங்கு இங்கே இது இதை இந்த இப்படி இவர் இவர்கள் இவள் இவன் இவை இவ்வளவு உனக்கு உனது உன் உன்னால் எங்கு எங்கே எது எதை எந்த எப்படி எவர் எவர்கள் எவள் எவன் எவை எவ்வளவு எனக்கு எனது எனவே என் என்ன என்னால் ஏது ஏன் தனது தன்னால் தானே தான் நாங்கள் நாம் நான் நீ நீங்கள்".split(" ")),e.ta.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var t=e.wordcut;t.init(),e.ta.tokenizer=function(r){if(!arguments.length||null==r||void 0==r)return[];if(Array.isArray(r))return r.map(function(t){return isLunr2?new e.Token(t.toLowerCase()):t.toLowerCase()});var i=r.toString().toLowerCase().replace(/^\s+/,"");return t.cut(i).split("|")},e.Pipeline.registerFunction(e.ta.stemmer,"stemmer-ta"),e.Pipeline.registerFunction(e.ta.stopWordFilter,"stopWordFilter-ta")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.te.min.js b/assets/javascripts/lunr/min/lunr.te.min.js new file mode 100644 index 00000000..9fa7a93b --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.te.min.js @@ -0,0 +1 @@ +!function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.te=function(){this.pipeline.reset(),this.pipeline.add(e.te.trimmer,e.te.stopWordFilter,e.te.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.te.stemmer))},e.te.wordCharacters="ఀ-ఄఅ-ఔక-హా-ౌౕ-ౖౘ-ౚౠ-ౡౢ-ౣ౦-౯౸-౿఼ఽ్ౝ౷౤౥",e.te.trimmer=e.trimmerSupport.generateTrimmer(e.te.wordCharacters),e.Pipeline.registerFunction(e.te.trimmer,"trimmer-te"),e.te.stopWordFilter=e.generateStopWordFilter("అందరూ అందుబాటులో అడగండి అడగడం అడ్డంగా అనుగుణంగా అనుమతించు అనుమతిస్తుంది అయితే ఇప్పటికే ఉన్నారు ఎక్కడైనా ఎప్పుడు ఎవరైనా ఎవరో ఏ ఏదైనా ఏమైనప్పటికి ఒక ఒకరు కనిపిస్తాయి కాదు కూడా గా గురించి చుట్టూ చేయగలిగింది తగిన తర్వాత దాదాపు దూరంగా నిజంగా పై ప్రకారం ప్రక్కన మధ్య మరియు మరొక మళ్ళీ మాత్రమే మెచ్చుకో వద్ద వెంట వేరుగా వ్యతిరేకంగా సంబంధం".split(" ")),e.te.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var t=e.wordcut;t.init(),e.te.tokenizer=function(r){if(!arguments.length||null==r||void 0==r)return[];if(Array.isArray(r))return r.map(function(t){return isLunr2?new e.Token(t.toLowerCase()):t.toLowerCase()});var i=r.toString().toLowerCase().replace(/^\s+/,"");return t.cut(i).split("|")},e.Pipeline.registerFunction(e.te.stemmer,"stemmer-te"),e.Pipeline.registerFunction(e.te.stopWordFilter,"stopWordFilter-te")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.th.min.js b/assets/javascripts/lunr/min/lunr.th.min.js new file mode 100644 index 00000000..dee3aac6 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.th.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r="2"==e.version[0];e.th=function(){this.pipeline.reset(),this.pipeline.add(e.th.trimmer),r?this.tokenizer=e.th.tokenizer:(e.tokenizer&&(e.tokenizer=e.th.tokenizer),this.tokenizerFn&&(this.tokenizerFn=e.th.tokenizer))},e.th.wordCharacters="[฀-๿]",e.th.trimmer=e.trimmerSupport.generateTrimmer(e.th.wordCharacters),e.Pipeline.registerFunction(e.th.trimmer,"trimmer-th");var t=e.wordcut;t.init(),e.th.tokenizer=function(i){if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(t){return r?new e.Token(t):t});var n=i.toString().replace(/^\s+/,"");return t.cut(n).split("|")}}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.tr.min.js b/assets/javascripts/lunr/min/lunr.tr.min.js new file mode 100644 index 00000000..563f6ec1 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.tr.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Turkish` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(r,i){"function"==typeof define&&define.amd?define(i):"object"==typeof exports?module.exports=i():i()(r.lunr)}(this,function(){return function(r){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");r.tr=function(){this.pipeline.reset(),this.pipeline.add(r.tr.trimmer,r.tr.stopWordFilter,r.tr.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(r.tr.stemmer))},r.tr.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",r.tr.trimmer=r.trimmerSupport.generateTrimmer(r.tr.wordCharacters),r.Pipeline.registerFunction(r.tr.trimmer,"trimmer-tr"),r.tr.stemmer=function(){var i=r.stemmerSupport.Among,e=r.stemmerSupport.SnowballProgram,n=new function(){function r(r,i,e){for(;;){var n=Dr.limit-Dr.cursor;if(Dr.in_grouping_b(r,i,e)){Dr.cursor=Dr.limit-n;break}if(Dr.cursor=Dr.limit-n,Dr.cursor<=Dr.limit_backward)return!1;Dr.cursor--}return!0}function n(){var i,e;i=Dr.limit-Dr.cursor,r(Wr,97,305);for(var n=0;nDr.limit_backward&&(Dr.cursor--,e=Dr.limit-Dr.cursor,i()))?(Dr.cursor=Dr.limit-e,!0):(Dr.cursor=Dr.limit-n,r()?(Dr.cursor=Dr.limit-n,!1):(Dr.cursor=Dr.limit-n,!(Dr.cursor<=Dr.limit_backward)&&(Dr.cursor--,!!i()&&(Dr.cursor=Dr.limit-n,!0))))}function u(r){return t(r,function(){return Dr.in_grouping_b(Wr,97,305)})}function o(){return u(function(){return Dr.eq_s_b(1,"n")})}function s(){return u(function(){return Dr.eq_s_b(1,"s")})}function c(){return u(function(){return Dr.eq_s_b(1,"y")})}function l(){return t(function(){return Dr.in_grouping_b(Lr,105,305)},function(){return Dr.out_grouping_b(Wr,97,305)})}function a(){return Dr.find_among_b(ur,10)&&l()}function m(){return n()&&Dr.in_grouping_b(Lr,105,305)&&s()}function d(){return Dr.find_among_b(or,2)}function f(){return n()&&Dr.in_grouping_b(Lr,105,305)&&c()}function b(){return n()&&Dr.find_among_b(sr,4)}function w(){return n()&&Dr.find_among_b(cr,4)&&o()}function _(){return n()&&Dr.find_among_b(lr,2)&&c()}function k(){return n()&&Dr.find_among_b(ar,2)}function p(){return n()&&Dr.find_among_b(mr,4)}function g(){return n()&&Dr.find_among_b(dr,2)}function y(){return n()&&Dr.find_among_b(fr,4)}function z(){return n()&&Dr.find_among_b(br,2)}function v(){return n()&&Dr.find_among_b(wr,2)&&c()}function h(){return Dr.eq_s_b(2,"ki")}function q(){return n()&&Dr.find_among_b(_r,2)&&o()}function C(){return n()&&Dr.find_among_b(kr,4)&&c()}function P(){return n()&&Dr.find_among_b(pr,4)}function F(){return n()&&Dr.find_among_b(gr,4)&&c()}function S(){return Dr.find_among_b(yr,4)}function W(){return n()&&Dr.find_among_b(zr,2)}function L(){return n()&&Dr.find_among_b(vr,4)}function x(){return n()&&Dr.find_among_b(hr,8)}function A(){return Dr.find_among_b(qr,2)}function E(){return n()&&Dr.find_among_b(Cr,32)&&c()}function j(){return Dr.find_among_b(Pr,8)&&c()}function T(){return n()&&Dr.find_among_b(Fr,4)&&c()}function Z(){return Dr.eq_s_b(3,"ken")&&c()}function B(){var r=Dr.limit-Dr.cursor;return!(T()||(Dr.cursor=Dr.limit-r,E()||(Dr.cursor=Dr.limit-r,j()||(Dr.cursor=Dr.limit-r,Z()))))}function D(){if(A()){var r=Dr.limit-Dr.cursor;if(S()||(Dr.cursor=Dr.limit-r,W()||(Dr.cursor=Dr.limit-r,C()||(Dr.cursor=Dr.limit-r,P()||(Dr.cursor=Dr.limit-r,F()||(Dr.cursor=Dr.limit-r))))),T())return!1}return!0}function G(){if(W()){Dr.bra=Dr.cursor,Dr.slice_del();var r=Dr.limit-Dr.cursor;return Dr.ket=Dr.cursor,x()||(Dr.cursor=Dr.limit-r,E()||(Dr.cursor=Dr.limit-r,j()||(Dr.cursor=Dr.limit-r,T()||(Dr.cursor=Dr.limit-r)))),nr=!1,!1}return!0}function H(){if(!L())return!0;var r=Dr.limit-Dr.cursor;return!E()&&(Dr.cursor=Dr.limit-r,!j())}function I(){var r,i=Dr.limit-Dr.cursor;return!(S()||(Dr.cursor=Dr.limit-i,F()||(Dr.cursor=Dr.limit-i,P()||(Dr.cursor=Dr.limit-i,C()))))||(Dr.bra=Dr.cursor,Dr.slice_del(),r=Dr.limit-Dr.cursor,Dr.ket=Dr.cursor,T()||(Dr.cursor=Dr.limit-r),!1)}function J(){var r,i=Dr.limit-Dr.cursor;if(Dr.ket=Dr.cursor,nr=!0,B()&&(Dr.cursor=Dr.limit-i,D()&&(Dr.cursor=Dr.limit-i,G()&&(Dr.cursor=Dr.limit-i,H()&&(Dr.cursor=Dr.limit-i,I()))))){if(Dr.cursor=Dr.limit-i,!x())return;Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,r=Dr.limit-Dr.cursor,S()||(Dr.cursor=Dr.limit-r,W()||(Dr.cursor=Dr.limit-r,C()||(Dr.cursor=Dr.limit-r,P()||(Dr.cursor=Dr.limit-r,F()||(Dr.cursor=Dr.limit-r))))),T()||(Dr.cursor=Dr.limit-r)}Dr.bra=Dr.cursor,Dr.slice_del()}function K(){var r,i,e,n;if(Dr.ket=Dr.cursor,h()){if(r=Dr.limit-Dr.cursor,p())return Dr.bra=Dr.cursor,Dr.slice_del(),i=Dr.limit-Dr.cursor,Dr.ket=Dr.cursor,W()?(Dr.bra=Dr.cursor,Dr.slice_del(),K()):(Dr.cursor=Dr.limit-i,a()&&(Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K()))),!0;if(Dr.cursor=Dr.limit-r,w()){if(Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,e=Dr.limit-Dr.cursor,d())Dr.bra=Dr.cursor,Dr.slice_del();else{if(Dr.cursor=Dr.limit-e,Dr.ket=Dr.cursor,!a()&&(Dr.cursor=Dr.limit-e,!m()&&(Dr.cursor=Dr.limit-e,!K())))return!0;Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K())}return!0}if(Dr.cursor=Dr.limit-r,g()){if(n=Dr.limit-Dr.cursor,d())Dr.bra=Dr.cursor,Dr.slice_del();else if(Dr.cursor=Dr.limit-n,m())Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K());else if(Dr.cursor=Dr.limit-n,!K())return!1;return!0}}return!1}function M(r){if(Dr.ket=Dr.cursor,!g()&&(Dr.cursor=Dr.limit-r,!k()))return!1;var i=Dr.limit-Dr.cursor;if(d())Dr.bra=Dr.cursor,Dr.slice_del();else if(Dr.cursor=Dr.limit-i,m())Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K());else if(Dr.cursor=Dr.limit-i,!K())return!1;return!0}function N(r){if(Dr.ket=Dr.cursor,!z()&&(Dr.cursor=Dr.limit-r,!b()))return!1;var i=Dr.limit-Dr.cursor;return!(!m()&&(Dr.cursor=Dr.limit-i,!d()))&&(Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K()),!0)}function O(){var r,i=Dr.limit-Dr.cursor;return Dr.ket=Dr.cursor,!(!w()&&(Dr.cursor=Dr.limit-i,!v()))&&(Dr.bra=Dr.cursor,Dr.slice_del(),r=Dr.limit-Dr.cursor,Dr.ket=Dr.cursor,!(!W()||(Dr.bra=Dr.cursor,Dr.slice_del(),!K()))||(Dr.cursor=Dr.limit-r,Dr.ket=Dr.cursor,!(a()||(Dr.cursor=Dr.limit-r,m()||(Dr.cursor=Dr.limit-r,K())))||(Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K()),!0)))}function Q(){var r,i,e=Dr.limit-Dr.cursor;if(Dr.ket=Dr.cursor,!p()&&(Dr.cursor=Dr.limit-e,!f()&&(Dr.cursor=Dr.limit-e,!_())))return!1;if(Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,r=Dr.limit-Dr.cursor,a())Dr.bra=Dr.cursor,Dr.slice_del(),i=Dr.limit-Dr.cursor,Dr.ket=Dr.cursor,W()||(Dr.cursor=Dr.limit-i);else if(Dr.cursor=Dr.limit-r,!W())return!0;return Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,K(),!0}function R(){var r,i,e=Dr.limit-Dr.cursor;if(Dr.ket=Dr.cursor,W())return Dr.bra=Dr.cursor,Dr.slice_del(),void K();if(Dr.cursor=Dr.limit-e,Dr.ket=Dr.cursor,q())if(Dr.bra=Dr.cursor,Dr.slice_del(),r=Dr.limit-Dr.cursor,Dr.ket=Dr.cursor,d())Dr.bra=Dr.cursor,Dr.slice_del();else{if(Dr.cursor=Dr.limit-r,Dr.ket=Dr.cursor,!a()&&(Dr.cursor=Dr.limit-r,!m())){if(Dr.cursor=Dr.limit-r,Dr.ket=Dr.cursor,!W())return;if(Dr.bra=Dr.cursor,Dr.slice_del(),!K())return}Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K())}else if(Dr.cursor=Dr.limit-e,!M(e)&&(Dr.cursor=Dr.limit-e,!N(e))){if(Dr.cursor=Dr.limit-e,Dr.ket=Dr.cursor,y())return Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,i=Dr.limit-Dr.cursor,void(a()?(Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K())):(Dr.cursor=Dr.limit-i,W()?(Dr.bra=Dr.cursor,Dr.slice_del(),K()):(Dr.cursor=Dr.limit-i,K())));if(Dr.cursor=Dr.limit-e,!O()){if(Dr.cursor=Dr.limit-e,d())return Dr.bra=Dr.cursor,void Dr.slice_del();Dr.cursor=Dr.limit-e,K()||(Dr.cursor=Dr.limit-e,Q()||(Dr.cursor=Dr.limit-e,Dr.ket=Dr.cursor,(a()||(Dr.cursor=Dr.limit-e,m()))&&(Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K()))))}}}function U(){var r;if(Dr.ket=Dr.cursor,r=Dr.find_among_b(Sr,4))switch(Dr.bra=Dr.cursor,r){case 1:Dr.slice_from("p");break;case 2:Dr.slice_from("ç");break;case 3:Dr.slice_from("t");break;case 4:Dr.slice_from("k")}}function V(){for(;;){var r=Dr.limit-Dr.cursor;if(Dr.in_grouping_b(Wr,97,305)){Dr.cursor=Dr.limit-r;break}if(Dr.cursor=Dr.limit-r,Dr.cursor<=Dr.limit_backward)return!1;Dr.cursor--}return!0}function X(r,i,e){if(Dr.cursor=Dr.limit-r,V()){var n=Dr.limit-Dr.cursor;if(!Dr.eq_s_b(1,i)&&(Dr.cursor=Dr.limit-n,!Dr.eq_s_b(1,e)))return!0;Dr.cursor=Dr.limit-r;var t=Dr.cursor;return Dr.insert(Dr.cursor,Dr.cursor,e),Dr.cursor=t,!1}return!0}function Y(){var r=Dr.limit-Dr.cursor;(Dr.eq_s_b(1,"d")||(Dr.cursor=Dr.limit-r,Dr.eq_s_b(1,"g")))&&X(r,"a","ı")&&X(r,"e","i")&&X(r,"o","u")&&X(r,"ö","ü")}function $(){for(var r,i=Dr.cursor,e=2;;){for(r=Dr.cursor;!Dr.in_grouping(Wr,97,305);){if(Dr.cursor>=Dr.limit)return Dr.cursor=r,!(e>0)&&(Dr.cursor=i,!0);Dr.cursor++}e--}}function rr(r,i,e){for(;!Dr.eq_s(i,e);){if(Dr.cursor>=Dr.limit)return!0;Dr.cursor++}return(tr=i)!=Dr.limit||(Dr.cursor=r,!1)}function ir(){var r=Dr.cursor;return!rr(r,2,"ad")||(Dr.cursor=r,!rr(r,5,"soyad"))}function er(){var r=Dr.cursor;return!ir()&&(Dr.limit_backward=r,Dr.cursor=Dr.limit,Y(),Dr.cursor=Dr.limit,U(),!0)}var nr,tr,ur=[new i("m",-1,-1),new i("n",-1,-1),new i("miz",-1,-1),new i("niz",-1,-1),new i("muz",-1,-1),new i("nuz",-1,-1),new i("müz",-1,-1),new i("nüz",-1,-1),new i("mız",-1,-1),new i("nız",-1,-1)],or=[new i("leri",-1,-1),new i("ları",-1,-1)],sr=[new i("ni",-1,-1),new i("nu",-1,-1),new i("nü",-1,-1),new i("nı",-1,-1)],cr=[new i("in",-1,-1),new i("un",-1,-1),new i("ün",-1,-1),new i("ın",-1,-1)],lr=[new i("a",-1,-1),new i("e",-1,-1)],ar=[new i("na",-1,-1),new i("ne",-1,-1)],mr=[new i("da",-1,-1),new i("ta",-1,-1),new i("de",-1,-1),new i("te",-1,-1)],dr=[new i("nda",-1,-1),new i("nde",-1,-1)],fr=[new i("dan",-1,-1),new i("tan",-1,-1),new i("den",-1,-1),new i("ten",-1,-1)],br=[new i("ndan",-1,-1),new i("nden",-1,-1)],wr=[new i("la",-1,-1),new i("le",-1,-1)],_r=[new i("ca",-1,-1),new i("ce",-1,-1)],kr=[new i("im",-1,-1),new i("um",-1,-1),new i("üm",-1,-1),new i("ım",-1,-1)],pr=[new i("sin",-1,-1),new i("sun",-1,-1),new i("sün",-1,-1),new i("sın",-1,-1)],gr=[new i("iz",-1,-1),new i("uz",-1,-1),new i("üz",-1,-1),new i("ız",-1,-1)],yr=[new i("siniz",-1,-1),new i("sunuz",-1,-1),new i("sünüz",-1,-1),new i("sınız",-1,-1)],zr=[new i("lar",-1,-1),new i("ler",-1,-1)],vr=[new i("niz",-1,-1),new i("nuz",-1,-1),new i("nüz",-1,-1),new i("nız",-1,-1)],hr=[new i("dir",-1,-1),new i("tir",-1,-1),new i("dur",-1,-1),new i("tur",-1,-1),new i("dür",-1,-1),new i("tür",-1,-1),new i("dır",-1,-1),new i("tır",-1,-1)],qr=[new i("casına",-1,-1),new i("cesine",-1,-1)],Cr=[new i("di",-1,-1),new i("ti",-1,-1),new i("dik",-1,-1),new i("tik",-1,-1),new i("duk",-1,-1),new i("tuk",-1,-1),new i("dük",-1,-1),new i("tük",-1,-1),new i("dık",-1,-1),new i("tık",-1,-1),new i("dim",-1,-1),new i("tim",-1,-1),new i("dum",-1,-1),new i("tum",-1,-1),new i("düm",-1,-1),new i("tüm",-1,-1),new i("dım",-1,-1),new i("tım",-1,-1),new i("din",-1,-1),new i("tin",-1,-1),new i("dun",-1,-1),new i("tun",-1,-1),new i("dün",-1,-1),new i("tün",-1,-1),new i("dın",-1,-1),new i("tın",-1,-1),new i("du",-1,-1),new i("tu",-1,-1),new i("dü",-1,-1),new i("tü",-1,-1),new i("dı",-1,-1),new i("tı",-1,-1)],Pr=[new i("sa",-1,-1),new i("se",-1,-1),new i("sak",-1,-1),new i("sek",-1,-1),new i("sam",-1,-1),new i("sem",-1,-1),new i("san",-1,-1),new i("sen",-1,-1)],Fr=[new i("miş",-1,-1),new i("muş",-1,-1),new i("müş",-1,-1),new i("mış",-1,-1)],Sr=[new i("b",-1,1),new i("c",-1,2),new i("d",-1,3),new i("ğ",-1,4)],Wr=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,8,0,0,0,0,0,0,1],Lr=[1,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,1],xr=[1,64,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],Ar=[17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,130],Er=[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],jr=[17],Tr=[65],Zr=[65],Br=[["a",xr,97,305],["e",Ar,101,252],["ı",Er,97,305],["i",jr,101,105],["o",Tr,111,117],["ö",Zr,246,252],["u",Tr,111,117]],Dr=new e;this.setCurrent=function(r){Dr.setCurrent(r)},this.getCurrent=function(){return Dr.getCurrent()},this.stem=function(){return!!($()&&(Dr.limit_backward=Dr.cursor,Dr.cursor=Dr.limit,J(),Dr.cursor=Dr.limit,nr&&(R(),Dr.cursor=Dr.limit_backward,er())))}};return function(r){return"function"==typeof r.update?r.update(function(r){return n.setCurrent(r),n.stem(),n.getCurrent()}):(n.setCurrent(r),n.stem(),n.getCurrent())}}(),r.Pipeline.registerFunction(r.tr.stemmer,"stemmer-tr"),r.tr.stopWordFilter=r.generateStopWordFilter("acaba altmış altı ama ancak arada aslında ayrıca bana bazı belki ben benden beni benim beri beş bile bin bir biri birkaç birkez birçok birşey birşeyi biz bizden bize bizi bizim bu buna bunda bundan bunlar bunları bunların bunu bunun burada böyle böylece da daha dahi de defa değil diye diğer doksan dokuz dolayı dolayısıyla dört edecek eden ederek edilecek ediliyor edilmesi ediyor elli en etmesi etti ettiği ettiğini eğer gibi göre halen hangi hatta hem henüz hep hepsi her herhangi herkesin hiç hiçbir iki ile ilgili ise itibaren itibariyle için işte kadar karşın katrilyon kendi kendilerine kendini kendisi kendisine kendisini kez ki kim kimden kime kimi kimse kırk milyar milyon mu mü mı nasıl ne neden nedenle nerde nerede nereye niye niçin o olan olarak oldu olduklarını olduğu olduğunu olmadı olmadığı olmak olması olmayan olmaz olsa olsun olup olur olursa oluyor on ona ondan onlar onlardan onları onların onu onun otuz oysa pek rağmen sadece sanki sekiz seksen sen senden seni senin siz sizden sizi sizin tarafından trilyon tüm var vardı ve veya ya yani yapacak yapmak yaptı yaptıkları yaptığı yaptığını yapılan yapılması yapıyor yedi yerine yetmiş yine yirmi yoksa yüz zaten çok çünkü öyle üzere üç şey şeyden şeyi şeyler şu şuna şunda şundan şunları şunu şöyle".split(" ")),r.Pipeline.registerFunction(r.tr.stopWordFilter,"stopWordFilter-tr")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.vi.min.js b/assets/javascripts/lunr/min/lunr.vi.min.js new file mode 100644 index 00000000..22aed28c --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.vi.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.vi=function(){this.pipeline.reset(),this.pipeline.add(e.vi.stopWordFilter,e.vi.trimmer)},e.vi.wordCharacters="[A-Za-ẓ̀͐́͑̉̃̓ÂâÊêÔôĂ-ăĐ-đƠ-ơƯ-ư]",e.vi.trimmer=e.trimmerSupport.generateTrimmer(e.vi.wordCharacters),e.Pipeline.registerFunction(e.vi.trimmer,"trimmer-vi"),e.vi.stopWordFilter=e.generateStopWordFilter("là cái nhưng mà".split(" "))}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.zh.min.js b/assets/javascripts/lunr/min/lunr.zh.min.js new file mode 100644 index 00000000..fda66e9c --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.zh.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r(require("@node-rs/jieba")):r()(e.lunr)}(this,function(e){return function(r,t){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var i="2"==r.version[0];r.zh=function(){this.pipeline.reset(),this.pipeline.add(r.zh.trimmer,r.zh.stopWordFilter,r.zh.stemmer),i?this.tokenizer=r.zh.tokenizer:(r.tokenizer&&(r.tokenizer=r.zh.tokenizer),this.tokenizerFn&&(this.tokenizerFn=r.zh.tokenizer))},r.zh.tokenizer=function(n){if(!arguments.length||null==n||void 0==n)return[];if(Array.isArray(n))return n.map(function(e){return i?new r.Token(e.toLowerCase()):e.toLowerCase()});t&&e.load(t);var o=n.toString().trim().toLowerCase(),s=[];e.cut(o,!0).forEach(function(e){s=s.concat(e.split(" "))}),s=s.filter(function(e){return!!e});var u=0;return s.map(function(e,t){if(i){var n=o.indexOf(e,u),s={};return s.position=[n,e.length],s.index=t,u=n,new r.Token(e,s)}return e})},r.zh.wordCharacters="\\w一-龥",r.zh.trimmer=r.trimmerSupport.generateTrimmer(r.zh.wordCharacters),r.Pipeline.registerFunction(r.zh.trimmer,"trimmer-zh"),r.zh.stemmer=function(){return function(e){return e}}(),r.Pipeline.registerFunction(r.zh.stemmer,"stemmer-zh"),r.zh.stopWordFilter=r.generateStopWordFilter("的 一 不 在 人 有 是 为 為 以 于 於 上 他 而 后 後 之 来 來 及 了 因 下 可 到 由 这 這 与 與 也 此 但 并 並 个 個 其 已 无 無 小 我 们 們 起 最 再 今 去 好 只 又 或 很 亦 某 把 那 你 乃 它 吧 被 比 别 趁 当 當 从 從 得 打 凡 儿 兒 尔 爾 该 該 各 给 給 跟 和 何 还 還 即 几 幾 既 看 据 據 距 靠 啦 另 么 麽 每 嘛 拿 哪 您 凭 憑 且 却 卻 让 讓 仍 啥 如 若 使 谁 誰 虽 雖 随 隨 同 所 她 哇 嗡 往 些 向 沿 哟 喲 用 咱 则 則 怎 曾 至 致 着 著 诸 諸 自".split(" ")),r.Pipeline.registerFunction(r.zh.stopWordFilter,"stopWordFilter-zh")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/tinyseg.js b/assets/javascripts/lunr/tinyseg.js new file mode 100644 index 00000000..167fa6dd --- /dev/null +++ b/assets/javascripts/lunr/tinyseg.js @@ -0,0 +1,206 @@ +/** + * export the module via AMD, CommonJS or as a browser global + * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js + */ +;(function (root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory) + } else if (typeof exports === 'object') { + /** + * Node. Does not work with strict CommonJS, but + * only CommonJS-like environments that support module.exports, + * like Node. + */ + module.exports = factory() + } else { + // Browser globals (root is window) + factory()(root.lunr); + } +}(this, function () { + /** + * Just return a value to define the module export. + * This example returns an object, but the module + * can return a function as the exported value. + */ + + return function(lunr) { + // TinySegmenter 0.1 -- Super compact Japanese tokenizer in Javascript + // (c) 2008 Taku Kudo + // TinySegmenter is freely distributable under the terms of a new BSD licence. + // For details, see http://chasen.org/~taku/software/TinySegmenter/LICENCE.txt + + function TinySegmenter() { + var patterns = { + "[一二三四五六七八九十百千万億兆]":"M", + "[一-龠々〆ヵヶ]":"H", + "[ぁ-ん]":"I", + "[ァ-ヴーア-ン゙ー]":"K", + "[a-zA-Za-zA-Z]":"A", + "[0-90-9]":"N" + } + this.chartype_ = []; + for (var i in patterns) { + var regexp = new RegExp(i); + this.chartype_.push([regexp, patterns[i]]); + } + + this.BIAS__ = -332 + this.BC1__ = {"HH":6,"II":2461,"KH":406,"OH":-1378}; + this.BC2__ = {"AA":-3267,"AI":2744,"AN":-878,"HH":-4070,"HM":-1711,"HN":4012,"HO":3761,"IA":1327,"IH":-1184,"II":-1332,"IK":1721,"IO":5492,"KI":3831,"KK":-8741,"MH":-3132,"MK":3334,"OO":-2920}; + this.BC3__ = {"HH":996,"HI":626,"HK":-721,"HN":-1307,"HO":-836,"IH":-301,"KK":2762,"MK":1079,"MM":4034,"OA":-1652,"OH":266}; + this.BP1__ = {"BB":295,"OB":304,"OO":-125,"UB":352}; + this.BP2__ = {"BO":60,"OO":-1762}; + this.BQ1__ = {"BHH":1150,"BHM":1521,"BII":-1158,"BIM":886,"BMH":1208,"BNH":449,"BOH":-91,"BOO":-2597,"OHI":451,"OIH":-296,"OKA":1851,"OKH":-1020,"OKK":904,"OOO":2965}; + this.BQ2__ = {"BHH":118,"BHI":-1159,"BHM":466,"BIH":-919,"BKK":-1720,"BKO":864,"OHH":-1139,"OHM":-181,"OIH":153,"UHI":-1146}; + this.BQ3__ = {"BHH":-792,"BHI":2664,"BII":-299,"BKI":419,"BMH":937,"BMM":8335,"BNN":998,"BOH":775,"OHH":2174,"OHM":439,"OII":280,"OKH":1798,"OKI":-793,"OKO":-2242,"OMH":-2402,"OOO":11699}; + this.BQ4__ = {"BHH":-3895,"BIH":3761,"BII":-4654,"BIK":1348,"BKK":-1806,"BMI":-3385,"BOO":-12396,"OAH":926,"OHH":266,"OHK":-2036,"ONN":-973}; + this.BW1__ = {",と":660,",同":727,"B1あ":1404,"B1同":542,"、と":660,"、同":727,"」と":1682,"あっ":1505,"いう":1743,"いっ":-2055,"いる":672,"うし":-4817,"うん":665,"から":3472,"がら":600,"こう":-790,"こと":2083,"こん":-1262,"さら":-4143,"さん":4573,"した":2641,"して":1104,"すで":-3399,"そこ":1977,"それ":-871,"たち":1122,"ため":601,"った":3463,"つい":-802,"てい":805,"てき":1249,"でき":1127,"です":3445,"では":844,"とい":-4915,"とみ":1922,"どこ":3887,"ない":5713,"なっ":3015,"など":7379,"なん":-1113,"にし":2468,"には":1498,"にも":1671,"に対":-912,"の一":-501,"の中":741,"ませ":2448,"まで":1711,"まま":2600,"まる":-2155,"やむ":-1947,"よっ":-2565,"れた":2369,"れで":-913,"をし":1860,"を見":731,"亡く":-1886,"京都":2558,"取り":-2784,"大き":-2604,"大阪":1497,"平方":-2314,"引き":-1336,"日本":-195,"本当":-2423,"毎日":-2113,"目指":-724,"B1あ":1404,"B1同":542,"」と":1682}; + this.BW2__ = {"..":-11822,"11":-669,"――":-5730,"−−":-13175,"いう":-1609,"うか":2490,"かし":-1350,"かも":-602,"から":-7194,"かれ":4612,"がい":853,"がら":-3198,"きた":1941,"くな":-1597,"こと":-8392,"この":-4193,"させ":4533,"され":13168,"さん":-3977,"しい":-1819,"しか":-545,"した":5078,"して":972,"しな":939,"その":-3744,"たい":-1253,"たた":-662,"ただ":-3857,"たち":-786,"たと":1224,"たは":-939,"った":4589,"って":1647,"っと":-2094,"てい":6144,"てき":3640,"てく":2551,"ては":-3110,"ても":-3065,"でい":2666,"でき":-1528,"でし":-3828,"です":-4761,"でも":-4203,"とい":1890,"とこ":-1746,"とと":-2279,"との":720,"とみ":5168,"とも":-3941,"ない":-2488,"なが":-1313,"など":-6509,"なの":2614,"なん":3099,"にお":-1615,"にし":2748,"にな":2454,"によ":-7236,"に対":-14943,"に従":-4688,"に関":-11388,"のか":2093,"ので":-7059,"のに":-6041,"のの":-6125,"はい":1073,"はが":-1033,"はず":-2532,"ばれ":1813,"まし":-1316,"まで":-6621,"まれ":5409,"めて":-3153,"もい":2230,"もの":-10713,"らか":-944,"らし":-1611,"らに":-1897,"りし":651,"りま":1620,"れた":4270,"れて":849,"れば":4114,"ろう":6067,"われ":7901,"を通":-11877,"んだ":728,"んな":-4115,"一人":602,"一方":-1375,"一日":970,"一部":-1051,"上が":-4479,"会社":-1116,"出て":2163,"分の":-7758,"同党":970,"同日":-913,"大阪":-2471,"委員":-1250,"少な":-1050,"年度":-8669,"年間":-1626,"府県":-2363,"手権":-1982,"新聞":-4066,"日新":-722,"日本":-7068,"日米":3372,"曜日":-601,"朝鮮":-2355,"本人":-2697,"東京":-1543,"然と":-1384,"社会":-1276,"立て":-990,"第に":-1612,"米国":-4268,"11":-669}; + this.BW3__ = {"あた":-2194,"あり":719,"ある":3846,"い.":-1185,"い。":-1185,"いい":5308,"いえ":2079,"いく":3029,"いた":2056,"いっ":1883,"いる":5600,"いわ":1527,"うち":1117,"うと":4798,"えと":1454,"か.":2857,"か。":2857,"かけ":-743,"かっ":-4098,"かに":-669,"から":6520,"かり":-2670,"が,":1816,"が、":1816,"がき":-4855,"がけ":-1127,"がっ":-913,"がら":-4977,"がり":-2064,"きた":1645,"けど":1374,"こと":7397,"この":1542,"ころ":-2757,"さい":-714,"さを":976,"し,":1557,"し、":1557,"しい":-3714,"した":3562,"して":1449,"しな":2608,"しま":1200,"す.":-1310,"す。":-1310,"する":6521,"ず,":3426,"ず、":3426,"ずに":841,"そう":428,"た.":8875,"た。":8875,"たい":-594,"たの":812,"たり":-1183,"たる":-853,"だ.":4098,"だ。":4098,"だっ":1004,"った":-4748,"って":300,"てい":6240,"てお":855,"ても":302,"です":1437,"でに":-1482,"では":2295,"とう":-1387,"とし":2266,"との":541,"とも":-3543,"どう":4664,"ない":1796,"なく":-903,"など":2135,"に,":-1021,"に、":-1021,"にし":1771,"にな":1906,"には":2644,"の,":-724,"の、":-724,"の子":-1000,"は,":1337,"は、":1337,"べき":2181,"まし":1113,"ます":6943,"まっ":-1549,"まで":6154,"まれ":-793,"らし":1479,"られ":6820,"るる":3818,"れ,":854,"れ、":854,"れた":1850,"れて":1375,"れば":-3246,"れる":1091,"われ":-605,"んだ":606,"んで":798,"カ月":990,"会議":860,"入り":1232,"大会":2217,"始め":1681,"市":965,"新聞":-5055,"日,":974,"日、":974,"社会":2024,"カ月":990}; + this.TC1__ = {"AAA":1093,"HHH":1029,"HHM":580,"HII":998,"HOH":-390,"HOM":-331,"IHI":1169,"IOH":-142,"IOI":-1015,"IOM":467,"MMH":187,"OOI":-1832}; + this.TC2__ = {"HHO":2088,"HII":-1023,"HMM":-1154,"IHI":-1965,"KKH":703,"OII":-2649}; + this.TC3__ = {"AAA":-294,"HHH":346,"HHI":-341,"HII":-1088,"HIK":731,"HOH":-1486,"IHH":128,"IHI":-3041,"IHO":-1935,"IIH":-825,"IIM":-1035,"IOI":-542,"KHH":-1216,"KKA":491,"KKH":-1217,"KOK":-1009,"MHH":-2694,"MHM":-457,"MHO":123,"MMH":-471,"NNH":-1689,"NNO":662,"OHO":-3393}; + this.TC4__ = {"HHH":-203,"HHI":1344,"HHK":365,"HHM":-122,"HHN":182,"HHO":669,"HIH":804,"HII":679,"HOH":446,"IHH":695,"IHO":-2324,"IIH":321,"III":1497,"IIO":656,"IOO":54,"KAK":4845,"KKA":3386,"KKK":3065,"MHH":-405,"MHI":201,"MMH":-241,"MMM":661,"MOM":841}; + this.TQ1__ = {"BHHH":-227,"BHHI":316,"BHIH":-132,"BIHH":60,"BIII":1595,"BNHH":-744,"BOHH":225,"BOOO":-908,"OAKK":482,"OHHH":281,"OHIH":249,"OIHI":200,"OIIH":-68}; + this.TQ2__ = {"BIHH":-1401,"BIII":-1033,"BKAK":-543,"BOOO":-5591}; + this.TQ3__ = {"BHHH":478,"BHHM":-1073,"BHIH":222,"BHII":-504,"BIIH":-116,"BIII":-105,"BMHI":-863,"BMHM":-464,"BOMH":620,"OHHH":346,"OHHI":1729,"OHII":997,"OHMH":481,"OIHH":623,"OIIH":1344,"OKAK":2792,"OKHH":587,"OKKA":679,"OOHH":110,"OOII":-685}; + this.TQ4__ = {"BHHH":-721,"BHHM":-3604,"BHII":-966,"BIIH":-607,"BIII":-2181,"OAAA":-2763,"OAKK":180,"OHHH":-294,"OHHI":2446,"OHHO":480,"OHIH":-1573,"OIHH":1935,"OIHI":-493,"OIIH":626,"OIII":-4007,"OKAK":-8156}; + this.TW1__ = {"につい":-4681,"東京都":2026}; + this.TW2__ = {"ある程":-2049,"いった":-1256,"ころが":-2434,"しょう":3873,"その後":-4430,"だって":-1049,"ていた":1833,"として":-4657,"ともに":-4517,"もので":1882,"一気に":-792,"初めて":-1512,"同時に":-8097,"大きな":-1255,"対して":-2721,"社会党":-3216}; + this.TW3__ = {"いただ":-1734,"してい":1314,"として":-4314,"につい":-5483,"にとっ":-5989,"に当た":-6247,"ので,":-727,"ので、":-727,"のもの":-600,"れから":-3752,"十二月":-2287}; + this.TW4__ = {"いう.":8576,"いう。":8576,"からな":-2348,"してい":2958,"たが,":1516,"たが、":1516,"ている":1538,"という":1349,"ました":5543,"ません":1097,"ようと":-4258,"よると":5865}; + this.UC1__ = {"A":484,"K":93,"M":645,"O":-505}; + this.UC2__ = {"A":819,"H":1059,"I":409,"M":3987,"N":5775,"O":646}; + this.UC3__ = {"A":-1370,"I":2311}; + this.UC4__ = {"A":-2643,"H":1809,"I":-1032,"K":-3450,"M":3565,"N":3876,"O":6646}; + this.UC5__ = {"H":313,"I":-1238,"K":-799,"M":539,"O":-831}; + this.UC6__ = {"H":-506,"I":-253,"K":87,"M":247,"O":-387}; + this.UP1__ = {"O":-214}; + this.UP2__ = {"B":69,"O":935}; + this.UP3__ = {"B":189}; + this.UQ1__ = {"BH":21,"BI":-12,"BK":-99,"BN":142,"BO":-56,"OH":-95,"OI":477,"OK":410,"OO":-2422}; + this.UQ2__ = {"BH":216,"BI":113,"OK":1759}; + this.UQ3__ = {"BA":-479,"BH":42,"BI":1913,"BK":-7198,"BM":3160,"BN":6427,"BO":14761,"OI":-827,"ON":-3212}; + this.UW1__ = {",":156,"、":156,"「":-463,"あ":-941,"う":-127,"が":-553,"き":121,"こ":505,"で":-201,"と":-547,"ど":-123,"に":-789,"の":-185,"は":-847,"も":-466,"や":-470,"よ":182,"ら":-292,"り":208,"れ":169,"を":-446,"ん":-137,"・":-135,"主":-402,"京":-268,"区":-912,"午":871,"国":-460,"大":561,"委":729,"市":-411,"日":-141,"理":361,"生":-408,"県":-386,"都":-718,"「":-463,"・":-135}; + this.UW2__ = {",":-829,"、":-829,"〇":892,"「":-645,"」":3145,"あ":-538,"い":505,"う":134,"お":-502,"か":1454,"が":-856,"く":-412,"こ":1141,"さ":878,"ざ":540,"し":1529,"す":-675,"せ":300,"そ":-1011,"た":188,"だ":1837,"つ":-949,"て":-291,"で":-268,"と":-981,"ど":1273,"な":1063,"に":-1764,"の":130,"は":-409,"ひ":-1273,"べ":1261,"ま":600,"も":-1263,"や":-402,"よ":1639,"り":-579,"る":-694,"れ":571,"を":-2516,"ん":2095,"ア":-587,"カ":306,"キ":568,"ッ":831,"三":-758,"不":-2150,"世":-302,"中":-968,"主":-861,"事":492,"人":-123,"会":978,"保":362,"入":548,"初":-3025,"副":-1566,"北":-3414,"区":-422,"大":-1769,"天":-865,"太":-483,"子":-1519,"学":760,"実":1023,"小":-2009,"市":-813,"年":-1060,"強":1067,"手":-1519,"揺":-1033,"政":1522,"文":-1355,"新":-1682,"日":-1815,"明":-1462,"最":-630,"朝":-1843,"本":-1650,"東":-931,"果":-665,"次":-2378,"民":-180,"気":-1740,"理":752,"発":529,"目":-1584,"相":-242,"県":-1165,"立":-763,"第":810,"米":509,"自":-1353,"行":838,"西":-744,"見":-3874,"調":1010,"議":1198,"込":3041,"開":1758,"間":-1257,"「":-645,"」":3145,"ッ":831,"ア":-587,"カ":306,"キ":568}; + this.UW3__ = {",":4889,"1":-800,"−":-1723,"、":4889,"々":-2311,"〇":5827,"」":2670,"〓":-3573,"あ":-2696,"い":1006,"う":2342,"え":1983,"お":-4864,"か":-1163,"が":3271,"く":1004,"け":388,"げ":401,"こ":-3552,"ご":-3116,"さ":-1058,"し":-395,"す":584,"せ":3685,"そ":-5228,"た":842,"ち":-521,"っ":-1444,"つ":-1081,"て":6167,"で":2318,"と":1691,"ど":-899,"な":-2788,"に":2745,"の":4056,"は":4555,"ひ":-2171,"ふ":-1798,"へ":1199,"ほ":-5516,"ま":-4384,"み":-120,"め":1205,"も":2323,"や":-788,"よ":-202,"ら":727,"り":649,"る":5905,"れ":2773,"わ":-1207,"を":6620,"ん":-518,"ア":551,"グ":1319,"ス":874,"ッ":-1350,"ト":521,"ム":1109,"ル":1591,"ロ":2201,"ン":278,"・":-3794,"一":-1619,"下":-1759,"世":-2087,"両":3815,"中":653,"主":-758,"予":-1193,"二":974,"人":2742,"今":792,"他":1889,"以":-1368,"低":811,"何":4265,"作":-361,"保":-2439,"元":4858,"党":3593,"全":1574,"公":-3030,"六":755,"共":-1880,"円":5807,"再":3095,"分":457,"初":2475,"別":1129,"前":2286,"副":4437,"力":365,"動":-949,"務":-1872,"化":1327,"北":-1038,"区":4646,"千":-2309,"午":-783,"協":-1006,"口":483,"右":1233,"各":3588,"合":-241,"同":3906,"和":-837,"員":4513,"国":642,"型":1389,"場":1219,"外":-241,"妻":2016,"学":-1356,"安":-423,"実":-1008,"家":1078,"小":-513,"少":-3102,"州":1155,"市":3197,"平":-1804,"年":2416,"広":-1030,"府":1605,"度":1452,"建":-2352,"当":-3885,"得":1905,"思":-1291,"性":1822,"戸":-488,"指":-3973,"政":-2013,"教":-1479,"数":3222,"文":-1489,"新":1764,"日":2099,"旧":5792,"昨":-661,"時":-1248,"曜":-951,"最":-937,"月":4125,"期":360,"李":3094,"村":364,"東":-805,"核":5156,"森":2438,"業":484,"氏":2613,"民":-1694,"決":-1073,"法":1868,"海":-495,"無":979,"物":461,"特":-3850,"生":-273,"用":914,"町":1215,"的":7313,"直":-1835,"省":792,"県":6293,"知":-1528,"私":4231,"税":401,"立":-960,"第":1201,"米":7767,"系":3066,"約":3663,"級":1384,"統":-4229,"総":1163,"線":1255,"者":6457,"能":725,"自":-2869,"英":785,"見":1044,"調":-562,"財":-733,"費":1777,"車":1835,"軍":1375,"込":-1504,"通":-1136,"選":-681,"郎":1026,"郡":4404,"部":1200,"金":2163,"長":421,"開":-1432,"間":1302,"関":-1282,"雨":2009,"電":-1045,"非":2066,"駅":1620,"1":-800,"」":2670,"・":-3794,"ッ":-1350,"ア":551,"グ":1319,"ス":874,"ト":521,"ム":1109,"ル":1591,"ロ":2201,"ン":278}; + this.UW4__ = {",":3930,".":3508,"―":-4841,"、":3930,"。":3508,"〇":4999,"「":1895,"」":3798,"〓":-5156,"あ":4752,"い":-3435,"う":-640,"え":-2514,"お":2405,"か":530,"が":6006,"き":-4482,"ぎ":-3821,"く":-3788,"け":-4376,"げ":-4734,"こ":2255,"ご":1979,"さ":2864,"し":-843,"じ":-2506,"す":-731,"ず":1251,"せ":181,"そ":4091,"た":5034,"だ":5408,"ち":-3654,"っ":-5882,"つ":-1659,"て":3994,"で":7410,"と":4547,"な":5433,"に":6499,"ぬ":1853,"ね":1413,"の":7396,"は":8578,"ば":1940,"ひ":4249,"び":-4134,"ふ":1345,"へ":6665,"べ":-744,"ほ":1464,"ま":1051,"み":-2082,"む":-882,"め":-5046,"も":4169,"ゃ":-2666,"や":2795,"ょ":-1544,"よ":3351,"ら":-2922,"り":-9726,"る":-14896,"れ":-2613,"ろ":-4570,"わ":-1783,"を":13150,"ん":-2352,"カ":2145,"コ":1789,"セ":1287,"ッ":-724,"ト":-403,"メ":-1635,"ラ":-881,"リ":-541,"ル":-856,"ン":-3637,"・":-4371,"ー":-11870,"一":-2069,"中":2210,"予":782,"事":-190,"井":-1768,"人":1036,"以":544,"会":950,"体":-1286,"作":530,"側":4292,"先":601,"党":-2006,"共":-1212,"内":584,"円":788,"初":1347,"前":1623,"副":3879,"力":-302,"動":-740,"務":-2715,"化":776,"区":4517,"協":1013,"参":1555,"合":-1834,"和":-681,"員":-910,"器":-851,"回":1500,"国":-619,"園":-1200,"地":866,"場":-1410,"塁":-2094,"士":-1413,"多":1067,"大":571,"子":-4802,"学":-1397,"定":-1057,"寺":-809,"小":1910,"屋":-1328,"山":-1500,"島":-2056,"川":-2667,"市":2771,"年":374,"庁":-4556,"後":456,"性":553,"感":916,"所":-1566,"支":856,"改":787,"政":2182,"教":704,"文":522,"方":-856,"日":1798,"時":1829,"最":845,"月":-9066,"木":-485,"来":-442,"校":-360,"業":-1043,"氏":5388,"民":-2716,"気":-910,"沢":-939,"済":-543,"物":-735,"率":672,"球":-1267,"生":-1286,"産":-1101,"田":-2900,"町":1826,"的":2586,"目":922,"省":-3485,"県":2997,"空":-867,"立":-2112,"第":788,"米":2937,"系":786,"約":2171,"経":1146,"統":-1169,"総":940,"線":-994,"署":749,"者":2145,"能":-730,"般":-852,"行":-792,"規":792,"警":-1184,"議":-244,"谷":-1000,"賞":730,"車":-1481,"軍":1158,"輪":-1433,"込":-3370,"近":929,"道":-1291,"選":2596,"郎":-4866,"都":1192,"野":-1100,"銀":-2213,"長":357,"間":-2344,"院":-2297,"際":-2604,"電":-878,"領":-1659,"題":-792,"館":-1984,"首":1749,"高":2120,"「":1895,"」":3798,"・":-4371,"ッ":-724,"ー":-11870,"カ":2145,"コ":1789,"セ":1287,"ト":-403,"メ":-1635,"ラ":-881,"リ":-541,"ル":-856,"ン":-3637}; + this.UW5__ = {",":465,".":-299,"1":-514,"E2":-32768,"]":-2762,"、":465,"。":-299,"「":363,"あ":1655,"い":331,"う":-503,"え":1199,"お":527,"か":647,"が":-421,"き":1624,"ぎ":1971,"く":312,"げ":-983,"さ":-1537,"し":-1371,"す":-852,"だ":-1186,"ち":1093,"っ":52,"つ":921,"て":-18,"で":-850,"と":-127,"ど":1682,"な":-787,"に":-1224,"の":-635,"は":-578,"べ":1001,"み":502,"め":865,"ゃ":3350,"ょ":854,"り":-208,"る":429,"れ":504,"わ":419,"を":-1264,"ん":327,"イ":241,"ル":451,"ン":-343,"中":-871,"京":722,"会":-1153,"党":-654,"務":3519,"区":-901,"告":848,"員":2104,"大":-1296,"学":-548,"定":1785,"嵐":-1304,"市":-2991,"席":921,"年":1763,"思":872,"所":-814,"挙":1618,"新":-1682,"日":218,"月":-4353,"査":932,"格":1356,"機":-1508,"氏":-1347,"田":240,"町":-3912,"的":-3149,"相":1319,"省":-1052,"県":-4003,"研":-997,"社":-278,"空":-813,"統":1955,"者":-2233,"表":663,"語":-1073,"議":1219,"選":-1018,"郎":-368,"長":786,"間":1191,"題":2368,"館":-689,"1":-514,"E2":-32768,"「":363,"イ":241,"ル":451,"ン":-343}; + this.UW6__ = {",":227,".":808,"1":-270,"E1":306,"、":227,"。":808,"あ":-307,"う":189,"か":241,"が":-73,"く":-121,"こ":-200,"じ":1782,"す":383,"た":-428,"っ":573,"て":-1014,"で":101,"と":-105,"な":-253,"に":-149,"の":-417,"は":-236,"も":-206,"り":187,"る":-135,"を":195,"ル":-673,"ン":-496,"一":-277,"中":201,"件":-800,"会":624,"前":302,"区":1792,"員":-1212,"委":798,"学":-960,"市":887,"広":-695,"後":535,"業":-697,"相":753,"社":-507,"福":974,"空":-822,"者":1811,"連":463,"郎":1082,"1":-270,"E1":306,"ル":-673,"ン":-496}; + + return this; + } + TinySegmenter.prototype.ctype_ = function(str) { + for (var i in this.chartype_) { + if (str.match(this.chartype_[i][0])) { + return this.chartype_[i][1]; + } + } + return "O"; + } + + TinySegmenter.prototype.ts_ = function(v) { + if (v) { return v; } + return 0; + } + + TinySegmenter.prototype.segment = function(input) { + if (input == null || input == undefined || input == "") { + return []; + } + var result = []; + var seg = ["B3","B2","B1"]; + var ctype = ["O","O","O"]; + var o = input.split(""); + for (i = 0; i < o.length; ++i) { + seg.push(o[i]); + ctype.push(this.ctype_(o[i])) + } + seg.push("E1"); + seg.push("E2"); + seg.push("E3"); + ctype.push("O"); + ctype.push("O"); + ctype.push("O"); + var word = seg[3]; + var p1 = "U"; + var p2 = "U"; + var p3 = "U"; + for (var i = 4; i < seg.length - 3; ++i) { + var score = this.BIAS__; + var w1 = seg[i-3]; + var w2 = seg[i-2]; + var w3 = seg[i-1]; + var w4 = seg[i]; + var w5 = seg[i+1]; + var w6 = seg[i+2]; + var c1 = ctype[i-3]; + var c2 = ctype[i-2]; + var c3 = ctype[i-1]; + var c4 = ctype[i]; + var c5 = ctype[i+1]; + var c6 = ctype[i+2]; + score += this.ts_(this.UP1__[p1]); + score += this.ts_(this.UP2__[p2]); + score += this.ts_(this.UP3__[p3]); + score += this.ts_(this.BP1__[p1 + p2]); + score += this.ts_(this.BP2__[p2 + p3]); + score += this.ts_(this.UW1__[w1]); + score += this.ts_(this.UW2__[w2]); + score += this.ts_(this.UW3__[w3]); + score += this.ts_(this.UW4__[w4]); + score += this.ts_(this.UW5__[w5]); + score += this.ts_(this.UW6__[w6]); + score += this.ts_(this.BW1__[w2 + w3]); + score += this.ts_(this.BW2__[w3 + w4]); + score += this.ts_(this.BW3__[w4 + w5]); + score += this.ts_(this.TW1__[w1 + w2 + w3]); + score += this.ts_(this.TW2__[w2 + w3 + w4]); + score += this.ts_(this.TW3__[w3 + w4 + w5]); + score += this.ts_(this.TW4__[w4 + w5 + w6]); + score += this.ts_(this.UC1__[c1]); + score += this.ts_(this.UC2__[c2]); + score += this.ts_(this.UC3__[c3]); + score += this.ts_(this.UC4__[c4]); + score += this.ts_(this.UC5__[c5]); + score += this.ts_(this.UC6__[c6]); + score += this.ts_(this.BC1__[c2 + c3]); + score += this.ts_(this.BC2__[c3 + c4]); + score += this.ts_(this.BC3__[c4 + c5]); + score += this.ts_(this.TC1__[c1 + c2 + c3]); + score += this.ts_(this.TC2__[c2 + c3 + c4]); + score += this.ts_(this.TC3__[c3 + c4 + c5]); + score += this.ts_(this.TC4__[c4 + c5 + c6]); + // score += this.ts_(this.TC5__[c4 + c5 + c6]); + score += this.ts_(this.UQ1__[p1 + c1]); + score += this.ts_(this.UQ2__[p2 + c2]); + score += this.ts_(this.UQ3__[p3 + c3]); + score += this.ts_(this.BQ1__[p2 + c2 + c3]); + score += this.ts_(this.BQ2__[p2 + c3 + c4]); + score += this.ts_(this.BQ3__[p3 + c2 + c3]); + score += this.ts_(this.BQ4__[p3 + c3 + c4]); + score += this.ts_(this.TQ1__[p2 + c1 + c2 + c3]); + score += this.ts_(this.TQ2__[p2 + c2 + c3 + c4]); + score += this.ts_(this.TQ3__[p3 + c1 + c2 + c3]); + score += this.ts_(this.TQ4__[p3 + c2 + c3 + c4]); + var p = "O"; + if (score > 0) { + result.push(word); + word = ""; + p = "B"; + } + p1 = p2; + p2 = p3; + p3 = p; + word += seg[i]; + } + result.push(word); + + return result; + } + + lunr.TinySegmenter = TinySegmenter; + }; + +})); \ No newline at end of file diff --git a/assets/javascripts/lunr/wordcut.js b/assets/javascripts/lunr/wordcut.js new file mode 100644 index 00000000..0d898c9e --- /dev/null +++ b/assets/javascripts/lunr/wordcut.js @@ -0,0 +1,6708 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}(g.lunr || (g.lunr = {})).wordcut = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 1; + }) + this.addWords(words, false) + } + if(finalize){ + this.finalizeDict(); + } + }, + + dictSeek: function (l, r, ch, strOffset, pos) { + var ans = null; + while (l <= r) { + var m = Math.floor((l + r) / 2), + dict_item = this.dict[m], + len = dict_item.length; + if (len <= strOffset) { + l = m + 1; + } else { + var ch_ = dict_item[strOffset]; + if (ch_ < ch) { + l = m + 1; + } else if (ch_ > ch) { + r = m - 1; + } else { + ans = m; + if (pos == LEFT) { + r = m - 1; + } else { + l = m + 1; + } + } + } + } + return ans; + }, + + isFinal: function (acceptor) { + return this.dict[acceptor.l].length == acceptor.strOffset; + }, + + createAcceptor: function () { + return { + l: 0, + r: this.dict.length - 1, + strOffset: 0, + isFinal: false, + dict: this, + transit: function (ch) { + return this.dict.transit(this, ch); + }, + isError: false, + tag: "DICT", + w: 1, + type: "DICT" + }; + }, + + transit: function (acceptor, ch) { + var l = this.dictSeek(acceptor.l, + acceptor.r, + ch, + acceptor.strOffset, + LEFT); + if (l !== null) { + var r = this.dictSeek(l, + acceptor.r, + ch, + acceptor.strOffset, + RIGHT); + acceptor.l = l; + acceptor.r = r; + acceptor.strOffset++; + acceptor.isFinal = this.isFinal(acceptor); + } else { + acceptor.isError = true; + } + return acceptor; + }, + + sortuniq: function(a){ + return a.sort().filter(function(item, pos, arr){ + return !pos || item != arr[pos - 1]; + }) + }, + + flatten: function(a){ + //[[1,2],[3]] -> [1,2,3] + return [].concat.apply([], a); + } +}; +module.exports = WordcutDict; + +}).call(this,"/dist/tmp") +},{"glob":16,"path":22}],3:[function(require,module,exports){ +var WordRule = { + createAcceptor: function(tag) { + if (tag["WORD_RULE"]) + return null; + + return {strOffset: 0, + isFinal: false, + transit: function(ch) { + var lch = ch.toLowerCase(); + if (lch >= "a" && lch <= "z") { + this.isFinal = true; + this.strOffset++; + } else { + this.isError = true; + } + return this; + }, + isError: false, + tag: "WORD_RULE", + type: "WORD_RULE", + w: 1}; + } +}; + +var NumberRule = { + createAcceptor: function(tag) { + if (tag["NUMBER_RULE"]) + return null; + + return {strOffset: 0, + isFinal: false, + transit: function(ch) { + if (ch >= "0" && ch <= "9") { + this.isFinal = true; + this.strOffset++; + } else { + this.isError = true; + } + return this; + }, + isError: false, + tag: "NUMBER_RULE", + type: "NUMBER_RULE", + w: 1}; + } +}; + +var SpaceRule = { + tag: "SPACE_RULE", + createAcceptor: function(tag) { + + if (tag["SPACE_RULE"]) + return null; + + return {strOffset: 0, + isFinal: false, + transit: function(ch) { + if (ch == " " || ch == "\t" || ch == "\r" || ch == "\n" || + ch == "\u00A0" || ch=="\u2003"//nbsp and emsp + ) { + this.isFinal = true; + this.strOffset++; + } else { + this.isError = true; + } + return this; + }, + isError: false, + tag: SpaceRule.tag, + w: 1, + type: "SPACE_RULE"}; + } +} + +var SingleSymbolRule = { + tag: "SINSYM", + createAcceptor: function(tag) { + return {strOffset: 0, + isFinal: false, + transit: function(ch) { + if (this.strOffset == 0 && ch.match(/^[\@\(\)\/\,\-\."`]$/)) { + this.isFinal = true; + this.strOffset++; + } else { + this.isError = true; + } + return this; + }, + isError: false, + tag: "SINSYM", + w: 1, + type: "SINSYM"}; + } +} + + +var LatinRules = [WordRule, SpaceRule, SingleSymbolRule, NumberRule]; + +module.exports = LatinRules; + +},{}],4:[function(require,module,exports){ +var _ = require("underscore") + , WordcutCore = require("./wordcut_core"); +var PathInfoBuilder = { + + /* + buildByPartAcceptors: function(path, acceptors, i) { + var + var genInfos = partAcceptors.reduce(function(genInfos, acceptor) { + + }, []); + + return genInfos; + } + */ + + buildByAcceptors: function(path, finalAcceptors, i) { + var self = this; + var infos = finalAcceptors.map(function(acceptor) { + var p = i - acceptor.strOffset + 1 + , _info = path[p]; + + var info = {p: p, + mw: _info.mw + (acceptor.mw === undefined ? 0 : acceptor.mw), + w: acceptor.w + _info.w, + unk: (acceptor.unk ? acceptor.unk : 0) + _info.unk, + type: acceptor.type}; + + if (acceptor.type == "PART") { + for(var j = p + 1; j <= i; j++) { + path[j].merge = p; + } + info.merge = p; + } + + return info; + }); + return infos.filter(function(info) { return info; }); + }, + + fallback: function(path, leftBoundary, text, i) { + var _info = path[leftBoundary]; + if (text[i].match(/[\u0E48-\u0E4E]/)) { + if (leftBoundary != 0) + leftBoundary = path[leftBoundary].p; + return {p: leftBoundary, + mw: 0, + w: 1 + _info.w, + unk: 1 + _info.unk, + type: "UNK"}; +/* } else if(leftBoundary > 0 && path[leftBoundary].type !== "UNK") { + leftBoundary = path[leftBoundary].p; + return {p: leftBoundary, + w: 1 + _info.w, + unk: 1 + _info.unk, + type: "UNK"}; */ + } else { + return {p: leftBoundary, + mw: _info.mw, + w: 1 + _info.w, + unk: 1 + _info.unk, + type: "UNK"}; + } + }, + + build: function(path, finalAcceptors, i, leftBoundary, text) { + var basicPathInfos = this.buildByAcceptors(path, finalAcceptors, i); + if (basicPathInfos.length > 0) { + return basicPathInfos; + } else { + return [this.fallback(path, leftBoundary, text, i)]; + } + } +}; + +module.exports = function() { + return _.clone(PathInfoBuilder); +} + +},{"./wordcut_core":8,"underscore":25}],5:[function(require,module,exports){ +var _ = require("underscore"); + + +var PathSelector = { + selectPath: function(paths) { + var path = paths.reduce(function(selectedPath, path) { + if (selectedPath == null) { + return path; + } else { + if (path.unk < selectedPath.unk) + return path; + if (path.unk == selectedPath.unk) { + if (path.mw < selectedPath.mw) + return path + if (path.mw == selectedPath.mw) { + if (path.w < selectedPath.w) + return path; + } + } + return selectedPath; + } + }, null); + return path; + }, + + createPath: function() { + return [{p:null, w:0, unk:0, type: "INIT", mw:0}]; + } +}; + +module.exports = function() { + return _.clone(PathSelector); +}; + +},{"underscore":25}],6:[function(require,module,exports){ +function isMatch(pat, offset, ch) { + if (pat.length <= offset) + return false; + var _ch = pat[offset]; + return _ch == ch || + (_ch.match(/[กข]/) && ch.match(/[ก-ฮ]/)) || + (_ch.match(/[มบ]/) && ch.match(/[ก-ฮ]/)) || + (_ch.match(/\u0E49/) && ch.match(/[\u0E48-\u0E4B]/)); +} + +var Rule0 = { + pat: "เหก็ม", + createAcceptor: function(tag) { + return {strOffset: 0, + isFinal: false, + transit: function(ch) { + if (isMatch(Rule0.pat, this.strOffset,ch)) { + this.isFinal = (this.strOffset + 1 == Rule0.pat.length); + this.strOffset++; + } else { + this.isError = true; + } + return this; + }, + isError: false, + tag: "THAI_RULE", + type: "THAI_RULE", + w: 1}; + } +}; + +var PartRule = { + createAcceptor: function(tag) { + return {strOffset: 0, + patterns: [ + "แก", "เก", "ก้", "กก์", "กา", "กี", "กิ", "กืก" + ], + isFinal: false, + transit: function(ch) { + var offset = this.strOffset; + this.patterns = this.patterns.filter(function(pat) { + return isMatch(pat, offset, ch); + }); + + if (this.patterns.length > 0) { + var len = 1 + offset; + this.isFinal = this.patterns.some(function(pat) { + return pat.length == len; + }); + this.strOffset++; + } else { + this.isError = true; + } + return this; + }, + isError: false, + tag: "PART", + type: "PART", + unk: 1, + w: 1}; + } +}; + +var ThaiRules = [Rule0, PartRule]; + +module.exports = ThaiRules; + +},{}],7:[function(require,module,exports){ +var sys = require("sys") + , WordcutDict = require("./dict") + , WordcutCore = require("./wordcut_core") + , PathInfoBuilder = require("./path_info_builder") + , PathSelector = require("./path_selector") + , Acceptors = require("./acceptors") + , latinRules = require("./latin_rules") + , thaiRules = require("./thai_rules") + , _ = require("underscore"); + + +var Wordcut = Object.create(WordcutCore); +Wordcut.defaultPathInfoBuilder = PathInfoBuilder; +Wordcut.defaultPathSelector = PathSelector; +Wordcut.defaultAcceptors = Acceptors; +Wordcut.defaultLatinRules = latinRules; +Wordcut.defaultThaiRules = thaiRules; +Wordcut.defaultDict = WordcutDict; + + +Wordcut.initNoDict = function(dict_path) { + var self = this; + self.pathInfoBuilder = new self.defaultPathInfoBuilder; + self.pathSelector = new self.defaultPathSelector; + self.acceptors = new self.defaultAcceptors; + self.defaultLatinRules.forEach(function(rule) { + self.acceptors.creators.push(rule); + }); + self.defaultThaiRules.forEach(function(rule) { + self.acceptors.creators.push(rule); + }); +}; + +Wordcut.init = function(dict_path, withDefault, additionalWords) { + withDefault = withDefault || false; + this.initNoDict(); + var dict = _.clone(this.defaultDict); + dict.init(dict_path, withDefault, additionalWords); + this.acceptors.creators.push(dict); +}; + +module.exports = Wordcut; + +},{"./acceptors":1,"./dict":2,"./latin_rules":3,"./path_info_builder":4,"./path_selector":5,"./thai_rules":6,"./wordcut_core":8,"sys":28,"underscore":25}],8:[function(require,module,exports){ +var WordcutCore = { + + buildPath: function(text) { + var self = this + , path = self.pathSelector.createPath() + , leftBoundary = 0; + self.acceptors.reset(); + for (var i = 0; i < text.length; i++) { + var ch = text[i]; + self.acceptors.transit(ch); + + var possiblePathInfos = self + .pathInfoBuilder + .build(path, + self.acceptors.getFinalAcceptors(), + i, + leftBoundary, + text); + var selectedPath = self.pathSelector.selectPath(possiblePathInfos) + + path.push(selectedPath); + if (selectedPath.type !== "UNK") { + leftBoundary = i; + } + } + return path; + }, + + pathToRanges: function(path) { + var e = path.length - 1 + , ranges = []; + + while (e > 0) { + var info = path[e] + , s = info.p; + + if (info.merge !== undefined && ranges.length > 0) { + var r = ranges[ranges.length - 1]; + r.s = info.merge; + s = r.s; + } else { + ranges.push({s:s, e:e}); + } + e = s; + } + return ranges.reverse(); + }, + + rangesToText: function(text, ranges, delimiter) { + return ranges.map(function(r) { + return text.substring(r.s, r.e); + }).join(delimiter); + }, + + cut: function(text, delimiter) { + var path = this.buildPath(text) + , ranges = this.pathToRanges(path); + return this + .rangesToText(text, ranges, + (delimiter === undefined ? "|" : delimiter)); + }, + + cutIntoRanges: function(text, noText) { + var path = this.buildPath(text) + , ranges = this.pathToRanges(path); + + if (!noText) { + ranges.forEach(function(r) { + r.text = text.substring(r.s, r.e); + }); + } + return ranges; + }, + + cutIntoArray: function(text) { + var path = this.buildPath(text) + , ranges = this.pathToRanges(path); + + return ranges.map(function(r) { + return text.substring(r.s, r.e) + }); + } +}; + +module.exports = WordcutCore; + +},{}],9:[function(require,module,exports){ +// http://wiki.commonjs.org/wiki/Unit_Testing/1.0 +// +// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8! +// +// Originally from narwhal.js (http://narwhaljs.org) +// Copyright (c) 2009 Thomas Robinson <280north.com> +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the 'Software'), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +// when used in node, this will actually load the util module we depend on +// versus loading the builtin util module as happens otherwise +// this is a bug in node module loading as far as I am concerned +var util = require('util/'); + +var pSlice = Array.prototype.slice; +var hasOwn = Object.prototype.hasOwnProperty; + +// 1. The assert module provides functions that throw +// AssertionError's when particular conditions are not met. The +// assert module must conform to the following interface. + +var assert = module.exports = ok; + +// 2. The AssertionError is defined in assert. +// new assert.AssertionError({ message: message, +// actual: actual, +// expected: expected }) + +assert.AssertionError = function AssertionError(options) { + this.name = 'AssertionError'; + this.actual = options.actual; + this.expected = options.expected; + this.operator = options.operator; + if (options.message) { + this.message = options.message; + this.generatedMessage = false; + } else { + this.message = getMessage(this); + this.generatedMessage = true; + } + var stackStartFunction = options.stackStartFunction || fail; + + if (Error.captureStackTrace) { + Error.captureStackTrace(this, stackStartFunction); + } + else { + // non v8 browsers so we can have a stacktrace + var err = new Error(); + if (err.stack) { + var out = err.stack; + + // try to strip useless frames + var fn_name = stackStartFunction.name; + var idx = out.indexOf('\n' + fn_name); + if (idx >= 0) { + // once we have located the function frame + // we need to strip out everything before it (and its line) + var next_line = out.indexOf('\n', idx + 1); + out = out.substring(next_line + 1); + } + + this.stack = out; + } + } +}; + +// assert.AssertionError instanceof Error +util.inherits(assert.AssertionError, Error); + +function replacer(key, value) { + if (util.isUndefined(value)) { + return '' + value; + } + if (util.isNumber(value) && !isFinite(value)) { + return value.toString(); + } + if (util.isFunction(value) || util.isRegExp(value)) { + return value.toString(); + } + return value; +} + +function truncate(s, n) { + if (util.isString(s)) { + return s.length < n ? s : s.slice(0, n); + } else { + return s; + } +} + +function getMessage(self) { + return truncate(JSON.stringify(self.actual, replacer), 128) + ' ' + + self.operator + ' ' + + truncate(JSON.stringify(self.expected, replacer), 128); +} + +// At present only the three keys mentioned above are used and +// understood by the spec. Implementations or sub modules can pass +// other keys to the AssertionError's constructor - they will be +// ignored. + +// 3. All of the following functions must throw an AssertionError +// when a corresponding condition is not met, with a message that +// may be undefined if not provided. All assertion methods provide +// both the actual and expected values to the assertion error for +// display purposes. + +function fail(actual, expected, message, operator, stackStartFunction) { + throw new assert.AssertionError({ + message: message, + actual: actual, + expected: expected, + operator: operator, + stackStartFunction: stackStartFunction + }); +} + +// EXTENSION! allows for well behaved errors defined elsewhere. +assert.fail = fail; + +// 4. Pure assertion tests whether a value is truthy, as determined +// by !!guard. +// assert.ok(guard, message_opt); +// This statement is equivalent to assert.equal(true, !!guard, +// message_opt);. To test strictly for the value true, use +// assert.strictEqual(true, guard, message_opt);. + +function ok(value, message) { + if (!value) fail(value, true, message, '==', assert.ok); +} +assert.ok = ok; + +// 5. The equality assertion tests shallow, coercive equality with +// ==. +// assert.equal(actual, expected, message_opt); + +assert.equal = function equal(actual, expected, message) { + if (actual != expected) fail(actual, expected, message, '==', assert.equal); +}; + +// 6. The non-equality assertion tests for whether two objects are not equal +// with != assert.notEqual(actual, expected, message_opt); + +assert.notEqual = function notEqual(actual, expected, message) { + if (actual == expected) { + fail(actual, expected, message, '!=', assert.notEqual); + } +}; + +// 7. The equivalence assertion tests a deep equality relation. +// assert.deepEqual(actual, expected, message_opt); + +assert.deepEqual = function deepEqual(actual, expected, message) { + if (!_deepEqual(actual, expected)) { + fail(actual, expected, message, 'deepEqual', assert.deepEqual); + } +}; + +function _deepEqual(actual, expected) { + // 7.1. All identical values are equivalent, as determined by ===. + if (actual === expected) { + return true; + + } else if (util.isBuffer(actual) && util.isBuffer(expected)) { + if (actual.length != expected.length) return false; + + for (var i = 0; i < actual.length; i++) { + if (actual[i] !== expected[i]) return false; + } + + return true; + + // 7.2. If the expected value is a Date object, the actual value is + // equivalent if it is also a Date object that refers to the same time. + } else if (util.isDate(actual) && util.isDate(expected)) { + return actual.getTime() === expected.getTime(); + + // 7.3 If the expected value is a RegExp object, the actual value is + // equivalent if it is also a RegExp object with the same source and + // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`). + } else if (util.isRegExp(actual) && util.isRegExp(expected)) { + return actual.source === expected.source && + actual.global === expected.global && + actual.multiline === expected.multiline && + actual.lastIndex === expected.lastIndex && + actual.ignoreCase === expected.ignoreCase; + + // 7.4. Other pairs that do not both pass typeof value == 'object', + // equivalence is determined by ==. + } else if (!util.isObject(actual) && !util.isObject(expected)) { + return actual == expected; + + // 7.5 For all other Object pairs, including Array objects, equivalence is + // determined by having the same number of owned properties (as verified + // with Object.prototype.hasOwnProperty.call), the same set of keys + // (although not necessarily the same order), equivalent values for every + // corresponding key, and an identical 'prototype' property. Note: this + // accounts for both named and indexed properties on Arrays. + } else { + return objEquiv(actual, expected); + } +} + +function isArguments(object) { + return Object.prototype.toString.call(object) == '[object Arguments]'; +} + +function objEquiv(a, b) { + if (util.isNullOrUndefined(a) || util.isNullOrUndefined(b)) + return false; + // an identical 'prototype' property. + if (a.prototype !== b.prototype) return false; + // if one is a primitive, the other must be same + if (util.isPrimitive(a) || util.isPrimitive(b)) { + return a === b; + } + var aIsArgs = isArguments(a), + bIsArgs = isArguments(b); + if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs)) + return false; + if (aIsArgs) { + a = pSlice.call(a); + b = pSlice.call(b); + return _deepEqual(a, b); + } + var ka = objectKeys(a), + kb = objectKeys(b), + key, i; + // having the same number of owned properties (keys incorporates + // hasOwnProperty) + if (ka.length != kb.length) + return false; + //the same set of keys (although not necessarily the same order), + ka.sort(); + kb.sort(); + //~~~cheap key test + for (i = ka.length - 1; i >= 0; i--) { + if (ka[i] != kb[i]) + return false; + } + //equivalent values for every corresponding key, and + //~~~possibly expensive deep test + for (i = ka.length - 1; i >= 0; i--) { + key = ka[i]; + if (!_deepEqual(a[key], b[key])) return false; + } + return true; +} + +// 8. The non-equivalence assertion tests for any deep inequality. +// assert.notDeepEqual(actual, expected, message_opt); + +assert.notDeepEqual = function notDeepEqual(actual, expected, message) { + if (_deepEqual(actual, expected)) { + fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual); + } +}; + +// 9. The strict equality assertion tests strict equality, as determined by ===. +// assert.strictEqual(actual, expected, message_opt); + +assert.strictEqual = function strictEqual(actual, expected, message) { + if (actual !== expected) { + fail(actual, expected, message, '===', assert.strictEqual); + } +}; + +// 10. The strict non-equality assertion tests for strict inequality, as +// determined by !==. assert.notStrictEqual(actual, expected, message_opt); + +assert.notStrictEqual = function notStrictEqual(actual, expected, message) { + if (actual === expected) { + fail(actual, expected, message, '!==', assert.notStrictEqual); + } +}; + +function expectedException(actual, expected) { + if (!actual || !expected) { + return false; + } + + if (Object.prototype.toString.call(expected) == '[object RegExp]') { + return expected.test(actual); + } else if (actual instanceof expected) { + return true; + } else if (expected.call({}, actual) === true) { + return true; + } + + return false; +} + +function _throws(shouldThrow, block, expected, message) { + var actual; + + if (util.isString(expected)) { + message = expected; + expected = null; + } + + try { + block(); + } catch (e) { + actual = e; + } + + message = (expected && expected.name ? ' (' + expected.name + ').' : '.') + + (message ? ' ' + message : '.'); + + if (shouldThrow && !actual) { + fail(actual, expected, 'Missing expected exception' + message); + } + + if (!shouldThrow && expectedException(actual, expected)) { + fail(actual, expected, 'Got unwanted exception' + message); + } + + if ((shouldThrow && actual && expected && + !expectedException(actual, expected)) || (!shouldThrow && actual)) { + throw actual; + } +} + +// 11. Expected to throw an error: +// assert.throws(block, Error_opt, message_opt); + +assert.throws = function(block, /*optional*/error, /*optional*/message) { + _throws.apply(this, [true].concat(pSlice.call(arguments))); +}; + +// EXTENSION! This is annoying to write outside this module. +assert.doesNotThrow = function(block, /*optional*/message) { + _throws.apply(this, [false].concat(pSlice.call(arguments))); +}; + +assert.ifError = function(err) { if (err) {throw err;}}; + +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) { + if (hasOwn.call(obj, key)) keys.push(key); + } + return keys; +}; + +},{"util/":28}],10:[function(require,module,exports){ +'use strict'; +module.exports = balanced; +function balanced(a, b, str) { + if (a instanceof RegExp) a = maybeMatch(a, str); + if (b instanceof RegExp) b = maybeMatch(b, str); + + var r = range(a, b, str); + + return r && { + start: r[0], + end: r[1], + pre: str.slice(0, r[0]), + body: str.slice(r[0] + a.length, r[1]), + post: str.slice(r[1] + b.length) + }; +} + +function maybeMatch(reg, str) { + var m = str.match(reg); + return m ? m[0] : null; +} + +balanced.range = range; +function range(a, b, str) { + var begs, beg, left, right, result; + var ai = str.indexOf(a); + var bi = str.indexOf(b, ai + 1); + var i = ai; + + if (ai >= 0 && bi > 0) { + begs = []; + left = str.length; + + while (i >= 0 && !result) { + if (i == ai) { + begs.push(i); + ai = str.indexOf(a, i + 1); + } else if (begs.length == 1) { + result = [ begs.pop(), bi ]; + } else { + beg = begs.pop(); + if (beg < left) { + left = beg; + right = bi; + } + + bi = str.indexOf(b, i + 1); + } + + i = ai < bi && ai >= 0 ? ai : bi; + } + + if (begs.length) { + result = [ left, right ]; + } + } + + return result; +} + +},{}],11:[function(require,module,exports){ +var concatMap = require('concat-map'); +var balanced = require('balanced-match'); + +module.exports = expandTop; + +var escSlash = '\0SLASH'+Math.random()+'\0'; +var escOpen = '\0OPEN'+Math.random()+'\0'; +var escClose = '\0CLOSE'+Math.random()+'\0'; +var escComma = '\0COMMA'+Math.random()+'\0'; +var escPeriod = '\0PERIOD'+Math.random()+'\0'; + +function numeric(str) { + return parseInt(str, 10) == str + ? parseInt(str, 10) + : str.charCodeAt(0); +} + +function escapeBraces(str) { + return str.split('\\\\').join(escSlash) + .split('\\{').join(escOpen) + .split('\\}').join(escClose) + .split('\\,').join(escComma) + .split('\\.').join(escPeriod); +} + +function unescapeBraces(str) { + return str.split(escSlash).join('\\') + .split(escOpen).join('{') + .split(escClose).join('}') + .split(escComma).join(',') + .split(escPeriod).join('.'); +} + + +// Basically just str.split(","), but handling cases +// where we have nested braced sections, which should be +// treated as individual members, like {a,{b,c},d} +function parseCommaParts(str) { + if (!str) + return ['']; + + var parts = []; + var m = balanced('{', '}', str); + + if (!m) + return str.split(','); + + var pre = m.pre; + var body = m.body; + var post = m.post; + var p = pre.split(','); + + p[p.length-1] += '{' + body + '}'; + var postParts = parseCommaParts(post); + if (post.length) { + p[p.length-1] += postParts.shift(); + p.push.apply(p, postParts); + } + + parts.push.apply(parts, p); + + return parts; +} + +function expandTop(str) { + if (!str) + return []; + + // I don't know why Bash 4.3 does this, but it does. + // Anything starting with {} will have the first two bytes preserved + // but *only* at the top level, so {},a}b will not expand to anything, + // but a{},b}c will be expanded to [a}c,abc]. + // One could argue that this is a bug in Bash, but since the goal of + // this module is to match Bash's rules, we escape a leading {} + if (str.substr(0, 2) === '{}') { + str = '\\{\\}' + str.substr(2); + } + + return expand(escapeBraces(str), true).map(unescapeBraces); +} + +function identity(e) { + return e; +} + +function embrace(str) { + return '{' + str + '}'; +} +function isPadded(el) { + return /^-?0\d/.test(el); +} + +function lte(i, y) { + return i <= y; +} +function gte(i, y) { + return i >= y; +} + +function expand(str, isTop) { + var expansions = []; + + var m = balanced('{', '}', str); + if (!m || /\$$/.test(m.pre)) return [str]; + + var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); + var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); + var isSequence = isNumericSequence || isAlphaSequence; + var isOptions = m.body.indexOf(',') >= 0; + if (!isSequence && !isOptions) { + // {a},b} + if (m.post.match(/,.*\}/)) { + str = m.pre + '{' + m.body + escClose + m.post; + return expand(str); + } + return [str]; + } + + var n; + if (isSequence) { + n = m.body.split(/\.\./); + } else { + n = parseCommaParts(m.body); + if (n.length === 1) { + // x{{a,b}}y ==> x{a}y x{b}y + n = expand(n[0], false).map(embrace); + if (n.length === 1) { + var post = m.post.length + ? expand(m.post, false) + : ['']; + return post.map(function(p) { + return m.pre + n[0] + p; + }); + } + } + } + + // at this point, n is the parts, and we know it's not a comma set + // with a single entry. + + // no need to expand pre, since it is guaranteed to be free of brace-sets + var pre = m.pre; + var post = m.post.length + ? expand(m.post, false) + : ['']; + + var N; + + if (isSequence) { + var x = numeric(n[0]); + var y = numeric(n[1]); + var width = Math.max(n[0].length, n[1].length) + var incr = n.length == 3 + ? Math.abs(numeric(n[2])) + : 1; + var test = lte; + var reverse = y < x; + if (reverse) { + incr *= -1; + test = gte; + } + var pad = n.some(isPadded); + + N = []; + + for (var i = x; test(i, y); i += incr) { + var c; + if (isAlphaSequence) { + c = String.fromCharCode(i); + if (c === '\\') + c = ''; + } else { + c = String(i); + if (pad) { + var need = width - c.length; + if (need > 0) { + var z = new Array(need + 1).join('0'); + if (i < 0) + c = '-' + z + c.slice(1); + else + c = z + c; + } + } + } + N.push(c); + } + } else { + N = concatMap(n, function(el) { return expand(el, false) }); + } + + for (var j = 0; j < N.length; j++) { + for (var k = 0; k < post.length; k++) { + var expansion = pre + N[j] + post[k]; + if (!isTop || isSequence || expansion) + expansions.push(expansion); + } + } + + return expansions; +} + + +},{"balanced-match":10,"concat-map":13}],12:[function(require,module,exports){ + +},{}],13:[function(require,module,exports){ +module.exports = function (xs, fn) { + var res = []; + for (var i = 0; i < xs.length; i++) { + var x = fn(xs[i], i); + if (isArray(x)) res.push.apply(res, x); + else res.push(x); + } + return res; +}; + +var isArray = Array.isArray || function (xs) { + return Object.prototype.toString.call(xs) === '[object Array]'; +}; + +},{}],14:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +function EventEmitter() { + this._events = this._events || {}; + this._maxListeners = this._maxListeners || undefined; +} +module.exports = EventEmitter; + +// Backwards-compat with node 0.10.x +EventEmitter.EventEmitter = EventEmitter; + +EventEmitter.prototype._events = undefined; +EventEmitter.prototype._maxListeners = undefined; + +// By default EventEmitters will print a warning if more than 10 listeners are +// added to it. This is a useful default which helps finding memory leaks. +EventEmitter.defaultMaxListeners = 10; + +// Obviously not all Emitters should be limited to 10. This function allows +// that to be increased. Set to zero for unlimited. +EventEmitter.prototype.setMaxListeners = function(n) { + if (!isNumber(n) || n < 0 || isNaN(n)) + throw TypeError('n must be a positive number'); + this._maxListeners = n; + return this; +}; + +EventEmitter.prototype.emit = function(type) { + var er, handler, len, args, i, listeners; + + if (!this._events) + this._events = {}; + + // If there is no 'error' event listener then throw. + if (type === 'error') { + if (!this._events.error || + (isObject(this._events.error) && !this._events.error.length)) { + er = arguments[1]; + if (er instanceof Error) { + throw er; // Unhandled 'error' event + } + throw TypeError('Uncaught, unspecified "error" event.'); + } + } + + handler = this._events[type]; + + if (isUndefined(handler)) + return false; + + if (isFunction(handler)) { + switch (arguments.length) { + // fast cases + case 1: + handler.call(this); + break; + case 2: + handler.call(this, arguments[1]); + break; + case 3: + handler.call(this, arguments[1], arguments[2]); + break; + // slower + default: + len = arguments.length; + args = new Array(len - 1); + for (i = 1; i < len; i++) + args[i - 1] = arguments[i]; + handler.apply(this, args); + } + } else if (isObject(handler)) { + len = arguments.length; + args = new Array(len - 1); + for (i = 1; i < len; i++) + args[i - 1] = arguments[i]; + + listeners = handler.slice(); + len = listeners.length; + for (i = 0; i < len; i++) + listeners[i].apply(this, args); + } + + return true; +}; + +EventEmitter.prototype.addListener = function(type, listener) { + var m; + + if (!isFunction(listener)) + throw TypeError('listener must be a function'); + + if (!this._events) + this._events = {}; + + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (this._events.newListener) + this.emit('newListener', type, + isFunction(listener.listener) ? + listener.listener : listener); + + if (!this._events[type]) + // Optimize the case of one listener. Don't need the extra array object. + this._events[type] = listener; + else if (isObject(this._events[type])) + // If we've already got an array, just append. + this._events[type].push(listener); + else + // Adding the second element, need to change to array. + this._events[type] = [this._events[type], listener]; + + // Check for listener leak + if (isObject(this._events[type]) && !this._events[type].warned) { + var m; + if (!isUndefined(this._maxListeners)) { + m = this._maxListeners; + } else { + m = EventEmitter.defaultMaxListeners; + } + + if (m && m > 0 && this._events[type].length > m) { + this._events[type].warned = true; + console.error('(node) warning: possible EventEmitter memory ' + + 'leak detected. %d listeners added. ' + + 'Use emitter.setMaxListeners() to increase limit.', + this._events[type].length); + if (typeof console.trace === 'function') { + // not supported in IE 10 + console.trace(); + } + } + } + + return this; +}; + +EventEmitter.prototype.on = EventEmitter.prototype.addListener; + +EventEmitter.prototype.once = function(type, listener) { + if (!isFunction(listener)) + throw TypeError('listener must be a function'); + + var fired = false; + + function g() { + this.removeListener(type, g); + + if (!fired) { + fired = true; + listener.apply(this, arguments); + } + } + + g.listener = listener; + this.on(type, g); + + return this; +}; + +// emits a 'removeListener' event iff the listener was removed +EventEmitter.prototype.removeListener = function(type, listener) { + var list, position, length, i; + + if (!isFunction(listener)) + throw TypeError('listener must be a function'); + + if (!this._events || !this._events[type]) + return this; + + list = this._events[type]; + length = list.length; + position = -1; + + if (list === listener || + (isFunction(list.listener) && list.listener === listener)) { + delete this._events[type]; + if (this._events.removeListener) + this.emit('removeListener', type, listener); + + } else if (isObject(list)) { + for (i = length; i-- > 0;) { + if (list[i] === listener || + (list[i].listener && list[i].listener === listener)) { + position = i; + break; + } + } + + if (position < 0) + return this; + + if (list.length === 1) { + list.length = 0; + delete this._events[type]; + } else { + list.splice(position, 1); + } + + if (this._events.removeListener) + this.emit('removeListener', type, listener); + } + + return this; +}; + +EventEmitter.prototype.removeAllListeners = function(type) { + var key, listeners; + + if (!this._events) + return this; + + // not listening for removeListener, no need to emit + if (!this._events.removeListener) { + if (arguments.length === 0) + this._events = {}; + else if (this._events[type]) + delete this._events[type]; + return this; + } + + // emit removeListener for all listeners on all events + if (arguments.length === 0) { + for (key in this._events) { + if (key === 'removeListener') continue; + this.removeAllListeners(key); + } + this.removeAllListeners('removeListener'); + this._events = {}; + return this; + } + + listeners = this._events[type]; + + if (isFunction(listeners)) { + this.removeListener(type, listeners); + } else { + // LIFO order + while (listeners.length) + this.removeListener(type, listeners[listeners.length - 1]); + } + delete this._events[type]; + + return this; +}; + +EventEmitter.prototype.listeners = function(type) { + var ret; + if (!this._events || !this._events[type]) + ret = []; + else if (isFunction(this._events[type])) + ret = [this._events[type]]; + else + ret = this._events[type].slice(); + return ret; +}; + +EventEmitter.listenerCount = function(emitter, type) { + var ret; + if (!emitter._events || !emitter._events[type]) + ret = 0; + else if (isFunction(emitter._events[type])) + ret = 1; + else + ret = emitter._events[type].length; + return ret; +}; + +function isFunction(arg) { + return typeof arg === 'function'; +} + +function isNumber(arg) { + return typeof arg === 'number'; +} + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} + +function isUndefined(arg) { + return arg === void 0; +} + +},{}],15:[function(require,module,exports){ +(function (process){ +exports.alphasort = alphasort +exports.alphasorti = alphasorti +exports.setopts = setopts +exports.ownProp = ownProp +exports.makeAbs = makeAbs +exports.finish = finish +exports.mark = mark +exports.isIgnored = isIgnored +exports.childrenIgnored = childrenIgnored + +function ownProp (obj, field) { + return Object.prototype.hasOwnProperty.call(obj, field) +} + +var path = require("path") +var minimatch = require("minimatch") +var isAbsolute = require("path-is-absolute") +var Minimatch = minimatch.Minimatch + +function alphasorti (a, b) { + return a.toLowerCase().localeCompare(b.toLowerCase()) +} + +function alphasort (a, b) { + return a.localeCompare(b) +} + +function setupIgnores (self, options) { + self.ignore = options.ignore || [] + + if (!Array.isArray(self.ignore)) + self.ignore = [self.ignore] + + if (self.ignore.length) { + self.ignore = self.ignore.map(ignoreMap) + } +} + +function ignoreMap (pattern) { + var gmatcher = null + if (pattern.slice(-3) === '/**') { + var gpattern = pattern.replace(/(\/\*\*)+$/, '') + gmatcher = new Minimatch(gpattern) + } + + return { + matcher: new Minimatch(pattern), + gmatcher: gmatcher + } +} + +function setopts (self, pattern, options) { + if (!options) + options = {} + + // base-matching: just use globstar for that. + if (options.matchBase && -1 === pattern.indexOf("/")) { + if (options.noglobstar) { + throw new Error("base matching requires globstar") + } + pattern = "**/" + pattern + } + + self.silent = !!options.silent + self.pattern = pattern + self.strict = options.strict !== false + self.realpath = !!options.realpath + self.realpathCache = options.realpathCache || Object.create(null) + self.follow = !!options.follow + self.dot = !!options.dot + self.mark = !!options.mark + self.nodir = !!options.nodir + if (self.nodir) + self.mark = true + self.sync = !!options.sync + self.nounique = !!options.nounique + self.nonull = !!options.nonull + self.nosort = !!options.nosort + self.nocase = !!options.nocase + self.stat = !!options.stat + self.noprocess = !!options.noprocess + + self.maxLength = options.maxLength || Infinity + self.cache = options.cache || Object.create(null) + self.statCache = options.statCache || Object.create(null) + self.symlinks = options.symlinks || Object.create(null) + + setupIgnores(self, options) + + self.changedCwd = false + var cwd = process.cwd() + if (!ownProp(options, "cwd")) + self.cwd = cwd + else { + self.cwd = options.cwd + self.changedCwd = path.resolve(options.cwd) !== cwd + } + + self.root = options.root || path.resolve(self.cwd, "/") + self.root = path.resolve(self.root) + if (process.platform === "win32") + self.root = self.root.replace(/\\/g, "/") + + self.nomount = !!options.nomount + + // disable comments and negation unless the user explicitly + // passes in false as the option. + options.nonegate = options.nonegate === false ? false : true + options.nocomment = options.nocomment === false ? false : true + deprecationWarning(options) + + self.minimatch = new Minimatch(pattern, options) + self.options = self.minimatch.options +} + +// TODO(isaacs): remove entirely in v6 +// exported to reset in tests +exports.deprecationWarned +function deprecationWarning(options) { + if (!options.nonegate || !options.nocomment) { + if (process.noDeprecation !== true && !exports.deprecationWarned) { + var msg = 'glob WARNING: comments and negation will be disabled in v6' + if (process.throwDeprecation) + throw new Error(msg) + else if (process.traceDeprecation) + console.trace(msg) + else + console.error(msg) + + exports.deprecationWarned = true + } + } +} + +function finish (self) { + var nou = self.nounique + var all = nou ? [] : Object.create(null) + + for (var i = 0, l = self.matches.length; i < l; i ++) { + var matches = self.matches[i] + if (!matches || Object.keys(matches).length === 0) { + if (self.nonull) { + // do like the shell, and spit out the literal glob + var literal = self.minimatch.globSet[i] + if (nou) + all.push(literal) + else + all[literal] = true + } + } else { + // had matches + var m = Object.keys(matches) + if (nou) + all.push.apply(all, m) + else + m.forEach(function (m) { + all[m] = true + }) + } + } + + if (!nou) + all = Object.keys(all) + + if (!self.nosort) + all = all.sort(self.nocase ? alphasorti : alphasort) + + // at *some* point we statted all of these + if (self.mark) { + for (var i = 0; i < all.length; i++) { + all[i] = self._mark(all[i]) + } + if (self.nodir) { + all = all.filter(function (e) { + return !(/\/$/.test(e)) + }) + } + } + + if (self.ignore.length) + all = all.filter(function(m) { + return !isIgnored(self, m) + }) + + self.found = all +} + +function mark (self, p) { + var abs = makeAbs(self, p) + var c = self.cache[abs] + var m = p + if (c) { + var isDir = c === 'DIR' || Array.isArray(c) + var slash = p.slice(-1) === '/' + + if (isDir && !slash) + m += '/' + else if (!isDir && slash) + m = m.slice(0, -1) + + if (m !== p) { + var mabs = makeAbs(self, m) + self.statCache[mabs] = self.statCache[abs] + self.cache[mabs] = self.cache[abs] + } + } + + return m +} + +// lotta situps... +function makeAbs (self, f) { + var abs = f + if (f.charAt(0) === '/') { + abs = path.join(self.root, f) + } else if (isAbsolute(f) || f === '') { + abs = f + } else if (self.changedCwd) { + abs = path.resolve(self.cwd, f) + } else { + abs = path.resolve(f) + } + return abs +} + + +// Return true, if pattern ends with globstar '**', for the accompanying parent directory. +// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents +function isIgnored (self, path) { + if (!self.ignore.length) + return false + + return self.ignore.some(function(item) { + return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path)) + }) +} + +function childrenIgnored (self, path) { + if (!self.ignore.length) + return false + + return self.ignore.some(function(item) { + return !!(item.gmatcher && item.gmatcher.match(path)) + }) +} + +}).call(this,require('_process')) +},{"_process":24,"minimatch":20,"path":22,"path-is-absolute":23}],16:[function(require,module,exports){ +(function (process){ +// Approach: +// +// 1. Get the minimatch set +// 2. For each pattern in the set, PROCESS(pattern, false) +// 3. Store matches per-set, then uniq them +// +// PROCESS(pattern, inGlobStar) +// Get the first [n] items from pattern that are all strings +// Join these together. This is PREFIX. +// If there is no more remaining, then stat(PREFIX) and +// add to matches if it succeeds. END. +// +// If inGlobStar and PREFIX is symlink and points to dir +// set ENTRIES = [] +// else readdir(PREFIX) as ENTRIES +// If fail, END +// +// with ENTRIES +// If pattern[n] is GLOBSTAR +// // handle the case where the globstar match is empty +// // by pruning it out, and testing the resulting pattern +// PROCESS(pattern[0..n] + pattern[n+1 .. $], false) +// // handle other cases. +// for ENTRY in ENTRIES (not dotfiles) +// // attach globstar + tail onto the entry +// // Mark that this entry is a globstar match +// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true) +// +// else // not globstar +// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot) +// Test ENTRY against pattern[n] +// If fails, continue +// If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $]) +// +// Caveat: +// Cache all stats and readdirs results to minimize syscall. Since all +// we ever care about is existence and directory-ness, we can just keep +// `true` for files, and [children,...] for directories, or `false` for +// things that don't exist. + +module.exports = glob + +var fs = require('fs') +var minimatch = require('minimatch') +var Minimatch = minimatch.Minimatch +var inherits = require('inherits') +var EE = require('events').EventEmitter +var path = require('path') +var assert = require('assert') +var isAbsolute = require('path-is-absolute') +var globSync = require('./sync.js') +var common = require('./common.js') +var alphasort = common.alphasort +var alphasorti = common.alphasorti +var setopts = common.setopts +var ownProp = common.ownProp +var inflight = require('inflight') +var util = require('util') +var childrenIgnored = common.childrenIgnored +var isIgnored = common.isIgnored + +var once = require('once') + +function glob (pattern, options, cb) { + if (typeof options === 'function') cb = options, options = {} + if (!options) options = {} + + if (options.sync) { + if (cb) + throw new TypeError('callback provided to sync glob') + return globSync(pattern, options) + } + + return new Glob(pattern, options, cb) +} + +glob.sync = globSync +var GlobSync = glob.GlobSync = globSync.GlobSync + +// old api surface +glob.glob = glob + +glob.hasMagic = function (pattern, options_) { + var options = util._extend({}, options_) + options.noprocess = true + + var g = new Glob(pattern, options) + var set = g.minimatch.set + if (set.length > 1) + return true + + for (var j = 0; j < set[0].length; j++) { + if (typeof set[0][j] !== 'string') + return true + } + + return false +} + +glob.Glob = Glob +inherits(Glob, EE) +function Glob (pattern, options, cb) { + if (typeof options === 'function') { + cb = options + options = null + } + + if (options && options.sync) { + if (cb) + throw new TypeError('callback provided to sync glob') + return new GlobSync(pattern, options) + } + + if (!(this instanceof Glob)) + return new Glob(pattern, options, cb) + + setopts(this, pattern, options) + this._didRealPath = false + + // process each pattern in the minimatch set + var n = this.minimatch.set.length + + // The matches are stored as {: true,...} so that + // duplicates are automagically pruned. + // Later, we do an Object.keys() on these. + // Keep them as a list so we can fill in when nonull is set. + this.matches = new Array(n) + + if (typeof cb === 'function') { + cb = once(cb) + this.on('error', cb) + this.on('end', function (matches) { + cb(null, matches) + }) + } + + var self = this + var n = this.minimatch.set.length + this._processing = 0 + this.matches = new Array(n) + + this._emitQueue = [] + this._processQueue = [] + this.paused = false + + if (this.noprocess) + return this + + if (n === 0) + return done() + + for (var i = 0; i < n; i ++) { + this._process(this.minimatch.set[i], i, false, done) + } + + function done () { + --self._processing + if (self._processing <= 0) + self._finish() + } +} + +Glob.prototype._finish = function () { + assert(this instanceof Glob) + if (this.aborted) + return + + if (this.realpath && !this._didRealpath) + return this._realpath() + + common.finish(this) + this.emit('end', this.found) +} + +Glob.prototype._realpath = function () { + if (this._didRealpath) + return + + this._didRealpath = true + + var n = this.matches.length + if (n === 0) + return this._finish() + + var self = this + for (var i = 0; i < this.matches.length; i++) + this._realpathSet(i, next) + + function next () { + if (--n === 0) + self._finish() + } +} + +Glob.prototype._realpathSet = function (index, cb) { + var matchset = this.matches[index] + if (!matchset) + return cb() + + var found = Object.keys(matchset) + var self = this + var n = found.length + + if (n === 0) + return cb() + + var set = this.matches[index] = Object.create(null) + found.forEach(function (p, i) { + // If there's a problem with the stat, then it means that + // one or more of the links in the realpath couldn't be + // resolved. just return the abs value in that case. + p = self._makeAbs(p) + fs.realpath(p, self.realpathCache, function (er, real) { + if (!er) + set[real] = true + else if (er.syscall === 'stat') + set[p] = true + else + self.emit('error', er) // srsly wtf right here + + if (--n === 0) { + self.matches[index] = set + cb() + } + }) + }) +} + +Glob.prototype._mark = function (p) { + return common.mark(this, p) +} + +Glob.prototype._makeAbs = function (f) { + return common.makeAbs(this, f) +} + +Glob.prototype.abort = function () { + this.aborted = true + this.emit('abort') +} + +Glob.prototype.pause = function () { + if (!this.paused) { + this.paused = true + this.emit('pause') + } +} + +Glob.prototype.resume = function () { + if (this.paused) { + this.emit('resume') + this.paused = false + if (this._emitQueue.length) { + var eq = this._emitQueue.slice(0) + this._emitQueue.length = 0 + for (var i = 0; i < eq.length; i ++) { + var e = eq[i] + this._emitMatch(e[0], e[1]) + } + } + if (this._processQueue.length) { + var pq = this._processQueue.slice(0) + this._processQueue.length = 0 + for (var i = 0; i < pq.length; i ++) { + var p = pq[i] + this._processing-- + this._process(p[0], p[1], p[2], p[3]) + } + } + } +} + +Glob.prototype._process = function (pattern, index, inGlobStar, cb) { + assert(this instanceof Glob) + assert(typeof cb === 'function') + + if (this.aborted) + return + + this._processing++ + if (this.paused) { + this._processQueue.push([pattern, index, inGlobStar, cb]) + return + } + + //console.error('PROCESS %d', this._processing, pattern) + + // Get the first [n] parts of pattern that are all strings. + var n = 0 + while (typeof pattern[n] === 'string') { + n ++ + } + // now n is the index of the first one that is *not* a string. + + // see if there's anything else + var prefix + switch (n) { + // if not, then this is rather simple + case pattern.length: + this._processSimple(pattern.join('/'), index, cb) + return + + case 0: + // pattern *starts* with some non-trivial item. + // going to readdir(cwd), but not include the prefix in matches. + prefix = null + break + + default: + // pattern has some string bits in the front. + // whatever it starts with, whether that's 'absolute' like /foo/bar, + // or 'relative' like '../baz' + prefix = pattern.slice(0, n).join('/') + break + } + + var remain = pattern.slice(n) + + // get the list of entries. + var read + if (prefix === null) + read = '.' + else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { + if (!prefix || !isAbsolute(prefix)) + prefix = '/' + prefix + read = prefix + } else + read = prefix + + var abs = this._makeAbs(read) + + //if ignored, skip _processing + if (childrenIgnored(this, read)) + return cb() + + var isGlobStar = remain[0] === minimatch.GLOBSTAR + if (isGlobStar) + this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb) + else + this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb) +} + +Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) { + var self = this + this._readdir(abs, inGlobStar, function (er, entries) { + return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb) + }) +} + +Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { + + // if the abs isn't a dir, then nothing can match! + if (!entries) + return cb() + + // It will only match dot entries if it starts with a dot, or if + // dot is set. Stuff like @(.foo|.bar) isn't allowed. + var pn = remain[0] + var negate = !!this.minimatch.negate + var rawGlob = pn._glob + var dotOk = this.dot || rawGlob.charAt(0) === '.' + + var matchedEntries = [] + for (var i = 0; i < entries.length; i++) { + var e = entries[i] + if (e.charAt(0) !== '.' || dotOk) { + var m + if (negate && !prefix) { + m = !e.match(pn) + } else { + m = e.match(pn) + } + if (m) + matchedEntries.push(e) + } + } + + //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries) + + var len = matchedEntries.length + // If there are no matched entries, then nothing matches. + if (len === 0) + return cb() + + // if this is the last remaining pattern bit, then no need for + // an additional stat *unless* the user has specified mark or + // stat explicitly. We know they exist, since readdir returned + // them. + + if (remain.length === 1 && !this.mark && !this.stat) { + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + if (prefix) { + if (prefix !== '/') + e = prefix + '/' + e + else + e = prefix + e + } + + if (e.charAt(0) === '/' && !this.nomount) { + e = path.join(this.root, e) + } + this._emitMatch(index, e) + } + // This was the last one, and no stats were needed + return cb() + } + + // now test all matched entries as stand-ins for that part + // of the pattern. + remain.shift() + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + var newPattern + if (prefix) { + if (prefix !== '/') + e = prefix + '/' + e + else + e = prefix + e + } + this._process([e].concat(remain), index, inGlobStar, cb) + } + cb() +} + +Glob.prototype._emitMatch = function (index, e) { + if (this.aborted) + return + + if (this.matches[index][e]) + return + + if (isIgnored(this, e)) + return + + if (this.paused) { + this._emitQueue.push([index, e]) + return + } + + var abs = this._makeAbs(e) + + if (this.nodir) { + var c = this.cache[abs] + if (c === 'DIR' || Array.isArray(c)) + return + } + + if (this.mark) + e = this._mark(e) + + this.matches[index][e] = true + + var st = this.statCache[abs] + if (st) + this.emit('stat', e, st) + + this.emit('match', e) +} + +Glob.prototype._readdirInGlobStar = function (abs, cb) { + if (this.aborted) + return + + // follow all symlinked directories forever + // just proceed as if this is a non-globstar situation + if (this.follow) + return this._readdir(abs, false, cb) + + var lstatkey = 'lstat\0' + abs + var self = this + var lstatcb = inflight(lstatkey, lstatcb_) + + if (lstatcb) + fs.lstat(abs, lstatcb) + + function lstatcb_ (er, lstat) { + if (er) + return cb() + + var isSym = lstat.isSymbolicLink() + self.symlinks[abs] = isSym + + // If it's not a symlink or a dir, then it's definitely a regular file. + // don't bother doing a readdir in that case. + if (!isSym && !lstat.isDirectory()) { + self.cache[abs] = 'FILE' + cb() + } else + self._readdir(abs, false, cb) + } +} + +Glob.prototype._readdir = function (abs, inGlobStar, cb) { + if (this.aborted) + return + + cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb) + if (!cb) + return + + //console.error('RD %j %j', +inGlobStar, abs) + if (inGlobStar && !ownProp(this.symlinks, abs)) + return this._readdirInGlobStar(abs, cb) + + if (ownProp(this.cache, abs)) { + var c = this.cache[abs] + if (!c || c === 'FILE') + return cb() + + if (Array.isArray(c)) + return cb(null, c) + } + + var self = this + fs.readdir(abs, readdirCb(this, abs, cb)) +} + +function readdirCb (self, abs, cb) { + return function (er, entries) { + if (er) + self._readdirError(abs, er, cb) + else + self._readdirEntries(abs, entries, cb) + } +} + +Glob.prototype._readdirEntries = function (abs, entries, cb) { + if (this.aborted) + return + + // if we haven't asked to stat everything, then just + // assume that everything in there exists, so we can avoid + // having to stat it a second time. + if (!this.mark && !this.stat) { + for (var i = 0; i < entries.length; i ++) { + var e = entries[i] + if (abs === '/') + e = abs + e + else + e = abs + '/' + e + this.cache[e] = true + } + } + + this.cache[abs] = entries + return cb(null, entries) +} + +Glob.prototype._readdirError = function (f, er, cb) { + if (this.aborted) + return + + // handle errors, and cache the information + switch (er.code) { + case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 + case 'ENOTDIR': // totally normal. means it *does* exist. + this.cache[this._makeAbs(f)] = 'FILE' + break + + case 'ENOENT': // not terribly unusual + case 'ELOOP': + case 'ENAMETOOLONG': + case 'UNKNOWN': + this.cache[this._makeAbs(f)] = false + break + + default: // some unusual error. Treat as failure. + this.cache[this._makeAbs(f)] = false + if (this.strict) { + this.emit('error', er) + // If the error is handled, then we abort + // if not, we threw out of here + this.abort() + } + if (!this.silent) + console.error('glob error', er) + break + } + + return cb() +} + +Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) { + var self = this + this._readdir(abs, inGlobStar, function (er, entries) { + self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb) + }) +} + + +Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { + //console.error('pgs2', prefix, remain[0], entries) + + // no entries means not a dir, so it can never have matches + // foo.txt/** doesn't match foo.txt + if (!entries) + return cb() + + // test without the globstar, and with every child both below + // and replacing the globstar. + var remainWithoutGlobStar = remain.slice(1) + var gspref = prefix ? [ prefix ] : [] + var noGlobStar = gspref.concat(remainWithoutGlobStar) + + // the noGlobStar pattern exits the inGlobStar state + this._process(noGlobStar, index, false, cb) + + var isSym = this.symlinks[abs] + var len = entries.length + + // If it's a symlink, and we're in a globstar, then stop + if (isSym && inGlobStar) + return cb() + + for (var i = 0; i < len; i++) { + var e = entries[i] + if (e.charAt(0) === '.' && !this.dot) + continue + + // these two cases enter the inGlobStar state + var instead = gspref.concat(entries[i], remainWithoutGlobStar) + this._process(instead, index, true, cb) + + var below = gspref.concat(entries[i], remain) + this._process(below, index, true, cb) + } + + cb() +} + +Glob.prototype._processSimple = function (prefix, index, cb) { + // XXX review this. Shouldn't it be doing the mounting etc + // before doing stat? kinda weird? + var self = this + this._stat(prefix, function (er, exists) { + self._processSimple2(prefix, index, er, exists, cb) + }) +} +Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) { + + //console.error('ps2', prefix, exists) + + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + // If it doesn't exist, then just mark the lack of results + if (!exists) + return cb() + + if (prefix && isAbsolute(prefix) && !this.nomount) { + var trail = /[\/\\]$/.test(prefix) + if (prefix.charAt(0) === '/') { + prefix = path.join(this.root, prefix) + } else { + prefix = path.resolve(this.root, prefix) + if (trail) + prefix += '/' + } + } + + if (process.platform === 'win32') + prefix = prefix.replace(/\\/g, '/') + + // Mark this as a match + this._emitMatch(index, prefix) + cb() +} + +// Returns either 'DIR', 'FILE', or false +Glob.prototype._stat = function (f, cb) { + var abs = this._makeAbs(f) + var needDir = f.slice(-1) === '/' + + if (f.length > this.maxLength) + return cb() + + if (!this.stat && ownProp(this.cache, abs)) { + var c = this.cache[abs] + + if (Array.isArray(c)) + c = 'DIR' + + // It exists, but maybe not how we need it + if (!needDir || c === 'DIR') + return cb(null, c) + + if (needDir && c === 'FILE') + return cb() + + // otherwise we have to stat, because maybe c=true + // if we know it exists, but not what it is. + } + + var exists + var stat = this.statCache[abs] + if (stat !== undefined) { + if (stat === false) + return cb(null, stat) + else { + var type = stat.isDirectory() ? 'DIR' : 'FILE' + if (needDir && type === 'FILE') + return cb() + else + return cb(null, type, stat) + } + } + + var self = this + var statcb = inflight('stat\0' + abs, lstatcb_) + if (statcb) + fs.lstat(abs, statcb) + + function lstatcb_ (er, lstat) { + if (lstat && lstat.isSymbolicLink()) { + // If it's a symlink, then treat it as the target, unless + // the target does not exist, then treat it as a file. + return fs.stat(abs, function (er, stat) { + if (er) + self._stat2(f, abs, null, lstat, cb) + else + self._stat2(f, abs, er, stat, cb) + }) + } else { + self._stat2(f, abs, er, lstat, cb) + } + } +} + +Glob.prototype._stat2 = function (f, abs, er, stat, cb) { + if (er) { + this.statCache[abs] = false + return cb() + } + + var needDir = f.slice(-1) === '/' + this.statCache[abs] = stat + + if (abs.slice(-1) === '/' && !stat.isDirectory()) + return cb(null, false, stat) + + var c = stat.isDirectory() ? 'DIR' : 'FILE' + this.cache[abs] = this.cache[abs] || c + + if (needDir && c !== 'DIR') + return cb() + + return cb(null, c, stat) +} + +}).call(this,require('_process')) +},{"./common.js":15,"./sync.js":17,"_process":24,"assert":9,"events":14,"fs":12,"inflight":18,"inherits":19,"minimatch":20,"once":21,"path":22,"path-is-absolute":23,"util":28}],17:[function(require,module,exports){ +(function (process){ +module.exports = globSync +globSync.GlobSync = GlobSync + +var fs = require('fs') +var minimatch = require('minimatch') +var Minimatch = minimatch.Minimatch +var Glob = require('./glob.js').Glob +var util = require('util') +var path = require('path') +var assert = require('assert') +var isAbsolute = require('path-is-absolute') +var common = require('./common.js') +var alphasort = common.alphasort +var alphasorti = common.alphasorti +var setopts = common.setopts +var ownProp = common.ownProp +var childrenIgnored = common.childrenIgnored + +function globSync (pattern, options) { + if (typeof options === 'function' || arguments.length === 3) + throw new TypeError('callback provided to sync glob\n'+ + 'See: https://github.com/isaacs/node-glob/issues/167') + + return new GlobSync(pattern, options).found +} + +function GlobSync (pattern, options) { + if (!pattern) + throw new Error('must provide pattern') + + if (typeof options === 'function' || arguments.length === 3) + throw new TypeError('callback provided to sync glob\n'+ + 'See: https://github.com/isaacs/node-glob/issues/167') + + if (!(this instanceof GlobSync)) + return new GlobSync(pattern, options) + + setopts(this, pattern, options) + + if (this.noprocess) + return this + + var n = this.minimatch.set.length + this.matches = new Array(n) + for (var i = 0; i < n; i ++) { + this._process(this.minimatch.set[i], i, false) + } + this._finish() +} + +GlobSync.prototype._finish = function () { + assert(this instanceof GlobSync) + if (this.realpath) { + var self = this + this.matches.forEach(function (matchset, index) { + var set = self.matches[index] = Object.create(null) + for (var p in matchset) { + try { + p = self._makeAbs(p) + var real = fs.realpathSync(p, self.realpathCache) + set[real] = true + } catch (er) { + if (er.syscall === 'stat') + set[self._makeAbs(p)] = true + else + throw er + } + } + }) + } + common.finish(this) +} + + +GlobSync.prototype._process = function (pattern, index, inGlobStar) { + assert(this instanceof GlobSync) + + // Get the first [n] parts of pattern that are all strings. + var n = 0 + while (typeof pattern[n] === 'string') { + n ++ + } + // now n is the index of the first one that is *not* a string. + + // See if there's anything else + var prefix + switch (n) { + // if not, then this is rather simple + case pattern.length: + this._processSimple(pattern.join('/'), index) + return + + case 0: + // pattern *starts* with some non-trivial item. + // going to readdir(cwd), but not include the prefix in matches. + prefix = null + break + + default: + // pattern has some string bits in the front. + // whatever it starts with, whether that's 'absolute' like /foo/bar, + // or 'relative' like '../baz' + prefix = pattern.slice(0, n).join('/') + break + } + + var remain = pattern.slice(n) + + // get the list of entries. + var read + if (prefix === null) + read = '.' + else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { + if (!prefix || !isAbsolute(prefix)) + prefix = '/' + prefix + read = prefix + } else + read = prefix + + var abs = this._makeAbs(read) + + //if ignored, skip processing + if (childrenIgnored(this, read)) + return + + var isGlobStar = remain[0] === minimatch.GLOBSTAR + if (isGlobStar) + this._processGlobStar(prefix, read, abs, remain, index, inGlobStar) + else + this._processReaddir(prefix, read, abs, remain, index, inGlobStar) +} + + +GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) { + var entries = this._readdir(abs, inGlobStar) + + // if the abs isn't a dir, then nothing can match! + if (!entries) + return + + // It will only match dot entries if it starts with a dot, or if + // dot is set. Stuff like @(.foo|.bar) isn't allowed. + var pn = remain[0] + var negate = !!this.minimatch.negate + var rawGlob = pn._glob + var dotOk = this.dot || rawGlob.charAt(0) === '.' + + var matchedEntries = [] + for (var i = 0; i < entries.length; i++) { + var e = entries[i] + if (e.charAt(0) !== '.' || dotOk) { + var m + if (negate && !prefix) { + m = !e.match(pn) + } else { + m = e.match(pn) + } + if (m) + matchedEntries.push(e) + } + } + + var len = matchedEntries.length + // If there are no matched entries, then nothing matches. + if (len === 0) + return + + // if this is the last remaining pattern bit, then no need for + // an additional stat *unless* the user has specified mark or + // stat explicitly. We know they exist, since readdir returned + // them. + + if (remain.length === 1 && !this.mark && !this.stat) { + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + if (prefix) { + if (prefix.slice(-1) !== '/') + e = prefix + '/' + e + else + e = prefix + e + } + + if (e.charAt(0) === '/' && !this.nomount) { + e = path.join(this.root, e) + } + this.matches[index][e] = true + } + // This was the last one, and no stats were needed + return + } + + // now test all matched entries as stand-ins for that part + // of the pattern. + remain.shift() + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + var newPattern + if (prefix) + newPattern = [prefix, e] + else + newPattern = [e] + this._process(newPattern.concat(remain), index, inGlobStar) + } +} + + +GlobSync.prototype._emitMatch = function (index, e) { + var abs = this._makeAbs(e) + if (this.mark) + e = this._mark(e) + + if (this.matches[index][e]) + return + + if (this.nodir) { + var c = this.cache[this._makeAbs(e)] + if (c === 'DIR' || Array.isArray(c)) + return + } + + this.matches[index][e] = true + if (this.stat) + this._stat(e) +} + + +GlobSync.prototype._readdirInGlobStar = function (abs) { + // follow all symlinked directories forever + // just proceed as if this is a non-globstar situation + if (this.follow) + return this._readdir(abs, false) + + var entries + var lstat + var stat + try { + lstat = fs.lstatSync(abs) + } catch (er) { + // lstat failed, doesn't exist + return null + } + + var isSym = lstat.isSymbolicLink() + this.symlinks[abs] = isSym + + // If it's not a symlink or a dir, then it's definitely a regular file. + // don't bother doing a readdir in that case. + if (!isSym && !lstat.isDirectory()) + this.cache[abs] = 'FILE' + else + entries = this._readdir(abs, false) + + return entries +} + +GlobSync.prototype._readdir = function (abs, inGlobStar) { + var entries + + if (inGlobStar && !ownProp(this.symlinks, abs)) + return this._readdirInGlobStar(abs) + + if (ownProp(this.cache, abs)) { + var c = this.cache[abs] + if (!c || c === 'FILE') + return null + + if (Array.isArray(c)) + return c + } + + try { + return this._readdirEntries(abs, fs.readdirSync(abs)) + } catch (er) { + this._readdirError(abs, er) + return null + } +} + +GlobSync.prototype._readdirEntries = function (abs, entries) { + // if we haven't asked to stat everything, then just + // assume that everything in there exists, so we can avoid + // having to stat it a second time. + if (!this.mark && !this.stat) { + for (var i = 0; i < entries.length; i ++) { + var e = entries[i] + if (abs === '/') + e = abs + e + else + e = abs + '/' + e + this.cache[e] = true + } + } + + this.cache[abs] = entries + + // mark and cache dir-ness + return entries +} + +GlobSync.prototype._readdirError = function (f, er) { + // handle errors, and cache the information + switch (er.code) { + case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 + case 'ENOTDIR': // totally normal. means it *does* exist. + this.cache[this._makeAbs(f)] = 'FILE' + break + + case 'ENOENT': // not terribly unusual + case 'ELOOP': + case 'ENAMETOOLONG': + case 'UNKNOWN': + this.cache[this._makeAbs(f)] = false + break + + default: // some unusual error. Treat as failure. + this.cache[this._makeAbs(f)] = false + if (this.strict) + throw er + if (!this.silent) + console.error('glob error', er) + break + } +} + +GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) { + + var entries = this._readdir(abs, inGlobStar) + + // no entries means not a dir, so it can never have matches + // foo.txt/** doesn't match foo.txt + if (!entries) + return + + // test without the globstar, and with every child both below + // and replacing the globstar. + var remainWithoutGlobStar = remain.slice(1) + var gspref = prefix ? [ prefix ] : [] + var noGlobStar = gspref.concat(remainWithoutGlobStar) + + // the noGlobStar pattern exits the inGlobStar state + this._process(noGlobStar, index, false) + + var len = entries.length + var isSym = this.symlinks[abs] + + // If it's a symlink, and we're in a globstar, then stop + if (isSym && inGlobStar) + return + + for (var i = 0; i < len; i++) { + var e = entries[i] + if (e.charAt(0) === '.' && !this.dot) + continue + + // these two cases enter the inGlobStar state + var instead = gspref.concat(entries[i], remainWithoutGlobStar) + this._process(instead, index, true) + + var below = gspref.concat(entries[i], remain) + this._process(below, index, true) + } +} + +GlobSync.prototype._processSimple = function (prefix, index) { + // XXX review this. Shouldn't it be doing the mounting etc + // before doing stat? kinda weird? + var exists = this._stat(prefix) + + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + // If it doesn't exist, then just mark the lack of results + if (!exists) + return + + if (prefix && isAbsolute(prefix) && !this.nomount) { + var trail = /[\/\\]$/.test(prefix) + if (prefix.charAt(0) === '/') { + prefix = path.join(this.root, prefix) + } else { + prefix = path.resolve(this.root, prefix) + if (trail) + prefix += '/' + } + } + + if (process.platform === 'win32') + prefix = prefix.replace(/\\/g, '/') + + // Mark this as a match + this.matches[index][prefix] = true +} + +// Returns either 'DIR', 'FILE', or false +GlobSync.prototype._stat = function (f) { + var abs = this._makeAbs(f) + var needDir = f.slice(-1) === '/' + + if (f.length > this.maxLength) + return false + + if (!this.stat && ownProp(this.cache, abs)) { + var c = this.cache[abs] + + if (Array.isArray(c)) + c = 'DIR' + + // It exists, but maybe not how we need it + if (!needDir || c === 'DIR') + return c + + if (needDir && c === 'FILE') + return false + + // otherwise we have to stat, because maybe c=true + // if we know it exists, but not what it is. + } + + var exists + var stat = this.statCache[abs] + if (!stat) { + var lstat + try { + lstat = fs.lstatSync(abs) + } catch (er) { + return false + } + + if (lstat.isSymbolicLink()) { + try { + stat = fs.statSync(abs) + } catch (er) { + stat = lstat + } + } else { + stat = lstat + } + } + + this.statCache[abs] = stat + + var c = stat.isDirectory() ? 'DIR' : 'FILE' + this.cache[abs] = this.cache[abs] || c + + if (needDir && c !== 'DIR') + return false + + return c +} + +GlobSync.prototype._mark = function (p) { + return common.mark(this, p) +} + +GlobSync.prototype._makeAbs = function (f) { + return common.makeAbs(this, f) +} + +}).call(this,require('_process')) +},{"./common.js":15,"./glob.js":16,"_process":24,"assert":9,"fs":12,"minimatch":20,"path":22,"path-is-absolute":23,"util":28}],18:[function(require,module,exports){ +(function (process){ +var wrappy = require('wrappy') +var reqs = Object.create(null) +var once = require('once') + +module.exports = wrappy(inflight) + +function inflight (key, cb) { + if (reqs[key]) { + reqs[key].push(cb) + return null + } else { + reqs[key] = [cb] + return makeres(key) + } +} + +function makeres (key) { + return once(function RES () { + var cbs = reqs[key] + var len = cbs.length + var args = slice(arguments) + + // XXX It's somewhat ambiguous whether a new callback added in this + // pass should be queued for later execution if something in the + // list of callbacks throws, or if it should just be discarded. + // However, it's such an edge case that it hardly matters, and either + // choice is likely as surprising as the other. + // As it happens, we do go ahead and schedule it for later execution. + try { + for (var i = 0; i < len; i++) { + cbs[i].apply(null, args) + } + } finally { + if (cbs.length > len) { + // added more in the interim. + // de-zalgo, just in case, but don't call again. + cbs.splice(0, len) + process.nextTick(function () { + RES.apply(null, args) + }) + } else { + delete reqs[key] + } + } + }) +} + +function slice (args) { + var length = args.length + var array = [] + + for (var i = 0; i < length; i++) array[i] = args[i] + return array +} + +}).call(this,require('_process')) +},{"_process":24,"once":21,"wrappy":29}],19:[function(require,module,exports){ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} + +},{}],20:[function(require,module,exports){ +module.exports = minimatch +minimatch.Minimatch = Minimatch + +var path = { sep: '/' } +try { + path = require('path') +} catch (er) {} + +var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {} +var expand = require('brace-expansion') + +var plTypes = { + '!': { open: '(?:(?!(?:', close: '))[^/]*?)'}, + '?': { open: '(?:', close: ')?' }, + '+': { open: '(?:', close: ')+' }, + '*': { open: '(?:', close: ')*' }, + '@': { open: '(?:', close: ')' } +} + +// any single thing other than / +// don't need to escape / when using new RegExp() +var qmark = '[^/]' + +// * => any number of characters +var star = qmark + '*?' + +// ** when dots are allowed. Anything goes, except .. and . +// not (^ or / followed by one or two dots followed by $ or /), +// followed by anything, any number of times. +var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?' + +// not a ^ or / followed by a dot, +// followed by anything, any number of times. +var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?' + +// characters that need to be escaped in RegExp. +var reSpecials = charSet('().*{}+?[]^$\\!') + +// "abc" -> { a:true, b:true, c:true } +function charSet (s) { + return s.split('').reduce(function (set, c) { + set[c] = true + return set + }, {}) +} + +// normalizes slashes. +var slashSplit = /\/+/ + +minimatch.filter = filter +function filter (pattern, options) { + options = options || {} + return function (p, i, list) { + return minimatch(p, pattern, options) + } +} + +function ext (a, b) { + a = a || {} + b = b || {} + var t = {} + Object.keys(b).forEach(function (k) { + t[k] = b[k] + }) + Object.keys(a).forEach(function (k) { + t[k] = a[k] + }) + return t +} + +minimatch.defaults = function (def) { + if (!def || !Object.keys(def).length) return minimatch + + var orig = minimatch + + var m = function minimatch (p, pattern, options) { + return orig.minimatch(p, pattern, ext(def, options)) + } + + m.Minimatch = function Minimatch (pattern, options) { + return new orig.Minimatch(pattern, ext(def, options)) + } + + return m +} + +Minimatch.defaults = function (def) { + if (!def || !Object.keys(def).length) return Minimatch + return minimatch.defaults(def).Minimatch +} + +function minimatch (p, pattern, options) { + if (typeof pattern !== 'string') { + throw new TypeError('glob pattern string required') + } + + if (!options) options = {} + + // shortcut: comments match nothing. + if (!options.nocomment && pattern.charAt(0) === '#') { + return false + } + + // "" only matches "" + if (pattern.trim() === '') return p === '' + + return new Minimatch(pattern, options).match(p) +} + +function Minimatch (pattern, options) { + if (!(this instanceof Minimatch)) { + return new Minimatch(pattern, options) + } + + if (typeof pattern !== 'string') { + throw new TypeError('glob pattern string required') + } + + if (!options) options = {} + pattern = pattern.trim() + + // windows support: need to use /, not \ + if (path.sep !== '/') { + pattern = pattern.split(path.sep).join('/') + } + + this.options = options + this.set = [] + this.pattern = pattern + this.regexp = null + this.negate = false + this.comment = false + this.empty = false + + // make the set of regexps etc. + this.make() +} + +Minimatch.prototype.debug = function () {} + +Minimatch.prototype.make = make +function make () { + // don't do it more than once. + if (this._made) return + + var pattern = this.pattern + var options = this.options + + // empty patterns and comments match nothing. + if (!options.nocomment && pattern.charAt(0) === '#') { + this.comment = true + return + } + if (!pattern) { + this.empty = true + return + } + + // step 1: figure out negation, etc. + this.parseNegate() + + // step 2: expand braces + var set = this.globSet = this.braceExpand() + + if (options.debug) this.debug = console.error + + this.debug(this.pattern, set) + + // step 3: now we have a set, so turn each one into a series of path-portion + // matching patterns. + // These will be regexps, except in the case of "**", which is + // set to the GLOBSTAR object for globstar behavior, + // and will not contain any / characters + set = this.globParts = set.map(function (s) { + return s.split(slashSplit) + }) + + this.debug(this.pattern, set) + + // glob --> regexps + set = set.map(function (s, si, set) { + return s.map(this.parse, this) + }, this) + + this.debug(this.pattern, set) + + // filter out everything that didn't compile properly. + set = set.filter(function (s) { + return s.indexOf(false) === -1 + }) + + this.debug(this.pattern, set) + + this.set = set +} + +Minimatch.prototype.parseNegate = parseNegate +function parseNegate () { + var pattern = this.pattern + var negate = false + var options = this.options + var negateOffset = 0 + + if (options.nonegate) return + + for (var i = 0, l = pattern.length + ; i < l && pattern.charAt(i) === '!' + ; i++) { + negate = !negate + negateOffset++ + } + + if (negateOffset) this.pattern = pattern.substr(negateOffset) + this.negate = negate +} + +// Brace expansion: +// a{b,c}d -> abd acd +// a{b,}c -> abc ac +// a{0..3}d -> a0d a1d a2d a3d +// a{b,c{d,e}f}g -> abg acdfg acefg +// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg +// +// Invalid sets are not expanded. +// a{2..}b -> a{2..}b +// a{b}c -> a{b}c +minimatch.braceExpand = function (pattern, options) { + return braceExpand(pattern, options) +} + +Minimatch.prototype.braceExpand = braceExpand + +function braceExpand (pattern, options) { + if (!options) { + if (this instanceof Minimatch) { + options = this.options + } else { + options = {} + } + } + + pattern = typeof pattern === 'undefined' + ? this.pattern : pattern + + if (typeof pattern === 'undefined') { + throw new TypeError('undefined pattern') + } + + if (options.nobrace || + !pattern.match(/\{.*\}/)) { + // shortcut. no need to expand. + return [pattern] + } + + return expand(pattern) +} + +// parse a component of the expanded set. +// At this point, no pattern may contain "/" in it +// so we're going to return a 2d array, where each entry is the full +// pattern, split on '/', and then turned into a regular expression. +// A regexp is made at the end which joins each array with an +// escaped /, and another full one which joins each regexp with |. +// +// Following the lead of Bash 4.1, note that "**" only has special meaning +// when it is the *only* thing in a path portion. Otherwise, any series +// of * is equivalent to a single *. Globstar behavior is enabled by +// default, and can be disabled by setting options.noglobstar. +Minimatch.prototype.parse = parse +var SUBPARSE = {} +function parse (pattern, isSub) { + if (pattern.length > 1024 * 64) { + throw new TypeError('pattern is too long') + } + + var options = this.options + + // shortcuts + if (!options.noglobstar && pattern === '**') return GLOBSTAR + if (pattern === '') return '' + + var re = '' + var hasMagic = !!options.nocase + var escaping = false + // ? => one single character + var patternListStack = [] + var negativeLists = [] + var stateChar + var inClass = false + var reClassStart = -1 + var classStart = -1 + // . and .. never match anything that doesn't start with ., + // even when options.dot is set. + var patternStart = pattern.charAt(0) === '.' ? '' // anything + // not (start or / followed by . or .. followed by / or end) + : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))' + : '(?!\\.)' + var self = this + + function clearStateChar () { + if (stateChar) { + // we had some state-tracking character + // that wasn't consumed by this pass. + switch (stateChar) { + case '*': + re += star + hasMagic = true + break + case '?': + re += qmark + hasMagic = true + break + default: + re += '\\' + stateChar + break + } + self.debug('clearStateChar %j %j', stateChar, re) + stateChar = false + } + } + + for (var i = 0, len = pattern.length, c + ; (i < len) && (c = pattern.charAt(i)) + ; i++) { + this.debug('%s\t%s %s %j', pattern, i, re, c) + + // skip over any that are escaped. + if (escaping && reSpecials[c]) { + re += '\\' + c + escaping = false + continue + } + + switch (c) { + case '/': + // completely not allowed, even escaped. + // Should already be path-split by now. + return false + + case '\\': + clearStateChar() + escaping = true + continue + + // the various stateChar values + // for the "extglob" stuff. + case '?': + case '*': + case '+': + case '@': + case '!': + this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c) + + // all of those are literals inside a class, except that + // the glob [!a] means [^a] in regexp + if (inClass) { + this.debug(' in class') + if (c === '!' && i === classStart + 1) c = '^' + re += c + continue + } + + // if we already have a stateChar, then it means + // that there was something like ** or +? in there. + // Handle the stateChar, then proceed with this one. + self.debug('call clearStateChar %j', stateChar) + clearStateChar() + stateChar = c + // if extglob is disabled, then +(asdf|foo) isn't a thing. + // just clear the statechar *now*, rather than even diving into + // the patternList stuff. + if (options.noext) clearStateChar() + continue + + case '(': + if (inClass) { + re += '(' + continue + } + + if (!stateChar) { + re += '\\(' + continue + } + + patternListStack.push({ + type: stateChar, + start: i - 1, + reStart: re.length, + open: plTypes[stateChar].open, + close: plTypes[stateChar].close + }) + // negation is (?:(?!js)[^/]*) + re += stateChar === '!' ? '(?:(?!(?:' : '(?:' + this.debug('plType %j %j', stateChar, re) + stateChar = false + continue + + case ')': + if (inClass || !patternListStack.length) { + re += '\\)' + continue + } + + clearStateChar() + hasMagic = true + var pl = patternListStack.pop() + // negation is (?:(?!js)[^/]*) + // The others are (?:) + re += pl.close + if (pl.type === '!') { + negativeLists.push(pl) + } + pl.reEnd = re.length + continue + + case '|': + if (inClass || !patternListStack.length || escaping) { + re += '\\|' + escaping = false + continue + } + + clearStateChar() + re += '|' + continue + + // these are mostly the same in regexp and glob + case '[': + // swallow any state-tracking char before the [ + clearStateChar() + + if (inClass) { + re += '\\' + c + continue + } + + inClass = true + classStart = i + reClassStart = re.length + re += c + continue + + case ']': + // a right bracket shall lose its special + // meaning and represent itself in + // a bracket expression if it occurs + // first in the list. -- POSIX.2 2.8.3.2 + if (i === classStart + 1 || !inClass) { + re += '\\' + c + escaping = false + continue + } + + // handle the case where we left a class open. + // "[z-a]" is valid, equivalent to "\[z-a\]" + if (inClass) { + // split where the last [ was, make sure we don't have + // an invalid re. if so, re-walk the contents of the + // would-be class to re-translate any characters that + // were passed through as-is + // TODO: It would probably be faster to determine this + // without a try/catch and a new RegExp, but it's tricky + // to do safely. For now, this is safe and works. + var cs = pattern.substring(classStart + 1, i) + try { + RegExp('[' + cs + ']') + } catch (er) { + // not a valid class! + var sp = this.parse(cs, SUBPARSE) + re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]' + hasMagic = hasMagic || sp[1] + inClass = false + continue + } + } + + // finish up the class. + hasMagic = true + inClass = false + re += c + continue + + default: + // swallow any state char that wasn't consumed + clearStateChar() + + if (escaping) { + // no need + escaping = false + } else if (reSpecials[c] + && !(c === '^' && inClass)) { + re += '\\' + } + + re += c + + } // switch + } // for + + // handle the case where we left a class open. + // "[abc" is valid, equivalent to "\[abc" + if (inClass) { + // split where the last [ was, and escape it + // this is a huge pita. We now have to re-walk + // the contents of the would-be class to re-translate + // any characters that were passed through as-is + cs = pattern.substr(classStart + 1) + sp = this.parse(cs, SUBPARSE) + re = re.substr(0, reClassStart) + '\\[' + sp[0] + hasMagic = hasMagic || sp[1] + } + + // handle the case where we had a +( thing at the *end* + // of the pattern. + // each pattern list stack adds 3 chars, and we need to go through + // and escape any | chars that were passed through as-is for the regexp. + // Go through and escape them, taking care not to double-escape any + // | chars that were already escaped. + for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) { + var tail = re.slice(pl.reStart + pl.open.length) + this.debug('setting tail', re, pl) + // maybe some even number of \, then maybe 1 \, followed by a | + tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) { + if (!$2) { + // the | isn't already escaped, so escape it. + $2 = '\\' + } + + // need to escape all those slashes *again*, without escaping the + // one that we need for escaping the | character. As it works out, + // escaping an even number of slashes can be done by simply repeating + // it exactly after itself. That's why this trick works. + // + // I am sorry that you have to see this. + return $1 + $1 + $2 + '|' + }) + + this.debug('tail=%j\n %s', tail, tail, pl, re) + var t = pl.type === '*' ? star + : pl.type === '?' ? qmark + : '\\' + pl.type + + hasMagic = true + re = re.slice(0, pl.reStart) + t + '\\(' + tail + } + + // handle trailing things that only matter at the very end. + clearStateChar() + if (escaping) { + // trailing \\ + re += '\\\\' + } + + // only need to apply the nodot start if the re starts with + // something that could conceivably capture a dot + var addPatternStart = false + switch (re.charAt(0)) { + case '.': + case '[': + case '(': addPatternStart = true + } + + // Hack to work around lack of negative lookbehind in JS + // A pattern like: *.!(x).!(y|z) needs to ensure that a name + // like 'a.xyz.yz' doesn't match. So, the first negative + // lookahead, has to look ALL the way ahead, to the end of + // the pattern. + for (var n = negativeLists.length - 1; n > -1; n--) { + var nl = negativeLists[n] + + var nlBefore = re.slice(0, nl.reStart) + var nlFirst = re.slice(nl.reStart, nl.reEnd - 8) + var nlLast = re.slice(nl.reEnd - 8, nl.reEnd) + var nlAfter = re.slice(nl.reEnd) + + nlLast += nlAfter + + // Handle nested stuff like *(*.js|!(*.json)), where open parens + // mean that we should *not* include the ) in the bit that is considered + // "after" the negated section. + var openParensBefore = nlBefore.split('(').length - 1 + var cleanAfter = nlAfter + for (i = 0; i < openParensBefore; i++) { + cleanAfter = cleanAfter.replace(/\)[+*?]?/, '') + } + nlAfter = cleanAfter + + var dollar = '' + if (nlAfter === '' && isSub !== SUBPARSE) { + dollar = '$' + } + var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast + re = newRe + } + + // if the re is not "" at this point, then we need to make sure + // it doesn't match against an empty path part. + // Otherwise a/* will match a/, which it should not. + if (re !== '' && hasMagic) { + re = '(?=.)' + re + } + + if (addPatternStart) { + re = patternStart + re + } + + // parsing just a piece of a larger pattern. + if (isSub === SUBPARSE) { + return [re, hasMagic] + } + + // skip the regexp for non-magical patterns + // unescape anything in it, though, so that it'll be + // an exact match against a file etc. + if (!hasMagic) { + return globUnescape(pattern) + } + + var flags = options.nocase ? 'i' : '' + try { + var regExp = new RegExp('^' + re + '$', flags) + } catch (er) { + // If it was an invalid regular expression, then it can't match + // anything. This trick looks for a character after the end of + // the string, which is of course impossible, except in multi-line + // mode, but it's not a /m regex. + return new RegExp('$.') + } + + regExp._glob = pattern + regExp._src = re + + return regExp +} + +minimatch.makeRe = function (pattern, options) { + return new Minimatch(pattern, options || {}).makeRe() +} + +Minimatch.prototype.makeRe = makeRe +function makeRe () { + if (this.regexp || this.regexp === false) return this.regexp + + // at this point, this.set is a 2d array of partial + // pattern strings, or "**". + // + // It's better to use .match(). This function shouldn't + // be used, really, but it's pretty convenient sometimes, + // when you just want to work with a regex. + var set = this.set + + if (!set.length) { + this.regexp = false + return this.regexp + } + var options = this.options + + var twoStar = options.noglobstar ? star + : options.dot ? twoStarDot + : twoStarNoDot + var flags = options.nocase ? 'i' : '' + + var re = set.map(function (pattern) { + return pattern.map(function (p) { + return (p === GLOBSTAR) ? twoStar + : (typeof p === 'string') ? regExpEscape(p) + : p._src + }).join('\\\/') + }).join('|') + + // must match entire pattern + // ending in a * or ** will make it less strict. + re = '^(?:' + re + ')$' + + // can match anything, as long as it's not this. + if (this.negate) re = '^(?!' + re + ').*$' + + try { + this.regexp = new RegExp(re, flags) + } catch (ex) { + this.regexp = false + } + return this.regexp +} + +minimatch.match = function (list, pattern, options) { + options = options || {} + var mm = new Minimatch(pattern, options) + list = list.filter(function (f) { + return mm.match(f) + }) + if (mm.options.nonull && !list.length) { + list.push(pattern) + } + return list +} + +Minimatch.prototype.match = match +function match (f, partial) { + this.debug('match', f, this.pattern) + // short-circuit in the case of busted things. + // comments, etc. + if (this.comment) return false + if (this.empty) return f === '' + + if (f === '/' && partial) return true + + var options = this.options + + // windows: need to use /, not \ + if (path.sep !== '/') { + f = f.split(path.sep).join('/') + } + + // treat the test path as a set of pathparts. + f = f.split(slashSplit) + this.debug(this.pattern, 'split', f) + + // just ONE of the pattern sets in this.set needs to match + // in order for it to be valid. If negating, then just one + // match means that we have failed. + // Either way, return on the first hit. + + var set = this.set + this.debug(this.pattern, 'set', set) + + // Find the basename of the path by looking for the last non-empty segment + var filename + var i + for (i = f.length - 1; i >= 0; i--) { + filename = f[i] + if (filename) break + } + + for (i = 0; i < set.length; i++) { + var pattern = set[i] + var file = f + if (options.matchBase && pattern.length === 1) { + file = [filename] + } + var hit = this.matchOne(file, pattern, partial) + if (hit) { + if (options.flipNegate) return true + return !this.negate + } + } + + // didn't get any hits. this is success if it's a negative + // pattern, failure otherwise. + if (options.flipNegate) return false + return this.negate +} + +// set partial to true to test if, for example, +// "/a/b" matches the start of "/*/b/*/d" +// Partial means, if you run out of file before you run +// out of pattern, then that's fine, as long as all +// the parts match. +Minimatch.prototype.matchOne = function (file, pattern, partial) { + var options = this.options + + this.debug('matchOne', + { 'this': this, file: file, pattern: pattern }) + + this.debug('matchOne', file.length, pattern.length) + + for (var fi = 0, + pi = 0, + fl = file.length, + pl = pattern.length + ; (fi < fl) && (pi < pl) + ; fi++, pi++) { + this.debug('matchOne loop') + var p = pattern[pi] + var f = file[fi] + + this.debug(pattern, p, f) + + // should be impossible. + // some invalid regexp stuff in the set. + if (p === false) return false + + if (p === GLOBSTAR) { + this.debug('GLOBSTAR', [pattern, p, f]) + + // "**" + // a/**/b/**/c would match the following: + // a/b/x/y/z/c + // a/x/y/z/b/c + // a/b/x/b/x/c + // a/b/c + // To do this, take the rest of the pattern after + // the **, and see if it would match the file remainder. + // If so, return success. + // If not, the ** "swallows" a segment, and try again. + // This is recursively awful. + // + // a/**/b/**/c matching a/b/x/y/z/c + // - a matches a + // - doublestar + // - matchOne(b/x/y/z/c, b/**/c) + // - b matches b + // - doublestar + // - matchOne(x/y/z/c, c) -> no + // - matchOne(y/z/c, c) -> no + // - matchOne(z/c, c) -> no + // - matchOne(c, c) yes, hit + var fr = fi + var pr = pi + 1 + if (pr === pl) { + this.debug('** at the end') + // a ** at the end will just swallow the rest. + // We have found a match. + // however, it will not swallow /.x, unless + // options.dot is set. + // . and .. are *never* matched by **, for explosively + // exponential reasons. + for (; fi < fl; fi++) { + if (file[fi] === '.' || file[fi] === '..' || + (!options.dot && file[fi].charAt(0) === '.')) return false + } + return true + } + + // ok, let's see if we can swallow whatever we can. + while (fr < fl) { + var swallowee = file[fr] + + this.debug('\nglobstar while', file, fr, pattern, pr, swallowee) + + // XXX remove this slice. Just pass the start index. + if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { + this.debug('globstar found match!', fr, fl, swallowee) + // found a match. + return true + } else { + // can't swallow "." or ".." ever. + // can only swallow ".foo" when explicitly asked. + if (swallowee === '.' || swallowee === '..' || + (!options.dot && swallowee.charAt(0) === '.')) { + this.debug('dot detected!', file, fr, pattern, pr) + break + } + + // ** swallows a segment, and continue. + this.debug('globstar swallow a segment, and continue') + fr++ + } + } + + // no match was found. + // However, in partial mode, we can't say this is necessarily over. + // If there's more *pattern* left, then + if (partial) { + // ran out of file + this.debug('\n>>> no match, partial?', file, fr, pattern, pr) + if (fr === fl) return true + } + return false + } + + // something other than ** + // non-magic patterns just have to match exactly + // patterns with magic have been turned into regexps. + var hit + if (typeof p === 'string') { + if (options.nocase) { + hit = f.toLowerCase() === p.toLowerCase() + } else { + hit = f === p + } + this.debug('string match', p, f, hit) + } else { + hit = f.match(p) + this.debug('pattern match', p, f, hit) + } + + if (!hit) return false + } + + // Note: ending in / means that we'll get a final "" + // at the end of the pattern. This can only match a + // corresponding "" at the end of the file. + // If the file ends in /, then it can only match a + // a pattern that ends in /, unless the pattern just + // doesn't have any more for it. But, a/b/ should *not* + // match "a/b/*", even though "" matches against the + // [^/]*? pattern, except in partial mode, where it might + // simply not be reached yet. + // However, a/b/ should still satisfy a/* + + // now either we fell off the end of the pattern, or we're done. + if (fi === fl && pi === pl) { + // ran out of pattern and filename at the same time. + // an exact hit! + return true + } else if (fi === fl) { + // ran out of file, but still had pattern left. + // this is ok if we're doing the match as part of + // a glob fs traversal. + return partial + } else if (pi === pl) { + // ran out of pattern, still have file left. + // this is only acceptable if we're on the very last + // empty segment of a file with a trailing slash. + // a/* should match a/b/ + var emptyFileEnd = (fi === fl - 1) && (file[fi] === '') + return emptyFileEnd + } + + // should be unreachable. + throw new Error('wtf?') +} + +// replace stuff like \* with * +function globUnescape (s) { + return s.replace(/\\(.)/g, '$1') +} + +function regExpEscape (s) { + return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') +} + +},{"brace-expansion":11,"path":22}],21:[function(require,module,exports){ +var wrappy = require('wrappy') +module.exports = wrappy(once) +module.exports.strict = wrappy(onceStrict) + +once.proto = once(function () { + Object.defineProperty(Function.prototype, 'once', { + value: function () { + return once(this) + }, + configurable: true + }) + + Object.defineProperty(Function.prototype, 'onceStrict', { + value: function () { + return onceStrict(this) + }, + configurable: true + }) +}) + +function once (fn) { + var f = function () { + if (f.called) return f.value + f.called = true + return f.value = fn.apply(this, arguments) + } + f.called = false + return f +} + +function onceStrict (fn) { + var f = function () { + if (f.called) + throw new Error(f.onceError) + f.called = true + return f.value = fn.apply(this, arguments) + } + var name = fn.name || 'Function wrapped with `once`' + f.onceError = name + " shouldn't be called more than once" + f.called = false + return f +} + +},{"wrappy":29}],22:[function(require,module,exports){ +(function (process){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// resolves . and .. elements in a path array with directory names there +// must be no slashes, empty elements, or device names (c:\) in the array +// (so also no leading and trailing slashes - it does not distinguish +// relative and absolute paths) +function normalizeArray(parts, allowAboveRoot) { + // if the path tries to go above the root, `up` ends up > 0 + var up = 0; + for (var i = parts.length - 1; i >= 0; i--) { + var last = parts[i]; + if (last === '.') { + parts.splice(i, 1); + } else if (last === '..') { + parts.splice(i, 1); + up++; + } else if (up) { + parts.splice(i, 1); + up--; + } + } + + // if the path is allowed to go above the root, restore leading ..s + if (allowAboveRoot) { + for (; up--; up) { + parts.unshift('..'); + } + } + + return parts; +} + +// Split a filename into [root, dir, basename, ext], unix version +// 'root' is just a slash, or nothing. +var splitPathRe = + /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; +var splitPath = function(filename) { + return splitPathRe.exec(filename).slice(1); +}; + +// path.resolve([from ...], to) +// posix version +exports.resolve = function() { + var resolvedPath = '', + resolvedAbsolute = false; + + for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { + var path = (i >= 0) ? arguments[i] : process.cwd(); + + // Skip empty and invalid entries + if (typeof path !== 'string') { + throw new TypeError('Arguments to path.resolve must be strings'); + } else if (!path) { + continue; + } + + resolvedPath = path + '/' + resolvedPath; + resolvedAbsolute = path.charAt(0) === '/'; + } + + // At this point the path should be resolved to a full absolute path, but + // handle relative paths to be safe (might happen when process.cwd() fails) + + // Normalize the path + resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) { + return !!p; + }), !resolvedAbsolute).join('/'); + + return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; +}; + +// path.normalize(path) +// posix version +exports.normalize = function(path) { + var isAbsolute = exports.isAbsolute(path), + trailingSlash = substr(path, -1) === '/'; + + // Normalize the path + path = normalizeArray(filter(path.split('/'), function(p) { + return !!p; + }), !isAbsolute).join('/'); + + if (!path && !isAbsolute) { + path = '.'; + } + if (path && trailingSlash) { + path += '/'; + } + + return (isAbsolute ? '/' : '') + path; +}; + +// posix version +exports.isAbsolute = function(path) { + return path.charAt(0) === '/'; +}; + +// posix version +exports.join = function() { + var paths = Array.prototype.slice.call(arguments, 0); + return exports.normalize(filter(paths, function(p, index) { + if (typeof p !== 'string') { + throw new TypeError('Arguments to path.join must be strings'); + } + return p; + }).join('/')); +}; + + +// path.relative(from, to) +// posix version +exports.relative = function(from, to) { + from = exports.resolve(from).substr(1); + to = exports.resolve(to).substr(1); + + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + + var end = arr.length - 1; + for (; end >= 0; end--) { + if (arr[end] !== '') break; + } + + if (start > end) return []; + return arr.slice(start, end - start + 1); + } + + var fromParts = trim(from.split('/')); + var toParts = trim(to.split('/')); + + var length = Math.min(fromParts.length, toParts.length); + var samePartsLength = length; + for (var i = 0; i < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + + return outputParts.join('/'); +}; + +exports.sep = '/'; +exports.delimiter = ':'; + +exports.dirname = function(path) { + var result = splitPath(path), + root = result[0], + dir = result[1]; + + if (!root && !dir) { + // No dirname whatsoever + return '.'; + } + + if (dir) { + // It has a dirname, strip trailing slash + dir = dir.substr(0, dir.length - 1); + } + + return root + dir; +}; + + +exports.basename = function(path, ext) { + var f = splitPath(path)[2]; + // TODO: make this comparison case-insensitive on windows? + if (ext && f.substr(-1 * ext.length) === ext) { + f = f.substr(0, f.length - ext.length); + } + return f; +}; + + +exports.extname = function(path) { + return splitPath(path)[3]; +}; + +function filter (xs, f) { + if (xs.filter) return xs.filter(f); + var res = []; + for (var i = 0; i < xs.length; i++) { + if (f(xs[i], i, xs)) res.push(xs[i]); + } + return res; +} + +// String.prototype.substr - negative index don't work in IE8 +var substr = 'ab'.substr(-1) === 'b' + ? function (str, start, len) { return str.substr(start, len) } + : function (str, start, len) { + if (start < 0) start = str.length + start; + return str.substr(start, len); + } +; + +}).call(this,require('_process')) +},{"_process":24}],23:[function(require,module,exports){ +(function (process){ +'use strict'; + +function posix(path) { + return path.charAt(0) === '/'; +} + +function win32(path) { + // https://github.com/nodejs/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56 + var splitDeviceRe = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/; + var result = splitDeviceRe.exec(path); + var device = result[1] || ''; + var isUnc = Boolean(device && device.charAt(1) !== ':'); + + // UNC paths are always absolute + return Boolean(result[2] || isUnc); +} + +module.exports = process.platform === 'win32' ? win32 : posix; +module.exports.posix = posix; +module.exports.win32 = win32; + +}).call(this,require('_process')) +},{"_process":24}],24:[function(require,module,exports){ +// shim for using process in browser +var process = module.exports = {}; + +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. + +var cachedSetTimeout; +var cachedClearTimeout; + +function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); +} +function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); +} +(function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } +} ()) +function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + +} +function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + + +} +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } +} + +function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); +} + +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; +process.prependListener = noop; +process.prependOnceListener = noop; + +process.listeners = function (name) { return [] } + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + +},{}],25:[function(require,module,exports){ +// Underscore.js 1.8.3 +// http://underscorejs.org +// (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. + +(function() { + + // Baseline setup + // -------------- + + // Establish the root object, `window` in the browser, or `exports` on the server. + var root = this; + + // Save the previous value of the `_` variable. + var previousUnderscore = root._; + + // Save bytes in the minified (but not gzipped) version: + var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype; + + // Create quick reference variables for speed access to core prototypes. + var + push = ArrayProto.push, + slice = ArrayProto.slice, + toString = ObjProto.toString, + hasOwnProperty = ObjProto.hasOwnProperty; + + // All **ECMAScript 5** native function implementations that we hope to use + // are declared here. + var + nativeIsArray = Array.isArray, + nativeKeys = Object.keys, + nativeBind = FuncProto.bind, + nativeCreate = Object.create; + + // Naked function reference for surrogate-prototype-swapping. + var Ctor = function(){}; + + // Create a safe reference to the Underscore object for use below. + var _ = function(obj) { + if (obj instanceof _) return obj; + if (!(this instanceof _)) return new _(obj); + this._wrapped = obj; + }; + + // Export the Underscore object for **Node.js**, with + // backwards-compatibility for the old `require()` API. If we're in + // the browser, add `_` as a global object. + if (typeof exports !== 'undefined') { + if (typeof module !== 'undefined' && module.exports) { + exports = module.exports = _; + } + exports._ = _; + } else { + root._ = _; + } + + // Current version. + _.VERSION = '1.8.3'; + + // Internal function that returns an efficient (for current engines) version + // of the passed-in callback, to be repeatedly applied in other Underscore + // functions. + var optimizeCb = function(func, context, argCount) { + if (context === void 0) return func; + switch (argCount == null ? 3 : argCount) { + case 1: return function(value) { + return func.call(context, value); + }; + case 2: return function(value, other) { + return func.call(context, value, other); + }; + case 3: return function(value, index, collection) { + return func.call(context, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(context, accumulator, value, index, collection); + }; + } + return function() { + return func.apply(context, arguments); + }; + }; + + // A mostly-internal function to generate callbacks that can be applied + // to each element in a collection, returning the desired result — either + // identity, an arbitrary callback, a property matcher, or a property accessor. + var cb = function(value, context, argCount) { + if (value == null) return _.identity; + if (_.isFunction(value)) return optimizeCb(value, context, argCount); + if (_.isObject(value)) return _.matcher(value); + return _.property(value); + }; + _.iteratee = function(value, context) { + return cb(value, context, Infinity); + }; + + // An internal function for creating assigner functions. + var createAssigner = function(keysFunc, undefinedOnly) { + return function(obj) { + var length = arguments.length; + if (length < 2 || obj == null) return obj; + for (var index = 1; index < length; index++) { + var source = arguments[index], + keys = keysFunc(source), + l = keys.length; + for (var i = 0; i < l; i++) { + var key = keys[i]; + if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key]; + } + } + return obj; + }; + }; + + // An internal function for creating a new object that inherits from another. + var baseCreate = function(prototype) { + if (!_.isObject(prototype)) return {}; + if (nativeCreate) return nativeCreate(prototype); + Ctor.prototype = prototype; + var result = new Ctor; + Ctor.prototype = null; + return result; + }; + + var property = function(key) { + return function(obj) { + return obj == null ? void 0 : obj[key]; + }; + }; + + // Helper for collection methods to determine whether a collection + // should be iterated as an array or as an object + // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength + // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094 + var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; + var getLength = property('length'); + var isArrayLike = function(collection) { + var length = getLength(collection); + return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX; + }; + + // Collection Functions + // -------------------- + + // The cornerstone, an `each` implementation, aka `forEach`. + // Handles raw objects in addition to array-likes. Treats all + // sparse array-likes as if they were dense. + _.each = _.forEach = function(obj, iteratee, context) { + iteratee = optimizeCb(iteratee, context); + var i, length; + if (isArrayLike(obj)) { + for (i = 0, length = obj.length; i < length; i++) { + iteratee(obj[i], i, obj); + } + } else { + var keys = _.keys(obj); + for (i = 0, length = keys.length; i < length; i++) { + iteratee(obj[keys[i]], keys[i], obj); + } + } + return obj; + }; + + // Return the results of applying the iteratee to each element. + _.map = _.collect = function(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length, + results = Array(length); + for (var index = 0; index < length; index++) { + var currentKey = keys ? keys[index] : index; + results[index] = iteratee(obj[currentKey], currentKey, obj); + } + return results; + }; + + // Create a reducing function iterating left or right. + function createReduce(dir) { + // Optimized iterator function as using arguments.length + // in the main function will deoptimize the, see #1991. + function iterator(obj, iteratee, memo, keys, index, length) { + for (; index >= 0 && index < length; index += dir) { + var currentKey = keys ? keys[index] : index; + memo = iteratee(memo, obj[currentKey], currentKey, obj); + } + return memo; + } + + return function(obj, iteratee, memo, context) { + iteratee = optimizeCb(iteratee, context, 4); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length, + index = dir > 0 ? 0 : length - 1; + // Determine the initial value if none is provided. + if (arguments.length < 3) { + memo = obj[keys ? keys[index] : index]; + index += dir; + } + return iterator(obj, iteratee, memo, keys, index, length); + }; + } + + // **Reduce** builds up a single result from a list of values, aka `inject`, + // or `foldl`. + _.reduce = _.foldl = _.inject = createReduce(1); + + // The right-associative version of reduce, also known as `foldr`. + _.reduceRight = _.foldr = createReduce(-1); + + // Return the first value which passes a truth test. Aliased as `detect`. + _.find = _.detect = function(obj, predicate, context) { + var key; + if (isArrayLike(obj)) { + key = _.findIndex(obj, predicate, context); + } else { + key = _.findKey(obj, predicate, context); + } + if (key !== void 0 && key !== -1) return obj[key]; + }; + + // Return all the elements that pass a truth test. + // Aliased as `select`. + _.filter = _.select = function(obj, predicate, context) { + var results = []; + predicate = cb(predicate, context); + _.each(obj, function(value, index, list) { + if (predicate(value, index, list)) results.push(value); + }); + return results; + }; + + // Return all the elements for which a truth test fails. + _.reject = function(obj, predicate, context) { + return _.filter(obj, _.negate(cb(predicate)), context); + }; + + // Determine whether all of the elements match a truth test. + // Aliased as `all`. + _.every = _.all = function(obj, predicate, context) { + predicate = cb(predicate, context); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = keys ? keys[index] : index; + if (!predicate(obj[currentKey], currentKey, obj)) return false; + } + return true; + }; + + // Determine if at least one element in the object matches a truth test. + // Aliased as `any`. + _.some = _.any = function(obj, predicate, context) { + predicate = cb(predicate, context); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = keys ? keys[index] : index; + if (predicate(obj[currentKey], currentKey, obj)) return true; + } + return false; + }; + + // Determine if the array or object contains a given item (using `===`). + // Aliased as `includes` and `include`. + _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) { + if (!isArrayLike(obj)) obj = _.values(obj); + if (typeof fromIndex != 'number' || guard) fromIndex = 0; + return _.indexOf(obj, item, fromIndex) >= 0; + }; + + // Invoke a method (with arguments) on every item in a collection. + _.invoke = function(obj, method) { + var args = slice.call(arguments, 2); + var isFunc = _.isFunction(method); + return _.map(obj, function(value) { + var func = isFunc ? method : value[method]; + return func == null ? func : func.apply(value, args); + }); + }; + + // Convenience version of a common use case of `map`: fetching a property. + _.pluck = function(obj, key) { + return _.map(obj, _.property(key)); + }; + + // Convenience version of a common use case of `filter`: selecting only objects + // containing specific `key:value` pairs. + _.where = function(obj, attrs) { + return _.filter(obj, _.matcher(attrs)); + }; + + // Convenience version of a common use case of `find`: getting the first object + // containing specific `key:value` pairs. + _.findWhere = function(obj, attrs) { + return _.find(obj, _.matcher(attrs)); + }; + + // Return the maximum element (or element-based computation). + _.max = function(obj, iteratee, context) { + var result = -Infinity, lastComputed = -Infinity, + value, computed; + if (iteratee == null && obj != null) { + obj = isArrayLike(obj) ? obj : _.values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value > result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + _.each(obj, function(value, index, list) { + computed = iteratee(value, index, list); + if (computed > lastComputed || computed === -Infinity && result === -Infinity) { + result = value; + lastComputed = computed; + } + }); + } + return result; + }; + + // Return the minimum element (or element-based computation). + _.min = function(obj, iteratee, context) { + var result = Infinity, lastComputed = Infinity, + value, computed; + if (iteratee == null && obj != null) { + obj = isArrayLike(obj) ? obj : _.values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value < result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + _.each(obj, function(value, index, list) { + computed = iteratee(value, index, list); + if (computed < lastComputed || computed === Infinity && result === Infinity) { + result = value; + lastComputed = computed; + } + }); + } + return result; + }; + + // Shuffle a collection, using the modern version of the + // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle). + _.shuffle = function(obj) { + var set = isArrayLike(obj) ? obj : _.values(obj); + var length = set.length; + var shuffled = Array(length); + for (var index = 0, rand; index < length; index++) { + rand = _.random(0, index); + if (rand !== index) shuffled[index] = shuffled[rand]; + shuffled[rand] = set[index]; + } + return shuffled; + }; + + // Sample **n** random values from a collection. + // If **n** is not specified, returns a single random element. + // The internal `guard` argument allows it to work with `map`. + _.sample = function(obj, n, guard) { + if (n == null || guard) { + if (!isArrayLike(obj)) obj = _.values(obj); + return obj[_.random(obj.length - 1)]; + } + return _.shuffle(obj).slice(0, Math.max(0, n)); + }; + + // Sort the object's values by a criterion produced by an iteratee. + _.sortBy = function(obj, iteratee, context) { + iteratee = cb(iteratee, context); + return _.pluck(_.map(obj, function(value, index, list) { + return { + value: value, + index: index, + criteria: iteratee(value, index, list) + }; + }).sort(function(left, right) { + var a = left.criteria; + var b = right.criteria; + if (a !== b) { + if (a > b || a === void 0) return 1; + if (a < b || b === void 0) return -1; + } + return left.index - right.index; + }), 'value'); + }; + + // An internal function used for aggregate "group by" operations. + var group = function(behavior) { + return function(obj, iteratee, context) { + var result = {}; + iteratee = cb(iteratee, context); + _.each(obj, function(value, index) { + var key = iteratee(value, index, obj); + behavior(result, value, key); + }); + return result; + }; + }; + + // Groups the object's values by a criterion. Pass either a string attribute + // to group by, or a function that returns the criterion. + _.groupBy = group(function(result, value, key) { + if (_.has(result, key)) result[key].push(value); else result[key] = [value]; + }); + + // Indexes the object's values by a criterion, similar to `groupBy`, but for + // when you know that your index values will be unique. + _.indexBy = group(function(result, value, key) { + result[key] = value; + }); + + // Counts instances of an object that group by a certain criterion. Pass + // either a string attribute to count by, or a function that returns the + // criterion. + _.countBy = group(function(result, value, key) { + if (_.has(result, key)) result[key]++; else result[key] = 1; + }); + + // Safely create a real, live array from anything iterable. + _.toArray = function(obj) { + if (!obj) return []; + if (_.isArray(obj)) return slice.call(obj); + if (isArrayLike(obj)) return _.map(obj, _.identity); + return _.values(obj); + }; + + // Return the number of elements in an object. + _.size = function(obj) { + if (obj == null) return 0; + return isArrayLike(obj) ? obj.length : _.keys(obj).length; + }; + + // Split a collection into two arrays: one whose elements all satisfy the given + // predicate, and one whose elements all do not satisfy the predicate. + _.partition = function(obj, predicate, context) { + predicate = cb(predicate, context); + var pass = [], fail = []; + _.each(obj, function(value, key, obj) { + (predicate(value, key, obj) ? pass : fail).push(value); + }); + return [pass, fail]; + }; + + // Array Functions + // --------------- + + // Get the first element of an array. Passing **n** will return the first N + // values in the array. Aliased as `head` and `take`. The **guard** check + // allows it to work with `_.map`. + _.first = _.head = _.take = function(array, n, guard) { + if (array == null) return void 0; + if (n == null || guard) return array[0]; + return _.initial(array, array.length - n); + }; + + // Returns everything but the last entry of the array. Especially useful on + // the arguments object. Passing **n** will return all the values in + // the array, excluding the last N. + _.initial = function(array, n, guard) { + return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n))); + }; + + // Get the last element of an array. Passing **n** will return the last N + // values in the array. + _.last = function(array, n, guard) { + if (array == null) return void 0; + if (n == null || guard) return array[array.length - 1]; + return _.rest(array, Math.max(0, array.length - n)); + }; + + // Returns everything but the first entry of the array. Aliased as `tail` and `drop`. + // Especially useful on the arguments object. Passing an **n** will return + // the rest N values in the array. + _.rest = _.tail = _.drop = function(array, n, guard) { + return slice.call(array, n == null || guard ? 1 : n); + }; + + // Trim out all falsy values from an array. + _.compact = function(array) { + return _.filter(array, _.identity); + }; + + // Internal implementation of a recursive `flatten` function. + var flatten = function(input, shallow, strict, startIndex) { + var output = [], idx = 0; + for (var i = startIndex || 0, length = getLength(input); i < length; i++) { + var value = input[i]; + if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) { + //flatten current level of array or arguments object + if (!shallow) value = flatten(value, shallow, strict); + var j = 0, len = value.length; + output.length += len; + while (j < len) { + output[idx++] = value[j++]; + } + } else if (!strict) { + output[idx++] = value; + } + } + return output; + }; + + // Flatten out an array, either recursively (by default), or just one level. + _.flatten = function(array, shallow) { + return flatten(array, shallow, false); + }; + + // Return a version of the array that does not contain the specified value(s). + _.without = function(array) { + return _.difference(array, slice.call(arguments, 1)); + }; + + // Produce a duplicate-free version of the array. If the array has already + // been sorted, you have the option of using a faster algorithm. + // Aliased as `unique`. + _.uniq = _.unique = function(array, isSorted, iteratee, context) { + if (!_.isBoolean(isSorted)) { + context = iteratee; + iteratee = isSorted; + isSorted = false; + } + if (iteratee != null) iteratee = cb(iteratee, context); + var result = []; + var seen = []; + for (var i = 0, length = getLength(array); i < length; i++) { + var value = array[i], + computed = iteratee ? iteratee(value, i, array) : value; + if (isSorted) { + if (!i || seen !== computed) result.push(value); + seen = computed; + } else if (iteratee) { + if (!_.contains(seen, computed)) { + seen.push(computed); + result.push(value); + } + } else if (!_.contains(result, value)) { + result.push(value); + } + } + return result; + }; + + // Produce an array that contains the union: each distinct element from all of + // the passed-in arrays. + _.union = function() { + return _.uniq(flatten(arguments, true, true)); + }; + + // Produce an array that contains every item shared between all the + // passed-in arrays. + _.intersection = function(array) { + var result = []; + var argsLength = arguments.length; + for (var i = 0, length = getLength(array); i < length; i++) { + var item = array[i]; + if (_.contains(result, item)) continue; + for (var j = 1; j < argsLength; j++) { + if (!_.contains(arguments[j], item)) break; + } + if (j === argsLength) result.push(item); + } + return result; + }; + + // Take the difference between one array and a number of other arrays. + // Only the elements present in just the first array will remain. + _.difference = function(array) { + var rest = flatten(arguments, true, true, 1); + return _.filter(array, function(value){ + return !_.contains(rest, value); + }); + }; + + // Zip together multiple lists into a single array -- elements that share + // an index go together. + _.zip = function() { + return _.unzip(arguments); + }; + + // Complement of _.zip. Unzip accepts an array of arrays and groups + // each array's elements on shared indices + _.unzip = function(array) { + var length = array && _.max(array, getLength).length || 0; + var result = Array(length); + + for (var index = 0; index < length; index++) { + result[index] = _.pluck(array, index); + } + return result; + }; + + // Converts lists into objects. Pass either a single array of `[key, value]` + // pairs, or two parallel arrays of the same length -- one of keys, and one of + // the corresponding values. + _.object = function(list, values) { + var result = {}; + for (var i = 0, length = getLength(list); i < length; i++) { + if (values) { + result[list[i]] = values[i]; + } else { + result[list[i][0]] = list[i][1]; + } + } + return result; + }; + + // Generator function to create the findIndex and findLastIndex functions + function createPredicateIndexFinder(dir) { + return function(array, predicate, context) { + predicate = cb(predicate, context); + var length = getLength(array); + var index = dir > 0 ? 0 : length - 1; + for (; index >= 0 && index < length; index += dir) { + if (predicate(array[index], index, array)) return index; + } + return -1; + }; + } + + // Returns the first index on an array-like that passes a predicate test + _.findIndex = createPredicateIndexFinder(1); + _.findLastIndex = createPredicateIndexFinder(-1); + + // Use a comparator function to figure out the smallest index at which + // an object should be inserted so as to maintain order. Uses binary search. + _.sortedIndex = function(array, obj, iteratee, context) { + iteratee = cb(iteratee, context, 1); + var value = iteratee(obj); + var low = 0, high = getLength(array); + while (low < high) { + var mid = Math.floor((low + high) / 2); + if (iteratee(array[mid]) < value) low = mid + 1; else high = mid; + } + return low; + }; + + // Generator function to create the indexOf and lastIndexOf functions + function createIndexFinder(dir, predicateFind, sortedIndex) { + return function(array, item, idx) { + var i = 0, length = getLength(array); + if (typeof idx == 'number') { + if (dir > 0) { + i = idx >= 0 ? idx : Math.max(idx + length, i); + } else { + length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1; + } + } else if (sortedIndex && idx && length) { + idx = sortedIndex(array, item); + return array[idx] === item ? idx : -1; + } + if (item !== item) { + idx = predicateFind(slice.call(array, i, length), _.isNaN); + return idx >= 0 ? idx + i : -1; + } + for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) { + if (array[idx] === item) return idx; + } + return -1; + }; + } + + // Return the position of the first occurrence of an item in an array, + // or -1 if the item is not included in the array. + // If the array is large and already in sort order, pass `true` + // for **isSorted** to use binary search. + _.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex); + _.lastIndexOf = createIndexFinder(-1, _.findLastIndex); + + // Generate an integer Array containing an arithmetic progression. A port of + // the native Python `range()` function. See + // [the Python documentation](http://docs.python.org/library/functions.html#range). + _.range = function(start, stop, step) { + if (stop == null) { + stop = start || 0; + start = 0; + } + step = step || 1; + + var length = Math.max(Math.ceil((stop - start) / step), 0); + var range = Array(length); + + for (var idx = 0; idx < length; idx++, start += step) { + range[idx] = start; + } + + return range; + }; + + // Function (ahem) Functions + // ------------------ + + // Determines whether to execute a function as a constructor + // or a normal function with the provided arguments + var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) { + if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args); + var self = baseCreate(sourceFunc.prototype); + var result = sourceFunc.apply(self, args); + if (_.isObject(result)) return result; + return self; + }; + + // Create a function bound to a given object (assigning `this`, and arguments, + // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if + // available. + _.bind = function(func, context) { + if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1)); + if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function'); + var args = slice.call(arguments, 2); + var bound = function() { + return executeBound(func, bound, context, this, args.concat(slice.call(arguments))); + }; + return bound; + }; + + // Partially apply a function by creating a version that has had some of its + // arguments pre-filled, without changing its dynamic `this` context. _ acts + // as a placeholder, allowing any combination of arguments to be pre-filled. + _.partial = function(func) { + var boundArgs = slice.call(arguments, 1); + var bound = function() { + var position = 0, length = boundArgs.length; + var args = Array(length); + for (var i = 0; i < length; i++) { + args[i] = boundArgs[i] === _ ? arguments[position++] : boundArgs[i]; + } + while (position < arguments.length) args.push(arguments[position++]); + return executeBound(func, bound, this, this, args); + }; + return bound; + }; + + // Bind a number of an object's methods to that object. Remaining arguments + // are the method names to be bound. Useful for ensuring that all callbacks + // defined on an object belong to it. + _.bindAll = function(obj) { + var i, length = arguments.length, key; + if (length <= 1) throw new Error('bindAll must be passed function names'); + for (i = 1; i < length; i++) { + key = arguments[i]; + obj[key] = _.bind(obj[key], obj); + } + return obj; + }; + + // Memoize an expensive function by storing its results. + _.memoize = function(func, hasher) { + var memoize = function(key) { + var cache = memoize.cache; + var address = '' + (hasher ? hasher.apply(this, arguments) : key); + if (!_.has(cache, address)) cache[address] = func.apply(this, arguments); + return cache[address]; + }; + memoize.cache = {}; + return memoize; + }; + + // Delays a function for the given number of milliseconds, and then calls + // it with the arguments supplied. + _.delay = function(func, wait) { + var args = slice.call(arguments, 2); + return setTimeout(function(){ + return func.apply(null, args); + }, wait); + }; + + // Defers a function, scheduling it to run after the current call stack has + // cleared. + _.defer = _.partial(_.delay, _, 1); + + // Returns a function, that, when invoked, will only be triggered at most once + // during a given window of time. Normally, the throttled function will run + // as much as it can, without ever going more than once per `wait` duration; + // but if you'd like to disable the execution on the leading edge, pass + // `{leading: false}`. To disable execution on the trailing edge, ditto. + _.throttle = function(func, wait, options) { + var context, args, result; + var timeout = null; + var previous = 0; + if (!options) options = {}; + var later = function() { + previous = options.leading === false ? 0 : _.now(); + timeout = null; + result = func.apply(context, args); + if (!timeout) context = args = null; + }; + return function() { + var now = _.now(); + if (!previous && options.leading === false) previous = now; + var remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + previous = now; + result = func.apply(context, args); + if (!timeout) context = args = null; + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; + }; + + // Returns a function, that, as long as it continues to be invoked, will not + // be triggered. The function will be called after it stops being called for + // N milliseconds. If `immediate` is passed, trigger the function on the + // leading edge, instead of the trailing. + _.debounce = function(func, wait, immediate) { + var timeout, args, context, timestamp, result; + + var later = function() { + var last = _.now() - timestamp; + + if (last < wait && last >= 0) { + timeout = setTimeout(later, wait - last); + } else { + timeout = null; + if (!immediate) { + result = func.apply(context, args); + if (!timeout) context = args = null; + } + } + }; + + return function() { + context = this; + args = arguments; + timestamp = _.now(); + var callNow = immediate && !timeout; + if (!timeout) timeout = setTimeout(later, wait); + if (callNow) { + result = func.apply(context, args); + context = args = null; + } + + return result; + }; + }; + + // Returns the first function passed as an argument to the second, + // allowing you to adjust arguments, run code before and after, and + // conditionally execute the original function. + _.wrap = function(func, wrapper) { + return _.partial(wrapper, func); + }; + + // Returns a negated version of the passed-in predicate. + _.negate = function(predicate) { + return function() { + return !predicate.apply(this, arguments); + }; + }; + + // Returns a function that is the composition of a list of functions, each + // consuming the return value of the function that follows. + _.compose = function() { + var args = arguments; + var start = args.length - 1; + return function() { + var i = start; + var result = args[start].apply(this, arguments); + while (i--) result = args[i].call(this, result); + return result; + }; + }; + + // Returns a function that will only be executed on and after the Nth call. + _.after = function(times, func) { + return function() { + if (--times < 1) { + return func.apply(this, arguments); + } + }; + }; + + // Returns a function that will only be executed up to (but not including) the Nth call. + _.before = function(times, func) { + var memo; + return function() { + if (--times > 0) { + memo = func.apply(this, arguments); + } + if (times <= 1) func = null; + return memo; + }; + }; + + // Returns a function that will be executed at most one time, no matter how + // often you call it. Useful for lazy initialization. + _.once = _.partial(_.before, 2); + + // Object Functions + // ---------------- + + // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed. + var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString'); + var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString', + 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; + + function collectNonEnumProps(obj, keys) { + var nonEnumIdx = nonEnumerableProps.length; + var constructor = obj.constructor; + var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto; + + // Constructor is a special case. + var prop = 'constructor'; + if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop); + + while (nonEnumIdx--) { + prop = nonEnumerableProps[nonEnumIdx]; + if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) { + keys.push(prop); + } + } + } + + // Retrieve the names of an object's own properties. + // Delegates to **ECMAScript 5**'s native `Object.keys` + _.keys = function(obj) { + if (!_.isObject(obj)) return []; + if (nativeKeys) return nativeKeys(obj); + var keys = []; + for (var key in obj) if (_.has(obj, key)) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; + }; + + // Retrieve all the property names of an object. + _.allKeys = function(obj) { + if (!_.isObject(obj)) return []; + var keys = []; + for (var key in obj) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; + }; + + // Retrieve the values of an object's properties. + _.values = function(obj) { + var keys = _.keys(obj); + var length = keys.length; + var values = Array(length); + for (var i = 0; i < length; i++) { + values[i] = obj[keys[i]]; + } + return values; + }; + + // Returns the results of applying the iteratee to each element of the object + // In contrast to _.map it returns an object + _.mapObject = function(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var keys = _.keys(obj), + length = keys.length, + results = {}, + currentKey; + for (var index = 0; index < length; index++) { + currentKey = keys[index]; + results[currentKey] = iteratee(obj[currentKey], currentKey, obj); + } + return results; + }; + + // Convert an object into a list of `[key, value]` pairs. + _.pairs = function(obj) { + var keys = _.keys(obj); + var length = keys.length; + var pairs = Array(length); + for (var i = 0; i < length; i++) { + pairs[i] = [keys[i], obj[keys[i]]]; + } + return pairs; + }; + + // Invert the keys and values of an object. The values must be serializable. + _.invert = function(obj) { + var result = {}; + var keys = _.keys(obj); + for (var i = 0, length = keys.length; i < length; i++) { + result[obj[keys[i]]] = keys[i]; + } + return result; + }; + + // Return a sorted list of the function names available on the object. + // Aliased as `methods` + _.functions = _.methods = function(obj) { + var names = []; + for (var key in obj) { + if (_.isFunction(obj[key])) names.push(key); + } + return names.sort(); + }; + + // Extend a given object with all the properties in passed-in object(s). + _.extend = createAssigner(_.allKeys); + + // Assigns a given object with all the own properties in the passed-in object(s) + // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) + _.extendOwn = _.assign = createAssigner(_.keys); + + // Returns the first key on an object that passes a predicate test + _.findKey = function(obj, predicate, context) { + predicate = cb(predicate, context); + var keys = _.keys(obj), key; + for (var i = 0, length = keys.length; i < length; i++) { + key = keys[i]; + if (predicate(obj[key], key, obj)) return key; + } + }; + + // Return a copy of the object only containing the whitelisted properties. + _.pick = function(object, oiteratee, context) { + var result = {}, obj = object, iteratee, keys; + if (obj == null) return result; + if (_.isFunction(oiteratee)) { + keys = _.allKeys(obj); + iteratee = optimizeCb(oiteratee, context); + } else { + keys = flatten(arguments, false, false, 1); + iteratee = function(value, key, obj) { return key in obj; }; + obj = Object(obj); + } + for (var i = 0, length = keys.length; i < length; i++) { + var key = keys[i]; + var value = obj[key]; + if (iteratee(value, key, obj)) result[key] = value; + } + return result; + }; + + // Return a copy of the object without the blacklisted properties. + _.omit = function(obj, iteratee, context) { + if (_.isFunction(iteratee)) { + iteratee = _.negate(iteratee); + } else { + var keys = _.map(flatten(arguments, false, false, 1), String); + iteratee = function(value, key) { + return !_.contains(keys, key); + }; + } + return _.pick(obj, iteratee, context); + }; + + // Fill in a given object with default properties. + _.defaults = createAssigner(_.allKeys, true); + + // Creates an object that inherits from the given prototype object. + // If additional properties are provided then they will be added to the + // created object. + _.create = function(prototype, props) { + var result = baseCreate(prototype); + if (props) _.extendOwn(result, props); + return result; + }; + + // Create a (shallow-cloned) duplicate of an object. + _.clone = function(obj) { + if (!_.isObject(obj)) return obj; + return _.isArray(obj) ? obj.slice() : _.extend({}, obj); + }; + + // Invokes interceptor with the obj, and then returns obj. + // The primary purpose of this method is to "tap into" a method chain, in + // order to perform operations on intermediate results within the chain. + _.tap = function(obj, interceptor) { + interceptor(obj); + return obj; + }; + + // Returns whether an object has a given set of `key:value` pairs. + _.isMatch = function(object, attrs) { + var keys = _.keys(attrs), length = keys.length; + if (object == null) return !length; + var obj = Object(object); + for (var i = 0; i < length; i++) { + var key = keys[i]; + if (attrs[key] !== obj[key] || !(key in obj)) return false; + } + return true; + }; + + + // Internal recursive comparison function for `isEqual`. + var eq = function(a, b, aStack, bStack) { + // Identical objects are equal. `0 === -0`, but they aren't identical. + // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal). + if (a === b) return a !== 0 || 1 / a === 1 / b; + // A strict comparison is necessary because `null == undefined`. + if (a == null || b == null) return a === b; + // Unwrap any wrapped objects. + if (a instanceof _) a = a._wrapped; + if (b instanceof _) b = b._wrapped; + // Compare `[[Class]]` names. + var className = toString.call(a); + if (className !== toString.call(b)) return false; + switch (className) { + // Strings, numbers, regular expressions, dates, and booleans are compared by value. + case '[object RegExp]': + // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i') + case '[object String]': + // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is + // equivalent to `new String("5")`. + return '' + a === '' + b; + case '[object Number]': + // `NaN`s are equivalent, but non-reflexive. + // Object(NaN) is equivalent to NaN + if (+a !== +a) return +b !== +b; + // An `egal` comparison is performed for other numeric values. + return +a === 0 ? 1 / +a === 1 / b : +a === +b; + case '[object Date]': + case '[object Boolean]': + // Coerce dates and booleans to numeric primitive values. Dates are compared by their + // millisecond representations. Note that invalid dates with millisecond representations + // of `NaN` are not equivalent. + return +a === +b; + } + + var areArrays = className === '[object Array]'; + if (!areArrays) { + if (typeof a != 'object' || typeof b != 'object') return false; + + // Objects with different constructors are not equivalent, but `Object`s or `Array`s + // from different frames are. + var aCtor = a.constructor, bCtor = b.constructor; + if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor && + _.isFunction(bCtor) && bCtor instanceof bCtor) + && ('constructor' in a && 'constructor' in b)) { + return false; + } + } + // Assume equality for cyclic structures. The algorithm for detecting cyclic + // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. + + // Initializing stack of traversed objects. + // It's done here since we only need them for objects and arrays comparison. + aStack = aStack || []; + bStack = bStack || []; + var length = aStack.length; + while (length--) { + // Linear search. Performance is inversely proportional to the number of + // unique nested structures. + if (aStack[length] === a) return bStack[length] === b; + } + + // Add the first object to the stack of traversed objects. + aStack.push(a); + bStack.push(b); + + // Recursively compare objects and arrays. + if (areArrays) { + // Compare array lengths to determine if a deep comparison is necessary. + length = a.length; + if (length !== b.length) return false; + // Deep compare the contents, ignoring non-numeric properties. + while (length--) { + if (!eq(a[length], b[length], aStack, bStack)) return false; + } + } else { + // Deep compare objects. + var keys = _.keys(a), key; + length = keys.length; + // Ensure that both objects contain the same number of properties before comparing deep equality. + if (_.keys(b).length !== length) return false; + while (length--) { + // Deep compare each member + key = keys[length]; + if (!(_.has(b, key) && eq(a[key], b[key], aStack, bStack))) return false; + } + } + // Remove the first object from the stack of traversed objects. + aStack.pop(); + bStack.pop(); + return true; + }; + + // Perform a deep comparison to check if two objects are equal. + _.isEqual = function(a, b) { + return eq(a, b); + }; + + // Is a given array, string, or object empty? + // An "empty" object has no enumerable own-properties. + _.isEmpty = function(obj) { + if (obj == null) return true; + if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0; + return _.keys(obj).length === 0; + }; + + // Is a given value a DOM element? + _.isElement = function(obj) { + return !!(obj && obj.nodeType === 1); + }; + + // Is a given value an array? + // Delegates to ECMA5's native Array.isArray + _.isArray = nativeIsArray || function(obj) { + return toString.call(obj) === '[object Array]'; + }; + + // Is a given variable an object? + _.isObject = function(obj) { + var type = typeof obj; + return type === 'function' || type === 'object' && !!obj; + }; + + // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError. + _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) { + _['is' + name] = function(obj) { + return toString.call(obj) === '[object ' + name + ']'; + }; + }); + + // Define a fallback version of the method in browsers (ahem, IE < 9), where + // there isn't any inspectable "Arguments" type. + if (!_.isArguments(arguments)) { + _.isArguments = function(obj) { + return _.has(obj, 'callee'); + }; + } + + // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8, + // IE 11 (#1621), and in Safari 8 (#1929). + if (typeof /./ != 'function' && typeof Int8Array != 'object') { + _.isFunction = function(obj) { + return typeof obj == 'function' || false; + }; + } + + // Is a given object a finite number? + _.isFinite = function(obj) { + return isFinite(obj) && !isNaN(parseFloat(obj)); + }; + + // Is the given value `NaN`? (NaN is the only number which does not equal itself). + _.isNaN = function(obj) { + return _.isNumber(obj) && obj !== +obj; + }; + + // Is a given value a boolean? + _.isBoolean = function(obj) { + return obj === true || obj === false || toString.call(obj) === '[object Boolean]'; + }; + + // Is a given value equal to null? + _.isNull = function(obj) { + return obj === null; + }; + + // Is a given variable undefined? + _.isUndefined = function(obj) { + return obj === void 0; + }; + + // Shortcut function for checking if an object has a given property directly + // on itself (in other words, not on a prototype). + _.has = function(obj, key) { + return obj != null && hasOwnProperty.call(obj, key); + }; + + // Utility Functions + // ----------------- + + // Run Underscore.js in *noConflict* mode, returning the `_` variable to its + // previous owner. Returns a reference to the Underscore object. + _.noConflict = function() { + root._ = previousUnderscore; + return this; + }; + + // Keep the identity function around for default iteratees. + _.identity = function(value) { + return value; + }; + + // Predicate-generating functions. Often useful outside of Underscore. + _.constant = function(value) { + return function() { + return value; + }; + }; + + _.noop = function(){}; + + _.property = property; + + // Generates a function for a given object that returns a given property. + _.propertyOf = function(obj) { + return obj == null ? function(){} : function(key) { + return obj[key]; + }; + }; + + // Returns a predicate for checking whether an object has a given set of + // `key:value` pairs. + _.matcher = _.matches = function(attrs) { + attrs = _.extendOwn({}, attrs); + return function(obj) { + return _.isMatch(obj, attrs); + }; + }; + + // Run a function **n** times. + _.times = function(n, iteratee, context) { + var accum = Array(Math.max(0, n)); + iteratee = optimizeCb(iteratee, context, 1); + for (var i = 0; i < n; i++) accum[i] = iteratee(i); + return accum; + }; + + // Return a random integer between min and max (inclusive). + _.random = function(min, max) { + if (max == null) { + max = min; + min = 0; + } + return min + Math.floor(Math.random() * (max - min + 1)); + }; + + // A (possibly faster) way to get the current timestamp as an integer. + _.now = Date.now || function() { + return new Date().getTime(); + }; + + // List of HTML entities for escaping. + var escapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`' + }; + var unescapeMap = _.invert(escapeMap); + + // Functions for escaping and unescaping strings to/from HTML interpolation. + var createEscaper = function(map) { + var escaper = function(match) { + return map[match]; + }; + // Regexes for identifying a key that needs to be escaped + var source = '(?:' + _.keys(map).join('|') + ')'; + var testRegexp = RegExp(source); + var replaceRegexp = RegExp(source, 'g'); + return function(string) { + string = string == null ? '' : '' + string; + return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string; + }; + }; + _.escape = createEscaper(escapeMap); + _.unescape = createEscaper(unescapeMap); + + // If the value of the named `property` is a function then invoke it with the + // `object` as context; otherwise, return it. + _.result = function(object, property, fallback) { + var value = object == null ? void 0 : object[property]; + if (value === void 0) { + value = fallback; + } + return _.isFunction(value) ? value.call(object) : value; + }; + + // Generate a unique integer id (unique within the entire client session). + // Useful for temporary DOM ids. + var idCounter = 0; + _.uniqueId = function(prefix) { + var id = ++idCounter + ''; + return prefix ? prefix + id : id; + }; + + // By default, Underscore uses ERB-style template delimiters, change the + // following template settings to use alternative delimiters. + _.templateSettings = { + evaluate : /<%([\s\S]+?)%>/g, + interpolate : /<%=([\s\S]+?)%>/g, + escape : /<%-([\s\S]+?)%>/g + }; + + // When customizing `templateSettings`, if you don't want to define an + // interpolation, evaluation or escaping regex, we need one that is + // guaranteed not to match. + var noMatch = /(.)^/; + + // Certain characters need to be escaped so that they can be put into a + // string literal. + var escapes = { + "'": "'", + '\\': '\\', + '\r': 'r', + '\n': 'n', + '\u2028': 'u2028', + '\u2029': 'u2029' + }; + + var escaper = /\\|'|\r|\n|\u2028|\u2029/g; + + var escapeChar = function(match) { + return '\\' + escapes[match]; + }; + + // JavaScript micro-templating, similar to John Resig's implementation. + // Underscore templating handles arbitrary delimiters, preserves whitespace, + // and correctly escapes quotes within interpolated code. + // NB: `oldSettings` only exists for backwards compatibility. + _.template = function(text, settings, oldSettings) { + if (!settings && oldSettings) settings = oldSettings; + settings = _.defaults({}, settings, _.templateSettings); + + // Combine delimiters into one regular expression via alternation. + var matcher = RegExp([ + (settings.escape || noMatch).source, + (settings.interpolate || noMatch).source, + (settings.evaluate || noMatch).source + ].join('|') + '|$', 'g'); + + // Compile the template source, escaping string literals appropriately. + var index = 0; + var source = "__p+='"; + text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { + source += text.slice(index, offset).replace(escaper, escapeChar); + index = offset + match.length; + + if (escape) { + source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; + } else if (interpolate) { + source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; + } else if (evaluate) { + source += "';\n" + evaluate + "\n__p+='"; + } + + // Adobe VMs need the match returned to produce the correct offest. + return match; + }); + source += "';\n"; + + // If a variable is not specified, place data values in local scope. + if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n'; + + source = "var __t,__p='',__j=Array.prototype.join," + + "print=function(){__p+=__j.call(arguments,'');};\n" + + source + 'return __p;\n'; + + try { + var render = new Function(settings.variable || 'obj', '_', source); + } catch (e) { + e.source = source; + throw e; + } + + var template = function(data) { + return render.call(this, data, _); + }; + + // Provide the compiled source as a convenience for precompilation. + var argument = settings.variable || 'obj'; + template.source = 'function(' + argument + '){\n' + source + '}'; + + return template; + }; + + // Add a "chain" function. Start chaining a wrapped Underscore object. + _.chain = function(obj) { + var instance = _(obj); + instance._chain = true; + return instance; + }; + + // OOP + // --------------- + // If Underscore is called as a function, it returns a wrapped object that + // can be used OO-style. This wrapper holds altered versions of all the + // underscore functions. Wrapped objects may be chained. + + // Helper function to continue chaining intermediate results. + var result = function(instance, obj) { + return instance._chain ? _(obj).chain() : obj; + }; + + // Add your own custom functions to the Underscore object. + _.mixin = function(obj) { + _.each(_.functions(obj), function(name) { + var func = _[name] = obj[name]; + _.prototype[name] = function() { + var args = [this._wrapped]; + push.apply(args, arguments); + return result(this, func.apply(_, args)); + }; + }); + }; + + // Add all of the Underscore functions to the wrapper object. + _.mixin(_); + + // Add all mutator Array functions to the wrapper. + _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { + var method = ArrayProto[name]; + _.prototype[name] = function() { + var obj = this._wrapped; + method.apply(obj, arguments); + if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0]; + return result(this, obj); + }; + }); + + // Add all accessor Array functions to the wrapper. + _.each(['concat', 'join', 'slice'], function(name) { + var method = ArrayProto[name]; + _.prototype[name] = function() { + return result(this, method.apply(this._wrapped, arguments)); + }; + }); + + // Extracts the result from a wrapped and chained object. + _.prototype.value = function() { + return this._wrapped; + }; + + // Provide unwrapping proxy for some methods used in engine operations + // such as arithmetic and JSON stringification. + _.prototype.valueOf = _.prototype.toJSON = _.prototype.value; + + _.prototype.toString = function() { + return '' + this._wrapped; + }; + + // AMD registration happens at the end for compatibility with AMD loaders + // that may not enforce next-turn semantics on modules. Even though general + // practice for AMD registration is to be anonymous, underscore registers + // as a named module because, like jQuery, it is a base library that is + // popular enough to be bundled in a third party lib, but not be part of + // an AMD load request. Those cases could generate an error when an + // anonymous define() is called outside of a loader request. + if (typeof define === 'function' && define.amd) { + define('underscore', [], function() { + return _; + }); + } +}.call(this)); + +},{}],26:[function(require,module,exports){ +arguments[4][19][0].apply(exports,arguments) +},{"dup":19}],27:[function(require,module,exports){ +module.exports = function isBuffer(arg) { + return arg && typeof arg === 'object' + && typeof arg.copy === 'function' + && typeof arg.fill === 'function' + && typeof arg.readUInt8 === 'function'; +} +},{}],28:[function(require,module,exports){ +(function (process,global){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +var formatRegExp = /%[sdj%]/g; +exports.format = function(f) { + if (!isString(f)) { + var objects = []; + for (var i = 0; i < arguments.length; i++) { + objects.push(inspect(arguments[i])); + } + return objects.join(' '); + } + + var i = 1; + var args = arguments; + var len = args.length; + var str = String(f).replace(formatRegExp, function(x) { + if (x === '%%') return '%'; + if (i >= len) return x; + switch (x) { + case '%s': return String(args[i++]); + case '%d': return Number(args[i++]); + case '%j': + try { + return JSON.stringify(args[i++]); + } catch (_) { + return '[Circular]'; + } + default: + return x; + } + }); + for (var x = args[i]; i < len; x = args[++i]) { + if (isNull(x) || !isObject(x)) { + str += ' ' + x; + } else { + str += ' ' + inspect(x); + } + } + return str; +}; + + +// Mark that a method should not be used. +// Returns a modified function which warns once by default. +// If --no-deprecation is set, then it is a no-op. +exports.deprecate = function(fn, msg) { + // Allow for deprecating things in the process of starting up. + if (isUndefined(global.process)) { + return function() { + return exports.deprecate(fn, msg).apply(this, arguments); + }; + } + + if (process.noDeprecation === true) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (process.throwDeprecation) { + throw new Error(msg); + } else if (process.traceDeprecation) { + console.trace(msg); + } else { + console.error(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + + return deprecated; +}; + + +var debugs = {}; +var debugEnviron; +exports.debuglog = function(set) { + if (isUndefined(debugEnviron)) + debugEnviron = process.env.NODE_DEBUG || ''; + set = set.toUpperCase(); + if (!debugs[set]) { + if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { + var pid = process.pid; + debugs[set] = function() { + var msg = exports.format.apply(exports, arguments); + console.error('%s %d: %s', set, pid, msg); + }; + } else { + debugs[set] = function() {}; + } + } + return debugs[set]; +}; + + +/** + * Echos the value of a value. Trys to print the value out + * in the best way possible given the different types. + * + * @param {Object} obj The object to print out. + * @param {Object} opts Optional options object that alters the output. + */ +/* legacy: obj, showHidden, depth, colors*/ +function inspect(obj, opts) { + // default options + var ctx = { + seen: [], + stylize: stylizeNoColor + }; + // legacy... + if (arguments.length >= 3) ctx.depth = arguments[2]; + if (arguments.length >= 4) ctx.colors = arguments[3]; + if (isBoolean(opts)) { + // legacy... + ctx.showHidden = opts; + } else if (opts) { + // got an "options" object + exports._extend(ctx, opts); + } + // set default options + if (isUndefined(ctx.showHidden)) ctx.showHidden = false; + if (isUndefined(ctx.depth)) ctx.depth = 2; + if (isUndefined(ctx.colors)) ctx.colors = false; + if (isUndefined(ctx.customInspect)) ctx.customInspect = true; + if (ctx.colors) ctx.stylize = stylizeWithColor; + return formatValue(ctx, obj, ctx.depth); +} +exports.inspect = inspect; + + +// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics +inspect.colors = { + 'bold' : [1, 22], + 'italic' : [3, 23], + 'underline' : [4, 24], + 'inverse' : [7, 27], + 'white' : [37, 39], + 'grey' : [90, 39], + 'black' : [30, 39], + 'blue' : [34, 39], + 'cyan' : [36, 39], + 'green' : [32, 39], + 'magenta' : [35, 39], + 'red' : [31, 39], + 'yellow' : [33, 39] +}; + +// Don't use 'blue' not visible on cmd.exe +inspect.styles = { + 'special': 'cyan', + 'number': 'yellow', + 'boolean': 'yellow', + 'undefined': 'grey', + 'null': 'bold', + 'string': 'green', + 'date': 'magenta', + // "name": intentionally not styling + 'regexp': 'red' +}; + + +function stylizeWithColor(str, styleType) { + var style = inspect.styles[styleType]; + + if (style) { + return '\u001b[' + inspect.colors[style][0] + 'm' + str + + '\u001b[' + inspect.colors[style][1] + 'm'; + } else { + return str; + } +} + + +function stylizeNoColor(str, styleType) { + return str; +} + + +function arrayToHash(array) { + var hash = {}; + + array.forEach(function(val, idx) { + hash[val] = true; + }); + + return hash; +} + + +function formatValue(ctx, value, recurseTimes) { + // Provide a hook for user-specified inspect functions. + // Check that value is an object with an inspect function on it + if (ctx.customInspect && + value && + isFunction(value.inspect) && + // Filter out the util module, it's inspect function is special + value.inspect !== exports.inspect && + // Also filter out any prototype objects using the circular check. + !(value.constructor && value.constructor.prototype === value)) { + var ret = value.inspect(recurseTimes, ctx); + if (!isString(ret)) { + ret = formatValue(ctx, ret, recurseTimes); + } + return ret; + } + + // Primitive types cannot have properties + var primitive = formatPrimitive(ctx, value); + if (primitive) { + return primitive; + } + + // Look up the keys of the object. + var keys = Object.keys(value); + var visibleKeys = arrayToHash(keys); + + if (ctx.showHidden) { + keys = Object.getOwnPropertyNames(value); + } + + // IE doesn't make error fields non-enumerable + // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx + if (isError(value) + && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { + return formatError(value); + } + + // Some type of object without properties can be shortcutted. + if (keys.length === 0) { + if (isFunction(value)) { + var name = value.name ? ': ' + value.name : ''; + return ctx.stylize('[Function' + name + ']', 'special'); + } + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } + if (isDate(value)) { + return ctx.stylize(Date.prototype.toString.call(value), 'date'); + } + if (isError(value)) { + return formatError(value); + } + } + + var base = '', array = false, braces = ['{', '}']; + + // Make Array say that they are Array + if (isArray(value)) { + array = true; + braces = ['[', ']']; + } + + // Make functions say that they are functions + if (isFunction(value)) { + var n = value.name ? ': ' + value.name : ''; + base = ' [Function' + n + ']'; + } + + // Make RegExps say that they are RegExps + if (isRegExp(value)) { + base = ' ' + RegExp.prototype.toString.call(value); + } + + // Make dates with properties first say the date + if (isDate(value)) { + base = ' ' + Date.prototype.toUTCString.call(value); + } + + // Make error with message first say the error + if (isError(value)) { + base = ' ' + formatError(value); + } + + if (keys.length === 0 && (!array || value.length == 0)) { + return braces[0] + base + braces[1]; + } + + if (recurseTimes < 0) { + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } else { + return ctx.stylize('[Object]', 'special'); + } + } + + ctx.seen.push(value); + + var output; + if (array) { + output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); + } else { + output = keys.map(function(key) { + return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); + }); + } + + ctx.seen.pop(); + + return reduceToSingleString(output, base, braces); +} + + +function formatPrimitive(ctx, value) { + if (isUndefined(value)) + return ctx.stylize('undefined', 'undefined'); + if (isString(value)) { + var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') + .replace(/'/g, "\\'") + .replace(/\\"/g, '"') + '\''; + return ctx.stylize(simple, 'string'); + } + if (isNumber(value)) + return ctx.stylize('' + value, 'number'); + if (isBoolean(value)) + return ctx.stylize('' + value, 'boolean'); + // For some reason typeof null is "object", so special case here. + if (isNull(value)) + return ctx.stylize('null', 'null'); +} + + +function formatError(value) { + return '[' + Error.prototype.toString.call(value) + ']'; +} + + +function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { + var output = []; + for (var i = 0, l = value.length; i < l; ++i) { + if (hasOwnProperty(value, String(i))) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + String(i), true)); + } else { + output.push(''); + } + } + keys.forEach(function(key) { + if (!key.match(/^\d+$/)) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + key, true)); + } + }); + return output; +} + + +function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { + var name, str, desc; + desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; + if (desc.get) { + if (desc.set) { + str = ctx.stylize('[Getter/Setter]', 'special'); + } else { + str = ctx.stylize('[Getter]', 'special'); + } + } else { + if (desc.set) { + str = ctx.stylize('[Setter]', 'special'); + } + } + if (!hasOwnProperty(visibleKeys, key)) { + name = '[' + key + ']'; + } + if (!str) { + if (ctx.seen.indexOf(desc.value) < 0) { + if (isNull(recurseTimes)) { + str = formatValue(ctx, desc.value, null); + } else { + str = formatValue(ctx, desc.value, recurseTimes - 1); + } + if (str.indexOf('\n') > -1) { + if (array) { + str = str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n').substr(2); + } else { + str = '\n' + str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n'); + } + } + } else { + str = ctx.stylize('[Circular]', 'special'); + } + } + if (isUndefined(name)) { + if (array && key.match(/^\d+$/)) { + return str; + } + name = JSON.stringify('' + key); + if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { + name = name.substr(1, name.length - 2); + name = ctx.stylize(name, 'name'); + } else { + name = name.replace(/'/g, "\\'") + .replace(/\\"/g, '"') + .replace(/(^"|"$)/g, "'"); + name = ctx.stylize(name, 'string'); + } + } + + return name + ': ' + str; +} + + +function reduceToSingleString(output, base, braces) { + var numLinesEst = 0; + var length = output.reduce(function(prev, cur) { + numLinesEst++; + if (cur.indexOf('\n') >= 0) numLinesEst++; + return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; + }, 0); + + if (length > 60) { + return braces[0] + + (base === '' ? '' : base + '\n ') + + ' ' + + output.join(',\n ') + + ' ' + + braces[1]; + } + + return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; +} + + +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. +function isArray(ar) { + return Array.isArray(ar); +} +exports.isArray = isArray; + +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; + +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; + +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; + +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; + +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; + +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; + +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; + +function isRegExp(re) { + return isObject(re) && objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; + +function isDate(d) { + return isObject(d) && objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; + +function isError(e) { + return isObject(e) && + (objectToString(e) === '[object Error]' || e instanceof Error); +} +exports.isError = isError; + +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; + +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; + +exports.isBuffer = require('./support/isBuffer'); + +function objectToString(o) { + return Object.prototype.toString.call(o); +} + + +function pad(n) { + return n < 10 ? '0' + n.toString(10) : n.toString(10); +} + + +var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', + 'Oct', 'Nov', 'Dec']; + +// 26 Feb 16:19:34 +function timestamp() { + var d = new Date(); + var time = [pad(d.getHours()), + pad(d.getMinutes()), + pad(d.getSeconds())].join(':'); + return [d.getDate(), months[d.getMonth()], time].join(' '); +} + + +// log is just a thin wrapper to console.log that prepends a timestamp +exports.log = function() { + console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); +}; + + +/** + * Inherit the prototype methods from one constructor into another. + * + * The Function.prototype.inherits from lang.js rewritten as a standalone + * function (not on Function.prototype). NOTE: If this file is to be loaded + * during bootstrapping this function needs to be rewritten using some native + * functions as prototype setup using normal JavaScript does not work as + * expected during bootstrapping (see mirror.js in r114903). + * + * @param {function} ctor Constructor function which needs to inherit the + * prototype. + * @param {function} superCtor Constructor function to inherit prototype from. + */ +exports.inherits = require('inherits'); + +exports._extend = function(origin, add) { + // Don't do anything if add isn't an object + if (!add || !isObject(add)) return origin; + + var keys = Object.keys(add); + var i = keys.length; + while (i--) { + origin[keys[i]] = add[keys[i]]; + } + return origin; +}; + +function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} + +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./support/isBuffer":27,"_process":24,"inherits":26}],29:[function(require,module,exports){ +// Returns a wrapper function that returns a wrapped callback +// The wrapper function should do some stuff, and return a +// presumably different callback function. +// This makes sure that own properties are retained, so that +// decorations and such are not lost along the way. +module.exports = wrappy +function wrappy (fn, cb) { + if (fn && cb) return wrappy(fn)(cb) + + if (typeof fn !== 'function') + throw new TypeError('need wrapper function') + + Object.keys(fn).forEach(function (k) { + wrapper[k] = fn[k] + }) + + return wrapper + + function wrapper() { + var args = new Array(arguments.length) + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i] + } + var ret = fn.apply(this, args) + var cb = args[args.length-1] + if (typeof ret === 'function' && ret !== cb) { + Object.keys(cb).forEach(function (k) { + ret[k] = cb[k] + }) + } + return ret + } +} + +},{}]},{},[7])(7) +}); \ No newline at end of file diff --git a/assets/javascripts/workers/search.ad38c271.min.js b/assets/javascripts/workers/search.ad38c271.min.js new file mode 100644 index 00000000..3c8e715e --- /dev/null +++ b/assets/javascripts/workers/search.ad38c271.min.js @@ -0,0 +1,2 @@ +"use strict";(()=>{var xe=Object.create;var G=Object.defineProperty,ve=Object.defineProperties,Se=Object.getOwnPropertyDescriptor,Te=Object.getOwnPropertyDescriptors,Qe=Object.getOwnPropertyNames,J=Object.getOwnPropertySymbols,Ee=Object.getPrototypeOf,Z=Object.prototype.hasOwnProperty,be=Object.prototype.propertyIsEnumerable;var K=Math.pow,X=(t,e,r)=>e in t?G(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,_=(t,e)=>{for(var r in e||(e={}))Z.call(e,r)&&X(t,r,e[r]);if(J)for(var r of J(e))be.call(e,r)&&X(t,r,e[r]);return t},B=(t,e)=>ve(t,Te(e));var Le=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var we=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Qe(e))!Z.call(t,i)&&i!==r&&G(t,i,{get:()=>e[i],enumerable:!(n=Se(e,i))||n.enumerable});return t};var Pe=(t,e,r)=>(r=t!=null?xe(Ee(t)):{},we(e||!t||!t.__esModule?G(r,"default",{value:t,enumerable:!0}):r,t));var W=(t,e,r)=>new Promise((n,i)=>{var s=u=>{try{a(r.next(u))}catch(c){i(c)}},o=u=>{try{a(r.throw(u))}catch(c){i(c)}},a=u=>u.done?n(u.value):Promise.resolve(u.value).then(s,o);a((r=r.apply(t,e)).next())});var re=Le((ee,te)=>{(function(){var t=function(e){var r=new t.Builder;return r.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),r.searchPipeline.add(t.stemmer),e.call(r,r),r.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(r){e.console&&console.warn&&console.warn(r)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var r=Object.create(null),n=Object.keys(e),i=0;i0){var f=t.utils.clone(r)||{};f.position=[a,c],f.index=s.length,s.push(new t.Token(n.slice(a,o),f))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,r){r in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+r),e.label=r,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var r=e.label&&e.label in this.registeredFunctions;r||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. +`,e)},t.Pipeline.load=function(e){var r=new t.Pipeline;return e.forEach(function(n){var i=t.Pipeline.registeredFunctions[n];if(i)r.add(i);else throw new Error("Cannot load unregistered function: "+n)}),r},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(r){t.Pipeline.warnIfFunctionNotRegistered(r),this._stack.push(r)},this)},t.Pipeline.prototype.after=function(e,r){t.Pipeline.warnIfFunctionNotRegistered(r);var n=this._stack.indexOf(e);if(n==-1)throw new Error("Cannot find existingFn");n=n+1,this._stack.splice(n,0,r)},t.Pipeline.prototype.before=function(e,r){t.Pipeline.warnIfFunctionNotRegistered(r);var n=this._stack.indexOf(e);if(n==-1)throw new Error("Cannot find existingFn");this._stack.splice(n,0,r)},t.Pipeline.prototype.remove=function(e){var r=this._stack.indexOf(e);r!=-1&&this._stack.splice(r,1)},t.Pipeline.prototype.run=function(e){for(var r=this._stack.length,n=0;n1&&(oe&&(n=s),o!=e);)i=n-r,s=r+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(ou?f+=2:a==u&&(r+=n[c+1]*i[f+1],c+=2,f+=2);return r},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),r=1,n=0;r0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new t.TokenSet;s.node.edges["*"]=u}if(s.str.length==0&&(u.final=!0),i.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var c=s.node.edges["*"];else{var c=new t.TokenSet;s.node.edges["*"]=c}s.str.length==1&&(c.final=!0),i.push({node:c,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var f=s.str.charAt(0),g=s.str.charAt(1),l;g in s.node.edges?l=s.node.edges[g]:(l=new t.TokenSet,s.node.edges[g]=l),s.str.length==1&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:f+s.str.slice(2)})}}}return n},t.TokenSet.fromString=function(e){for(var r=new t.TokenSet,n=r,i=0,s=e.length;i=e;r--){var n=this.uncheckedNodes[r],i=n.child.toString();i in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[i]:(n.child._str=i,this.minimizedNodes[i]=n.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(r){var n=new t.QueryParser(e,r);n.parse()})},t.Index.prototype.query=function(e){for(var r=new t.Query(this.fields),n=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),u=0;u1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,r){var n=e[this._ref],i=Object.keys(this._fields);this._documents[n]=r||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,r;do e=this.next(),r=e.charCodeAt(0);while(r>47&&r<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var r=e.next();if(r==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(r.charCodeAt(0)==92){e.escapeCharacter();continue}if(r==":")return t.QueryLexer.lexField;if(r=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(r=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(r=="+"&&e.width()===1||r=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(r.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,r){this.lexer=new t.QueryLexer(e),this.query=r,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var r=e.peekLexeme();if(r!=null)switch(r.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+r.type;throw r.str.length>=1&&(n+=" with value '"+r.str+"'"),new t.QueryParseError(n,r.start,r.end)}},t.QueryParser.parsePresence=function(e){var r=e.consumeLexeme();if(r!=null){switch(r.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+r.str+"'";throw new t.QueryParseError(n,r.start,r.end)}var i=e.peekLexeme();if(i==null){var n="expecting term or field, found nothing";throw new t.QueryParseError(n,r.start,r.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var n="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(n,i.start,i.end)}}},t.QueryParser.parseField=function(e){var r=e.consumeLexeme();if(r!=null){if(e.query.allFields.indexOf(r.str)==-1){var n=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+r.str+"', possible fields: "+n;throw new t.QueryParseError(i,r.start,r.end)}e.currentClause.fields=[r.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,r.start,r.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var r=e.consumeLexeme();if(r!=null){e.currentClause.term=r.str.toLowerCase(),r.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(n==null){e.nextClause();return}switch(n.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+n.type+"'";throw new t.QueryParseError(i,n.start,n.end)}}},t.QueryParser.parseEditDistance=function(e){var r=e.consumeLexeme();if(r!=null){var n=parseInt(r.str,10);if(isNaN(n)){var i="edit distance must be numeric";throw new t.QueryParseError(i,r.start,r.end)}e.currentClause.editDistance=n;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var r=e.consumeLexeme();if(r!=null){var n=parseInt(r.str,10);if(isNaN(n)){var i="boost must be numeric";throw new t.QueryParseError(i,r.start,r.end)}e.currentClause.boost=n;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,r){typeof define=="function"&&define.amd?define(r):typeof ee=="object"?te.exports=r():e.lunr=r()}(this,function(){return t})})()});var Y=Pe(re());function ne(t,e=document){let r=ke(t,e);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${t}" to be present`);return r}function ke(t,e=document){return e.querySelector(t)||void 0}Object.entries||(Object.entries=function(t){let e=[];for(let r of Object.keys(t))e.push([r,t[r]]);return e});Object.values||(Object.values=function(t){let e=[];for(let r of Object.keys(t))e.push(t[r]);return e});typeof Element!="undefined"&&(Element.prototype.scrollTo||(Element.prototype.scrollTo=function(t,e){typeof t=="object"?(this.scrollLeft=t.left,this.scrollTop=t.top):(this.scrollLeft=t,this.scrollTop=e)}),Element.prototype.replaceWith||(Element.prototype.replaceWith=function(...t){let e=this.parentNode;if(e){t.length===0&&e.removeChild(this);for(let r=t.length-1;r>=0;r--){let n=t[r];typeof n=="string"?n=document.createTextNode(n):n.parentNode&&n.parentNode.removeChild(n),r?e.insertBefore(this.previousSibling,n):e.replaceChild(n,this)}}}));function ie(t){let e=new Map;for(let r of t){let[n]=r.location.split("#"),i=e.get(n);typeof i=="undefined"?e.set(n,r):(e.set(r.location,r),r.parent=i)}return e}function H(t,e,r){var s;e=new RegExp(e,"g");let n,i=0;do{n=e.exec(t);let o=(s=n==null?void 0:n.index)!=null?s:t.length;if(in?e(r,1,n,n=i):t.charAt(i)===">"&&(t.charAt(n+1)==="/"?--s===0&&e(r++,2,n,i+1):t.charAt(i-1)!=="/"&&s++===0&&e(r,0,n,i+1),n=i+1);i>n&&e(r,1,n,i)}function oe(t,e,r,n=!1){return q([t],e,r,n).pop()}function q(t,e,r,n=!1){let i=[0];for(let s=1;s>>2&1023,c=a[0]>>>12;i.push(+(u>c)+i[i.length-1])}return t.map((s,o)=>{let a=0,u=new Map;for(let f of r.sort((g,l)=>g-l)){let g=f&1048575,l=f>>>20;if(i[l]!==o)continue;let m=u.get(l);typeof m=="undefined"&&u.set(l,m=[]),m.push(g)}if(u.size===0)return s;let c=[];for(let[f,g]of u){let l=e[f],m=l[0]>>>12,x=l[l.length-1]>>>12,v=l[l.length-1]>>>2&1023;n&&m>a&&c.push(s.slice(a,m));let d=s.slice(m,x+v);for(let y of g.sort((b,E)=>E-b)){let b=(l[y]>>>12)-m,E=(l[y]>>>2&1023)+b;d=[d.slice(0,b),"",d.slice(b,E),"",d.slice(E)].join("")}if(a=x+v,c.push(d)===2)break}return n&&a{var f;switch(i[f=o+=s]||(i[f]=[]),a){case 0:case 2:i[o].push(u<<12|c-u<<2|a);break;case 1:let g=r[n].slice(u,c);H(g,lunr.tokenizer.separator,(l,m)=>{if(typeof lunr.segmenter!="undefined"){let x=g.slice(l,m);if(/^[MHIK]$/.test(lunr.segmenter.ctype_(x))){let v=lunr.segmenter.segment(x);for(let d=0,y=0;dr){return t.trim().split(/"([^"]+)"/g).map((r,n)=>n&1?r.replace(/^\b|^(?![^\x00-\x7F]|$)|\s+/g," +"):r).join("").replace(/"|(?:^|\s+)[*+\-:^~]+(?=\s+|$)/g,"").split(/\s+/g).reduce((r,n)=>{let i=e(n);return[...r,...Array.isArray(i)?i:[i]]},[]).map(r=>/([~^]$)/.test(r)?`${r}1`:r).map(r=>/(^[+-]|[~^]\d+$)/.test(r)?r:`${r}*`).join(" ")}function ce(t){return ue(t,e=>{let r=[],n=new lunr.QueryLexer(e);n.run();for(let{type:i,str:s,start:o,end:a}of n.lexemes)switch(i){case"FIELD":["title","text","tags"].includes(s)||(e=[e.slice(0,a)," ",e.slice(a+1)].join(""));break;case"TERM":H(s,lunr.tokenizer.separator,(...u)=>{r.push([e.slice(0,o),s.slice(...u),e.slice(a)].join(""))})}return r})}function le(t){let e=new lunr.Query(["title","text","tags"]);new lunr.QueryParser(t,e).parse();for(let n of e.clauses)n.usePipeline=!0,n.term.startsWith("*")&&(n.wildcard=lunr.Query.wildcard.LEADING,n.term=n.term.slice(1)),n.term.endsWith("*")&&(n.wildcard=lunr.Query.wildcard.TRAILING,n.term=n.term.slice(0,-1));return e.clauses}function he(t,e){var i;let r=new Set(t),n={};for(let s=0;s0;){let o=i[--s];for(let u=1;un[o]-u&&(r.add(t.slice(o,o+u)),i[s++]=o+u);let a=o+n[o];n[a]&&ar=>{if(typeof r[e]=="undefined")return;let n=[r.location,e].join(":");return t.set(n,lunr.tokenizer.table=[]),r[e]}}function Re(t,e){let[r,n]=[new Set(t),new Set(e)];return[...new Set([...r].filter(i=>!n.has(i)))]}var U=class{constructor({config:e,docs:r,options:n}){let i=Oe(this.table=new Map);this.map=ie(r),this.options=n,this.index=lunr(function(){this.metadataWhitelist=["position"],this.b(0),e.lang.length===1&&e.lang[0]!=="en"?this.use(lunr[e.lang[0]]):e.lang.length>1&&this.use(lunr.multiLanguage(...e.lang)),this.tokenizer=ae,lunr.tokenizer.separator=new RegExp(e.separator),lunr.segmenter="TinySegmenter"in lunr?new lunr.TinySegmenter:void 0;let s=Re(["trimmer","stopWordFilter","stemmer"],e.pipeline);for(let o of e.lang.map(a=>a==="en"?lunr:lunr[a]))for(let a of s)this.pipeline.remove(o[a]),this.searchPipeline.remove(o[a]);this.ref("location");for(let[o,a]of Object.entries(e.fields))this.field(o,B(_({},a),{extractor:i(o)}));for(let o of r)this.add(o,{boost:o.boost})})}search(e){if(e=e.replace(new RegExp("\\p{sc=Han}+","gu"),s=>[...fe(s,this.index.invertedIndex)].join("* ")),e=ce(e),!e)return{items:[]};let r=le(e).filter(s=>s.presence!==lunr.Query.presence.PROHIBITED),n=this.index.search(e).reduce((s,{ref:o,score:a,matchData:u})=>{let c=this.map.get(o);if(typeof c!="undefined"){c=_({},c),c.tags&&(c.tags=[...c.tags]);let f=he(r,Object.keys(u.metadata));for(let l of this.index.fields){if(typeof c[l]=="undefined")continue;let m=[];for(let d of Object.values(u.metadata))typeof d[l]!="undefined"&&m.push(...d[l].position);if(!m.length)continue;let x=this.table.get([c.location,l].join(":")),v=Array.isArray(c[l])?q:oe;c[l]=v(c[l],x,m,l!=="text")}let g=+!c.parent+Object.values(f).filter(l=>l).length/Object.keys(f).length;s.push(B(_({},c),{score:a*(1+K(g,2)),terms:f}))}return s},[]).sort((s,o)=>o.score-s.score).reduce((s,o)=>{let a=this.map.get(o.location);if(typeof a!="undefined"){let u=a.parent?a.parent.location:a.location;s.set(u,[...s.get(u)||[],o])}return s},new Map);for(let[s,o]of n)if(!o.find(a=>a.location===s)){let a=this.map.get(s);o.push(B(_({},a),{score:0,terms:{}}))}let i;if(this.options.suggest){let s=this.index.query(o=>{for(let a of r)o.term(a.term,{fields:["title"],presence:lunr.Query.presence.REQUIRED,wildcard:lunr.Query.wildcard.TRAILING})});i=s.length?Object.keys(s[0].matchData.metadata):[]}return _({items:[...n.values()]},typeof i!="undefined"&&{suggest:i})}};var de;function Ie(t){return W(this,null,function*(){let e="../lunr";if(typeof parent!="undefined"&&"IFrameWorker"in parent){let n=ne("script[src]"),[i]=n.src.split("/worker");e=e.replace("..",i)}let r=[];for(let n of t.lang){switch(n){case"ja":r.push(`${e}/tinyseg.js`);break;case"hi":case"th":r.push(`${e}/wordcut.js`);break}n!=="en"&&r.push(`${e}/min/lunr.${n}.min.js`)}t.lang.length>1&&r.push(`${e}/min/lunr.multi.min.js`),r.length&&(yield importScripts(`${e}/min/lunr.stemmer.support.min.js`,...r))})}function Fe(t){return W(this,null,function*(){switch(t.type){case 0:return yield Ie(t.data.config),de=new U(t.data),{type:1};case 2:let e=t.data;try{return{type:3,data:de.search(e)}}catch(r){return console.warn(`Invalid query: ${e} \u2013 see https://bit.ly/2s3ChXG`),console.warn(r),{type:3,data:{items:[]}}}default:throw new TypeError("Invalid message type")}})}self.lunr=Y.default;Y.default.utils.warn=console.warn;addEventListener("message",t=>W(null,null,function*(){postMessage(yield Fe(t.data))}));})(); diff --git a/assets/stylesheets/main.8cce3a28.min.css b/assets/stylesheets/main.8cce3a28.min.css new file mode 100644 index 00000000..b3b04366 --- /dev/null +++ b/assets/stylesheets/main.8cce3a28.min.css @@ -0,0 +1 @@ +@charset "UTF-8";html{-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;box-sizing:border-box}*,:after,:before{box-sizing:inherit}@media (prefers-reduced-motion){*,:after,:before{transition:none!important}}body{margin:0}a,button,input,label{-webkit-tap-highlight-color:transparent}a{color:inherit;text-decoration:none}hr{border:0;box-sizing:initial;display:block;height:.05rem;overflow:visible;padding:0}small{font-size:80%}sub,sup{line-height:1em}img{border-style:none}table{border-collapse:initial;border-spacing:0}td,th{font-weight:400;vertical-align:top}button{background:#0000;border:0;font-family:inherit;font-size:inherit;margin:0;padding:0}input{border:0;outline:none}:root{--md-primary-fg-color:#4051b5;--md-primary-fg-color--light:#5d6cc0;--md-primary-fg-color--dark:#303fa1;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3;--md-accent-fg-color:#526cfe;--md-accent-fg-color--transparent:#526cfe1a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-scheme=default]{color-scheme:light}[data-md-color-scheme=default] img[src$="#gh-dark-mode-only"],[data-md-color-scheme=default] img[src$="#only-dark"]{display:none}:root,[data-md-color-scheme=default]{--md-hue:225deg;--md-default-fg-color:#000000de;--md-default-fg-color--light:#0000008a;--md-default-fg-color--lighter:#00000052;--md-default-fg-color--lightest:#00000012;--md-default-bg-color:#fff;--md-default-bg-color--light:#ffffffb3;--md-default-bg-color--lighter:#ffffff4d;--md-default-bg-color--lightest:#ffffff1f;--md-code-fg-color:#36464e;--md-code-bg-color:#f5f5f5;--md-code-bg-color--light:#f5f5f5b3;--md-code-bg-color--lighter:#f5f5f54d;--md-code-hl-color:#4287ff;--md-code-hl-color--light:#4287ff1a;--md-code-hl-number-color:#d52a2a;--md-code-hl-special-color:#db1457;--md-code-hl-function-color:#a846b9;--md-code-hl-constant-color:#6e59d9;--md-code-hl-keyword-color:#3f6ec6;--md-code-hl-string-color:#1c7d4d;--md-code-hl-name-color:var(--md-code-fg-color);--md-code-hl-operator-color:var(--md-default-fg-color--light);--md-code-hl-punctuation-color:var(--md-default-fg-color--light);--md-code-hl-comment-color:var(--md-default-fg-color--light);--md-code-hl-generic-color:var(--md-default-fg-color--light);--md-code-hl-variable-color:var(--md-default-fg-color--light);--md-typeset-color:var(--md-default-fg-color);--md-typeset-a-color:var(--md-primary-fg-color);--md-typeset-del-color:#f5503d26;--md-typeset-ins-color:#0bd57026;--md-typeset-kbd-color:#fafafa;--md-typeset-kbd-accent-color:#fff;--md-typeset-kbd-border-color:#b8b8b8;--md-typeset-mark-color:#ffff0080;--md-typeset-table-color:#0000001f;--md-typeset-table-color--light:rgba(0,0,0,.035);--md-admonition-fg-color:var(--md-default-fg-color);--md-admonition-bg-color:var(--md-default-bg-color);--md-warning-fg-color:#000000de;--md-warning-bg-color:#ff9;--md-footer-fg-color:#fff;--md-footer-fg-color--light:#ffffffb3;--md-footer-fg-color--lighter:#ffffff73;--md-footer-bg-color:#000000de;--md-footer-bg-color--dark:#00000052;--md-shadow-z1:0 0.2rem 0.5rem #0000000d,0 0 0.05rem #0000001a;--md-shadow-z2:0 0.2rem 0.5rem #0000001a,0 0 0.05rem #00000040;--md-shadow-z3:0 0.2rem 0.5rem #0003,0 0 0.05rem #00000059}.md-icon svg{fill:currentcolor;display:block;height:1.2rem;width:1.2rem}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;--md-text-font-family:var(--md-text-font,_),-apple-system,BlinkMacSystemFont,Helvetica,Arial,sans-serif;--md-code-font-family:var(--md-code-font,_),SFMono-Regular,Consolas,Menlo,monospace}aside,body,input{font-feature-settings:"kern","liga";color:var(--md-typeset-color);font-family:var(--md-text-font-family)}code,kbd,pre{font-feature-settings:"kern";font-family:var(--md-code-font-family)}:root{--md-typeset-table-sort-icon:url('data:image/svg+xml;charset=utf-8,');--md-typeset-table-sort-icon--asc:url('data:image/svg+xml;charset=utf-8,');--md-typeset-table-sort-icon--desc:url('data:image/svg+xml;charset=utf-8,')}.md-typeset{-webkit-print-color-adjust:exact;color-adjust:exact;font-size:.8rem;line-height:1.6;overflow-wrap:break-word}@media print{.md-typeset{font-size:.68rem}}.md-typeset blockquote,.md-typeset dl,.md-typeset figure,.md-typeset ol,.md-typeset pre,.md-typeset ul{margin-bottom:1em;margin-top:1em}.md-typeset h1{color:var(--md-default-fg-color--light);font-size:2em;line-height:1.3;margin:0 0 1.25em}.md-typeset h1,.md-typeset h2{font-weight:300;letter-spacing:-.01em}.md-typeset h2{font-size:1.5625em;line-height:1.4;margin:1.6em 0 .64em}.md-typeset h3{font-size:1.25em;font-weight:400;letter-spacing:-.01em;line-height:1.5;margin:1.6em 0 .8em}.md-typeset h2+h3{margin-top:.8em}.md-typeset h4{font-weight:700;letter-spacing:-.01em;margin:1em 0}.md-typeset h5,.md-typeset h6{color:var(--md-default-fg-color--light);font-size:.8em;font-weight:700;letter-spacing:-.01em;margin:1.25em 0}.md-typeset h5{text-transform:uppercase}.md-typeset h5 code{text-transform:none}.md-typeset hr{border-bottom:.05rem solid var(--md-default-fg-color--lightest);display:flow-root;margin:1.5em 0}.md-typeset a{color:var(--md-typeset-a-color);word-break:break-word}.md-typeset a,.md-typeset a:before{transition:color 125ms}.md-typeset a:focus,.md-typeset a:hover{color:var(--md-accent-fg-color)}.md-typeset a:focus code,.md-typeset a:hover code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-typeset a code{color:var(--md-typeset-a-color)}.md-typeset a.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-typeset code,.md-typeset kbd,.md-typeset pre{color:var(--md-code-fg-color);direction:ltr;font-variant-ligatures:none;transition:background-color 125ms}@media print{.md-typeset code,.md-typeset kbd,.md-typeset pre{white-space:pre-wrap}}.md-typeset code{background-color:var(--md-code-bg-color);border-radius:.1rem;-webkit-box-decoration-break:clone;box-decoration-break:clone;font-size:.85em;padding:0 .2941176471em;transition:color 125ms,background-color 125ms;word-break:break-word}.md-typeset code:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.md-typeset pre{display:flow-root;line-height:1.4;position:relative}.md-typeset pre>code{-webkit-box-decoration-break:slice;box-decoration-break:slice;box-shadow:none;display:block;margin:0;outline-color:var(--md-accent-fg-color);overflow:auto;padding:.7720588235em 1.1764705882em;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin;touch-action:auto;word-break:normal}.md-typeset pre>code:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-typeset pre>code::-webkit-scrollbar{height:.2rem;width:.2rem}.md-typeset pre>code::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-typeset pre>code::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}.md-typeset kbd{background-color:var(--md-typeset-kbd-color);border-radius:.1rem;box-shadow:0 .1rem 0 .05rem var(--md-typeset-kbd-border-color),0 .1rem 0 var(--md-typeset-kbd-border-color),0 -.1rem .2rem var(--md-typeset-kbd-accent-color) inset;color:var(--md-default-fg-color);display:inline-block;font-size:.75em;padding:0 .6666666667em;vertical-align:text-top;word-break:break-word}.md-typeset mark{background-color:var(--md-typeset-mark-color);-webkit-box-decoration-break:clone;box-decoration-break:clone;color:inherit;word-break:break-word}.md-typeset abbr{cursor:help;text-decoration:none}.md-typeset [data-preview],.md-typeset abbr{border-bottom:.05rem dotted var(--md-default-fg-color--light)}.md-typeset small{opacity:.75}[dir=ltr] .md-typeset sub,[dir=ltr] .md-typeset sup{margin-left:.078125em}[dir=rtl] .md-typeset sub,[dir=rtl] .md-typeset sup{margin-right:.078125em}[dir=ltr] .md-typeset blockquote{padding-left:.6rem}[dir=rtl] .md-typeset blockquote{padding-right:.6rem}[dir=ltr] .md-typeset blockquote{border-left:.2rem solid var(--md-default-fg-color--lighter)}[dir=rtl] .md-typeset blockquote{border-right:.2rem solid var(--md-default-fg-color--lighter)}.md-typeset blockquote{color:var(--md-default-fg-color--light);margin-left:0;margin-right:0}.md-typeset ul{list-style-type:disc}.md-typeset ul[type]{list-style-type:revert-layer}[dir=ltr] .md-typeset ol,[dir=ltr] .md-typeset ul{margin-left:.625em}[dir=rtl] .md-typeset ol,[dir=rtl] .md-typeset ul{margin-right:.625em}.md-typeset ol,.md-typeset ul{padding:0}.md-typeset ol:not([hidden]),.md-typeset ul:not([hidden]){display:flow-root}.md-typeset ol ol,.md-typeset ul ol{list-style-type:lower-alpha}.md-typeset ol ol ol,.md-typeset ul ol ol{list-style-type:lower-roman}.md-typeset ol ol ol ol,.md-typeset ul ol ol ol{list-style-type:upper-alpha}.md-typeset ol ol ol ol ol,.md-typeset ul ol ol ol ol{list-style-type:upper-roman}.md-typeset ol[type],.md-typeset ul[type]{list-style-type:revert-layer}[dir=ltr] .md-typeset ol li,[dir=ltr] .md-typeset ul li{margin-left:1.25em}[dir=rtl] .md-typeset ol li,[dir=rtl] .md-typeset ul li{margin-right:1.25em}.md-typeset ol li,.md-typeset ul li{margin-bottom:.5em}.md-typeset ol li blockquote,.md-typeset ol li p,.md-typeset ul li blockquote,.md-typeset ul li p{margin:.5em 0}.md-typeset ol li:last-child,.md-typeset ul li:last-child{margin-bottom:0}[dir=ltr] .md-typeset ol li ol,[dir=ltr] .md-typeset ol li ul,[dir=ltr] .md-typeset ul li ol,[dir=ltr] .md-typeset ul li ul{margin-left:.625em}[dir=rtl] .md-typeset ol li ol,[dir=rtl] .md-typeset ol li ul,[dir=rtl] .md-typeset ul li ol,[dir=rtl] .md-typeset ul li ul{margin-right:.625em}.md-typeset ol li ol,.md-typeset ol li ul,.md-typeset ul li ol,.md-typeset ul li ul{margin-bottom:.5em;margin-top:.5em}[dir=ltr] .md-typeset dd{margin-left:1.875em}[dir=rtl] .md-typeset dd{margin-right:1.875em}.md-typeset dd{margin-bottom:1.5em;margin-top:1em}.md-typeset img,.md-typeset svg,.md-typeset video{height:auto;max-width:100%}.md-typeset img[align=left]{margin:1em 1em 1em 0}.md-typeset img[align=right]{margin:1em 0 1em 1em}.md-typeset img[align]:only-child{margin-top:0}.md-typeset figure{display:flow-root;margin:1em auto;max-width:100%;text-align:center;width:-moz-fit-content;width:fit-content}.md-typeset figure img{display:block;margin:0 auto}.md-typeset figcaption{font-style:italic;margin:1em auto;max-width:24rem}.md-typeset iframe{max-width:100%}.md-typeset table:not([class]){background-color:var(--md-default-bg-color);border:.05rem solid var(--md-typeset-table-color);border-radius:.1rem;display:inline-block;font-size:.64rem;max-width:100%;overflow:auto;touch-action:auto}@media print{.md-typeset table:not([class]){display:table}}.md-typeset table:not([class])+*{margin-top:1.5em}.md-typeset table:not([class]) td>:first-child,.md-typeset table:not([class]) th>:first-child{margin-top:0}.md-typeset table:not([class]) td>:last-child,.md-typeset table:not([class]) th>:last-child{margin-bottom:0}.md-typeset table:not([class]) td:not([align]),.md-typeset table:not([class]) th:not([align]){text-align:left}[dir=rtl] .md-typeset table:not([class]) td:not([align]),[dir=rtl] .md-typeset table:not([class]) th:not([align]){text-align:right}.md-typeset table:not([class]) th{font-weight:700;min-width:5rem;padding:.9375em 1.25em;vertical-align:top}.md-typeset table:not([class]) td{border-top:.05rem solid var(--md-typeset-table-color);padding:.9375em 1.25em;vertical-align:top}.md-typeset table:not([class]) tbody tr{transition:background-color 125ms}.md-typeset table:not([class]) tbody tr:hover{background-color:var(--md-typeset-table-color--light);box-shadow:0 .05rem 0 var(--md-default-bg-color) inset}.md-typeset table:not([class]) a{word-break:normal}.md-typeset table th[role=columnheader]{cursor:pointer}[dir=ltr] .md-typeset table th[role=columnheader]:after{margin-left:.5em}[dir=rtl] .md-typeset table th[role=columnheader]:after{margin-right:.5em}.md-typeset table th[role=columnheader]:after{content:"";display:inline-block;height:1.2em;-webkit-mask-image:var(--md-typeset-table-sort-icon);mask-image:var(--md-typeset-table-sort-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.md-typeset table th[role=columnheader]:hover:after{background-color:var(--md-default-fg-color--lighter)}.md-typeset table th[role=columnheader][aria-sort=ascending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--asc);mask-image:var(--md-typeset-table-sort-icon--asc)}.md-typeset table th[role=columnheader][aria-sort=descending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--desc);mask-image:var(--md-typeset-table-sort-icon--desc)}.md-typeset__scrollwrap{margin:1em -.8rem;overflow-x:auto;touch-action:auto}.md-typeset__table{display:inline-block;margin-bottom:.5em;padding:0 .8rem}@media print{.md-typeset__table{display:block}}html .md-typeset__table table{display:table;margin:0;overflow:hidden;width:100%}@media screen and (max-width:44.984375em){.md-content__inner>pre{margin:1em -.8rem}.md-content__inner>pre code{border-radius:0}}.md-typeset .md-author{border-radius:100%;display:block;flex-shrink:0;height:1.6rem;overflow:hidden;position:relative;transition:color 125ms,transform 125ms;width:1.6rem}.md-typeset .md-author img{display:block}.md-typeset .md-author--more{background:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--lighter);font-size:.6rem;font-weight:700;line-height:1.6rem;text-align:center}.md-typeset .md-author--long{height:2.4rem;width:2.4rem}.md-typeset a.md-author{transform:scale(1)}.md-typeset a.md-author img{border-radius:100%;filter:grayscale(100%) opacity(75%);transition:filter 125ms}.md-typeset a.md-author:focus,.md-typeset a.md-author:hover{transform:scale(1.1);z-index:1}.md-typeset a.md-author:focus img,.md-typeset a.md-author:hover img{filter:grayscale(0)}.md-banner{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color);overflow:auto}@media print{.md-banner{display:none}}.md-banner--warning{background-color:var(--md-warning-bg-color);color:var(--md-warning-fg-color)}.md-banner__inner{font-size:.7rem;margin:.6rem auto;padding:0 .8rem}[dir=ltr] .md-banner__button{float:right}[dir=rtl] .md-banner__button{float:left}.md-banner__button{color:inherit;cursor:pointer;transition:opacity .25s}.no-js .md-banner__button{display:none}.md-banner__button:hover{opacity:.7}html{font-size:125%;height:100%;overflow-x:hidden}@media screen and (min-width:100em){html{font-size:137.5%}}@media screen and (min-width:125em){html{font-size:150%}}body{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;font-size:.5rem;min-height:100%;position:relative;width:100%}@media print{body{display:block}}@media screen and (max-width:59.984375em){body[data-md-scrolllock]{position:fixed}}.md-grid{margin-left:auto;margin-right:auto;max-width:61rem}.md-container{display:flex;flex-direction:column;flex-grow:1}@media print{.md-container{display:block}}.md-main{flex-grow:1}.md-main__inner{display:flex;height:100%;margin-top:1.5rem}.md-ellipsis{overflow:hidden;text-overflow:ellipsis}.md-toggle{display:none}.md-option{height:0;opacity:0;position:absolute;width:0}.md-option:checked+label:not([hidden]){display:block}.md-option.focus-visible+label{outline-color:var(--md-accent-fg-color);outline-style:auto}.md-skip{background-color:var(--md-default-fg-color);border-radius:.1rem;color:var(--md-default-bg-color);font-size:.64rem;margin:.5rem;opacity:0;outline-color:var(--md-accent-fg-color);padding:.3rem .5rem;position:fixed;transform:translateY(.4rem);z-index:-1}.md-skip:focus{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 175ms 75ms;z-index:10}@page{margin:25mm}:root{--md-clipboard-icon:url('data:image/svg+xml;charset=utf-8,')}.md-clipboard{border-radius:.1rem;color:var(--md-default-fg-color--lightest);cursor:pointer;height:1.5em;outline-color:var(--md-accent-fg-color);outline-offset:.1rem;transition:color .25s;width:1.5em;z-index:1}@media print{.md-clipboard{display:none}}.md-clipboard:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}:hover>.md-clipboard{color:var(--md-default-fg-color--light)}.md-clipboard:focus,.md-clipboard:hover{color:var(--md-accent-fg-color)}.md-clipboard:after{background-color:currentcolor;content:"";display:block;height:1.125em;margin:0 auto;-webkit-mask-image:var(--md-clipboard-icon);mask-image:var(--md-clipboard-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:1.125em}.md-clipboard--inline{cursor:pointer}.md-clipboard--inline code{transition:color .25s,background-color .25s}.md-clipboard--inline:focus code,.md-clipboard--inline:hover code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}:root{--md-code-select-icon:url('data:image/svg+xml;charset=utf-8,');--md-code-copy-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .md-code__content{display:grid}.md-code__nav{background-color:var(--md-code-bg-color--lighter);border-radius:.1rem;display:flex;gap:.2rem;padding:.2rem;position:absolute;right:.25em;top:.25em;transition:background-color .25s;z-index:1}:hover>.md-code__nav{background-color:var(--md-code-bg-color--light)}.md-code__button{color:var(--md-default-fg-color--lightest);cursor:pointer;display:block;height:1.5em;outline-color:var(--md-accent-fg-color);outline-offset:.1rem;transition:color .25s;width:1.5em}:hover>*>.md-code__button{color:var(--md-default-fg-color--light)}.md-code__button.focus-visible,.md-code__button:hover{color:var(--md-accent-fg-color)}.md-code__button--active{color:var(--md-default-fg-color)!important}.md-code__button:after{background-color:currentcolor;content:"";display:block;height:1.125em;margin:0 auto;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:1.125em}.md-code__button[data-md-type=select]:after{-webkit-mask-image:var(--md-code-select-icon);mask-image:var(--md-code-select-icon)}.md-code__button[data-md-type=copy]:after{-webkit-mask-image:var(--md-code-copy-icon);mask-image:var(--md-code-copy-icon)}@keyframes consent{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}@keyframes overlay{0%{opacity:0}to{opacity:1}}.md-consent__overlay{animation:overlay .25s both;-webkit-backdrop-filter:blur(.1rem);backdrop-filter:blur(.1rem);background-color:#0000008a;height:100%;opacity:1;position:fixed;top:0;width:100%;z-index:5}.md-consent__inner{animation:consent .5s cubic-bezier(.1,.7,.1,1) both;background-color:var(--md-default-bg-color);border:0;border-radius:.1rem;bottom:0;box-shadow:0 0 .2rem #0000001a,0 .2rem .4rem #0003;max-height:100%;overflow:auto;padding:0;position:fixed;width:100%;z-index:5}.md-consent__form{padding:.8rem}.md-consent__settings{display:none;margin:1em 0}input:checked+.md-consent__settings{display:block}.md-consent__controls{margin-bottom:.8rem}.md-typeset .md-consent__controls .md-button{display:inline}@media screen and (max-width:44.984375em){.md-typeset .md-consent__controls .md-button{display:block;margin-top:.4rem;text-align:center;width:100%}}.md-consent label{cursor:pointer}.md-content{flex-grow:1;min-width:0}.md-content__inner{margin:0 .8rem 1.2rem;padding-top:.6rem}@media screen and (min-width:76.25em){[dir=ltr] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}[dir=ltr] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner,[dir=rtl] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-right:1.2rem}[dir=rtl] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}}.md-content__inner:before{content:"";display:block;height:.4rem}.md-content__inner>:last-child{margin-bottom:0}[dir=ltr] .md-content__button{float:right}[dir=rtl] .md-content__button{float:left}[dir=ltr] .md-content__button{margin-left:.4rem}[dir=rtl] .md-content__button{margin-right:.4rem}.md-content__button{margin:.4rem 0;padding:0}@media print{.md-content__button{display:none}}.md-typeset .md-content__button{color:var(--md-default-fg-color--lighter)}.md-content__button svg{display:inline;vertical-align:top}[dir=rtl] .md-content__button svg{transform:scaleX(-1)}[dir=ltr] .md-dialog{right:.8rem}[dir=rtl] .md-dialog{left:.8rem}.md-dialog{background-color:var(--md-default-fg-color);border-radius:.1rem;bottom:.8rem;box-shadow:var(--md-shadow-z3);min-width:11.1rem;opacity:0;padding:.4rem .6rem;pointer-events:none;position:fixed;transform:translateY(100%);transition:transform 0ms .4s,opacity .4s;z-index:4}@media print{.md-dialog{display:none}}.md-dialog--active{opacity:1;pointer-events:auto;transform:translateY(0);transition:transform .4s cubic-bezier(.075,.85,.175,1),opacity .4s}.md-dialog__inner{color:var(--md-default-bg-color);font-size:.7rem}.md-feedback{margin:2em 0 1em;text-align:center}.md-feedback fieldset{border:none;margin:0;padding:0}.md-feedback__title{font-weight:700;margin:1em auto}.md-feedback__inner{position:relative}.md-feedback__list{display:flex;flex-wrap:wrap;place-content:baseline center;position:relative}.md-feedback__list:hover .md-icon:not(:disabled){color:var(--md-default-fg-color--lighter)}:disabled .md-feedback__list{min-height:1.8rem}.md-feedback__icon{color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;margin:0 .1rem;transition:color 125ms}.md-feedback__icon:not(:disabled).md-icon:hover{color:var(--md-accent-fg-color)}.md-feedback__icon:disabled{color:var(--md-default-fg-color--lightest);pointer-events:none}.md-feedback__note{opacity:0;position:relative;transform:translateY(.4rem);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s}.md-feedback__note>*{margin:0 auto;max-width:16rem}:disabled .md-feedback__note{opacity:1;transform:translateY(0)}@media print{.md-feedback{display:none}}.md-footer{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color)}@media print{.md-footer{display:none}}.md-footer__inner{justify-content:space-between;overflow:auto;padding:.2rem}.md-footer__inner:not([hidden]){display:flex}.md-footer__link{align-items:end;display:flex;flex-grow:0.01;margin-bottom:.4rem;margin-top:1rem;max-width:100%;outline-color:var(--md-accent-fg-color);overflow:hidden;transition:opacity .25s}.md-footer__link:focus,.md-footer__link:hover{opacity:.7}[dir=rtl] .md-footer__link svg{transform:scaleX(-1)}@media screen and (max-width:44.984375em){.md-footer__link--prev{flex-shrink:0}.md-footer__link--prev .md-footer__title{display:none}}[dir=ltr] .md-footer__link--next{margin-left:auto}[dir=rtl] .md-footer__link--next{margin-right:auto}.md-footer__link--next{text-align:right}[dir=rtl] .md-footer__link--next{text-align:left}.md-footer__title{flex-grow:1;font-size:.9rem;margin-bottom:.7rem;max-width:calc(100% - 2.4rem);padding:0 1rem;white-space:nowrap}.md-footer__button{margin:.2rem;padding:.4rem}.md-footer__direction{font-size:.64rem;opacity:.7}.md-footer-meta{background-color:var(--md-footer-bg-color--dark)}.md-footer-meta__inner{display:flex;flex-wrap:wrap;justify-content:space-between;padding:.2rem}html .md-footer-meta.md-typeset a{color:var(--md-footer-fg-color--light)}html .md-footer-meta.md-typeset a:focus,html .md-footer-meta.md-typeset a:hover{color:var(--md-footer-fg-color)}.md-copyright{color:var(--md-footer-fg-color--lighter);font-size:.64rem;margin:auto .6rem;padding:.4rem 0;width:100%}@media screen and (min-width:45em){.md-copyright{width:auto}}.md-copyright__highlight{color:var(--md-footer-fg-color--light)}.md-social{display:inline-flex;gap:.2rem;margin:0 .4rem;padding:.2rem 0 .6rem}@media screen and (min-width:45em){.md-social{padding:.6rem 0}}.md-social__link{display:inline-block;height:1.6rem;text-align:center;width:1.6rem}.md-social__link:before{line-height:1.9}.md-social__link svg{fill:currentcolor;max-height:.8rem;vertical-align:-25%}.md-typeset .md-button{border:.1rem solid;border-radius:.1rem;color:var(--md-primary-fg-color);cursor:pointer;display:inline-block;font-weight:700;padding:.625em 2em;transition:color 125ms,background-color 125ms,border-color 125ms}.md-typeset .md-button--primary{background-color:var(--md-primary-fg-color);border-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color)}.md-typeset .md-button:focus,.md-typeset .md-button:hover{background-color:var(--md-accent-fg-color);border-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}[dir=ltr] .md-typeset .md-input{border-top-left-radius:.1rem}[dir=ltr] .md-typeset .md-input,[dir=rtl] .md-typeset .md-input{border-top-right-radius:.1rem}[dir=rtl] .md-typeset .md-input{border-top-left-radius:.1rem}.md-typeset .md-input{border-bottom:.1rem solid var(--md-default-fg-color--lighter);box-shadow:var(--md-shadow-z1);font-size:.8rem;height:1.8rem;padding:0 .6rem;transition:border .25s,box-shadow .25s}.md-typeset .md-input:focus,.md-typeset .md-input:hover{border-bottom-color:var(--md-accent-fg-color);box-shadow:var(--md-shadow-z2)}.md-typeset .md-input--stretch{width:100%}.md-header{background-color:var(--md-primary-fg-color);box-shadow:0 0 .2rem #0000,0 .2rem .4rem #0000;color:var(--md-primary-bg-color);display:block;left:0;position:sticky;right:0;top:0;z-index:4}@media print{.md-header{display:none}}.md-header[hidden]{transform:translateY(-100%);transition:transform .25s cubic-bezier(.8,0,.6,1),box-shadow .25s}.md-header--shadow{box-shadow:0 0 .2rem #0000001a,0 .2rem .4rem #0003;transition:transform .25s cubic-bezier(.1,.7,.1,1),box-shadow .25s}.md-header__inner{align-items:center;display:flex;padding:0 .2rem}.md-header__button{color:currentcolor;cursor:pointer;margin:.2rem;outline-color:var(--md-accent-fg-color);padding:.4rem;position:relative;transition:opacity .25s;vertical-align:middle;z-index:1}.md-header__button:hover{opacity:.7}.md-header__button:not([hidden]){display:inline-block}.md-header__button:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.md-header__button.md-logo{margin:.2rem;padding:.4rem}@media screen and (max-width:76.234375em){.md-header__button.md-logo{display:none}}.md-header__button.md-logo img,.md-header__button.md-logo svg{fill:currentcolor;display:block;height:1.2rem;width:auto}@media screen and (min-width:60em){.md-header__button[for=__search]{display:none}}.no-js .md-header__button[for=__search]{display:none}[dir=rtl] .md-header__button[for=__search] svg{transform:scaleX(-1)}@media screen and (min-width:76.25em){.md-header__button[for=__drawer]{display:none}}.md-header__topic{display:flex;max-width:100%;position:absolute;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;white-space:nowrap}.md-header__topic+.md-header__topic{opacity:0;pointer-events:none;transform:translateX(1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}[dir=rtl] .md-header__topic+.md-header__topic{transform:translateX(-1.25rem)}.md-header__topic:first-child{font-weight:700}[dir=ltr] .md-header__title{margin-left:1rem;margin-right:.4rem}[dir=rtl] .md-header__title{margin-left:.4rem;margin-right:1rem}.md-header__title{flex-grow:1;font-size:.9rem;height:2.4rem;line-height:2.4rem}.md-header__title--active .md-header__topic{opacity:0;pointer-events:none;transform:translateX(-1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}[dir=rtl] .md-header__title--active .md-header__topic{transform:translateX(1.25rem)}.md-header__title--active .md-header__topic+.md-header__topic{opacity:1;pointer-events:auto;transform:translateX(0);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;z-index:0}.md-header__title>.md-header__ellipsis{height:100%;position:relative;width:100%}.md-header__option{display:flex;flex-shrink:0;max-width:100%;transition:max-width 0ms .25s,opacity .25s .25s;white-space:nowrap}[data-md-toggle=search]:checked~.md-header .md-header__option{max-width:0;opacity:0;transition:max-width 0ms,opacity 0ms}.md-header__option>input{bottom:0}.md-header__source{display:none}@media screen and (min-width:60em){[dir=ltr] .md-header__source{margin-left:1rem}[dir=rtl] .md-header__source{margin-right:1rem}.md-header__source{display:block;max-width:11.7rem;width:11.7rem}}@media screen and (min-width:76.25em){[dir=ltr] .md-header__source{margin-left:1.4rem}[dir=rtl] .md-header__source{margin-right:1.4rem}}.md-meta{color:var(--md-default-fg-color--light);font-size:.7rem;line-height:1.3}.md-meta__list{display:inline-flex;flex-wrap:wrap;list-style:none;margin:0;padding:0}.md-meta__item:not(:last-child):after{content:"·";margin-left:.2rem;margin-right:.2rem}.md-meta__link{color:var(--md-typeset-a-color)}.md-meta__link:focus,.md-meta__link:hover{color:var(--md-accent-fg-color)}.md-draft{background-color:#ff1744;border-radius:.125em;color:#fff;display:inline-block;font-weight:700;padding-left:.5714285714em;padding-right:.5714285714em}:root{--md-nav-icon--prev:url('data:image/svg+xml;charset=utf-8,');--md-nav-icon--next:url('data:image/svg+xml;charset=utf-8,');--md-toc-icon:url('data:image/svg+xml;charset=utf-8,')}.md-nav{font-size:.7rem;line-height:1.3}.md-nav__title{color:var(--md-default-fg-color--light);display:block;font-weight:700;overflow:hidden;padding:0 .6rem;text-overflow:ellipsis}.md-nav__title .md-nav__button{display:none}.md-nav__title .md-nav__button img{height:100%;width:auto}.md-nav__title .md-nav__button.md-logo img,.md-nav__title .md-nav__button.md-logo svg{fill:currentcolor;display:block;height:2.4rem;max-width:100%;object-fit:contain;width:auto}.md-nav__list{list-style:none;margin:0;padding:0}.md-nav__link{align-items:flex-start;display:flex;gap:.4rem;margin-top:.625em;scroll-snap-align:start;transition:color 125ms}.md-nav__link--passed,.md-nav__link--passed code{color:var(--md-default-fg-color--light)}.md-nav__item .md-nav__link--active,.md-nav__item .md-nav__link--active code{color:var(--md-typeset-a-color)}.md-nav__link .md-ellipsis{position:relative}.md-nav__link .md-ellipsis code{word-break:normal}[dir=ltr] .md-nav__link .md-icon:last-child{margin-left:auto}[dir=rtl] .md-nav__link .md-icon:last-child{margin-right:auto}.md-nav__link .md-typeset{font-size:.7rem;line-height:1.3}.md-nav__link svg{fill:currentcolor;flex-shrink:0;height:1.3em;position:relative}.md-nav__link[for]:focus,.md-nav__link[for]:hover,.md-nav__link[href]:focus,.md-nav__link[href]:hover{color:var(--md-accent-fg-color);cursor:pointer}.md-nav__link[for]:focus code,.md-nav__link[for]:hover code,.md-nav__link[href]:focus code,.md-nav__link[href]:hover code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-nav__link.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-nav--primary .md-nav__link[for=__toc]{display:none}.md-nav--primary .md-nav__link[for=__toc] .md-icon:after{background-color:currentcolor;display:block;height:100%;-webkit-mask-image:var(--md-toc-icon);mask-image:var(--md-toc-icon);width:100%}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:none}.md-nav__container>.md-nav__link{margin-top:0}.md-nav__container>.md-nav__link:first-child{flex-grow:1;min-width:0}.md-nav__icon{flex-shrink:0}.md-nav__source{display:none}@media screen and (max-width:76.234375em){.md-nav--primary,.md-nav--primary .md-nav{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;height:100%;left:0;position:absolute;right:0;top:0;z-index:1}.md-nav--primary .md-nav__item,.md-nav--primary .md-nav__title{font-size:.8rem;line-height:1.5}.md-nav--primary .md-nav__title{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);cursor:pointer;height:5.6rem;line-height:2.4rem;padding:3rem .8rem .2rem;position:relative;white-space:nowrap}[dir=ltr] .md-nav--primary .md-nav__title .md-nav__icon{left:.4rem}[dir=rtl] .md-nav--primary .md-nav__title .md-nav__icon{right:.4rem}.md-nav--primary .md-nav__title .md-nav__icon{display:block;height:1.2rem;margin:.2rem;position:absolute;top:.4rem;width:1.2rem}.md-nav--primary .md-nav__title .md-nav__icon:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--prev);mask-image:var(--md-nav-icon--prev);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}.md-nav--primary .md-nav__title~.md-nav__list{background-color:var(--md-default-bg-color);box-shadow:0 .05rem 0 var(--md-default-fg-color--lightest) inset;overflow-y:auto;scroll-snap-type:y mandatory;touch-action:pan-y}.md-nav--primary .md-nav__title~.md-nav__list>:first-child{border-top:0}.md-nav--primary .md-nav__title[for=__drawer]{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);font-weight:700}.md-nav--primary .md-nav__title .md-logo{display:block;left:.2rem;margin:.2rem;padding:.4rem;position:absolute;right:.2rem;top:.2rem}.md-nav--primary .md-nav__list{flex:1}.md-nav--primary .md-nav__item{border-top:.05rem solid var(--md-default-fg-color--lightest)}.md-nav--primary .md-nav__item--active>.md-nav__link{color:var(--md-typeset-a-color)}.md-nav--primary .md-nav__item--active>.md-nav__link:focus,.md-nav--primary .md-nav__item--active>.md-nav__link:hover{color:var(--md-accent-fg-color)}.md-nav--primary .md-nav__link{margin-top:0;padding:.6rem .8rem}.md-nav--primary .md-nav__link svg{margin-top:.1em}.md-nav--primary .md-nav__link>.md-nav__link{padding:0}[dir=ltr] .md-nav--primary .md-nav__link .md-nav__icon{margin-right:-.2rem}[dir=rtl] .md-nav--primary .md-nav__link .md-nav__icon{margin-left:-.2rem}.md-nav--primary .md-nav__link .md-nav__icon{font-size:1.2rem;height:1.2rem;width:1.2rem}.md-nav--primary .md-nav__link .md-nav__icon:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[dir=rtl] .md-nav--primary .md-nav__icon:after{transform:scale(-1)}.md-nav--primary .md-nav--secondary .md-nav{background-color:initial;position:static}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-left:1.4rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-right:1.4rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-left:2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-right:2rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-left:2.6rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-right:2.6rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-left:3.2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-right:3.2rem}.md-nav--secondary{background-color:initial}.md-nav__toggle~.md-nav{display:flex;opacity:0;transform:translateX(100%);transition:transform .25s cubic-bezier(.8,0,.6,1),opacity 125ms 50ms}[dir=rtl] .md-nav__toggle~.md-nav{transform:translateX(-100%)}.md-nav__toggle:checked~.md-nav{opacity:1;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 125ms 125ms}.md-nav__toggle:checked~.md-nav>.md-nav__list{-webkit-backface-visibility:hidden;backface-visibility:hidden}}@media screen and (max-width:59.984375em){.md-nav--primary .md-nav__link[for=__toc]{display:flex}.md-nav--primary .md-nav__link[for=__toc] .md-icon:after{content:""}.md-nav--primary .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:flex}.md-nav__source{background-color:var(--md-primary-fg-color--dark);color:var(--md-primary-bg-color);display:block;padding:0 .2rem}}@media screen and (min-width:60em) and (max-width:76.234375em){.md-nav--integrated .md-nav__link[for=__toc]{display:flex}.md-nav--integrated .md-nav__link[for=__toc] .md-icon:after{content:""}.md-nav--integrated .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--integrated .md-nav__link[for=__toc]~.md-nav{display:flex}}@media screen and (min-width:60em){.md-nav{margin-bottom:-.4rem}.md-nav--secondary .md-nav__title{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);position:sticky;top:0;z-index:1}.md-nav--secondary .md-nav__title[for=__toc]{scroll-snap-align:start}.md-nav--secondary .md-nav__title .md-nav__icon{display:none}[dir=ltr] .md-nav--secondary .md-nav__list{padding-left:.6rem}[dir=rtl] .md-nav--secondary .md-nav__list{padding-right:.6rem}.md-nav--secondary .md-nav__list{padding-bottom:.4rem}[dir=ltr] .md-nav--secondary .md-nav__item>.md-nav__link{margin-right:.4rem}[dir=rtl] .md-nav--secondary .md-nav__item>.md-nav__link{margin-left:.4rem}}@media screen and (min-width:76.25em){.md-nav{margin-bottom:-.4rem;transition:max-height .25s cubic-bezier(.86,0,.07,1)}.md-nav--primary .md-nav__title{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);position:sticky;top:0;z-index:1}.md-nav--primary .md-nav__title[for=__drawer]{scroll-snap-align:start}.md-nav--primary .md-nav__title .md-nav__icon{display:none}[dir=ltr] .md-nav--primary .md-nav__list{padding-left:.6rem}[dir=rtl] .md-nav--primary .md-nav__list{padding-right:.6rem}.md-nav--primary .md-nav__list{padding-bottom:.4rem}[dir=ltr] .md-nav--primary .md-nav__item>.md-nav__link{margin-right:.4rem}[dir=rtl] .md-nav--primary .md-nav__item>.md-nav__link{margin-left:.4rem}.md-nav__toggle~.md-nav{display:grid;grid-template-rows:minmax(.4rem,0fr);opacity:0;transition:grid-template-rows .25s cubic-bezier(.86,0,.07,1),opacity .25s,visibility 0ms .25s;visibility:collapse}.md-nav__toggle~.md-nav>.md-nav__list{overflow:hidden}.md-nav__toggle.md-toggle--indeterminate~.md-nav,.md-nav__toggle:checked~.md-nav{grid-template-rows:minmax(.4rem,1fr);opacity:1;transition:grid-template-rows .25s cubic-bezier(.86,0,.07,1),opacity .15s .1s,visibility 0ms;visibility:visible}.md-nav__toggle.md-toggle--indeterminate~.md-nav{transition:none}.md-nav__item--nested>.md-nav>.md-nav__title{display:none}.md-nav__item--section{display:block;margin:1.25em 0}.md-nav__item--section:last-child{margin-bottom:0}.md-nav__item--section>.md-nav__link{font-weight:700}.md-nav__item--section>.md-nav__link[for]{color:var(--md-default-fg-color--light)}.md-nav__item--section>.md-nav__link:not(.md-nav__container){pointer-events:none}.md-nav__item--section>.md-nav__link .md-icon,.md-nav__item--section>.md-nav__link>[for]{display:none}[dir=ltr] .md-nav__item--section>.md-nav{margin-left:-.6rem}[dir=rtl] .md-nav__item--section>.md-nav{margin-right:-.6rem}.md-nav__item--section>.md-nav{display:block;opacity:1;visibility:visible}.md-nav__item--section>.md-nav>.md-nav__list>.md-nav__item{padding:0}.md-nav__icon{border-radius:100%;height:.9rem;transition:background-color .25s;width:.9rem}.md-nav__icon:hover{background-color:var(--md-accent-fg-color--transparent)}.md-nav__icon:after{background-color:currentcolor;border-radius:100%;content:"";display:inline-block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:transform .25s;vertical-align:-.1rem;width:100%}[dir=rtl] .md-nav__icon:after{transform:rotate(180deg)}.md-nav__item--nested .md-nav__toggle:checked~.md-nav__link .md-nav__icon:after,.md-nav__item--nested .md-toggle--indeterminate~.md-nav__link .md-nav__icon:after{transform:rotate(90deg)}.md-nav--lifted>.md-nav__list>.md-nav__item,.md-nav--lifted>.md-nav__title{display:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active{display:block}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);margin-top:0;position:sticky;top:0;z-index:1}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link:not(.md-nav__container){pointer-events:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active.md-nav__item--section{margin:0}[dir=ltr] .md-nav--lifted>.md-nav__list>.md-nav__item>.md-nav:not(.md-nav--secondary){margin-left:-.6rem}[dir=rtl] .md-nav--lifted>.md-nav__list>.md-nav__item>.md-nav:not(.md-nav--secondary){margin-right:-.6rem}.md-nav--lifted>.md-nav__list>.md-nav__item>[for]{color:var(--md-default-fg-color--light)}.md-nav--lifted .md-nav[data-md-level="1"]{grid-template-rows:minmax(.4rem,1fr);opacity:1;visibility:visible}[dir=ltr] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-left:.05rem solid var(--md-primary-fg-color)}[dir=rtl] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-right:.05rem solid var(--md-primary-fg-color)}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{display:block;margin-bottom:1.25em;opacity:1;visibility:visible}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary>.md-nav__list{overflow:visible;padding-bottom:0}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary>.md-nav__title{display:none}}.md-pagination{font-size:.8rem;font-weight:700;gap:.4rem}.md-pagination,.md-pagination>*{align-items:center;display:flex;justify-content:center}.md-pagination>*{border-radius:.2rem;height:1.8rem;min-width:1.8rem;text-align:center}.md-pagination__current{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light)}.md-pagination__link{transition:color 125ms,background-color 125ms}.md-pagination__link:focus,.md-pagination__link:hover{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-pagination__link:focus svg,.md-pagination__link:hover svg{color:var(--md-accent-fg-color)}.md-pagination__link.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-pagination__link svg{fill:currentcolor;color:var(--md-default-fg-color--lighter);display:block;max-height:100%;width:1.2rem}:root{--md-path-icon:url('data:image/svg+xml;charset=utf-8,')}.md-path{font-size:.7rem;margin:0 .8rem;overflow:auto;padding-top:1.2rem}.md-path:not([hidden]){display:block}@media screen and (min-width:76.25em){.md-path{margin:0 1.2rem}}.md-path__list{align-items:center;display:flex;gap:.2rem;list-style:none;margin:0;padding:0}.md-path__item:not(:first-child){display:inline-flex;gap:.2rem;white-space:nowrap}.md-path__item:not(:first-child):before{background-color:var(--md-default-fg-color--lighter);content:"";display:inline;height:.8rem;-webkit-mask-image:var(--md-path-icon);mask-image:var(--md-path-icon);width:.8rem}.md-path__link{align-items:center;color:var(--md-default-fg-color--light);display:flex}.md-path__link:focus,.md-path__link:hover{color:var(--md-accent-fg-color)}:root{--md-post-pin-icon:url('data:image/svg+xml;charset=utf-8,')}.md-post__back{border-bottom:.05rem solid var(--md-default-fg-color--lightest);margin-bottom:1.2rem;padding-bottom:1.2rem}@media screen and (max-width:76.234375em){.md-post__back{display:none}}[dir=rtl] .md-post__back svg{transform:scaleX(-1)}.md-post__authors{display:flex;flex-direction:column;gap:.6rem;margin:0 .6rem 1.2rem}.md-post .md-post__meta a{transition:color 125ms}.md-post .md-post__meta a:focus,.md-post .md-post__meta a:hover{color:var(--md-accent-fg-color)}.md-post__title{color:var(--md-default-fg-color--light);font-weight:700}.md-post--excerpt{margin-bottom:3.2rem}.md-post--excerpt .md-post__header{align-items:center;display:flex;gap:.6rem;min-height:1.6rem}.md-post--excerpt .md-post__authors{align-items:center;display:inline-flex;flex-direction:row;gap:.2rem;margin:0;min-height:2.4rem}[dir=ltr] .md-post--excerpt .md-post__meta .md-meta__list{margin-right:.4rem}[dir=rtl] .md-post--excerpt .md-post__meta .md-meta__list{margin-left:.4rem}.md-post--excerpt .md-post__content>:first-child{--md-scroll-margin:6rem;margin-top:0}.md-post>.md-nav--secondary{margin:1em 0}.md-pin{background:var(--md-default-fg-color--lightest);border-radius:1rem;margin-top:-.05rem;padding:.2rem}.md-pin:after{background-color:currentcolor;content:"";display:block;height:.6rem;margin:0 auto;-webkit-mask-image:var(--md-post-pin-icon);mask-image:var(--md-post-pin-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.6rem}.md-profile{align-items:center;display:flex;font-size:.7rem;gap:.6rem;line-height:1.4;width:100%}.md-profile__description{flex-grow:1}.md-content--post{display:flex}@media screen and (max-width:76.234375em){.md-content--post{flex-flow:column-reverse}}.md-content--post>.md-content__inner{flex-grow:1;min-width:0}@media screen and (min-width:76.25em){[dir=ltr] .md-content--post>.md-content__inner{margin-left:1.2rem}[dir=rtl] .md-content--post>.md-content__inner{margin-right:1.2rem}}@media screen and (max-width:76.234375em){.md-sidebar.md-sidebar--post{padding:0;position:static;width:100%}.md-sidebar.md-sidebar--post .md-sidebar__scrollwrap{overflow:visible}.md-sidebar.md-sidebar--post .md-sidebar__inner{padding:0}.md-sidebar.md-sidebar--post .md-post__meta{margin-left:.6rem;margin-right:.6rem}.md-sidebar.md-sidebar--post .md-nav__item{border:none;display:inline}.md-sidebar.md-sidebar--post .md-nav__list{display:inline-flex;flex-wrap:wrap;gap:.6rem;padding-bottom:.6rem;padding-top:.6rem}.md-sidebar.md-sidebar--post .md-nav__link{padding:0}.md-sidebar.md-sidebar--post .md-nav{height:auto;margin-bottom:0;position:static}}:root{--md-progress-value:0;--md-progress-delay:400ms}.md-progress{background:var(--md-primary-bg-color);height:.075rem;opacity:min(clamp(0,var(--md-progress-value),1),clamp(0,100 - var(--md-progress-value),1));position:fixed;top:0;transform:scaleX(calc(var(--md-progress-value)*1%));transform-origin:left;transition:transform .5s cubic-bezier(.19,1,.22,1),opacity .25s var(--md-progress-delay);width:100%;z-index:4}:root{--md-search-result-icon:url('data:image/svg+xml;charset=utf-8,')}.md-search{position:relative}@media screen and (min-width:60em){.md-search{padding:.2rem 0}}.no-js .md-search{display:none}.md-search__overlay{opacity:0;z-index:1}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__overlay{left:-2.2rem}[dir=rtl] .md-search__overlay{right:-2.2rem}.md-search__overlay{background-color:var(--md-default-bg-color);border-radius:1rem;height:2rem;overflow:hidden;pointer-events:none;position:absolute;top:-1rem;transform-origin:center;transition:transform .3s .1s,opacity .2s .2s;width:2rem}[data-md-toggle=search]:checked~.md-header .md-search__overlay{opacity:1;transition:transform .4s,opacity .1s}}@media screen and (min-width:60em){[dir=ltr] .md-search__overlay{left:0}[dir=rtl] .md-search__overlay{right:0}.md-search__overlay{background-color:#0000008a;cursor:pointer;height:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0}[data-md-toggle=search]:checked~.md-header .md-search__overlay{height:200vh;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@media screen and (max-width:29.984375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(45)}}@media screen and (min-width:30em) and (max-width:44.984375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(60)}}@media screen and (min-width:45em) and (max-width:59.984375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(75)}}.md-search__inner{-webkit-backface-visibility:hidden;backface-visibility:hidden}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__inner{left:0}[dir=rtl] .md-search__inner{right:0}.md-search__inner{height:0;opacity:0;overflow:hidden;position:fixed;top:0;transform:translateX(5%);transition:width 0ms .3s,height 0ms .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s;width:0;z-index:2}[dir=rtl] .md-search__inner{transform:translateX(-5%)}[data-md-toggle=search]:checked~.md-header .md-search__inner{height:100%;opacity:1;transform:translateX(0);transition:width 0ms 0ms,height 0ms 0ms,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s;width:100%}}@media screen and (min-width:60em){[dir=ltr] .md-search__inner{float:right}[dir=rtl] .md-search__inner{float:left}.md-search__inner{padding:.1rem 0;position:relative;transition:width .25s cubic-bezier(.1,.7,.1,1);width:11.7rem}}@media screen and (min-width:60em) and (max-width:76.234375em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:23.4rem}}@media screen and (min-width:76.25em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:34.4rem}}.md-search__form{background-color:var(--md-default-bg-color);box-shadow:0 0 .6rem #0000;height:2.4rem;position:relative;transition:color .25s,background-color .25s;z-index:2}@media screen and (min-width:60em){.md-search__form{background-color:#00000042;border-radius:.1rem;height:1.8rem}.md-search__form:hover{background-color:#ffffff1f}}[data-md-toggle=search]:checked~.md-header .md-search__form{background-color:var(--md-default-bg-color);border-radius:.1rem .1rem 0 0;box-shadow:0 0 .6rem #00000012;color:var(--md-default-fg-color)}[dir=ltr] .md-search__input{padding-left:3.6rem;padding-right:2.2rem}[dir=rtl] .md-search__input{padding-left:2.2rem;padding-right:3.6rem}.md-search__input{background:#0000;font-size:.9rem;height:100%;position:relative;text-overflow:ellipsis;width:100%;z-index:2}.md-search__input::placeholder{transition:color .25s}.md-search__input::placeholder,.md-search__input~.md-search__icon{color:var(--md-default-fg-color--light)}.md-search__input::-ms-clear{display:none}@media screen and (max-width:59.984375em){.md-search__input{font-size:.9rem;height:2.4rem;width:100%}}@media screen and (min-width:60em){[dir=ltr] .md-search__input{padding-left:2.2rem}[dir=rtl] .md-search__input{padding-right:2.2rem}.md-search__input{color:inherit;font-size:.8rem}.md-search__input::placeholder{color:var(--md-primary-bg-color--light)}.md-search__input+.md-search__icon{color:var(--md-primary-bg-color)}[data-md-toggle=search]:checked~.md-header .md-search__input{text-overflow:clip}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon{color:var(--md-default-fg-color--light)}[data-md-toggle=search]:checked~.md-header .md-search__input::placeholder{color:#0000}}.md-search__icon{cursor:pointer;display:inline-block;height:1.2rem;transition:color .25s,opacity .25s;width:1.2rem}.md-search__icon:hover{opacity:.7}[dir=ltr] .md-search__icon[for=__search]{left:.5rem}[dir=rtl] .md-search__icon[for=__search]{right:.5rem}.md-search__icon[for=__search]{position:absolute;top:.3rem;z-index:2}[dir=rtl] .md-search__icon[for=__search] svg{transform:scaleX(-1)}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__icon[for=__search]{left:.8rem}[dir=rtl] .md-search__icon[for=__search]{right:.8rem}.md-search__icon[for=__search]{top:.6rem}.md-search__icon[for=__search] svg:first-child{display:none}}@media screen and (min-width:60em){.md-search__icon[for=__search]{pointer-events:none}.md-search__icon[for=__search] svg:last-child{display:none}}[dir=ltr] .md-search__options{right:.5rem}[dir=rtl] .md-search__options{left:.5rem}.md-search__options{pointer-events:none;position:absolute;top:.3rem;z-index:2}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__options{right:.8rem}[dir=rtl] .md-search__options{left:.8rem}.md-search__options{top:.6rem}}[dir=ltr] .md-search__options>.md-icon{margin-left:.2rem}[dir=rtl] .md-search__options>.md-icon{margin-right:.2rem}.md-search__options>.md-icon{color:var(--md-default-fg-color--light);opacity:0;transform:scale(.75);transition:transform .15s cubic-bezier(.1,.7,.1,1),opacity .15s}.md-search__options>.md-icon:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>.md-icon{opacity:1;pointer-events:auto;transform:scale(1)}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>.md-icon:hover{opacity:.7}[dir=ltr] .md-search__suggest{padding-left:3.6rem;padding-right:2.2rem}[dir=rtl] .md-search__suggest{padding-left:2.2rem;padding-right:3.6rem}.md-search__suggest{align-items:center;color:var(--md-default-fg-color--lighter);display:flex;font-size:.9rem;height:100%;opacity:0;position:absolute;top:0;transition:opacity 50ms;white-space:nowrap;width:100%}@media screen and (min-width:60em){[dir=ltr] .md-search__suggest{padding-left:2.2rem}[dir=rtl] .md-search__suggest{padding-right:2.2rem}.md-search__suggest{font-size:.8rem}}[data-md-toggle=search]:checked~.md-header .md-search__suggest{opacity:1;transition:opacity .3s .1s}[dir=ltr] .md-search__output{border-bottom-left-radius:.1rem}[dir=ltr] .md-search__output,[dir=rtl] .md-search__output{border-bottom-right-radius:.1rem}[dir=rtl] .md-search__output{border-bottom-left-radius:.1rem}.md-search__output{overflow:hidden;position:absolute;width:100%;z-index:1}@media screen and (max-width:59.984375em){.md-search__output{bottom:0;top:2.4rem}}@media screen and (min-width:60em){.md-search__output{opacity:0;top:1.9rem;transition:opacity .4s}[data-md-toggle=search]:checked~.md-header .md-search__output{box-shadow:var(--md-shadow-z3);opacity:1}}.md-search__scrollwrap{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--md-default-bg-color);height:100%;overflow-y:auto;touch-action:pan-y}@media (-webkit-max-device-pixel-ratio:1),(max-resolution:1dppx){.md-search__scrollwrap{transform:translateZ(0)}}@media screen and (min-width:60em) and (max-width:76.234375em){.md-search__scrollwrap{width:23.4rem}}@media screen and (min-width:76.25em){.md-search__scrollwrap{width:34.4rem}}@media screen and (min-width:60em){.md-search__scrollwrap{max-height:0;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin}[data-md-toggle=search]:checked~.md-header .md-search__scrollwrap{max-height:75vh}.md-search__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-search__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.md-search__scrollwrap::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}}.md-search-result{color:var(--md-default-fg-color);word-break:break-word}.md-search-result__meta{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.8rem;padding:0 .8rem;scroll-snap-align:start}@media screen and (min-width:60em){[dir=ltr] .md-search-result__meta{padding-left:2.2rem}[dir=rtl] .md-search-result__meta{padding-right:2.2rem}}.md-search-result__list{list-style:none;margin:0;padding:0;-webkit-user-select:none;user-select:none}.md-search-result__item{box-shadow:0 -.05rem var(--md-default-fg-color--lightest)}.md-search-result__item:first-child{box-shadow:none}.md-search-result__link{display:block;outline:none;scroll-snap-align:start;transition:background-color .25s}.md-search-result__link:focus,.md-search-result__link:hover{background-color:var(--md-accent-fg-color--transparent)}.md-search-result__link:last-child p:last-child{margin-bottom:.6rem}.md-search-result__more>summary{cursor:pointer;display:block;outline:none;position:sticky;scroll-snap-align:start;top:0;z-index:1}.md-search-result__more>summary::marker{display:none}.md-search-result__more>summary::-webkit-details-marker{display:none}.md-search-result__more>summary>div{color:var(--md-typeset-a-color);font-size:.64rem;padding:.75em .8rem;transition:color .25s,background-color .25s}@media screen and (min-width:60em){[dir=ltr] .md-search-result__more>summary>div{padding-left:2.2rem}[dir=rtl] .md-search-result__more>summary>div{padding-right:2.2rem}}.md-search-result__more>summary:focus>div,.md-search-result__more>summary:hover>div{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-search-result__more[open]>summary{background-color:var(--md-default-bg-color)}.md-search-result__article{overflow:hidden;padding:0 .8rem;position:relative}@media screen and (min-width:60em){[dir=ltr] .md-search-result__article{padding-left:2.2rem}[dir=rtl] .md-search-result__article{padding-right:2.2rem}}[dir=ltr] .md-search-result__icon{left:0}[dir=rtl] .md-search-result__icon{right:0}.md-search-result__icon{color:var(--md-default-fg-color--light);height:1.2rem;margin:.5rem;position:absolute;width:1.2rem}@media screen and (max-width:59.984375em){.md-search-result__icon{display:none}}.md-search-result__icon:after{background-color:currentcolor;content:"";display:inline-block;height:100%;-webkit-mask-image:var(--md-search-result-icon);mask-image:var(--md-search-result-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[dir=rtl] .md-search-result__icon:after{transform:scaleX(-1)}.md-search-result .md-typeset{color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.6}.md-search-result .md-typeset h1{color:var(--md-default-fg-color);font-size:.8rem;font-weight:400;line-height:1.4;margin:.55rem 0}.md-search-result .md-typeset h1 mark{text-decoration:none}.md-search-result .md-typeset h2{color:var(--md-default-fg-color);font-size:.64rem;font-weight:700;line-height:1.6;margin:.5em 0}.md-search-result .md-typeset h2 mark{text-decoration:none}.md-search-result__terms{color:var(--md-default-fg-color);display:block;font-size:.64rem;font-style:italic;margin:.5em 0}.md-search-result mark{background-color:initial;color:var(--md-accent-fg-color);text-decoration:underline}.md-select{position:relative;z-index:1}.md-select__inner{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);left:50%;margin-top:.2rem;max-height:0;opacity:0;position:absolute;top:calc(100% - .2rem);transform:translate3d(-50%,.3rem,0);transition:transform .25s 375ms,opacity .25s .25s,max-height 0ms .5s}.md-select:focus-within .md-select__inner,.md-select:hover .md-select__inner{max-height:10rem;opacity:1;transform:translate3d(-50%,0,0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,max-height 0ms}.md-select__inner:after{border-bottom:.2rem solid #0000;border-bottom-color:var(--md-default-bg-color);border-left:.2rem solid #0000;border-right:.2rem solid #0000;border-top:0;content:"";height:0;left:50%;margin-left:-.2rem;margin-top:-.2rem;position:absolute;top:0;width:0}.md-select__list{border-radius:.1rem;font-size:.8rem;list-style-type:none;margin:0;max-height:inherit;overflow:auto;padding:0}.md-select__item{line-height:1.8rem}[dir=ltr] .md-select__link{padding-left:.6rem;padding-right:1.2rem}[dir=rtl] .md-select__link{padding-left:1.2rem;padding-right:.6rem}.md-select__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:background-color .25s,color .25s;width:100%}.md-select__link:focus,.md-select__link:hover{color:var(--md-accent-fg-color)}.md-select__link:focus{background-color:var(--md-default-fg-color--lightest)}.md-sidebar{align-self:flex-start;flex-shrink:0;padding:1.2rem 0;position:sticky;top:2.4rem;width:12.1rem}@media print{.md-sidebar{display:none}}@media screen and (max-width:76.234375em){[dir=ltr] .md-sidebar--primary{left:-12.1rem}[dir=rtl] .md-sidebar--primary{right:-12.1rem}.md-sidebar--primary{background-color:var(--md-default-bg-color);display:block;height:100%;position:fixed;top:0;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s;width:12.1rem;z-index:5}[data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{box-shadow:var(--md-shadow-z3);transform:translateX(12.1rem)}[dir=rtl] [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{transform:translateX(-12.1rem)}.md-sidebar--primary .md-sidebar__scrollwrap{bottom:0;left:0;margin:0;overflow:hidden;position:absolute;right:0;scroll-snap-type:none;top:0}}@media screen and (min-width:76.25em){.md-sidebar{height:0}.no-js .md-sidebar{height:auto}.md-header--lifted~.md-container .md-sidebar{top:4.8rem}}.md-sidebar--secondary{display:none;order:2}@media screen and (min-width:60em){.md-sidebar--secondary{height:0}.no-js .md-sidebar--secondary{height:auto}.md-sidebar--secondary:not([hidden]){display:block}.md-sidebar--secondary .md-sidebar__scrollwrap{touch-action:pan-y}}.md-sidebar__scrollwrap{-webkit-backface-visibility:hidden;backface-visibility:hidden;margin:0 .2rem;overflow-y:auto;scrollbar-color:var(--md-default-fg-color--lighter) #0000}@media screen and (min-width:60em){.md-sidebar__scrollwrap{scrollbar-gutter:stable;scrollbar-width:thin}}.md-sidebar__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.md-sidebar__scrollwrap:focus-within,.md-sidebar__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-sidebar__scrollwrap:focus-within::-webkit-scrollbar-thumb,.md-sidebar__scrollwrap:hover::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-sidebar__scrollwrap:focus-within::-webkit-scrollbar-thumb:hover,.md-sidebar__scrollwrap:hover::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}@supports selector(::-webkit-scrollbar){.md-sidebar__scrollwrap{scrollbar-gutter:auto}[dir=ltr] .md-sidebar__inner{padding-right:calc(100% - 11.5rem)}[dir=rtl] .md-sidebar__inner{padding-left:calc(100% - 11.5rem)}}@media screen and (max-width:76.234375em){.md-overlay{background-color:#0000008a;height:0;opacity:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0;z-index:5}[data-md-toggle=drawer]:checked~.md-overlay{height:100%;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@keyframes facts{0%{height:0}to{height:.65rem}}@keyframes fact{0%{opacity:0;transform:translateY(100%)}50%{opacity:0}to{opacity:1;transform:translateY(0)}}:root{--md-source-forks-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-repositories-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-stars-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-version-icon:url('data:image/svg+xml;charset=utf-8,')}.md-source{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:block;font-size:.65rem;line-height:1.2;outline-color:var(--md-accent-fg-color);transition:opacity .25s;white-space:nowrap}.md-source:hover{opacity:.7}.md-source__icon{display:inline-block;height:2.4rem;vertical-align:middle;width:2rem}[dir=ltr] .md-source__icon svg{margin-left:.6rem}[dir=rtl] .md-source__icon svg{margin-right:.6rem}.md-source__icon svg{margin-top:.6rem}[dir=ltr] .md-source__icon+.md-source__repository{padding-left:2rem}[dir=rtl] .md-source__icon+.md-source__repository{padding-right:2rem}[dir=ltr] .md-source__icon+.md-source__repository{margin-left:-2rem}[dir=rtl] .md-source__icon+.md-source__repository{margin-right:-2rem}[dir=ltr] .md-source__repository{margin-left:.6rem}[dir=rtl] .md-source__repository{margin-right:.6rem}.md-source__repository{display:inline-block;max-width:calc(100% - 1.2rem);overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.md-source__facts{display:flex;font-size:.55rem;gap:.4rem;list-style-type:none;margin:.1rem 0 0;opacity:.75;overflow:hidden;padding:0;width:100%}.md-source__repository--active .md-source__facts{animation:facts .25s ease-in}.md-source__fact{overflow:hidden;text-overflow:ellipsis}.md-source__repository--active .md-source__fact{animation:fact .4s ease-out}[dir=ltr] .md-source__fact:before{margin-right:.1rem}[dir=rtl] .md-source__fact:before{margin-left:.1rem}.md-source__fact:before{background-color:currentcolor;content:"";display:inline-block;height:.6rem;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;vertical-align:text-top;width:.6rem}.md-source__fact:nth-child(1n+2){flex-shrink:0}.md-source__fact--version:before{-webkit-mask-image:var(--md-source-version-icon);mask-image:var(--md-source-version-icon)}.md-source__fact--stars:before{-webkit-mask-image:var(--md-source-stars-icon);mask-image:var(--md-source-stars-icon)}.md-source__fact--forks:before{-webkit-mask-image:var(--md-source-forks-icon);mask-image:var(--md-source-forks-icon)}.md-source__fact--repositories:before{-webkit-mask-image:var(--md-source-repositories-icon);mask-image:var(--md-source-repositories-icon)}.md-source-file{margin:1em 0}[dir=ltr] .md-source-file__fact{margin-right:.6rem}[dir=rtl] .md-source-file__fact{margin-left:.6rem}.md-source-file__fact{align-items:center;color:var(--md-default-fg-color--light);display:inline-flex;font-size:.68rem;gap:.3rem}.md-source-file__fact .md-icon{flex-shrink:0;margin-bottom:.05rem}[dir=ltr] .md-source-file__fact .md-author{float:left}[dir=rtl] .md-source-file__fact .md-author{float:right}.md-source-file__fact .md-author{margin-right:.2rem}.md-source-file__fact svg{width:.9rem}:root{--md-status:url('data:image/svg+xml;charset=utf-8,');--md-status--new:url('data:image/svg+xml;charset=utf-8,');--md-status--deprecated:url('data:image/svg+xml;charset=utf-8,');--md-status--encrypted:url('data:image/svg+xml;charset=utf-8,')}.md-status:after{background-color:var(--md-default-fg-color--light);content:"";display:inline-block;height:1.125em;-webkit-mask-image:var(--md-status);mask-image:var(--md-status);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;vertical-align:text-bottom;width:1.125em}.md-status:hover:after{background-color:currentcolor}.md-status--new:after{-webkit-mask-image:var(--md-status--new);mask-image:var(--md-status--new)}.md-status--deprecated:after{-webkit-mask-image:var(--md-status--deprecated);mask-image:var(--md-status--deprecated)}.md-status--encrypted:after{-webkit-mask-image:var(--md-status--encrypted);mask-image:var(--md-status--encrypted)}.md-tabs{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);display:block;line-height:1.3;overflow:auto;width:100%;z-index:3}@media print{.md-tabs{display:none}}@media screen and (max-width:76.234375em){.md-tabs{display:none}}.md-tabs[hidden]{pointer-events:none}[dir=ltr] .md-tabs__list{margin-left:.2rem}[dir=rtl] .md-tabs__list{margin-right:.2rem}.md-tabs__list{contain:content;display:flex;list-style:none;margin:0;overflow:auto;padding:0;scrollbar-width:none;white-space:nowrap}.md-tabs__list::-webkit-scrollbar{display:none}.md-tabs__item{height:2.4rem;padding-left:.6rem;padding-right:.6rem}.md-tabs__item--active .md-tabs__link{color:inherit;opacity:1}.md-tabs__link{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:flex;font-size:.7rem;margin-top:.8rem;opacity:.7;outline-color:var(--md-accent-fg-color);outline-offset:.2rem;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s}.md-tabs__link:focus,.md-tabs__link:hover{color:inherit;opacity:1}[dir=ltr] .md-tabs__link svg{margin-right:.4rem}[dir=rtl] .md-tabs__link svg{margin-left:.4rem}.md-tabs__link svg{fill:currentcolor;height:1.3em}.md-tabs__item:nth-child(2) .md-tabs__link{transition-delay:20ms}.md-tabs__item:nth-child(3) .md-tabs__link{transition-delay:40ms}.md-tabs__item:nth-child(4) .md-tabs__link{transition-delay:60ms}.md-tabs__item:nth-child(5) .md-tabs__link{transition-delay:80ms}.md-tabs__item:nth-child(6) .md-tabs__link{transition-delay:.1s}.md-tabs__item:nth-child(7) .md-tabs__link{transition-delay:.12s}.md-tabs__item:nth-child(8) .md-tabs__link{transition-delay:.14s}.md-tabs__item:nth-child(9) .md-tabs__link{transition-delay:.16s}.md-tabs__item:nth-child(10) .md-tabs__link{transition-delay:.18s}.md-tabs__item:nth-child(11) .md-tabs__link{transition-delay:.2s}.md-tabs__item:nth-child(12) .md-tabs__link{transition-delay:.22s}.md-tabs__item:nth-child(13) .md-tabs__link{transition-delay:.24s}.md-tabs__item:nth-child(14) .md-tabs__link{transition-delay:.26s}.md-tabs__item:nth-child(15) .md-tabs__link{transition-delay:.28s}.md-tabs__item:nth-child(16) .md-tabs__link{transition-delay:.3s}.md-tabs[hidden] .md-tabs__link{opacity:0;transform:translateY(50%);transition:transform 0ms .1s,opacity .1s}:root{--md-tag-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .md-tags:not([hidden]){display:inline-flex;flex-wrap:wrap;gap:.5em;margin-bottom:.75em;margin-top:-.125em}.md-typeset .md-tag{align-items:center;background:var(--md-default-fg-color--lightest);border-radius:2.4rem;display:inline-flex;font-size:.64rem;font-size:min(.8em,.64rem);font-weight:700;gap:.5em;letter-spacing:normal;line-height:1.6;padding:.3125em .78125em}.md-typeset .md-tag[href]{-webkit-tap-highlight-color:transparent;color:inherit;outline:none;transition:color 125ms,background-color 125ms}.md-typeset .md-tag[href]:focus,.md-typeset .md-tag[href]:hover{background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}[id]>.md-typeset .md-tag{vertical-align:text-top}.md-typeset .md-tag-shadow{opacity:.5}.md-typeset .md-tag-icon:before{background-color:var(--md-default-fg-color--lighter);content:"";display:inline-block;height:1.2em;-webkit-mask-image:var(--md-tag-icon);mask-image:var(--md-tag-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.md-typeset .md-tag-icon[href]:focus:before,.md-typeset .md-tag-icon[href]:hover:before{background-color:var(--md-accent-bg-color)}@keyframes pulse{0%{transform:scale(.95)}75%{transform:scale(1)}to{transform:scale(.95)}}:root{--md-annotation-bg-icon:url('data:image/svg+xml;charset=utf-8,');--md-annotation-icon:url('data:image/svg+xml;charset=utf-8,')}.md-tooltip{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);font-family:var(--md-text-font-family);left:clamp(var(--md-tooltip-0,0rem) + .8rem,var(--md-tooltip-x),100vw + var(--md-tooltip-0,0rem) + .8rem - var(--md-tooltip-width) - 2 * .8rem);max-width:calc(100vw - 1.6rem);opacity:0;position:absolute;top:var(--md-tooltip-y);transform:translateY(-.4rem);transition:transform 0ms .25s,opacity .25s,z-index .25s;width:var(--md-tooltip-width);z-index:0}.md-tooltip--active{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,z-index 0ms;z-index:2}.md-tooltip--inline{font-weight:700;-webkit-user-select:none;user-select:none;width:auto}.md-tooltip--inline:not(.md-tooltip--active){transform:translateY(.2rem) scale(.9)}.md-tooltip--inline .md-tooltip__inner{font-size:.5rem;padding:.2rem .4rem}[hidden]+.md-tooltip--inline{display:none}.focus-visible>.md-tooltip,.md-tooltip:target{outline:var(--md-accent-fg-color) auto}.md-tooltip__inner{font-size:.64rem;padding:.8rem}.md-tooltip__inner.md-typeset>:first-child{margin-top:0}.md-tooltip__inner.md-typeset>:last-child{margin-bottom:0}.md-annotation{font-style:normal;font-weight:400;outline:none;text-align:initial;vertical-align:text-bottom;white-space:normal}[dir=rtl] .md-annotation{direction:rtl}code .md-annotation{font-family:var(--md-code-font-family);font-size:inherit}.md-annotation:not([hidden]){display:inline-block;line-height:1.25}.md-annotation__index{border-radius:.01px;cursor:pointer;display:inline-block;margin-left:.4ch;margin-right:.4ch;outline:none;overflow:hidden;position:relative;-webkit-user-select:none;user-select:none;vertical-align:text-top;z-index:0}.md-annotation .md-annotation__index{transition:z-index .25s}@media screen{.md-annotation__index{width:2.2ch}[data-md-visible]>.md-annotation__index{animation:pulse 2s infinite}.md-annotation__index:before{background:var(--md-default-bg-color);-webkit-mask-image:var(--md-annotation-bg-icon);mask-image:var(--md-annotation-bg-icon)}.md-annotation__index:after,.md-annotation__index:before{content:"";height:2.2ch;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:-.1ch;width:2.2ch;z-index:-1}.md-annotation__index:after{background-color:var(--md-default-fg-color--lighter);-webkit-mask-image:var(--md-annotation-icon);mask-image:var(--md-annotation-icon);transform:scale(1.0001);transition:background-color .25s,transform .25s}.md-tooltip--active+.md-annotation__index:after{transform:rotate(45deg)}.md-tooltip--active+.md-annotation__index:after,:hover>.md-annotation__index:after{background-color:var(--md-accent-fg-color)}}.md-tooltip--active+.md-annotation__index{animation-play-state:paused;transition-duration:0ms;z-index:2}.md-annotation__index [data-md-annotation-id]{display:inline-block}@media print{.md-annotation__index [data-md-annotation-id]{background:var(--md-default-fg-color--lighter);border-radius:2ch;color:var(--md-default-bg-color);font-weight:700;padding:0 .6ch;white-space:nowrap}.md-annotation__index [data-md-annotation-id]:after{content:attr(data-md-annotation-id)}}.md-typeset .md-annotation-list{counter-reset:annotation;list-style:none!important}.md-typeset .md-annotation-list li{position:relative}[dir=ltr] .md-typeset .md-annotation-list li:before{left:-2.125em}[dir=rtl] .md-typeset .md-annotation-list li:before{right:-2.125em}.md-typeset .md-annotation-list li:before{background:var(--md-default-fg-color--lighter);border-radius:2ch;color:var(--md-default-bg-color);content:counter(annotation);counter-increment:annotation;font-size:.8875em;font-weight:700;height:2ch;line-height:1.25;min-width:2ch;padding:0 .6ch;position:absolute;text-align:center;top:.25em}:root{--md-tooltip-width:20rem;--md-tooltip-tail:0.3rem}.md-tooltip2{-webkit-backface-visibility:hidden;backface-visibility:hidden;color:var(--md-default-fg-color);font-family:var(--md-text-font-family);opacity:0;pointer-events:none;position:absolute;top:calc(var(--md-tooltip-host-y) + var(--md-tooltip-y));transform:translateY(-.4rem);transform-origin:calc(var(--md-tooltip-host-x) + var(--md-tooltip-x)) 0;transition:transform 0ms .25s,opacity .25s,z-index .25s;width:100%;z-index:0}.md-tooltip2:before{border-left:var(--md-tooltip-tail) solid #0000;border-right:var(--md-tooltip-tail) solid #0000;content:"";display:block;left:clamp(1.5 * .8rem,var(--md-tooltip-host-x) + var(--md-tooltip-x) - var(--md-tooltip-tail),100vw - 2 * var(--md-tooltip-tail) - 1.5 * .8rem);position:absolute;z-index:1}.md-tooltip2--top:before{border-top:var(--md-tooltip-tail) solid var(--md-default-bg-color);bottom:calc(var(--md-tooltip-tail)*-1 + .025rem);filter:drop-shadow(0 1px 0 hsla(0,0%,0%,.05))}.md-tooltip2--bottom:before{border-bottom:var(--md-tooltip-tail) solid var(--md-default-bg-color);filter:drop-shadow(0 -1px 0 hsla(0,0%,0%,.05));top:calc(var(--md-tooltip-tail)*-1 + .025rem)}.md-tooltip2--active{opacity:1;transform:translateY(0);transition:transform .4s cubic-bezier(0,1,.5,1),opacity .25s,z-index 0ms;z-index:2}.md-tooltip2__inner{scrollbar-gutter:stable;background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);left:clamp(.8rem,var(--md-tooltip-host-x) - .8rem,100vw - var(--md-tooltip-width) - .8rem);max-height:40vh;max-width:calc(100vw - 1.6rem);position:relative;scrollbar-width:thin}.md-tooltip2__inner::-webkit-scrollbar{height:.2rem;width:.2rem}.md-tooltip2__inner::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-tooltip2__inner::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}[role=dialog]>.md-tooltip2__inner{font-size:.64rem;overflow:auto;padding:0 .8rem;pointer-events:auto;width:var(--md-tooltip-width)}[role=dialog]>.md-tooltip2__inner:after,[role=dialog]>.md-tooltip2__inner:before{content:"";display:block;height:.8rem;position:sticky;width:100%;z-index:10}[role=dialog]>.md-tooltip2__inner:before{background:linear-gradient(var(--md-default-bg-color),#0000 75%);top:0}[role=dialog]>.md-tooltip2__inner:after{background:linear-gradient(#0000,var(--md-default-bg-color) 75%);bottom:0}[role=tooltip]>.md-tooltip2__inner{font-size:.5rem;font-weight:700;left:clamp(.8rem,var(--md-tooltip-host-x) + var(--md-tooltip-x) - var(--md-tooltip-width)/2,100vw - var(--md-tooltip-width) - .8rem);max-width:min(100vw - 2 * .8rem,400px);padding:.2rem .4rem;-webkit-user-select:none;user-select:none;width:-moz-fit-content;width:fit-content}.md-tooltip2__inner.md-typeset>:first-child{margin-top:0}.md-tooltip2__inner.md-typeset>:last-child{margin-bottom:0}[dir=ltr] .md-top{margin-left:50%}[dir=rtl] .md-top{margin-right:50%}.md-top{background-color:var(--md-default-bg-color);border-radius:1.6rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color--light);cursor:pointer;display:block;font-size:.7rem;outline:none;padding:.4rem .8rem;position:fixed;top:3.2rem;transform:translate(-50%);transition:color 125ms,background-color 125ms,transform 125ms cubic-bezier(.4,0,.2,1),opacity 125ms;z-index:2}@media print{.md-top{display:none}}[dir=rtl] .md-top{transform:translate(50%)}.md-top[hidden]{opacity:0;pointer-events:none;transform:translate(-50%,.2rem);transition-duration:0ms}[dir=rtl] .md-top[hidden]{transform:translate(50%,.2rem)}.md-top:focus,.md-top:hover{background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.md-top svg{display:inline-block;vertical-align:-.5em}@keyframes hoverfix{0%{pointer-events:none}}:root{--md-version-icon:url('data:image/svg+xml;charset=utf-8,')}.md-version{flex-shrink:0;font-size:.8rem;height:2.4rem}[dir=ltr] .md-version__current{margin-left:1.4rem;margin-right:.4rem}[dir=rtl] .md-version__current{margin-left:.4rem;margin-right:1.4rem}.md-version__current{color:inherit;cursor:pointer;outline:none;position:relative;top:.05rem}[dir=ltr] .md-version__current:after{margin-left:.4rem}[dir=rtl] .md-version__current:after{margin-right:.4rem}.md-version__current:after{background-color:currentcolor;content:"";display:inline-block;height:.6rem;-webkit-mask-image:var(--md-version-icon);mask-image:var(--md-version-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.4rem}.md-version__alias{margin-left:.3rem;opacity:.7}.md-version__list{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);list-style-type:none;margin:.2rem .8rem;max-height:0;opacity:0;overflow:auto;padding:0;position:absolute;scroll-snap-type:y mandatory;top:.15rem;transition:max-height 0ms .5s,opacity .25s .25s;z-index:3}.md-version:focus-within .md-version__list,.md-version:hover .md-version__list{max-height:10rem;opacity:1;transition:max-height 0ms,opacity .25s}@media (hover:none),(pointer:coarse){.md-version:hover .md-version__list{animation:hoverfix .25s forwards}.md-version:focus-within .md-version__list{animation:none}}.md-version__item{line-height:1.8rem}[dir=ltr] .md-version__link{padding-left:.6rem;padding-right:1.2rem}[dir=rtl] .md-version__link{padding-left:1.2rem;padding-right:.6rem}.md-version__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:color .25s,background-color .25s;white-space:nowrap;width:100%}.md-version__link:focus,.md-version__link:hover{color:var(--md-accent-fg-color)}.md-version__link:focus{background-color:var(--md-default-fg-color--lightest)}:root{--md-admonition-icon--note:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--abstract:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--info:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--tip:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--success:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--question:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--warning:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--failure:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--danger:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--bug:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--example:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--quote:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .admonition,.md-typeset details{background-color:var(--md-admonition-bg-color);border:.075rem solid #448aff;border-radius:.2rem;box-shadow:var(--md-shadow-z1);color:var(--md-admonition-fg-color);display:flow-root;font-size:.64rem;margin:1.5625em 0;padding:0 .6rem;page-break-inside:avoid;transition:box-shadow 125ms}@media print{.md-typeset .admonition,.md-typeset details{box-shadow:none}}.md-typeset .admonition:focus-within,.md-typeset details:focus-within{box-shadow:0 0 0 .2rem #448aff1a}.md-typeset .admonition>*,.md-typeset details>*{box-sizing:border-box}.md-typeset .admonition .admonition,.md-typeset .admonition details,.md-typeset details .admonition,.md-typeset details details{margin-bottom:1em;margin-top:1em}.md-typeset .admonition .md-typeset__scrollwrap,.md-typeset details .md-typeset__scrollwrap{margin:1em -.6rem}.md-typeset .admonition .md-typeset__table,.md-typeset details .md-typeset__table{padding:0 .6rem}.md-typeset .admonition>.tabbed-set:only-child,.md-typeset details>.tabbed-set:only-child{margin-top:0}html .md-typeset .admonition>:last-child,html .md-typeset details>:last-child{margin-bottom:.6rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{padding-left:2rem;padding-right:.6rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{padding-left:.6rem;padding-right:2rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{border-left-width:.2rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-right-width:.2rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary,[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.md-typeset .admonition-title,.md-typeset summary{background-color:#448aff1a;border:none;font-weight:700;margin:0 -.6rem;padding-bottom:.4rem;padding-top:.4rem;position:relative}html .md-typeset .admonition-title:last-child,html .md-typeset summary:last-child{margin-bottom:0}[dir=ltr] .md-typeset .admonition-title:before,[dir=ltr] .md-typeset summary:before{left:.6rem}[dir=rtl] .md-typeset .admonition-title:before,[dir=rtl] .md-typeset summary:before{right:.6rem}.md-typeset .admonition-title:before,.md-typeset summary:before{background-color:#448aff;content:"";height:1rem;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;width:1rem}.md-typeset .admonition-title code,.md-typeset summary code{box-shadow:0 0 0 .05rem var(--md-default-fg-color--lightest)}.md-typeset .admonition.note,.md-typeset details.note{border-color:#448aff}.md-typeset .admonition.note:focus-within,.md-typeset details.note:focus-within{box-shadow:0 0 0 .2rem #448aff1a}.md-typeset .note>.admonition-title,.md-typeset .note>summary{background-color:#448aff1a}.md-typeset .note>.admonition-title:before,.md-typeset .note>summary:before{background-color:#448aff;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note)}.md-typeset .note>.admonition-title:after,.md-typeset .note>summary:after{color:#448aff}.md-typeset .admonition.abstract,.md-typeset details.abstract{border-color:#00b0ff}.md-typeset .admonition.abstract:focus-within,.md-typeset details.abstract:focus-within{box-shadow:0 0 0 .2rem #00b0ff1a}.md-typeset .abstract>.admonition-title,.md-typeset .abstract>summary{background-color:#00b0ff1a}.md-typeset .abstract>.admonition-title:before,.md-typeset .abstract>summary:before{background-color:#00b0ff;-webkit-mask-image:var(--md-admonition-icon--abstract);mask-image:var(--md-admonition-icon--abstract)}.md-typeset .abstract>.admonition-title:after,.md-typeset .abstract>summary:after{color:#00b0ff}.md-typeset .admonition.info,.md-typeset details.info{border-color:#00b8d4}.md-typeset .admonition.info:focus-within,.md-typeset details.info:focus-within{box-shadow:0 0 0 .2rem #00b8d41a}.md-typeset .info>.admonition-title,.md-typeset .info>summary{background-color:#00b8d41a}.md-typeset .info>.admonition-title:before,.md-typeset .info>summary:before{background-color:#00b8d4;-webkit-mask-image:var(--md-admonition-icon--info);mask-image:var(--md-admonition-icon--info)}.md-typeset .info>.admonition-title:after,.md-typeset .info>summary:after{color:#00b8d4}.md-typeset .admonition.tip,.md-typeset details.tip{border-color:#00bfa5}.md-typeset .admonition.tip:focus-within,.md-typeset details.tip:focus-within{box-shadow:0 0 0 .2rem #00bfa51a}.md-typeset .tip>.admonition-title,.md-typeset .tip>summary{background-color:#00bfa51a}.md-typeset .tip>.admonition-title:before,.md-typeset .tip>summary:before{background-color:#00bfa5;-webkit-mask-image:var(--md-admonition-icon--tip);mask-image:var(--md-admonition-icon--tip)}.md-typeset .tip>.admonition-title:after,.md-typeset .tip>summary:after{color:#00bfa5}.md-typeset .admonition.success,.md-typeset details.success{border-color:#00c853}.md-typeset .admonition.success:focus-within,.md-typeset details.success:focus-within{box-shadow:0 0 0 .2rem #00c8531a}.md-typeset .success>.admonition-title,.md-typeset .success>summary{background-color:#00c8531a}.md-typeset .success>.admonition-title:before,.md-typeset .success>summary:before{background-color:#00c853;-webkit-mask-image:var(--md-admonition-icon--success);mask-image:var(--md-admonition-icon--success)}.md-typeset .success>.admonition-title:after,.md-typeset .success>summary:after{color:#00c853}.md-typeset .admonition.question,.md-typeset details.question{border-color:#64dd17}.md-typeset .admonition.question:focus-within,.md-typeset details.question:focus-within{box-shadow:0 0 0 .2rem #64dd171a}.md-typeset .question>.admonition-title,.md-typeset .question>summary{background-color:#64dd171a}.md-typeset .question>.admonition-title:before,.md-typeset .question>summary:before{background-color:#64dd17;-webkit-mask-image:var(--md-admonition-icon--question);mask-image:var(--md-admonition-icon--question)}.md-typeset .question>.admonition-title:after,.md-typeset .question>summary:after{color:#64dd17}.md-typeset .admonition.warning,.md-typeset details.warning{border-color:#ff9100}.md-typeset .admonition.warning:focus-within,.md-typeset details.warning:focus-within{box-shadow:0 0 0 .2rem #ff91001a}.md-typeset .warning>.admonition-title,.md-typeset .warning>summary{background-color:#ff91001a}.md-typeset .warning>.admonition-title:before,.md-typeset .warning>summary:before{background-color:#ff9100;-webkit-mask-image:var(--md-admonition-icon--warning);mask-image:var(--md-admonition-icon--warning)}.md-typeset .warning>.admonition-title:after,.md-typeset .warning>summary:after{color:#ff9100}.md-typeset .admonition.failure,.md-typeset details.failure{border-color:#ff5252}.md-typeset .admonition.failure:focus-within,.md-typeset details.failure:focus-within{box-shadow:0 0 0 .2rem #ff52521a}.md-typeset .failure>.admonition-title,.md-typeset .failure>summary{background-color:#ff52521a}.md-typeset .failure>.admonition-title:before,.md-typeset .failure>summary:before{background-color:#ff5252;-webkit-mask-image:var(--md-admonition-icon--failure);mask-image:var(--md-admonition-icon--failure)}.md-typeset .failure>.admonition-title:after,.md-typeset .failure>summary:after{color:#ff5252}.md-typeset .admonition.danger,.md-typeset details.danger{border-color:#ff1744}.md-typeset .admonition.danger:focus-within,.md-typeset details.danger:focus-within{box-shadow:0 0 0 .2rem #ff17441a}.md-typeset .danger>.admonition-title,.md-typeset .danger>summary{background-color:#ff17441a}.md-typeset .danger>.admonition-title:before,.md-typeset .danger>summary:before{background-color:#ff1744;-webkit-mask-image:var(--md-admonition-icon--danger);mask-image:var(--md-admonition-icon--danger)}.md-typeset .danger>.admonition-title:after,.md-typeset .danger>summary:after{color:#ff1744}.md-typeset .admonition.bug,.md-typeset details.bug{border-color:#f50057}.md-typeset .admonition.bug:focus-within,.md-typeset details.bug:focus-within{box-shadow:0 0 0 .2rem #f500571a}.md-typeset .bug>.admonition-title,.md-typeset .bug>summary{background-color:#f500571a}.md-typeset .bug>.admonition-title:before,.md-typeset .bug>summary:before{background-color:#f50057;-webkit-mask-image:var(--md-admonition-icon--bug);mask-image:var(--md-admonition-icon--bug)}.md-typeset .bug>.admonition-title:after,.md-typeset .bug>summary:after{color:#f50057}.md-typeset .admonition.example,.md-typeset details.example{border-color:#7c4dff}.md-typeset .admonition.example:focus-within,.md-typeset details.example:focus-within{box-shadow:0 0 0 .2rem #7c4dff1a}.md-typeset .example>.admonition-title,.md-typeset .example>summary{background-color:#7c4dff1a}.md-typeset .example>.admonition-title:before,.md-typeset .example>summary:before{background-color:#7c4dff;-webkit-mask-image:var(--md-admonition-icon--example);mask-image:var(--md-admonition-icon--example)}.md-typeset .example>.admonition-title:after,.md-typeset .example>summary:after{color:#7c4dff}.md-typeset .admonition.quote,.md-typeset details.quote{border-color:#9e9e9e}.md-typeset .admonition.quote:focus-within,.md-typeset details.quote:focus-within{box-shadow:0 0 0 .2rem #9e9e9e1a}.md-typeset .quote>.admonition-title,.md-typeset .quote>summary{background-color:#9e9e9e1a}.md-typeset .quote>.admonition-title:before,.md-typeset .quote>summary:before{background-color:#9e9e9e;-webkit-mask-image:var(--md-admonition-icon--quote);mask-image:var(--md-admonition-icon--quote)}.md-typeset .quote>.admonition-title:after,.md-typeset .quote>summary:after{color:#9e9e9e}:root{--md-footnotes-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .footnote{color:var(--md-default-fg-color--light);font-size:.64rem}[dir=ltr] .md-typeset .footnote>ol{margin-left:0}[dir=rtl] .md-typeset .footnote>ol{margin-right:0}.md-typeset .footnote>ol>li{transition:color 125ms}.md-typeset .footnote>ol>li:target{color:var(--md-default-fg-color)}.md-typeset .footnote>ol>li:focus-within .footnote-backref{opacity:1;transform:translateX(0);transition:none}.md-typeset .footnote>ol>li:hover .footnote-backref,.md-typeset .footnote>ol>li:target .footnote-backref{opacity:1;transform:translateX(0)}.md-typeset .footnote>ol>li>:first-child{margin-top:0}.md-typeset .footnote-ref{font-size:.75em;font-weight:700}html .md-typeset .footnote-ref{outline-offset:.1rem}.md-typeset [id^="fnref:"]:target>.footnote-ref{outline:auto}.md-typeset .footnote-backref{color:var(--md-typeset-a-color);display:inline-block;font-size:0;opacity:0;transform:translateX(.25rem);transition:color .25s,transform .25s .25s,opacity 125ms .25s;vertical-align:text-bottom}@media print{.md-typeset .footnote-backref{color:var(--md-typeset-a-color);opacity:1;transform:translateX(0)}}[dir=rtl] .md-typeset .footnote-backref{transform:translateX(-.25rem)}.md-typeset .footnote-backref:hover{color:var(--md-accent-fg-color)}.md-typeset .footnote-backref:before{background-color:currentcolor;content:"";display:inline-block;height:.8rem;-webkit-mask-image:var(--md-footnotes-icon);mask-image:var(--md-footnotes-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.8rem}[dir=rtl] .md-typeset .footnote-backref:before{transform:scaleX(-1)}[dir=ltr] .md-typeset .headerlink{margin-left:.5rem}[dir=rtl] .md-typeset .headerlink{margin-right:.5rem}.md-typeset .headerlink{color:var(--md-default-fg-color--lighter);display:inline-block;opacity:0;transition:color .25s,opacity 125ms}@media print{.md-typeset .headerlink{display:none}}.md-typeset .headerlink:focus,.md-typeset :hover>.headerlink,.md-typeset :target>.headerlink{opacity:1;transition:color .25s,opacity 125ms}.md-typeset .headerlink:focus,.md-typeset .headerlink:hover,.md-typeset :target>.headerlink{color:var(--md-accent-fg-color)}.md-typeset :target{--md-scroll-margin:3.6rem;--md-scroll-offset:0rem;scroll-margin-top:calc(var(--md-scroll-margin) - var(--md-scroll-offset))}@media screen and (min-width:76.25em){.md-header--lifted~.md-container .md-typeset :target{--md-scroll-margin:6rem}}.md-typeset h1:target,.md-typeset h2:target,.md-typeset h3:target{--md-scroll-offset:0.2rem}.md-typeset h4:target{--md-scroll-offset:0.15rem}.md-typeset div.arithmatex{overflow:auto}@media screen and (max-width:44.984375em){.md-typeset div.arithmatex{margin:0 -.8rem}.md-typeset div.arithmatex>*{width:min-content}}.md-typeset div.arithmatex>*{margin-left:auto!important;margin-right:auto!important;padding:0 .8rem;touch-action:auto}.md-typeset div.arithmatex>* mjx-container{margin:0!important}.md-typeset div.arithmatex mjx-assistive-mml{height:0}.md-typeset del.critic{background-color:var(--md-typeset-del-color)}.md-typeset del.critic,.md-typeset ins.critic{-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset ins.critic{background-color:var(--md-typeset-ins-color)}.md-typeset .critic.comment{-webkit-box-decoration-break:clone;box-decoration-break:clone;color:var(--md-code-hl-comment-color)}.md-typeset .critic.comment:before{content:"/* "}.md-typeset .critic.comment:after{content:" */"}.md-typeset .critic.block{box-shadow:none;display:block;margin:1em 0;overflow:auto;padding-left:.8rem;padding-right:.8rem}.md-typeset .critic.block>:first-child{margin-top:.5em}.md-typeset .critic.block>:last-child{margin-bottom:.5em}:root{--md-details-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset details{display:flow-root;overflow:visible;padding-top:0}.md-typeset details[open]>summary:after{transform:rotate(90deg)}.md-typeset details:not([open]){box-shadow:none;padding-bottom:0}.md-typeset details:not([open])>summary{border-radius:.1rem}[dir=ltr] .md-typeset summary{padding-right:1.8rem}[dir=rtl] .md-typeset summary{padding-left:1.8rem}[dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}[dir=ltr] .md-typeset summary,[dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}[dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.md-typeset summary{cursor:pointer;display:block;min-height:1rem;overflow:hidden}.md-typeset summary.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-typeset summary:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}[dir=ltr] .md-typeset summary:after{right:.4rem}[dir=rtl] .md-typeset summary:after{left:.4rem}.md-typeset summary:after{background-color:currentcolor;content:"";height:1rem;-webkit-mask-image:var(--md-details-icon);mask-image:var(--md-details-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;transform:rotate(0deg);transition:transform .25s;width:1rem}[dir=rtl] .md-typeset summary:after{transform:rotate(180deg)}.md-typeset summary::marker{display:none}.md-typeset summary::-webkit-details-marker{display:none}.md-typeset .emojione,.md-typeset .gemoji,.md-typeset .twemoji{--md-icon-size:1.125em;display:inline-flex;height:var(--md-icon-size);vertical-align:text-top}.md-typeset .emojione svg,.md-typeset .gemoji svg,.md-typeset .twemoji svg{fill:currentcolor;max-height:100%;width:var(--md-icon-size)}.md-typeset .lg,.md-typeset .xl,.md-typeset .xxl,.md-typeset .xxxl{vertical-align:text-bottom}.md-typeset .middle{vertical-align:middle}.md-typeset .lg{--md-icon-size:1.5em}.md-typeset .xl{--md-icon-size:2.25em}.md-typeset .xxl{--md-icon-size:3em}.md-typeset .xxxl{--md-icon-size:4em}.highlight .o,.highlight .ow{color:var(--md-code-hl-operator-color)}.highlight .p{color:var(--md-code-hl-punctuation-color)}.highlight .cpf,.highlight .l,.highlight .s,.highlight .s1,.highlight .s2,.highlight .sb,.highlight .sc,.highlight .si,.highlight .ss{color:var(--md-code-hl-string-color)}.highlight .cp,.highlight .se,.highlight .sh,.highlight .sr,.highlight .sx{color:var(--md-code-hl-special-color)}.highlight .il,.highlight .m,.highlight .mb,.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo{color:var(--md-code-hl-number-color)}.highlight .k,.highlight .kd,.highlight .kn,.highlight .kp,.highlight .kr,.highlight .kt{color:var(--md-code-hl-keyword-color)}.highlight .kc,.highlight .n{color:var(--md-code-hl-name-color)}.highlight .bp,.highlight .nb,.highlight .no{color:var(--md-code-hl-constant-color)}.highlight .nc,.highlight .ne,.highlight .nf,.highlight .nn{color:var(--md-code-hl-function-color)}.highlight .nd,.highlight .ni,.highlight .nl,.highlight .nt{color:var(--md-code-hl-keyword-color)}.highlight .c,.highlight .c1,.highlight .ch,.highlight .cm,.highlight .cs,.highlight .sd{color:var(--md-code-hl-comment-color)}.highlight .na,.highlight .nv,.highlight .vc,.highlight .vg,.highlight .vi{color:var(--md-code-hl-variable-color)}.highlight .ge,.highlight .gh,.highlight .go,.highlight .gp,.highlight .gr,.highlight .gs,.highlight .gt,.highlight .gu{color:var(--md-code-hl-generic-color)}.highlight .gd,.highlight .gi{border-radius:.1rem;margin:0 -.125em;padding:0 .125em}.highlight .gd{background-color:var(--md-typeset-del-color)}.highlight .gi{background-color:var(--md-typeset-ins-color)}.highlight .hll{background-color:var(--md-code-hl-color--light);box-shadow:2px 0 0 0 var(--md-code-hl-color) inset;display:block;margin:0 -1.1764705882em;padding:0 1.1764705882em}.highlight span.filename{background-color:var(--md-code-bg-color);border-bottom:.05rem solid var(--md-default-fg-color--lightest);border-top-left-radius:.1rem;border-top-right-radius:.1rem;display:flow-root;font-size:.85em;font-weight:700;margin-top:1em;padding:.6617647059em 1.1764705882em;position:relative}.highlight span.filename+pre{margin-top:0}.highlight span.filename+pre>code{border-top-left-radius:0;border-top-right-radius:0}.highlight [data-linenos]:before{background-color:var(--md-code-bg-color);box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset;color:var(--md-default-fg-color--light);content:attr(data-linenos);float:left;left:-1.1764705882em;margin-left:-1.1764705882em;margin-right:1.1764705882em;padding-left:1.1764705882em;position:sticky;-webkit-user-select:none;user-select:none;z-index:3}.highlight code a[id]{position:absolute;visibility:hidden}.highlight code[data-md-copying]{display:initial}.highlight code[data-md-copying] .hll{display:contents}.highlight code[data-md-copying] .md-annotation{display:none}.highlighttable{display:flow-root}.highlighttable tbody,.highlighttable td{display:block;padding:0}.highlighttable tr{display:flex}.highlighttable pre{margin:0}.highlighttable th.filename{flex-grow:1;padding:0;text-align:left}.highlighttable th.filename span.filename{margin-top:0}.highlighttable .linenos{background-color:var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-top-left-radius:.1rem;font-size:.85em;padding:.7720588235em 0 .7720588235em 1.1764705882em;-webkit-user-select:none;user-select:none}.highlighttable .linenodiv{box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset}.highlighttable .linenodiv pre{color:var(--md-default-fg-color--light);text-align:right}.highlighttable .linenodiv span[class]{padding-right:.5882352941em}.highlighttable .code{flex:1;min-width:0}.linenodiv a{color:inherit}.md-typeset .highlighttable{direction:ltr;margin:1em 0}.md-typeset .highlighttable>tbody>tr>.code>div>pre>code{border-bottom-left-radius:0;border-top-left-radius:0}.md-typeset .highlight+.result{border:.05rem solid var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-bottom-right-radius:.1rem;border-top-width:.1rem;margin-top:-1.125em;overflow:visible;padding:0 1em}.md-typeset .highlight+.result:after{clear:both;content:"";display:block}@media screen and (max-width:44.984375em){.md-content__inner>.highlight{margin:1em -.8rem}.md-content__inner>.highlight>.filename,.md-content__inner>.highlight>.highlighttable>tbody>tr>.code>div>pre>code,.md-content__inner>.highlight>.highlighttable>tbody>tr>.filename span.filename,.md-content__inner>.highlight>.highlighttable>tbody>tr>.linenos,.md-content__inner>.highlight>pre>code{border-radius:0}.md-content__inner>.highlight+.result{border-left-width:0;border-radius:0;border-right-width:0;margin-left:-.8rem;margin-right:-.8rem}}.md-typeset .keys kbd:after,.md-typeset .keys kbd:before{-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;color:inherit;margin:0;position:relative}.md-typeset .keys span{color:var(--md-default-fg-color--light);padding:0 .2em}.md-typeset .keys .key-alt:before,.md-typeset .keys .key-left-alt:before,.md-typeset .keys .key-right-alt:before{content:"⎇";padding-right:.4em}.md-typeset .keys .key-command:before,.md-typeset .keys .key-left-command:before,.md-typeset .keys .key-right-command:before{content:"⌘";padding-right:.4em}.md-typeset .keys .key-control:before,.md-typeset .keys .key-left-control:before,.md-typeset .keys .key-right-control:before{content:"⌃";padding-right:.4em}.md-typeset .keys .key-left-meta:before,.md-typeset .keys .key-meta:before,.md-typeset .keys .key-right-meta:before{content:"◆";padding-right:.4em}.md-typeset .keys .key-left-option:before,.md-typeset .keys .key-option:before,.md-typeset .keys .key-right-option:before{content:"⌥";padding-right:.4em}.md-typeset .keys .key-left-shift:before,.md-typeset .keys .key-right-shift:before,.md-typeset .keys .key-shift:before{content:"⇧";padding-right:.4em}.md-typeset .keys .key-left-super:before,.md-typeset .keys .key-right-super:before,.md-typeset .keys .key-super:before{content:"❖";padding-right:.4em}.md-typeset .keys .key-left-windows:before,.md-typeset .keys .key-right-windows:before,.md-typeset .keys .key-windows:before{content:"⊞";padding-right:.4em}.md-typeset .keys .key-arrow-down:before{content:"↓";padding-right:.4em}.md-typeset .keys .key-arrow-left:before{content:"←";padding-right:.4em}.md-typeset .keys .key-arrow-right:before{content:"→";padding-right:.4em}.md-typeset .keys .key-arrow-up:before{content:"↑";padding-right:.4em}.md-typeset .keys .key-backspace:before{content:"⌫";padding-right:.4em}.md-typeset .keys .key-backtab:before{content:"⇤";padding-right:.4em}.md-typeset .keys .key-caps-lock:before{content:"⇪";padding-right:.4em}.md-typeset .keys .key-clear:before{content:"⌧";padding-right:.4em}.md-typeset .keys .key-context-menu:before{content:"☰";padding-right:.4em}.md-typeset .keys .key-delete:before{content:"⌦";padding-right:.4em}.md-typeset .keys .key-eject:before{content:"⏏";padding-right:.4em}.md-typeset .keys .key-end:before{content:"⤓";padding-right:.4em}.md-typeset .keys .key-escape:before{content:"⎋";padding-right:.4em}.md-typeset .keys .key-home:before{content:"⤒";padding-right:.4em}.md-typeset .keys .key-insert:before{content:"⎀";padding-right:.4em}.md-typeset .keys .key-page-down:before{content:"⇟";padding-right:.4em}.md-typeset .keys .key-page-up:before{content:"⇞";padding-right:.4em}.md-typeset .keys .key-print-screen:before{content:"⎙";padding-right:.4em}.md-typeset .keys .key-tab:after{content:"⇥";padding-left:.4em}.md-typeset .keys .key-num-enter:after{content:"⌤";padding-left:.4em}.md-typeset .keys .key-enter:after{content:"⏎";padding-left:.4em}:root{--md-tabbed-icon--prev:url('data:image/svg+xml;charset=utf-8,');--md-tabbed-icon--next:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .tabbed-set{border-radius:.1rem;display:flex;flex-flow:column wrap;margin:1em 0;position:relative}.md-typeset .tabbed-set>input{height:0;opacity:0;position:absolute;width:0}.md-typeset .tabbed-set>input:target{--md-scroll-offset:0.625em}.md-typeset .tabbed-set>input.focus-visible~.tabbed-labels:before{background-color:var(--md-accent-fg-color)}.md-typeset .tabbed-labels{-ms-overflow-style:none;box-shadow:0 -.05rem var(--md-default-fg-color--lightest) inset;display:flex;max-width:100%;overflow:auto;scrollbar-width:none}@media print{.md-typeset .tabbed-labels{display:contents}}@media screen{.js .md-typeset .tabbed-labels{position:relative}.js .md-typeset .tabbed-labels:before{background:var(--md-default-fg-color);bottom:0;content:"";display:block;height:2px;left:0;position:absolute;transform:translateX(var(--md-indicator-x));transition:width 225ms,background-color .25s,transform .25s;transition-timing-function:cubic-bezier(.4,0,.2,1);width:var(--md-indicator-width)}}.md-typeset .tabbed-labels::-webkit-scrollbar{display:none}.md-typeset .tabbed-labels>label{border-bottom:.1rem solid #0000;border-radius:.1rem .1rem 0 0;color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;font-size:.64rem;font-weight:700;padding:.78125em 1.25em .625em;scroll-margin-inline-start:1rem;transition:background-color .25s,color .25s;white-space:nowrap;width:auto}@media print{.md-typeset .tabbed-labels>label:first-child{order:1}.md-typeset .tabbed-labels>label:nth-child(2){order:2}.md-typeset .tabbed-labels>label:nth-child(3){order:3}.md-typeset .tabbed-labels>label:nth-child(4){order:4}.md-typeset .tabbed-labels>label:nth-child(5){order:5}.md-typeset .tabbed-labels>label:nth-child(6){order:6}.md-typeset .tabbed-labels>label:nth-child(7){order:7}.md-typeset .tabbed-labels>label:nth-child(8){order:8}.md-typeset .tabbed-labels>label:nth-child(9){order:9}.md-typeset .tabbed-labels>label:nth-child(10){order:10}.md-typeset .tabbed-labels>label:nth-child(11){order:11}.md-typeset .tabbed-labels>label:nth-child(12){order:12}.md-typeset .tabbed-labels>label:nth-child(13){order:13}.md-typeset .tabbed-labels>label:nth-child(14){order:14}.md-typeset .tabbed-labels>label:nth-child(15){order:15}.md-typeset .tabbed-labels>label:nth-child(16){order:16}.md-typeset .tabbed-labels>label:nth-child(17){order:17}.md-typeset .tabbed-labels>label:nth-child(18){order:18}.md-typeset .tabbed-labels>label:nth-child(19){order:19}.md-typeset .tabbed-labels>label:nth-child(20){order:20}}.md-typeset .tabbed-labels>label:hover{color:var(--md-default-fg-color)}.md-typeset .tabbed-labels>label>[href]:first-child{color:inherit}.md-typeset .tabbed-labels--linked>label{padding:0}.md-typeset .tabbed-labels--linked>label>a{display:block;padding:.78125em 1.25em .625em}.md-typeset .tabbed-content{width:100%}@media print{.md-typeset .tabbed-content{display:contents}}.md-typeset .tabbed-block{display:none}@media print{.md-typeset .tabbed-block{display:block}.md-typeset .tabbed-block:first-child{order:1}.md-typeset .tabbed-block:nth-child(2){order:2}.md-typeset .tabbed-block:nth-child(3){order:3}.md-typeset .tabbed-block:nth-child(4){order:4}.md-typeset .tabbed-block:nth-child(5){order:5}.md-typeset .tabbed-block:nth-child(6){order:6}.md-typeset .tabbed-block:nth-child(7){order:7}.md-typeset .tabbed-block:nth-child(8){order:8}.md-typeset .tabbed-block:nth-child(9){order:9}.md-typeset .tabbed-block:nth-child(10){order:10}.md-typeset .tabbed-block:nth-child(11){order:11}.md-typeset .tabbed-block:nth-child(12){order:12}.md-typeset .tabbed-block:nth-child(13){order:13}.md-typeset .tabbed-block:nth-child(14){order:14}.md-typeset .tabbed-block:nth-child(15){order:15}.md-typeset .tabbed-block:nth-child(16){order:16}.md-typeset .tabbed-block:nth-child(17){order:17}.md-typeset .tabbed-block:nth-child(18){order:18}.md-typeset .tabbed-block:nth-child(19){order:19}.md-typeset .tabbed-block:nth-child(20){order:20}}.md-typeset .tabbed-block>.highlight:first-child>pre,.md-typeset .tabbed-block>pre:first-child{margin:0}.md-typeset .tabbed-block>.highlight:first-child>pre>code,.md-typeset .tabbed-block>pre:first-child>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-block>.highlight:first-child>.filename{border-top-left-radius:0;border-top-right-radius:0;margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable{margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.filename span.filename,.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.linenos{border-top-left-radius:0;border-top-right-radius:0;margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.code>div>pre>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-block>.highlight:first-child+.result{margin-top:-.125em}.md-typeset .tabbed-block>.tabbed-set{margin:0}.md-typeset .tabbed-button{align-self:center;border-radius:100%;color:var(--md-default-fg-color--light);cursor:pointer;display:block;height:.9rem;margin-top:.1rem;pointer-events:auto;transition:background-color .25s;width:.9rem}.md-typeset .tabbed-button:hover{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-typeset .tabbed-button:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-tabbed-icon--prev);mask-image:var(--md-tabbed-icon--prev);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color .25s,transform .25s;width:100%}.md-typeset .tabbed-control{background:linear-gradient(to right,var(--md-default-bg-color) 60%,#0000);display:flex;height:1.9rem;justify-content:start;pointer-events:none;position:absolute;transition:opacity 125ms;width:1.2rem}[dir=rtl] .md-typeset .tabbed-control{transform:rotate(180deg)}.md-typeset .tabbed-control[hidden]{opacity:0}.md-typeset .tabbed-control--next{background:linear-gradient(to left,var(--md-default-bg-color) 60%,#0000);justify-content:end;right:0}.md-typeset .tabbed-control--next .tabbed-button:after{-webkit-mask-image:var(--md-tabbed-icon--next);mask-image:var(--md-tabbed-icon--next)}@media screen and (max-width:44.984375em){[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels{padding-left:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels{padding-right:.8rem}.md-content__inner>.tabbed-set .tabbed-labels{margin:0 -.8rem;max-width:100vw;scroll-padding-inline-start:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-right:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-left:.8rem}.md-content__inner>.tabbed-set .tabbed-labels:after{content:""}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-left:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-right:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-left:-.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-right:-.8rem}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{width:2rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-right:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-left:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-right:-.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-left:-.8rem}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{width:2rem}}@media screen{.md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){color:var(--md-default-fg-color)}.md-typeset .no-js .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset .no-js .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset .no-js .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset .no-js .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset .no-js .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset .no-js .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset .no-js .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset .no-js .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset .no-js .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset .no-js .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset .no-js .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset .no-js .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset .no-js .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset .no-js .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset .no-js .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset .no-js .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset .no-js .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset .no-js .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset .no-js .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset .no-js .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9),.md-typeset [role=dialog] .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset [role=dialog] .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset [role=dialog] .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset [role=dialog] .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset [role=dialog] .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset [role=dialog] .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset [role=dialog] .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset [role=dialog] .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset [role=dialog] .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset [role=dialog] .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset [role=dialog] .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset [role=dialog] .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset [role=dialog] .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset [role=dialog] .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset [role=dialog] .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset [role=dialog] .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset [role=dialog] .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset [role=dialog] .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset [role=dialog] .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset [role=dialog] .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9),.no-js .md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.no-js .md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.no-js .md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.no-js .md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.no-js .md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.no-js .md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.no-js .md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.no-js .md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.no-js .md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.no-js .md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.no-js .md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.no-js .md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.no-js .md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.no-js .md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.no-js .md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.no-js .md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.no-js .md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.no-js .md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.no-js .md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.no-js .md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9),[role=dialog] .md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,[role=dialog] .md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),[role=dialog] .md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),[role=dialog] .md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),[role=dialog] .md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),[role=dialog] .md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),[role=dialog] .md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),[role=dialog] .md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),[role=dialog] .md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),[role=dialog] .md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),[role=dialog] .md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),[role=dialog] .md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),[role=dialog] .md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),[role=dialog] .md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),[role=dialog] .md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),[role=dialog] .md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),[role=dialog] .md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),[role=dialog] .md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),[role=dialog] .md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),[role=dialog] .md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){border-color:var(--md-default-fg-color)}}.md-typeset .tabbed-set>input:first-child.focus-visible~.tabbed-labels>:first-child,.md-typeset .tabbed-set>input:nth-child(10).focus-visible~.tabbed-labels>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11).focus-visible~.tabbed-labels>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12).focus-visible~.tabbed-labels>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13).focus-visible~.tabbed-labels>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14).focus-visible~.tabbed-labels>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15).focus-visible~.tabbed-labels>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16).focus-visible~.tabbed-labels>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17).focus-visible~.tabbed-labels>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18).focus-visible~.tabbed-labels>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19).focus-visible~.tabbed-labels>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2).focus-visible~.tabbed-labels>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20).focus-visible~.tabbed-labels>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3).focus-visible~.tabbed-labels>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4).focus-visible~.tabbed-labels>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5).focus-visible~.tabbed-labels>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6).focus-visible~.tabbed-labels>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7).focus-visible~.tabbed-labels>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8).focus-visible~.tabbed-labels>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9).focus-visible~.tabbed-labels>:nth-child(9){color:var(--md-accent-fg-color)}.md-typeset .tabbed-set>input:first-child:checked~.tabbed-content>:first-child,.md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-content>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-content>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-content>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-content>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-content>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-content>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-content>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-content>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-content>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-content>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-content>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-content>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-content>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-content>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-content>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-content>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-content>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-content>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-content>:nth-child(9){display:block}:root{--md-tasklist-icon:url('data:image/svg+xml;charset=utf-8,');--md-tasklist-icon--checked:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .task-list-item{list-style-type:none;position:relative}[dir=ltr] .md-typeset .task-list-item [type=checkbox]{left:-2em}[dir=rtl] .md-typeset .task-list-item [type=checkbox]{right:-2em}.md-typeset .task-list-item [type=checkbox]{position:absolute;top:.45em}.md-typeset .task-list-control [type=checkbox]{opacity:0;z-index:-1}[dir=ltr] .md-typeset .task-list-indicator:before{left:-1.5em}[dir=rtl] .md-typeset .task-list-indicator:before{right:-1.5em}.md-typeset .task-list-indicator:before{background-color:var(--md-default-fg-color--lightest);content:"";height:1.25em;-webkit-mask-image:var(--md-tasklist-icon);mask-image:var(--md-tasklist-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.15em;width:1.25em}.md-typeset [type=checkbox]:checked+.task-list-indicator:before{background-color:#00e676;-webkit-mask-image:var(--md-tasklist-icon--checked);mask-image:var(--md-tasklist-icon--checked)}@media print{.giscus,[id=__comments]{display:none}}:root>*{--md-mermaid-font-family:var(--md-text-font-family),sans-serif;--md-mermaid-edge-color:var(--md-code-fg-color);--md-mermaid-node-bg-color:var(--md-accent-fg-color--transparent);--md-mermaid-node-fg-color:var(--md-accent-fg-color);--md-mermaid-label-bg-color:var(--md-default-bg-color);--md-mermaid-label-fg-color:var(--md-code-fg-color);--md-mermaid-sequence-actor-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-actor-fg-color:var(--md-mermaid-label-fg-color);--md-mermaid-sequence-actor-border-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-actor-line-color:var(--md-default-fg-color--lighter);--md-mermaid-sequence-actorman-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-actorman-line-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-box-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-box-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-label-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-label-fg-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-loop-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-loop-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-loop-border-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-message-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-message-line-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-note-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-note-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-note-border-color:var(--md-mermaid-label-fg-color);--md-mermaid-sequence-number-bg-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-number-fg-color:var(--md-accent-bg-color)}.mermaid{line-height:normal;margin:1em 0}.md-typeset .grid{grid-gap:.4rem;display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,16rem),1fr));margin:1em 0}.md-typeset .grid.cards>ol,.md-typeset .grid.cards>ul{display:contents}.md-typeset .grid.cards>ol>li,.md-typeset .grid.cards>ul>li,.md-typeset .grid>.card{border:.05rem solid var(--md-default-fg-color--lightest);border-radius:.1rem;display:block;margin:0;padding:.8rem;transition:border .25s,box-shadow .25s}.md-typeset .grid.cards>ol>li:focus-within,.md-typeset .grid.cards>ol>li:hover,.md-typeset .grid.cards>ul>li:focus-within,.md-typeset .grid.cards>ul>li:hover,.md-typeset .grid>.card:focus-within,.md-typeset .grid>.card:hover{border-color:#0000;box-shadow:var(--md-shadow-z2)}.md-typeset .grid.cards>ol>li>hr,.md-typeset .grid.cards>ul>li>hr,.md-typeset .grid>.card>hr{margin-bottom:1em;margin-top:1em}.md-typeset .grid.cards>ol>li>:first-child,.md-typeset .grid.cards>ul>li>:first-child,.md-typeset .grid>.card>:first-child{margin-top:0}.md-typeset .grid.cards>ol>li>:last-child,.md-typeset .grid.cards>ul>li>:last-child,.md-typeset .grid>.card>:last-child{margin-bottom:0}.md-typeset .grid>*,.md-typeset .grid>.admonition,.md-typeset .grid>.highlight>*,.md-typeset .grid>.highlighttable,.md-typeset .grid>.md-typeset details,.md-typeset .grid>details,.md-typeset .grid>pre{margin-bottom:0;margin-top:0}.md-typeset .grid>.highlight>pre:only-child,.md-typeset .grid>.highlight>pre>code,.md-typeset .grid>.highlighttable,.md-typeset .grid>.highlighttable>tbody,.md-typeset .grid>.highlighttable>tbody>tr,.md-typeset .grid>.highlighttable>tbody>tr>.code,.md-typeset .grid>.highlighttable>tbody>tr>.code>.highlight,.md-typeset .grid>.highlighttable>tbody>tr>.code>.highlight>pre,.md-typeset .grid>.highlighttable>tbody>tr>.code>.highlight>pre>code{height:100%}.md-typeset .grid>.tabbed-set{margin-bottom:0;margin-top:0}@media screen and (min-width:45em){[dir=ltr] .md-typeset .inline{float:left}[dir=rtl] .md-typeset .inline{float:right}[dir=ltr] .md-typeset .inline{margin-right:.8rem}[dir=rtl] .md-typeset .inline{margin-left:.8rem}.md-typeset .inline{margin-bottom:.8rem;margin-top:0;width:11.7rem}[dir=ltr] .md-typeset .inline.end{float:right}[dir=rtl] .md-typeset .inline.end{float:left}[dir=ltr] .md-typeset .inline.end{margin-left:.8rem;margin-right:0}[dir=rtl] .md-typeset .inline.end{margin-left:0;margin-right:.8rem}} \ No newline at end of file diff --git a/assets/stylesheets/palette.ab4e12ef.min.css b/assets/stylesheets/palette.ab4e12ef.min.css new file mode 100644 index 00000000..75aaf842 --- /dev/null +++ b/assets/stylesheets/palette.ab4e12ef.min.css @@ -0,0 +1 @@ +@media screen{[data-md-color-scheme=slate]{--md-default-fg-color:hsla(var(--md-hue),15%,90%,0.82);--md-default-fg-color--light:hsla(var(--md-hue),15%,90%,0.56);--md-default-fg-color--lighter:hsla(var(--md-hue),15%,90%,0.32);--md-default-fg-color--lightest:hsla(var(--md-hue),15%,90%,0.12);--md-default-bg-color:hsla(var(--md-hue),15%,14%,1);--md-default-bg-color--light:hsla(var(--md-hue),15%,14%,0.54);--md-default-bg-color--lighter:hsla(var(--md-hue),15%,14%,0.26);--md-default-bg-color--lightest:hsla(var(--md-hue),15%,14%,0.07);--md-code-fg-color:hsla(var(--md-hue),18%,86%,0.82);--md-code-bg-color:hsla(var(--md-hue),15%,18%,1);--md-code-bg-color--light:hsla(var(--md-hue),15%,18%,0.9);--md-code-bg-color--lighter:hsla(var(--md-hue),15%,18%,0.54);--md-code-hl-color:#2977ff;--md-code-hl-color--light:#2977ff1a;--md-code-hl-number-color:#e6695b;--md-code-hl-special-color:#f06090;--md-code-hl-function-color:#c973d9;--md-code-hl-constant-color:#9383e2;--md-code-hl-keyword-color:#6791e0;--md-code-hl-string-color:#2fb170;--md-code-hl-name-color:var(--md-code-fg-color);--md-code-hl-operator-color:var(--md-default-fg-color--light);--md-code-hl-punctuation-color:var(--md-default-fg-color--light);--md-code-hl-comment-color:var(--md-default-fg-color--light);--md-code-hl-generic-color:var(--md-default-fg-color--light);--md-code-hl-variable-color:var(--md-default-fg-color--light);--md-typeset-color:var(--md-default-fg-color);--md-typeset-a-color:var(--md-primary-fg-color);--md-typeset-kbd-color:hsla(var(--md-hue),15%,90%,0.12);--md-typeset-kbd-accent-color:hsla(var(--md-hue),15%,90%,0.2);--md-typeset-kbd-border-color:hsla(var(--md-hue),15%,14%,1);--md-typeset-mark-color:#4287ff4d;--md-typeset-table-color:hsla(var(--md-hue),15%,95%,0.12);--md-typeset-table-color--light:hsla(var(--md-hue),15%,95%,0.035);--md-admonition-fg-color:var(--md-default-fg-color);--md-admonition-bg-color:var(--md-default-bg-color);--md-footer-bg-color:hsla(var(--md-hue),15%,10%,0.87);--md-footer-bg-color--dark:hsla(var(--md-hue),15%,8%,1);--md-shadow-z1:0 0.2rem 0.5rem #0000000d,0 0 0.05rem #0000001a;--md-shadow-z2:0 0.2rem 0.5rem #00000040,0 0 0.05rem #00000040;--md-shadow-z3:0 0.2rem 0.5rem #0006,0 0 0.05rem #00000059;color-scheme:dark}[data-md-color-scheme=slate] img[src$="#gh-light-mode-only"],[data-md-color-scheme=slate] img[src$="#only-light"]{display:none}[data-md-color-scheme=slate][data-md-color-primary=pink]{--md-typeset-a-color:#ed5487}[data-md-color-scheme=slate][data-md-color-primary=purple]{--md-typeset-a-color:#c46fd3}[data-md-color-scheme=slate][data-md-color-primary=deep-purple]{--md-typeset-a-color:#a47bea}[data-md-color-scheme=slate][data-md-color-primary=indigo]{--md-typeset-a-color:#5488e8}[data-md-color-scheme=slate][data-md-color-primary=teal]{--md-typeset-a-color:#00ccb8}[data-md-color-scheme=slate][data-md-color-primary=green]{--md-typeset-a-color:#71c174}[data-md-color-scheme=slate][data-md-color-primary=deep-orange]{--md-typeset-a-color:#ff764d}[data-md-color-scheme=slate][data-md-color-primary=brown]{--md-typeset-a-color:#c1775c}[data-md-color-scheme=slate][data-md-color-primary=black],[data-md-color-scheme=slate][data-md-color-primary=blue-grey],[data-md-color-scheme=slate][data-md-color-primary=grey],[data-md-color-scheme=slate][data-md-color-primary=white]{--md-typeset-a-color:#5e8bde}[data-md-color-switching] *,[data-md-color-switching] :after,[data-md-color-switching] :before{transition-duration:0ms!important}}[data-md-color-accent=red]{--md-accent-fg-color:#ff1947;--md-accent-fg-color--transparent:#ff19471a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=pink]{--md-accent-fg-color:#f50056;--md-accent-fg-color--transparent:#f500561a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=purple]{--md-accent-fg-color:#df41fb;--md-accent-fg-color--transparent:#df41fb1a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=deep-purple]{--md-accent-fg-color:#7c4dff;--md-accent-fg-color--transparent:#7c4dff1a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=indigo]{--md-accent-fg-color:#526cfe;--md-accent-fg-color--transparent:#526cfe1a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=blue]{--md-accent-fg-color:#4287ff;--md-accent-fg-color--transparent:#4287ff1a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=light-blue]{--md-accent-fg-color:#0091eb;--md-accent-fg-color--transparent:#0091eb1a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=cyan]{--md-accent-fg-color:#00bad6;--md-accent-fg-color--transparent:#00bad61a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=teal]{--md-accent-fg-color:#00bda4;--md-accent-fg-color--transparent:#00bda41a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=green]{--md-accent-fg-color:#00c753;--md-accent-fg-color--transparent:#00c7531a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=light-green]{--md-accent-fg-color:#63de17;--md-accent-fg-color--transparent:#63de171a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=lime]{--md-accent-fg-color:#b0eb00;--md-accent-fg-color--transparent:#b0eb001a;--md-accent-bg-color:#000000de;--md-accent-bg-color--light:#0000008a}[data-md-color-accent=yellow]{--md-accent-fg-color:#ffd500;--md-accent-fg-color--transparent:#ffd5001a;--md-accent-bg-color:#000000de;--md-accent-bg-color--light:#0000008a}[data-md-color-accent=amber]{--md-accent-fg-color:#fa0;--md-accent-fg-color--transparent:#ffaa001a;--md-accent-bg-color:#000000de;--md-accent-bg-color--light:#0000008a}[data-md-color-accent=orange]{--md-accent-fg-color:#ff9100;--md-accent-fg-color--transparent:#ff91001a;--md-accent-bg-color:#000000de;--md-accent-bg-color--light:#0000008a}[data-md-color-accent=deep-orange]{--md-accent-fg-color:#ff6e42;--md-accent-fg-color--transparent:#ff6e421a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-primary=red]{--md-primary-fg-color:#ef5552;--md-primary-fg-color--light:#e57171;--md-primary-fg-color--dark:#e53734;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=pink]{--md-primary-fg-color:#e92063;--md-primary-fg-color--light:#ec417a;--md-primary-fg-color--dark:#c3185d;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=purple]{--md-primary-fg-color:#ab47bd;--md-primary-fg-color--light:#bb69c9;--md-primary-fg-color--dark:#8c24a8;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=deep-purple]{--md-primary-fg-color:#7e56c2;--md-primary-fg-color--light:#9574cd;--md-primary-fg-color--dark:#673ab6;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=indigo]{--md-primary-fg-color:#4051b5;--md-primary-fg-color--light:#5d6cc0;--md-primary-fg-color--dark:#303fa1;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=blue]{--md-primary-fg-color:#2094f3;--md-primary-fg-color--light:#42a5f5;--md-primary-fg-color--dark:#1975d2;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=light-blue]{--md-primary-fg-color:#02a6f2;--md-primary-fg-color--light:#28b5f6;--md-primary-fg-color--dark:#0287cf;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=cyan]{--md-primary-fg-color:#00bdd6;--md-primary-fg-color--light:#25c5da;--md-primary-fg-color--dark:#0097a8;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=teal]{--md-primary-fg-color:#009485;--md-primary-fg-color--light:#26a699;--md-primary-fg-color--dark:#007a6c;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=green]{--md-primary-fg-color:#4cae4f;--md-primary-fg-color--light:#68bb6c;--md-primary-fg-color--dark:#398e3d;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=light-green]{--md-primary-fg-color:#8bc34b;--md-primary-fg-color--light:#9ccc66;--md-primary-fg-color--dark:#689f38;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=lime]{--md-primary-fg-color:#cbdc38;--md-primary-fg-color--light:#d3e156;--md-primary-fg-color--dark:#b0b52c;--md-primary-bg-color:#000000de;--md-primary-bg-color--light:#0000008a}[data-md-color-primary=yellow]{--md-primary-fg-color:#ffec3d;--md-primary-fg-color--light:#ffee57;--md-primary-fg-color--dark:#fbc02d;--md-primary-bg-color:#000000de;--md-primary-bg-color--light:#0000008a}[data-md-color-primary=amber]{--md-primary-fg-color:#ffc105;--md-primary-fg-color--light:#ffc929;--md-primary-fg-color--dark:#ffa200;--md-primary-bg-color:#000000de;--md-primary-bg-color--light:#0000008a}[data-md-color-primary=orange]{--md-primary-fg-color:#ffa724;--md-primary-fg-color--light:#ffa724;--md-primary-fg-color--dark:#fa8900;--md-primary-bg-color:#000000de;--md-primary-bg-color--light:#0000008a}[data-md-color-primary=deep-orange]{--md-primary-fg-color:#ff6e42;--md-primary-fg-color--light:#ff8a66;--md-primary-fg-color--dark:#f4511f;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=brown]{--md-primary-fg-color:#795649;--md-primary-fg-color--light:#8d6e62;--md-primary-fg-color--dark:#5d4037;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=grey]{--md-primary-fg-color:#757575;--md-primary-fg-color--light:#9e9e9e;--md-primary-fg-color--dark:#616161;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3;--md-typeset-a-color:#4051b5}[data-md-color-primary=blue-grey]{--md-primary-fg-color:#546d78;--md-primary-fg-color--light:#607c8a;--md-primary-fg-color--dark:#455a63;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3;--md-typeset-a-color:#4051b5}[data-md-color-primary=light-green]:not([data-md-color-scheme=slate]){--md-typeset-a-color:#72ad2e}[data-md-color-primary=lime]:not([data-md-color-scheme=slate]){--md-typeset-a-color:#8b990a}[data-md-color-primary=yellow]:not([data-md-color-scheme=slate]){--md-typeset-a-color:#b8a500}[data-md-color-primary=amber]:not([data-md-color-scheme=slate]){--md-typeset-a-color:#d19d00}[data-md-color-primary=orange]:not([data-md-color-scheme=slate]){--md-typeset-a-color:#e68a00}[data-md-color-primary=white]{--md-primary-fg-color:hsla(var(--md-hue),0%,100%,1);--md-primary-fg-color--light:hsla(var(--md-hue),0%,100%,0.7);--md-primary-fg-color--dark:hsla(var(--md-hue),0%,0%,0.07);--md-primary-bg-color:hsla(var(--md-hue),0%,0%,0.87);--md-primary-bg-color--light:hsla(var(--md-hue),0%,0%,0.54);--md-typeset-a-color:#4051b5}[data-md-color-primary=white] .md-button{color:var(--md-typeset-a-color)}[data-md-color-primary=white] .md-button--primary{background-color:var(--md-typeset-a-color);border-color:var(--md-typeset-a-color);color:hsla(var(--md-hue),0%,100%,1)}@media screen and (min-width:60em){[data-md-color-primary=white] .md-search__form{background-color:hsla(var(--md-hue),0%,0%,.07)}[data-md-color-primary=white] .md-search__form:hover{background-color:hsla(var(--md-hue),0%,0%,.32)}[data-md-color-primary=white] .md-search__input+.md-search__icon{color:hsla(var(--md-hue),0%,0%,.87)}}@media screen and (min-width:76.25em){[data-md-color-primary=white] .md-tabs{border-bottom:.05rem solid #00000012}}[data-md-color-primary=black]{--md-primary-fg-color:hsla(var(--md-hue),15%,9%,1);--md-primary-fg-color--light:hsla(var(--md-hue),15%,9%,0.54);--md-primary-fg-color--dark:hsla(var(--md-hue),15%,9%,1);--md-primary-bg-color:hsla(var(--md-hue),15%,100%,1);--md-primary-bg-color--light:hsla(var(--md-hue),15%,100%,0.7);--md-typeset-a-color:#4051b5}[data-md-color-primary=black] .md-button{color:var(--md-typeset-a-color)}[data-md-color-primary=black] .md-button--primary{background-color:var(--md-typeset-a-color);border-color:var(--md-typeset-a-color);color:hsla(var(--md-hue),0%,100%,1)}[data-md-color-primary=black] .md-header{background-color:hsla(var(--md-hue),15%,9%,1)}@media screen and (max-width:59.984375em){[data-md-color-primary=black] .md-nav__source{background-color:hsla(var(--md-hue),15%,11%,.87)}}@media screen and (max-width:76.234375em){html [data-md-color-primary=black] .md-nav--primary .md-nav__title[for=__drawer]{background-color:hsla(var(--md-hue),15%,9%,1)}}@media screen and (min-width:76.25em){[data-md-color-primary=black] .md-tabs{background-color:hsla(var(--md-hue),15%,9%,1)}} \ No newline at end of file diff --git a/changelog/index.html b/changelog/index.html new file mode 100644 index 00000000..694d0440 --- /dev/null +++ b/changelog/index.html @@ -0,0 +1,35 @@ + Changelog - mkdocstrings-python

Changelog¤

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog and this project adheres to Semantic Versioning.

1.16.11 - 2025-05-24¤

Compare with 1.16.10

Bug Fixes¤

1.16.10 - 2025-04-03¤

Compare with 1.16.9

Bug Fixes¤

1.16.9 - 2025-04-03¤

Compare with 1.16.8

Bug Fixes¤

  • Use toc_label option in a few missing places (337b46b by Timothée Mazzucotelli). Issue-267

1.16.8 - 2025-03-24¤

Compare with 1.16.7

Bug Fixes¤

  • Prevent infinite recursion by detecting parent-member cycles (f3917e9 by Timothée Mazzucotelli). Issue-griffe-368

Code Refactoring¤

  • Prepare feature for ordering by __all__ value (bfb5b30 by Timothée Mazzucotelli). Issue-219
  • Sort objects without line numbers last instead of first (681afb1 by Timothée Mazzucotelli).

1.16.7 - 2025-03-20¤

Compare with 1.16.6

Code Refactoring¤

  • Prepare public filtering method feature (fde2019 by Timothée Mazzucotelli). Issue-78

1.16.6 - 2025-03-18¤

Compare with 1.16.5

Deprecations¤

Importing from submodules is now deprecated: the public API is fully exposed under the top-level mkdocstrings_handler.python module.

Bug Fixes¤

  • Add back default compiled filters (regression) (2d83900 by Timothée Mazzucotelli). Issue-264

Code Refactoring¤

  • Start logging warnings instead of info messages about deprecated use of templates (7606f33 by Timothée Mazzucotelli).
  • Move modules into internal folder, expose API in top-level module (93a68d0 by Timothée Mazzucotelli).

1.16.5 - 2025-03-10¤

Compare with 1.16.4

Code Refactoring¤

1.16.4 - 2025-03-10¤

Compare with 1.16.3

Bug Fixes¤

  • Fix de-duplication of summary sections (dc46ac9 by Timothée Mazzucotelli).

1.16.3 - 2025-03-08¤

Compare with 1.16.2

Build¤

  • Depend on mkdocstrings 0.28.3 (9fa4f16 by Timothée Mazzucotelli).

Bug Fixes¤

Code Refactoring¤

  • Import from top-level mkdocstrings module (da2ba13 by Timothée Mazzucotelli).

1.16.2 - 2025-02-24¤

Compare with 1.16.1

Build¤

  • Depend on mkdocs-autorefs >= 1.4 and mkdocstrings >= 0.28.2 (ea1ab49 by Timothée Mazzucotelli).

1.16.1 - 2025-02-18¤

Compare with 1.16.0

Bug Fixes¤

  • Give precedence to user-provided paths when they are already listed in sys.path (0f497d1 by Timothée Mazzucotelli). Issue-248

1.16.0 - 2025-02-17¤

Compare with 1.15.1

Features¤

  • Add option to show/hide overloads (4a5ee10 by Pete Stenger). PR-250

1.15.1 - 2025-02-17¤

Compare with 1.15.0

Bug Fixes¤

  • Unwrap Annotated regardless of signature_crossrefs (d809f1a by Timothée Mazzucotelli). Issue-249

1.15.0 - 2025-02-11¤

Compare with 1.14.6

Features¤

  • Support cross-referencing constructor parameters in instance attribute values (f07bf58 by Timothée Mazzucotelli).

1.14.6 - 2025-02-07¤

Compare with 1.14.5

Bug Fixes¤

  • Catch alias resolution errors when getting aliases for an identifier (0aaa260 by Timothée Mazzucotelli). Issue-358

Code Refactoring¤

  • Improve translations for Simplified Chinese and Japanese (753a0df by Zhikang Yan). PR-244

1.14.5 - 2025-02-05¤

Compare with 1.14.4

Bug Fixes¤

  • Remove type from property docstring summary in summary sections (15f2cd4 by Uchechukwu Orji). PR-242

1.14.4 - 2025-02-04¤

Compare with 1.14.3

Bug Fixes¤

  • Deactivate Pydantic validation on Python 3.9 is eval-type-backport is not available (for modern typing syntax support) (0de0e5e by Timothée Mazzucotelli). Issue-241

1.14.3 - 2025-02-04¤

Compare with 1.14.2

Bug Fixes¤

  • Let dataclass implement __init__ method, set extra fields in get_options (477b9e4 by Timothée Mazzucotelli).

1.14.2 - 2025-02-03¤

Compare with 1.14.1

Bug Fixes¤

  • Deactivate Pydantic logic if v1 is installed instead of v2 (c5ecd70 by Timothée Mazzucotelli). Issue-240

1.14.1 - 2025-02-03¤

Compare with 1.14.0

Bug Fixes¤

  • Fix type errors with options during collection and docstring parsing (15ca6d8 by Timothée Mazzucotelli).

1.14.0 - 2025-02-03¤

Compare with 1.13.0

Features¤

Code Refactoring¤

  • Use dataclasses for configuration/options and automate schema generation (5ebeda6 by Timothée Mazzucotelli).

1.13.0 - 2024-12-26¤

Compare with 1.12.2

Features¤

  • Allow using Ruff to format signatures and attribute values (d67215c by dm). PR-216

Bug Fixes¤

  • Respect show_signature_annotations option for attribute signatures in headings (e93d166 by Timothée Mazzucotelli). Issue-griffe-pydantic#9
  • Handle __init__ overloads when merging into class (af6fab3 by Timothée Mazzucotelli). Issue-212
  • Actually check if a module is public when rendering auto-generated summary table for modules (3bf55b2 by Timothée Mazzucotelli). Issue-203
  • Never render line numbers for signatures and attribute values (a669f1c by Timothée Mazzucotelli). Issue-192
  • Respect highlight's linenums config for pycon examples in docstrings (53eb82a by Timothée Mazzucotelli). Related-to-#192
  • Fix normalization of extension paths on the annoying operating system and Python 3.13 (101a6dc by Timothée Mazzucotelli).
  • Don't merge parent __init__ docstring into class docstring if such inherited method wasn't selected through the inherited_members configuration option (6c5b5c3 by Timothée Mazzucotelli). Issue-189

Code Refactoring¤

1.12.2 - 2024-10-19¤

Compare with 1.12.1

Bug Fixes¤

1.12.1 - 2024-10-14¤

Compare with 1.12.0

Bug Fixes¤

  • Don't escape parameter default values (9dee4d4 by Timothée Mazzucotelli). Issue-191

1.12.0 - 2024-10-12¤

Compare with 1.11.1

Build¤

  • Drop support for Python 3.8 (6615c91 by Timothée Mazzucotelli).

Features¤

  • Auto-summary of members (7f9757d by Timothée Mazzucotelli).
  • Render function overloads (0f2c25c by Timothée Mazzucotelli).
  • Parameter headings, more automatic cross-references (0176b83 by Timothée Mazzucotelli).

Code Refactoring¤

  • Declare default CSS symbol colors under :host as well (3b9dba2 by James McDonnell). PR-186

1.11.1 - 2024-09-03¤

Compare with 1.11.0

Code Refactoring¤

  • Prepare relative_crossrefs and scoped_crossrefs insiders features (dd8b014 by Timothée Mazzucotelli).

1.11.0 - 2024-09-03¤

Compare with 1.10.9

Features¤

  • Hook into autorefs to provide context around cross-ref errors (bb4be5b by Timothée Mazzucotelli).

1.10.9 - 2024-08-30¤

Compare with 1.10.8

Build¤

  • Explicitly depend on mkdocs-autorefs to be able to specify lower bound (2299ab5 by Timothée Mazzucotelli).

Code Refactoring¤

  • Use new autorefs syntax (68cb72f by Timothée Mazzucotelli).

1.10.8 - 2024-08-14¤

Compare with 1.10.7

Build¤

  • Depend on Griffe 0.49 (a87dcad by Timothée Mazzucotelli).

1.10.7 - 2024-07-25¤

Compare with 1.10.6

Packaging¤

  • Include tests and all relevant files for downstream packaging in source distribution

1.10.6 - 2024-07-25¤

Compare with 1.10.5

Bug Fixes¤

  • Fix condition to display members (check all members, not just non-inherited ones) (3d838a9 by Timothée Mazzucotelli).

Code Refactoring¤

  • Update code for Griffe 0.48 (removing deprecation warnings) (eff10cc by Timothée Mazzucotelli). Issue-173

1.10.5 - 2024-06-19¤

Compare with 1.10.4

Bug Fixes¤

  • Mix both previous checks for displaying objects: not imported or public (587963b by Timothée Mazzucotelli). Issue-294

1.10.4 - 2024-06-18¤

Compare with 1.10.3

Code Refactoring¤

  • Only filter out imported objects instead of non-public ones after applying filters (e2f4b35 by Timothée Mazzucotelli). Issue-mkdocstrings/griffe-294
  • Update code for Griffe 0.46 to avoid deprecation warnings (321b407 by Timothée Mazzucotelli).
  • Change load_external_modules default value to None to support new default mode in Griffe (ae5896c by Timothée Mazzucotelli).

1.10.3 - 2024-05-22¤

Compare with 1.10.2

Bug Fixes¤

  • Don't crash when rendering the source of an object whose lineno is none (64df00b by Timothée Mazzucotelli). Issue-163

1.10.2 - 2024-05-16¤

Compare with 1.10.1

Bug Fixes¤

  • Actually make use of custom .html.jinja templates (5668abb by Timothée Mazzucotelli).

1.10.1 - 2024-05-14¤

Compare with 1.10.0

Build¤

  • Depend on mkdocstrings 0.25 which adds support for parameter once when logging messages (2bc156b by Timothée Mazzucotelli).

Code Refactoring¤

  • Set handler's name (a71ab12 by Timothée Mazzucotelli).
  • Update *.html top-level templates to extend the *.html.jinja base templates (a8c540e by Timothée Mazzucotelli). Issue-151
  • Update *.html base templates to extend their *.html.jinja counterpart, while overriding the logs block to issue a logging message (info) stating that extending *.html templates is deprecated (e6f1b9c by Timothée Mazzucotelli). Issue-151
  • Add *.html.jinja top-level (overridable) templates, extending their base counterpart (7c14924 by Timothée Mazzucotelli). Issue-151
  • Add *.html.jinja base templates, which are copies of *.html templates, with an additional logs block, and using the updated get_template filter (eced9a5 by Timothée Mazzucotelli). Issue-151
  • Update get_template filter to support both *.html and *.html.jinja templates, logging a message (info) when *.html templates are overridden by users (3546fd7 by Timothée Mazzucotelli). Issue-151
  • Log a warning when base templates are overridden (26e3d66 by Timothée Mazzucotelli). Issue-151

1.10.0 - 2024-04-19¤

Compare with 1.9.2

Features¤

  • Add CSS classes doc-section-title and doc-section-item in docstring sections (d6e1d68 by Timothée Mazzucotelli). Issue-17

Bug Fixes¤

  • Render enumeration instance name instead of just "value", allowing proper cross-reference (11d81d8 by Timothée Mazzucotelli). Issue-124

1.9.2 - 2024-04-02¤

Compare with 1.9.1

Dependencies¤

  • Remove cap on Python-Markdown 3.6 now that ToC labels are fixed by mkdocstrings (0c1e2c1 by Timothée Mazzucotelli).

1.9.1 - 2024-04-02¤

Compare with 1.9.0

Bug Fixes¤

  • Don't try loading packages from relative paths (bd73497 by Timothée Mazzucotelli). Issue-145

Code Refactoring¤

  • Allow first name in a separate signature to be highlighted as a function name (f798a1e by Timothée Mazzucotelli).
  • Maintain original Pygments color for cross-refs in signatures (7c8b885 by Timothée Mazzucotelli).

1.9.0 - 2024-03-13¤

Compare with 1.8.0

Dependencies¤

  • Add upper bound on Python-Markdown 3.6 to temporarily prevent breaking changes (cd93ee3 by Timothée Mazzucotelli).

Features¤

Code Refactoring¤

  • Mark all Jinja blocks as scoped (548bdad by Timothée Mazzucotelli).

1.8.0 - 2024-01-08¤

Compare with 1.7.5

Features¤

1.7.5 - 2023-11-21¤

Compare with 1.7.4

Bug Fixes¤

  • Add missing translations (fallback theme) for ReadTheDocs (2fb6513 by Timothée Mazzucotelli). Issue #115

1.7.4 - 2023-11-12¤

Compare with 1.7.3

Bug Fixes¤

  • Make extension paths relative to config file (5035e92 by Waylan Limberg). PR #112, Co-authored-by: Timothée Mazzucotelli pawamoy@pm.me

Code Refactoring¤

  • Prepare for Griffe 0.37 (b5bb8a9 by Timothée Mazzucotelli).

1.7.3 - 2023-10-09¤

Compare with 1.7.2

Bug Fixes¤

  • Don't deepcopy the local config (1300d2c by Timothée Mazzucotelli).

1.7.2 - 2023-10-05¤

Compare with 1.7.1

Bug Fixes¤

  • Prevent alias resolution error when source-ordering members (67df10c by Timothée Mazzucotelli). Issue griffe#213

Code Refactoring¤

1.7.1 - 2023-09-28¤

Compare with 1.7.0

Bug Fixes¤

  • Stop propagation of annotation to next parameter in signature template (3a760ac by Timothée Mazzucotelli). Issue #110

Code Refactoring¤

  • Look into inherited members for __init__ methods when merging docstrings (b97d51f by Timothée Mazzucotelli). Issue #106

1.7.0 - 2023-09-14¤

Compare with 1.6.3

Features¤

  • Add option to unwrap Annotated types (53db04b by Timothée Mazzucotelli).

1.6.3 - 2023-09-11¤

Compare with 1.6.2

Bug Fixes¤

  • Make load_external_modules a global-only option (266f41f by Timothée Mazzucotelli). Issue #87
  • Never fail when trying to format code with Black (df24bbc by Timothée Mazzucotelli).

Code Refactoring¤

  • Wrap docstring section elements (list style) in code tags to prevent spell checker errors (1ae8dd8 by Timothée Mazzucotelli).

1.6.2 - 2023-09-05¤

Compare with 1.6.1

Bug Fixes¤

  • Don't render cross-ref spans when they're not enabled (eed51ee by Timothée Mazzucotelli).

1.6.1 - 2023-09-04¤

Compare with 1.6.0

Bug Fixes¤

  • Fix spacing for rendered named items in Yields, Receives and Returns sections (list style) (e12688e by Timothée Mazzucotelli).
  • Fix rendering Receives sections as lists (9ff7e68 by Timothée Mazzucotelli).

1.6.0 - 2023-08-27¤

Compare with 1.5.2

Features¤

  • Add doc-signature CSS class to separate signature code blocks (b6c648f by Timothée Mazzucotelli).

Code Refactoring¤

  • Add a format_attribute filter, preparing for cross-refs in attribute signatures (8f0ade2 by Timothée Mazzucotelli).

1.5.2 - 2023-08-25¤

Compare with 1.5.1

Bug Fixes¤

  • Regression in children template: fix condition for when members are specified (beeebff by Timothée Mazzucotelli). Issue #100
  • Prevent whitespace removal before highlight filter (c6f36c0 by Timothée Mazzucotelli).

Code Refactoring¤

  • Never show full object path in ToC entry (9aa758b by Timothée Mazzucotelli).
  • Sync templates with insiders, remove useless lines (38b317f by Timothée Mazzucotelli).

1.5.1 - 2023-08-24¤

Compare with 1.5.0

Code Refactoring¤

  • Never show full path in separate signature since it would appear in the heading already (9e02049 by Timothée Mazzucotelli).
  • Improve guessing whether an object is public (35eb811 by Timothée Mazzucotelli).
  • Always sort modules alphabetically as source order wouldn't make sense (70c81ce by Timothée Mazzucotelli).
  • Return anchors as a tuple, not a set, to preserve order (736a2b5 by Timothée Mazzucotelli). Related-to #mkdocstrings/crystal#6

1.5.0 - 2023-08-20¤

Compare with 1.4.0

Features¤

  • Add support for new Griffe docstring sections: modules, classes, and functions (methods) (d5337af by Timothée Mazzucotelli).

1.4.0 - 2023-08-18¤

Compare with 1.3.0

Features¤

  • Support new Griffe expressions (in v0.33) (9b8e1b1 by Timothée Mazzucotelli).

Code Refactoring¤

  • Deprecate crossref and multi_crossref filters (4fe3d20 by Timothée Mazzucotelli).

1.3.0 - 2023-08-06¤

Compare with 1.2.1

Dependencies¤

Features¤

  • Show parameter default values within the "list" section style too (55f08f3 by Antoine Dechaume). PR #92, Co-authored-by: Timothée Mazzucotelli pawamoy@pm.me

1.2.1 - 2023-07-20¤

Compare with 1.2.0

Bug Fixes¤

  • Fix members ordering when members are specified with a boolean (c69f9c3 by Timothée Mazzucotelli). Issue #89

1.2.0 - 2023-07-14¤

Compare with 1.1.2

Features¤

Bug Fixes¤

  • Don't show None as return annotation of class signatures (3d8724e by Timothée Mazzucotelli). Issue #85
  • Show labels in deterministic order (02619a8 by Oleh Prypin).

1.1.2 - 2023-06-04¤

Compare with 1.1.1

Code Refactoring¤

  • Keep headings style consistent (CSS) (92032e5 by Timothée Mazzucotelli).

1.1.1 - 2023-06-04¤

Compare with 1.1.0

Bug Fixes¤

  • Fix mkdocs and readthedocs themes support (14f18b2 by Timothée Mazzucotelli).

Code Refactoring¤

  • Improve display of paragraphs in docstring sections (439f5e6 by Timothée Mazzucotelli).

1.1.0 - 2023-05-25¤

Compare with 1.0.0

Features¤

  • Support custom templates through objects' extra data (8ff2b06 by Timothée Mazzucotelli). PR #70

1.0.0 - 2023-05-11¤

Compare with 0.10.1

Breaking changes¤

  • The signature of the format_signature filter has changed. If you override templates in your project to customize the output, make sure to update the following templates so that they use the new filter signature:

    • class.html
    • expression.html
    • function.html
    • signature.html

    You can see how to use the filter in this commit's changes: f686f4e4.

We take this as an opportunity to go out of beta and bump the version to 1.0.0. This will allow users to rely on semantic versioning.

Bug Fixes¤

  • Bring compatibility with insiders signature crossrefs feature (f686f4e by Timothée Mazzucotelli).

0.10.1 - 2023-05-07¤

Compare with 0.10.0

Bug Fixes¤

  • Format signatures with full-path names (685512d by Timothée Mazzucotelli).

0.10.0 - 2023-05-07¤

Compare with 0.9.0

Features¤

Bug Fixes¤

  • Make admonitions open by default (79cd153 by Timothée Mazzucotelli). Issue #22

Code Refactoring¤

  • Match documented behavior for filtering (all members, list, none) (c7f70c3 by Timothée Mazzucotelli).
  • Switch to an info level log for when black's not installed (f593bb0 by Faster Speeding).
  • Return anchors as a set (e2b820c by Timothée Mazzucotelli).

0.9.0 - 2023-04-03¤

Compare with 0.8.3

Features¤

Bug Fixes¤

  • Prevent alias resolution error when searching for anchors (a190e2c by Timothée Mazzucotelli). Issue #64

Code Refactoring¤

  • Support Griffe 0.26 (075735c by Timothée Mazzucotelli).
  • Log (debug) unresolved aliases (9164742 by Timothée Mazzucotelli).

0.8.3 - 2023-01-04¤

Compare with 0.8.2

Code Refactoring¤

  • Change "unresolved aliases" log level to DEBUG (dccb818 by Timothée Mazzucotelli).

0.8.2 - 2022-11-19¤

Compare with 0.8.1

Bug Fixes¤

  • Fix base directory used to expand globs (34cfa4b by Florian Hofer). PR #45

0.8.1 - 2022-11-19¤

Compare with 0.8.0

Bug Fixes¤

0.8.0 - 2022-11-13¤

Compare with 0.7.1

Features¤

Code Refactoring¤

  • Support Griffe 0.24 (3b9f701 by Timothée Mazzucotelli).

0.7.1 - 2022-06-12¤

Compare with 0.7.0

Bug Fixes¤

  • Fix rendering of / in signatures (3e927e4 by Timothée Mazzucotelli). Issue #25

0.7.0 - 2022-05-28¤

Compare with 0.6.6

Packaging / Dependencies¤

  • Depend on mkdocstrings 0.19 (b6a9a47 by Timothée Mazzucotelli).

Features¤

Bug Fixes¤

  • Fix CSS class on labels (312a709 by Timothée Mazzucotelli).
  • Fix categories rendering (6407cf4 by Timothée Mazzucotelli). Issue #14

Code Refactoring¤

  • Disable show_submodules by default (480d0c3 by Timothée Mazzucotelli).
  • Merge default configuration options in handler (347ce76 by Timothée Mazzucotelli).
  • Reduce number of template debug logs (8fed314 by Timothée Mazzucotelli).
  • Respect show_root_full_path for ToC entries (hidden headings) (8f4c853 by Timothée Mazzucotelli).
  • Bring consistency on headings style (59104c4 by Timothée Mazzucotelli).
  • Stop using deprecated base classes (d5ea1c5 by Timothée Mazzucotelli).

0.6.6 - 2022-03-06¤

Compare with 0.6.5

Code Refactoring¤

  • Always hide self and cls parameters (7f579d1 by Timothée Mazzucotelli). Issue #7
  • Use pycon for examples code blocks (6545900 by Timothée Mazzucotelli).

0.6.5 - 2022-02-24¤

Compare with 0.6.4

Bug Fixes¤

  • Don't escape signatures return annotations (ac54bfc by Timothée Mazzucotelli). Issue #6

0.6.4 - 2022-02-22¤

Compare with 0.6.3

Bug Fixes¤

  • Fix rendering of signature return annotation (b92ba3b by Timothée Mazzucotelli). Issue #4

0.6.3 - 2022-02-20¤

Compare with 0.6.2

Bug Fixes¤

0.6.2 - 2022-02-17¤

Compare with 0.6.1

Bug Fixes¤

  • Catch alias resolution errors (b734dd0 by Timothée Mazzucotelli).

0.6.1 - 2022-02-17¤

Compare with 0.6.0

Bug Fixes¤

  • Don't pop from fallback config (bde32af by Timothée Mazzucotelli).
  • Fix rendering init method source when merged into class (4a20aea by Timothée Mazzucotelli).

0.6.0 - 2022-02-13¤

Compare with 0.5.4

Features¤

  • Add option to merge __init__ methods' docstrings into their classes' docstrings (1b4d1c0 by Timothée Mazzucotelli).
  • Support separate attribute signature (e962b88 by Timothée Mazzucotelli).

Bug Fixes¤

  • Restore full cross-refs paths on hover (ac11970 by Timothée Mazzucotelli).
  • Fix rendering of labels (52919c5 by Timothée Mazzucotelli).

Code Refactoring¤

  • Don't add trailing parentheses in functions heading when separate signature (885696e by Timothée Mazzucotelli).
  • Use more explicit template debug messages (f2122d7 by Timothée Mazzucotelli).

0.5.4 - 2022-02-13¤

Compare with 0.5.3

Bug Fixes¤

  • Don't load additional modules during fallback (69b8e25 by Timothée Mazzucotelli).

0.5.3 - 2022-02-08¤

Compare with 0.5.2

Bug Fixes¤

  • Allow passing null as docstring style (f526816 by Timothée Mazzucotelli). Issue #2

0.5.2 - 2022-02-05¤

Compare with 0.5.1

Dependencies¤

  • Require at least mkdocstrings 0.18 (7abdda4 by Timothée Mazzucotelli).

0.5.1 - 2022-02-03¤

Compare with 0.5.0

Dependencies¤

  • Depend on Griffe >= 0.11.1 (1303557 by Timothée Mazzucotelli).

Code Refactoring¤

  • Move handler into its own module (b787e78 by Timothée Mazzucotelli).

0.5.0 - 2022-02-03¤

Compare with 0.4.1

Features¤

  • Allow changing docstring style of an object (39240c1 by Timothée Mazzucotelli).

Bug Fixes¤

  • Warn if Black is not installed when formatting signature (b848277 by Timothée Mazzucotelli).
  • Fix missing default for docstring_section_style option (774988e by Timothée Mazzucotelli).

Code Refactoring¤

  • Change to new way of stripping paragraphs (33d4594 by Timothée Mazzucotelli).

0.4.1 - 2022-02-01¤

Compare with 0.4.0

Bug Fixes¤

  • Fix docstring admonitions rendering (a24ae2e by Timothée Mazzucotelli).

0.4.0 - 2022-02-01¤

Compare with 0.3.0

Code Refactoring¤

  • Use the new mkdocstrings_handlers namespace (23c9023 by Timothée Mazzucotelli).

0.3.0 - 2022-01-14¤

Compare with 0.2.0

Features¤

  • Support griffe 0.10 (28061de by Timothée Mazzucotelli).

Dependencies¤

  • Require griffe 0.10 (cfbd7bb by Timothée Mazzucotelli).

Code Refactoring¤

  • Use new logger patching utility (4cdb292 by Timothée Mazzucotelli).

0.2.0 - 2021-12-28¤

Compare with 0.1.0

Dependencies¤

  • Depend on griffe >= 0.7.1 (34f7ebd by Timothée Mazzucotelli).
  • Upgrade griffe, no upper bound (8f0aa42 by Timothée Mazzucotelli).

Features¤

  • Add show_signature rendering option (0f07c2e by Will Da Silva).

Bug Fixes¤

  • Fix templates for named docstring elements (47868a1 by Timothée Mazzucotelli).

0.1.0 - 2021-12-19¤

Compare with first commit

Features¤

  • Implement handler and add templates (dbb580a by Timothée Mazzucotelli).

Bug Fixes¤

  • Fix separate signature feature (da6e81c by Timothée Mazzucotelli).
  • Fix signature template (parameters annotations) (b34ead0 by Timothée Mazzucotelli).
  • Only show source when present (c270d68 by Timothée Mazzucotelli).

Code Refactoring¤

  • Return all known anchors (9bbfe14 by Timothée Mazzucotelli).
  • Update for griffe 0.4.0 (831aabb by Timothée Mazzucotelli).
\ No newline at end of file diff --git a/code_of_conduct/index.html b/code_of_conduct/index.html new file mode 100644 index 00000000..d93c00bd --- /dev/null +++ b/code_of_conduct/index.html @@ -0,0 +1,35 @@ + Code of Conduct - mkdocstrings-python

Contributor Covenant Code of Conduct¤

Our Pledge¤

We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.

Our Standards¤

Examples of behavior that contributes to a positive environment for our community include:

  • Demonstrating empathy and kindness toward other people
  • Being respectful of differing opinions, viewpoints, and experiences
  • Giving and gracefully accepting constructive feedback
  • Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
  • Focusing on what is best not just for us as individuals, but for the overall community

Examples of unacceptable behavior include:

  • The use of sexualized language or imagery, and sexual attention or advances of any kind
  • Trolling, insulting or derogatory comments, and personal or political attacks
  • Public or private harassment
  • Publishing others' private information, such as a physical or email address, without their explicit permission
  • Other conduct which could reasonably be considered inappropriate in a professional setting

Enforcement Responsibilities¤

Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.

Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.

Scope¤

This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.

Enforcement¤

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at dev@pawamoy.fr. All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the reporter of any incident.

Enforcement Guidelines¤

Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:

1. Correction¤

Community Impact: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.

Consequence: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.

2. Warning¤

Community Impact: A violation through a single incident or series of actions.

Consequence: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.

3. Temporary Ban¤

Community Impact: A serious violation of community standards, including sustained inappropriate behavior.

Consequence: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.

4. Permanent Ban¤

Community Impact: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.

Consequence: A permanent ban from any sort of public interaction within the community.

Attribution¤

This Code of Conduct is adapted from the Contributor Covenant, version 2.1, available at https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.

Community Impact Guidelines were inspired by Mozilla's code of conduct enforcement ladder.

For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

\ No newline at end of file diff --git a/config/black.toml b/config/black.toml deleted file mode 100644 index d24affe5..00000000 --- a/config/black.toml +++ /dev/null @@ -1,3 +0,0 @@ -[tool.black] -line-length = 120 -exclude = "tests/fixtures" diff --git a/config/coverage.ini b/config/coverage.ini deleted file mode 100644 index 71d12074..00000000 --- a/config/coverage.ini +++ /dev/null @@ -1,26 +0,0 @@ -[coverage:run] -branch = true -parallel = true -source = - src/mkdocstrings_handlers - tests/ - -[coverage:paths] -equivalent = - src/ - .venv/lib/*/site-packages/ - .venvs/*/lib/*/site-packages/ - -[coverage:report] -include_namespace_packages = true -precision = 2 -omit = - src/*/__init__.py - src/*/__main__.py - tests/__init__.py -exclude_lines = - pragma: no cover - if TYPE_CHECKING - -[coverage:json] -output = htmlcov/coverage.json diff --git a/config/git-changelog.toml b/config/git-changelog.toml deleted file mode 100644 index 57114e0c..00000000 --- a/config/git-changelog.toml +++ /dev/null @@ -1,9 +0,0 @@ -bump = "auto" -convention = "angular" -in-place = true -output = "CHANGELOG.md" -parse-refs = false -parse-trailers = true -sections = ["build", "deps", "feat", "fix", "refactor"] -template = "keepachangelog" -versioning = "pep440" diff --git a/config/mypy.ini b/config/mypy.ini deleted file mode 100644 index cb0dd886..00000000 --- a/config/mypy.ini +++ /dev/null @@ -1,7 +0,0 @@ -[mypy] -ignore_missing_imports = true -exclude = tests/fixtures/ -warn_unused_ignores = true -show_error_codes = true -namespace_packages = true -explicit_package_bases = true diff --git a/config/pytest.ini b/config/pytest.ini deleted file mode 100644 index 4f43c18e..00000000 --- a/config/pytest.ini +++ /dev/null @@ -1,16 +0,0 @@ -[pytest] -python_files = - test_*.py -addopts = - --cov - --cov-config config/coverage.ini -testpaths = - tests - -# action:message_regex:warning_class:module_regex:line -filterwarnings = - error - # TODO: Remove once pytest-xdist 4 is released. - ignore:.*rsyncdir:DeprecationWarning:xdist - # TODO: Remove once mkdocstrings stops setting fallback function. - ignore:.*fallback anchor function:DeprecationWarning:mkdocstrings diff --git a/config/ruff.toml b/config/ruff.toml deleted file mode 100644 index 04af7c19..00000000 --- a/config/ruff.toml +++ /dev/null @@ -1,91 +0,0 @@ -target-version = "py39" -line-length = 120 - -[lint] -exclude = [ - "tests/fixtures/*.py", -] -select = [ - "A", "ANN", "ARG", - "B", "BLE", - "C", "C4", - "COM", - "D", "DTZ", - "E", "ERA", "EXE", - "F", "FBT", - "G", - "I", "ICN", "INP", "ISC", - "N", - "PGH", "PIE", "PL", "PLC", "PLE", "PLR", "PLW", "PT", "PYI", - "Q", - "RUF", "RSE", "RET", - "S", "SIM", "SLF", - "T", "T10", "T20", "TCH", "TID", "TRY", - "UP", - "W", - "YTT", -] -ignore = [ - "A001", # Variable is shadowing a Python builtin - "ANN101", # Missing type annotation for self - "ANN102", # Missing type annotation for cls - "ANN204", # Missing return type annotation for special method __str__ - "ANN401", # Dynamically typed expressions (typing.Any) are disallowed - "ARG005", # Unused lambda argument - "C901", # Too complex - "D105", # Missing docstring in magic method - "D417", # Missing argument description in the docstring - "E501", # Line too long - "ERA001", # Commented out code - "G004", # Logging statement uses f-string - "PLR0911", # Too many return statements - "PLR0912", # Too many branches - "PLR0913", # Too many arguments to function call - "PLR0915", # Too many statements - "SLF001", # Private member accessed - "TRY003", # Avoid specifying long messages outside the exception class -] - -[lint.per-file-ignores] -"src/**/cli.py" = [ - "T201", # Print statement -] -"src/*/debug.py" = [ - "T201", # Print statement -] -"!src/*/*.py" = [ - "D100", # Missing docstring in public module -] -"!src/**.py" = [ - "D101", # Missing docstring in public class - "D103", # Missing docstring in public function -] -"scripts/*.py" = [ - "INP001", # File is part of an implicit namespace package - "T201", # Print statement -] -"tests/**.py" = [ - "ARG005", # Unused lambda argument - "FBT001", # Boolean positional arg in function definition - "PLR2004", # Magic value used in comparison - "S101", # Use of assert detected -] - -[lint.flake8-quotes] -docstring-quotes = "double" - -[lint.flake8-tidy-imports] -ban-relative-imports = "all" - -[lint.isort] -known-first-party = ["mkdocstrings_handlers.python"] - -[lint.pydocstyle] -convention = "google" - -[format] -exclude = [ - "tests/fixtures/*.py", -] -docstring-code-format = true -docstring-code-line-length = 80 diff --git a/config/vscode/launch.json b/config/vscode/launch.json deleted file mode 100644 index 9d632bf0..00000000 --- a/config/vscode/launch.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "version": "0.2.0", - "configurations": [ - { - "name": "python (current file)", - "type": "debugpy", - "request": "launch", - "program": "${file}", - "console": "integratedTerminal", - "justMyCode": false, - "args": "${command:pickArgs}" - }, - { - "name": "run", - "type": "debugpy", - "request": "launch", - "module": "python", - "console": "integratedTerminal", - "justMyCode": false, - "args": "${command:pickArgs}" - }, - { - "name": "docs", - "type": "debugpy", - "request": "launch", - "module": "mkdocs", - "justMyCode": false, - "args": [ - "serve", - "-v" - ] - }, - { - "name": "test", - "type": "debugpy", - "request": "launch", - "module": "pytest", - "justMyCode": false, - "args": [ - "-c=config/pytest.ini", - "-vvv", - "--no-cov", - "--dist=no", - "tests", - "-k=${input:tests_selection}" - ] - } - ], - "inputs": [ - { - "id": "tests_selection", - "type": "promptString", - "description": "Tests selection", - "default": "" - } - ] -} \ No newline at end of file diff --git a/config/vscode/settings.json b/config/vscode/settings.json deleted file mode 100644 index 949856d1..00000000 --- a/config/vscode/settings.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "files.watcherExclude": { - "**/.venv*/**": true, - "**/.venvs*/**": true, - "**/venv*/**": true - }, - "mypy-type-checker.args": [ - "--config-file=config/mypy.ini" - ], - "python.testing.unittestEnabled": false, - "python.testing.pytestEnabled": true, - "python.testing.pytestArgs": [ - "--config-file=config/pytest.ini" - ], - "ruff.enable": true, - "ruff.format.args": [ - "--config=config/ruff.toml" - ], - "ruff.lint.args": [ - "--config=config/ruff.toml" - ], - "yaml.schemas": { - "https://squidfunk.github.io/mkdocs-material/schema.json": "mkdocs.yml" - }, - "yaml.customTags": [ - "!ENV scalar", - "!ENV sequence", - "!relative scalar", - "tag:yaml.org,2002:python/name:materialx.emoji.to_svg", - "tag:yaml.org,2002:python/name:materialx.emoji.twemoji", - "tag:yaml.org,2002:python/name:pymdownx.superfences.fence_code_format" - ] -} \ No newline at end of file diff --git a/config/vscode/tasks.json b/config/vscode/tasks.json deleted file mode 100644 index 73145eec..00000000 --- a/config/vscode/tasks.json +++ /dev/null @@ -1,97 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "label": "changelog", - "type": "process", - "command": "scripts/make", - "args": ["changelog"] - }, - { - "label": "check", - "type": "process", - "command": "scripts/make", - "args": ["check"] - }, - { - "label": "check-quality", - "type": "process", - "command": "scripts/make", - "args": ["check-quality"] - }, - { - "label": "check-types", - "type": "process", - "command": "scripts/make", - "args": ["check-types"] - }, - { - "label": "check-docs", - "type": "process", - "command": "scripts/make", - "args": ["check-docs"] - }, - { - "label": "check-api", - "type": "process", - "command": "scripts/make", - "args": ["check-api"] - }, - { - "label": "clean", - "type": "process", - "command": "scripts/make", - "args": ["clean"] - }, - { - "label": "docs", - "type": "process", - "command": "scripts/make", - "args": ["docs"] - }, - { - "label": "docs-deploy", - "type": "process", - "command": "scripts/make", - "args": ["docs-deploy"] - }, - { - "label": "format", - "type": "process", - "command": "scripts/make", - "args": ["format"] - }, - { - "label": "release", - "type": "process", - "command": "scripts/make", - "args": ["release", "${input:version}"] - }, - { - "label": "setup", - "type": "process", - "command": "scripts/make", - "args": ["setup"] - }, - { - "label": "test", - "type": "process", - "command": "scripts/make", - "args": ["test", "coverage"], - "group": "test" - }, - { - "label": "vscode", - "type": "process", - "command": "scripts/make", - "args": ["vscode"] - } - ], - "inputs": [ - { - "id": "version", - "type": "promptString", - "description": "Version" - } - ] -} \ No newline at end of file diff --git a/contributing/index.html b/contributing/index.html new file mode 100644 index 00000000..de0db8ec --- /dev/null +++ b/contributing/index.html @@ -0,0 +1,49 @@ + Contributing - mkdocstrings-python

Contributing¤

Contributions are welcome, and they are greatly appreciated! Every little bit helps, and credit will always be given.

Environment setup¤

Nothing easier!

Fork and clone the repository, then:

cd python
+make setup
+

Note

If it fails for some reason, you'll need to install uv manually.

You can install it with:

curl -LsSf https://astral.sh/uv/install.sh | sh
+

Now you can try running make setup again, or simply uv sync.

You now have the dependencies installed.

Run make help to see all the available actions!

Tasks¤

The entry-point to run commands and tasks is the make Python script, located in the scripts directory. Try running make to show the available commands and tasks. The commands do not need the Python dependencies to be installed, while the tasks do. The cross-platform tasks are written in Python, thanks to duty.

If you work in VSCode, we provide an action to configure VSCode for the project.

Development¤

As usual:

  1. create a new branch: git switch -c feature-or-bugfix-name
  2. edit the code and/or the documentation

Before committing:

  1. run make format to auto-format the code
  2. run make check to check everything (fix any warning)
  3. run make test to run the tests (fix any issue)
  4. if you updated the documentation or the project dependencies:
    1. run make docs
    2. go to http://localhost:8000 and check that everything looks good
  5. follow our commit message convention

If you are unsure about how to fix or ignore a warning, just let the continuous integration fail, and we will help you during review.

Don't bother updating the changelog, we will take care of this.

Commit message convention¤

Commit messages must follow our convention based on the Angular style or the Karma convention:

<type>[(scope)]: Subject
+
+[Body]
+

Subject and body must be valid Markdown. Subject must have proper casing (uppercase for first letter if it makes sense), but no dot at the end, and no punctuation in general.

Scope and body are optional. Type can be:

  • build: About packaging, building wheels, etc.
  • chore: About packaging or repo/files management.
  • ci: About Continuous Integration.
  • deps: Dependencies update.
  • docs: About documentation.
  • feat: New feature.
  • fix: Bug fix.
  • perf: About performance.
  • refactor: Changes that are not features or bug fixes.
  • style: A change in code style/format.
  • tests: About tests.

If you write a body, please add trailers at the end (for example issues and PR references, or co-authors), without relying on GitHub's flavored Markdown:

Body.
+
+Issue #10: https://github.com/namespace/project/issues/10
+Related to PR namespace/other-project#15: https://github.com/namespace/other-project/pull/15
+

These "trailers" must appear at the end of the body, without any blank lines between them. The trailer title can contain any character except colons :. We expect a full URI for each trailer, not just GitHub autolinks (for example, full GitHub URLs for commits and issues, not the hash or the #issue-number).

We do not enforce a line length on commit messages summary and body, but please avoid very long summaries, and very long lines in the body, unless they are part of code blocks that must not be wrapped.

Pull requests guidelines¤

Link to any related issue in the Pull Request message.

During the review, we recommend using fixups:

# SHA is the SHA of the commit you want to fix
+git commit --fixup=SHA
+

Once all the changes are approved, you can squash your commits:

git rebase -i --autosquash main
+

And force-push:

git push -f
+

If this seems all too complicated, you can push or force-push each new commit, and we will squash them ourselves if needed, before merging.

\ No newline at end of file diff --git a/credits/index.html b/credits/index.html new file mode 100644 index 00000000..46452868 --- /dev/null +++ b/credits/index.html @@ -0,0 +1,35 @@ + Credits - mkdocstrings-python

Credits¤

These projects were used to build mkdocstrings-python. Thank you!

Python | uv | copier-uv

Runtime dependencies¤

Project Summary Version (accepted) Version (last resolved) License
click Composable command line interface toolkit >=8.0.0, >=7.0 8.1.8 BSD License
colorama Cross-platform colored terminal text. >=0.4 0.4.6 BSD License
ghp-import Copy your docs directly to the gh-pages branch. >=1.0 2.1.0 Apache Software License
griffe Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API. >=1.6.2 1.7.3.1.3.1 ISC
Jinja2 A very fast and expressive template engine. >=2.11.1, >=2.10 3.1.6 BSD License
Markdown Python implementation of John Gruber's Markdown. >=3.3.3, >=3.3 3.7 BSD License
MarkupSafe Safely add untrusted strings to HTML/XML markup. >=2.0.1, >=2.0 3.0.2 BSD License
mergedeep A deep merge function for 🐍. ~=1.3, >=1.3.4 1.3.4 MIT License
mkdocs Project documentation with Markdown. >=1.6, >=1.1 1.6.1 BSD-2-Clause
mkdocs-autorefs Automatically link across pages in MkDocs. >=1.4 1.4.1 ISC
mkdocs-get-deps MkDocs extension that lists all dependencies according to a mkdocs.yml file >=0.2.0 0.2.0 MIT
mkdocstrings Automatic documentation from sources, for MkDocs. >=0.29, >=0.28.3 0.29.0 ISC
packaging Core utilities for Python packages >=22.0, >=20.5 24.2 Apache Software License + BSD License
pathspec Utility library for gitignore style pattern matching of file paths. >=0.9.0, >=0.11.1 0.12.1 Mozilla Public License 2.0 (MPL 2.0)
platformdirs A small Python package for determining appropriate platform-specific dirs, e.g. a user data dir. >=2.2.0, >=2 4.3.6 MIT
pymdown-extensions Extension pack for Python Markdown. >=9, >=6.3 10.14.3 MIT
python-dateutil Extensions to the standard Python datetime module >=2.8.1 2.9.0.post0 BSD License + Apache Software License
PyYAML YAML parser and emitter for Python >=5.1 6.0.2 MIT
pyyaml_env_tag A custom YAML tag for referencing environment variables in YAML files. >=0.1 0.1 MIT License
six Python 2 and 3 compatibility utilities >=1.5, >=1.15, <2 1.17.0 MIT
typing_extensions Backported and Experimental Type Hints for Python 3.8+ >=4.0.1, >=4.0 4.12.2 Python Software Foundation License
watchdog Filesystem events monitoring >=2.0 6.0.0 Apache-2.0

Development dependencies¤

Project Summary Version (accepted) Version (last resolved) License
annotated-types Reusable constraint types to use with typing.Annotated >=0.6.0 0.7.0 MIT License
ansimarkup Produce colored terminal text with an xml-like markup ~=1.4 1.5.0 Revised BSD License
appdirs A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir". >=1.4 1.4.4 MIT
asttokens Annotate AST trees with source code positions >=2.0.5 3.0.0 Apache 2.0
babel Internationalization utilities >=2.7.0 2.17.0 BSD-3-Clause
backrefs A wrapper around re and regex that adds additional back references. ~=5.7.post1 5.8 MIT
beautifulsoup4 Screen-scraping library >=4.12.3 4.13.3 MIT License
black The uncompromising code formatter. >=25.1 25.1.0 MIT
build A simple, correct Python build frontend >=1.2 1.2.2.post1 MIT License
cappa Declarative CLI argument parser. >=0.22 0.26.6 ?
certifi Python package for providing Mozilla's CA Bundle. >=2017.4.17 2025.1.31 MPL-2.0
cffi Foreign Function Interface for Python calling C code. >=1.12 1.17.1 MIT
charset-normalizer The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. >=2, <4 3.4.1 MIT
click Composable command line interface toolkit >=8.0.0, >=7.0 8.1.8 BSD License
colorama Cross-platform colored terminal text. >=0.4 0.4.6 BSD License
coverage Code coverage measurement for Python >=7.5 7.7.0 Apache-2.0
cryptography cryptography is a package which provides cryptographic recipes and primitives to Python developers. >=2.0 44.0.2 Apache-2.0 OR BSD-3-Clause
csscompressor A python port of YUI CSS Compressor >=0.9.5 0.9.5 BSD
docutils Docutils -- Python Documentation Utilities >=0.21.2 0.21.2 Public Domain + Python Software Foundation License + BSD License + GNU General Public License (GPL)
duty A simple task runner. >=1.6 1.6.0 ISC
execnet execnet: rapid multi-Python deployment >=2.1 2.1.1 MIT
executing Get the currently executing AST node of a frame, and other information >=2.2.0 2.2.0 MIT
failprint Run a command, print its output only if it fails. >=0.11, !=1.0.0 1.0.3 ISC
ghp-import Copy your docs directly to the gh-pages branch. >=1.0 2.1.0 Apache Software License
git-changelog Automatic Changelog generator using Jinja2 templates. >=2.5 2.5.3 ISC
gitdb Git Object Database >=4.0.1, <5 4.0.12 BSD License
GitPython GitPython is a Python library used to interact with Git repositories >=3.1.44 3.1.44 BSD-3-Clause
htmlmin2 An HTML Minifier >=0.1.13 0.1.13 BSD
humanize Python humanize utilities >=4.9 4.12.1 MIT
id A tool for generating OIDC identities 1.5.0 Apache Software License
idna Internationalized Domain Names in Applications (IDNA) >=2.5, <4 3.10 BSD License
iniconfig brain-dead simple config-ini parsing 2.0.0 MIT
inline-snapshot golden master/snapshot/approval testing library which puts the values right into your source code >=0.18 0.20.7 MIT License
jaraco.classes Utility functions for Python class constructs 3.4.0 MIT License
jaraco.context Useful decorators and context managers 6.0.1 MIT License
jaraco.functools Functools like those found in stdlib 4.1.0 MIT License
jeepney Low-level, pure Python DBus protocol wrapper. >=0.4.2 0.9.0 MIT
Jinja2 A very fast and expressive template engine. >=2.11.1, >=2.10 3.1.6 BSD License
jsmin JavaScript minifier. >=3.0.1 3.0.1 MIT License
keyring Store and access your passwords safely. >=15.1 25.6.0 MIT License
Markdown Python implementation of John Gruber's Markdown. >=3.3.3, >=3.3 3.7 BSD License
markdown-callouts Markdown extension: a classier syntax for admonitions >=0.4 0.4.0 MIT
markdown-exec Utilities to execute code blocks in Markdown files. >=1.8 1.10.3.1.1.0 ISC
markdown-it-py Python port of markdown-it. Markdown parsing, done right! >=2.2.0 3.0.0 MIT License
markdownify Convert HTML to markdown. >=0.14 1.1.0 MIT License
MarkupSafe Safely add untrusted strings to HTML/XML markup. >=2.0.1, >=2.0 3.0.2 BSD License
mdformat CommonMark compliant Markdown formatter >=0.7.21 0.7.22 MIT License
mdurl Markdown URL utilities ~=0.1 0.1.2 MIT License
mergedeep A deep merge function for 🐍. ~=1.3, >=1.3.4 1.3.4 MIT License
mkdocs Project documentation with Markdown. >=1.6, >=1.1 1.6.1 BSD-2-Clause
mkdocs-autorefs Automatically link across pages in MkDocs. >=1.4 1.4.1 ISC
mkdocs-coverage MkDocs plugin to integrate your coverage HTML report into your site. >=1.0 1.1.0 ISC
mkdocs-get-deps MkDocs extension that lists all dependencies according to a mkdocs.yml file >=0.2.0 0.2.0 MIT
mkdocs-git-revision-date-localized-plugin Mkdocs plugin that enables displaying the localized date of the last git modification of a markdown file. >=1.2 1.4.5 MIT
mkdocs-llmstxt MkDocs plugin to generate an /llms.txt file. >=0.2 0.2.0 ISC
mkdocs-material Documentation that simply works >=9.5 9.6.14+insiders.4.53.16 MIT
mkdocs-material-extensions Extension pack for Python Markdown and MkDocs Material. ~=1.3 1.3.1 MIT
mkdocs-minify-plugin An MkDocs plugin to minify HTML, JS or CSS files prior to being written to disk >=0.8 0.8.0 MIT
mkdocs-redirects A MkDocs plugin for dynamic page redirects to prevent broken links >=1.2 1.2.2 MIT
mkdocs-section-index MkDocs plugin to allow clickable sections that lead to an index page >=0.3 0.3.9 MIT
mkdocstrings Automatic documentation from sources, for MkDocs. >=0.29, >=0.28.3 0.29.0 ISC
more-itertools More routines for operating on iterables, beyond itertools 10.6.0 MIT License
mypy Optional static typing for Python >=1.10 1.15.0 MIT
mypy-extensions Type system extensions for programs checked with the mypy type checker. >=0.4.3 1.0.0 MIT License
nh3 Python binding to Ammonia HTML sanitizer Rust crate >=0.2.14 0.2.21 MIT
packaging Core utilities for Python packages >=22.0, >=20.5 24.2 Apache Software License + BSD License
paginate Divides large result sets into pages for easier browsing ~=0.5 0.5.7 MIT
pathspec Utility library for gitignore style pattern matching of file paths. >=0.9.0, >=0.11.1 0.12.1 Mozilla Public License 2.0 (MPL 2.0)
platformdirs A small Python package for determining appropriate platform-specific dirs, e.g. a user data dir. >=2.2.0, >=2 4.3.6 MIT
pluggy plugin and hook calling mechanisms for python >=1.5, <2 1.5.0 MIT
ptyprocess Run a subprocess in a pseudo terminal ~=0.6 0.7.0 ISC License (ISCL)
pycparser C parser in Python 2.22 BSD-3-Clause
pydantic Data validation using Python type hints >=2.10 2.10.6 MIT
pydantic_core Core functionality for Pydantic validation and serialization ==2.27.2 2.27.2 MIT
Pygments Pygments is a syntax highlighting package written in Python. >=2.5.1 2.19.1 BSD-2-Clause
pymdown-extensions Extension pack for Python Markdown. >=9, >=6.3 10.14.3 MIT
pyproject_hooks Wrappers to call pyproject.toml-based build backend hooks. 1.2.0 MIT License
pytest pytest: simple powerful testing with Python >=8.2 8.3.5 MIT
pytest-cov Pytest plugin for measuring coverage. >=5.0 6.0.0 MIT
pytest-randomly Pytest plugin to randomly order tests and control random.seed. >=3.15 3.16.0 MIT License
pytest-xdist pytest xdist plugin for distributed testing, most importantly across multiple CPUs >=3.6 3.6.1 MIT License
python-dateutil Extensions to the standard Python datetime module >=2.8.1 2.9.0.post0 BSD License + Apache Software License
pytz World timezone definitions, modern and historical >=2025.1 2025.1 MIT
PyYAML YAML parser and emitter for Python >=5.1 6.0.2 MIT
pyyaml_env_tag A custom YAML tag for referencing environment variables in YAML files. >=0.1 0.1 MIT License
readme_renderer readme_renderer is a library for rendering readme descriptions for Warehouse >=35.0 44.0 Apache License, Version 2.0
requests Python HTTP for Humans. >=2.20 2.32.3 Apache-2.0
requests-toolbelt A utility belt for advanced users of python-requests >=0.8.0, !=0.9.0 1.0.0 Apache 2.0
rfc3986 Validating URI References per RFC 3986 >=1.4.0 2.0.0 Apache 2.0
rich Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal >=12.0.0 13.9.4 MIT
ruff An extremely fast Python linter and code formatter, written in Rust. >=0.4 0.11.0 MIT
SecretStorage Python bindings to FreeDesktop.org Secret Service API >=3.2 3.3.3 BSD 3-Clause License
semver Python helper for Semantic Versioning (https://semver.org) >=2.13 3.0.4 BSD License
six Python 2 and 3 compatibility utilities >=1.5, >=1.15, <2 1.17.0 MIT
smmap A pure Python implementation of a sliding window memory map manager >=3.0.1, <6 5.0.2 BSD-3-Clause
soupsieve A modern CSS selector implementation for Beautiful Soup. >1.2 2.6 MIT
twine Collection of utilities for publishing packages on PyPI >=5.1 6.1.0 Apache Software License
type-lens type-lens is a Python template project designed to simplify the setup of a new project. >=0.2.3 0.2.3 MIT
types-Markdown Typing stubs for Markdown >=3.6 3.7.0.20241204 Apache-2.0
types-PyYAML Typing stubs for PyYAML >=6.0 6.0.12.20241230 Apache-2.0
typing_extensions Backported and Experimental Type Hints for Python 3.8+ >=4.0.1, >=4.0 4.12.2 Python Software Foundation License
urllib3 HTTP library with thread-safe connection pooling, file post, and more. >=1.26.0 2.3.0 MIT License
watchdog Filesystem events monitoring >=2.0 6.0.0 Apache-2.0
yore Manage legacy code with comments. >=0.3.3 0.3.4 ISC

More credits from the author

\ No newline at end of file diff --git a/docs/css/insiders.css b/css/insiders.css similarity index 100% rename from docs/css/insiders.css rename to css/insiders.css diff --git a/docs/css/material.css b/css/material.css similarity index 100% rename from docs/css/material.css rename to css/material.css diff --git a/docs/css/mkdocstrings.css b/css/mkdocstrings.css similarity index 100% rename from docs/css/mkdocstrings.css rename to css/mkdocstrings.css diff --git a/css/timeago.css b/css/timeago.css new file mode 100644 index 00000000..f7ab7d69 --- /dev/null +++ b/css/timeago.css @@ -0,0 +1,15 @@ +/* + timeago output is dynamic, which breaks when you print a page. + + This CSS is only included when type: timeago + and ensures fallback to type "iso_date" when printing. + + */ + +.git-revision-date-localized-plugin-iso_date { display: none } + +@media print { + .git-revision-date-localized-plugin-iso_date { display: inline } + .git-revision-date-localized-plugin-timeago { display: none } +} + diff --git a/docs/.glossary.md b/docs/.glossary.md deleted file mode 100644 index e11a6781..00000000 --- a/docs/.glossary.md +++ /dev/null @@ -1,13 +0,0 @@ -[__all__]: https://docs.python.org/3/tutorial/modules.html#importing-from-a-package -[class template]: https://github.com/mkdocstrings/python/blob/master/src/mkdocstrings_handlers/python/templates/material/_base/class.html -[function template]: https://github.com/mkdocstrings/python/blob/master/src/mkdocstrings_handlers/python/templates/material/_base/function.html -[autodoc syntax]: https://mkdocstrings.github.io/usage/#autodoc-syntax -[autopages recipe]: https://mkdocstrings.github.io/recipes/#automatic-code-reference-pages -[Griffe]: https://github.com/mkdocstrings/griffe -[ReadTheDocs Sphinx theme]: https://sphinx-rtd-theme.readthedocs.io/en/stable/index.html -[Spacy's documentation]: https://spacy.io/api/doc/ -[Black]: https://pypi.org/project/black/ -[Material for MkDocs]: https://squidfunk.github.io/mkdocs-material -[Ruff]: https://docs.astral.sh/ruff - -*[ToC]: Table of Contents diff --git a/docs/.overrides/main.html b/docs/.overrides/main.html deleted file mode 100644 index 5bedfd03..00000000 --- a/docs/.overrides/main.html +++ /dev/null @@ -1,20 +0,0 @@ -{% extends "base.html" %} - -{% block announce %} - - Fund this project through - sponsorship - - {% include ".icons/octicons/heart-fill-16.svg" %} - — - - Follow - @pawamoy on - - - {% include ".icons/fontawesome/brands/mastodon.svg" %} - - Fosstodon - - for updates -{% endblock %} diff --git a/docs/.overrides/partials/comments.html b/docs/.overrides/partials/comments.html deleted file mode 100644 index 1d5c6051..00000000 --- a/docs/.overrides/partials/comments.html +++ /dev/null @@ -1,57 +0,0 @@ - - - \ No newline at end of file diff --git a/docs/.overrides/partials/path-item.html b/docs/.overrides/partials/path-item.html deleted file mode 100644 index a9c95446..00000000 --- a/docs/.overrides/partials/path-item.html +++ /dev/null @@ -1,22 +0,0 @@ -{# Fix breadcrumbs for when mkdocs-section-index is used. #} -{# See https://github.com/squidfunk/mkdocs-material/issues/7614. #} - - -{% macro render_content(nav_item) %} - - {{ nav_item.title }} - -{% endmacro %} - - -{% macro render(nav_item, ref=nav_item) %} - {% if nav_item.is_page %} -
  • - - {{ render_content(ref) }} - -
  • - {% elif nav_item.children %} - {{ render(nav_item.children | first, ref) }} - {% endif %} -{% endmacro %} diff --git a/docs/changelog.md b/docs/changelog.md deleted file mode 100644 index 0536cbbe..00000000 --- a/docs/changelog.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Changelog ---- - ---8<-- "CHANGELOG.md" diff --git a/docs/code_of_conduct.md b/docs/code_of_conduct.md deleted file mode 100644 index 002b2a04..00000000 --- a/docs/code_of_conduct.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Code of Conduct ---- - ---8<-- "CODE_OF_CONDUCT.md" diff --git a/docs/contributing.md b/docs/contributing.md deleted file mode 100644 index 61935e5d..00000000 --- a/docs/contributing.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Contributing ---- - ---8<-- "CONTRIBUTING.md" diff --git a/docs/credits.md b/docs/credits.md deleted file mode 100644 index f6ab1aa2..00000000 --- a/docs/credits.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Credits -hide: -- toc ---- - -```python exec="yes" ---8<-- "scripts/gen_credits.py" -``` diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index 82377e21..00000000 --- a/docs/index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Overview -hide: -- feedback ---- - ---8<-- "README.md" diff --git a/docs/insiders/changelog.md b/docs/insiders/changelog.md deleted file mode 100644 index b5717892..00000000 --- a/docs/insiders/changelog.md +++ /dev/null @@ -1,94 +0,0 @@ -# Changelog - -## mkdocstrings-python Insiders - -### 1.12.0 March 22, 2025 { id="1.12.0" } - -- [Ordering method: `__all__`][option-members_order] - -### 1.11.0 March 20, 2025 { id="1.11.0" } - -- [Filtering method: `public`][option-filters-public] - -### 1.10.0 March 10, 2025 { id="1.10.0" } - -- [Backlinks][backlinks] - -### 1.9.0 September 03, 2024 { id="1.9.0" } - -- [Relative cross-references][relative_crossrefs] -- [Scoped cross-references][scoped_crossrefs] - -### 1.8.3 June 19, 2024 { id="1.8.3" } - -- Update code for Griffe 0.46+ to avoid deprecation warnings - -### 1.8.2 May 09, 2024 { id="1.8.2" } - -- Don't render cross-refs for default values when signatures aren't separated - -### 1.8.1 April 19, 2024 { id="1.8.1" } - -- Render enumeration instance name instead of just "value", allowing proper cross-reference - -### 1.8.0 March 24, 2024 { id="1.8.0" } - -- [Annotations modernization][modernize_annotations] - -### 1.7.0 March 24, 2024 { id="1.7.0" } - -- [Class inheritance diagrams with Mermaid][show_inheritance_diagram] - -### 1.6.0 January 30, 2024 { id="1.6.0" } - -- Render cross-references to parameters documentation in signatures and attribute values. -- Add [`parameter_headings`][parameter_headings] option to render headings for parameters (enabling permalinks and ToC/inventory entries). -- Render cross-references for default parameter values in signatures. - -### 1.5.1 September 12, 2023 { id="1.5.1" } - -- Prevent empty auto-summarized Methods section. - -### 1.5.0 September 05, 2023 { id="1.5.0" } - -- Render function signature overloads. - -### 1.4.0 August 27, 2023 { id="1.4.0" } - -- Render cross-references in attribute signatures. - -### 1.3.0 August 24, 2023 { id="1.3.0" } - -- Add "method" symbol type. - -### 1.2.0 August 20, 2023 { id="1.2.0" } - -- Add [member auto-summaries](../usage/configuration/members.md#summary). - -### 1.1.4 July 17, 2023 { id="1.1.4" } - -- Fix heading level increment for class members. - -### 1.1.3 July 17, 2023 { id="1.1.3" } - -- Fix heading level (avoid with clause preventing to decrease it). - -### 1.1.2 July 15, 2023 { id="1.1.2" } - -- Use non-breaking spaces after symbol types. - -### 1.1.1 June 27, 2023 { id="1.1.1" } - -- Correctly escape expressions in signatures and other rendered types. - -### 1.1.0 June 4, 2023 { id="1.1.0" } - -- Add [Symbol types in headings and table of contents](../usage/configuration/headings.md#show_symbol_type_toc). - -### 1.0.0 May 10, 2023 { id="1.0.0" } - -- Add [cross-references for type annotations in signatures](../usage/configuration/signatures.md#signature_crossrefs). - Make sure to update your local templates as the signature of the - [`format_signature` filter][mkdocstrings_handlers.python.do_format_signature] - has changed. The templates that must be updated: - `class.html`, `expression.html`, `function.html` and `signature.html`. diff --git a/docs/insiders/index.md b/docs/insiders/index.md deleted file mode 100644 index f184961f..00000000 --- a/docs/insiders/index.md +++ /dev/null @@ -1,161 +0,0 @@ ---- -title: Insiders ---- - -# Insiders - -*mkdocstrings-python* follows the **sponsorware** release strategy, which means that new features are first exclusively released to sponsors as part of [Insiders][]. Read on to learn [what sponsorships achieve][sponsorship], [how to become a sponsor][sponsors] to get access to Insiders, and [what's in it for you][features]! - -## What is Insiders? - -*mkdocstrings-python Insiders* is a private fork of *mkdocstrings-python*, hosted as a private GitHub repository. Almost[^1] [all new features][features] are developed as part of this fork, which means that they are immediately available to all eligible sponsors, as they are granted access to this private repository. - -[^1]: In general, every new feature is first exclusively released to sponsors, but sometimes upstream dependencies enhance existing features that must be supported by *mkdocstrings-python*. - -Every feature is tied to a [funding goal][funding] in monthly subscriptions. When a funding goal is hit, the features that are tied to it are merged back into *mkdocstrings-python* and released for general availability, making them available to all users. Bugfixes are always released in tandem. - -Sponsorships start as low as [**$10 a month**][sponsors].[^2] - -[^2]: Note that $10 a month is the minimum amount to become eligible for Insiders. While GitHub Sponsors also allows to sponsor lower amounts or one-time amounts, those can't be granted access to Insiders due to technical reasons. Such contributions are still very much welcome as they help ensuring the project's sustainability. - -## What sponsorships achieve - -Sponsorships make this project sustainable, as they buy the maintainers of this project time – a very scarce resource – which is spent on the development of new features, bug fixing, stability improvement, issue triage and general support. The biggest bottleneck in Open Source is time.[^3] - -[^3]: Making an Open Source project sustainable is exceptionally hard: maintainers burn out, projects are abandoned. That's not great and very unpredictable. The sponsorware model ensures that if you decide to use *mkdocstrings-python*, you can be sure that bugs are fixed quickly and new features are added regularly. - -If you're unsure if you should sponsor this project, check out the list of [completed funding goals][goals completed] to learn whether you're already using features that were developed with the help of sponsorships. You're most likely using at least a handful of them, [thanks to our awesome sponsors][sponsors]! - -## What's in it for me? - -```python exec="1" session="insiders" -data_source = [ - "docs/insiders/goals.yml", - ("griffe-inherited-docstrings", "https://mkdocstrings.github.io/griffe-inherited-docstrings/", "insiders/goals.yml"), - ("griffe-pydantic", "https://mkdocstrings.github.io/griffe-pydantic/", "insiders/goals.yml"), - ("griffe-warnings-deprecated", "https://mkdocstrings.github.io/griffe-warnings-deprecated/", "insiders/goals.yml"), -] -``` - - -```python exec="1" session="insiders" idprefix="" ---8<-- "scripts/insiders.py" - -if unreleased_features: - print( - "The moment you [become a sponsor](#how-to-become-a-sponsor), you'll get **immediate " - f"access to {len(unreleased_features)} additional features** that you can start using right away, and " - "which are currently exclusively available to sponsors:\n" - ) - - for feature in unreleased_features: - feature.render(badge=True) - - print( - "\n\nThese are just the features related to this project. " - "[See the complete feature list on the author's main Insiders page](https://pawamoy.github.io/insiders/#whats-in-it-for-me)." - ) -else: - print( - "The moment you [become a sponsor](#how-to-become-a-sponsor), you'll get immediate " - "access to all released features that you can start using right away, and " - "which are exclusively available to sponsors. At this moment, there are no " - "Insiders features for this project, but checkout the [next funding goals](#goals) " - "to see what's coming, as well as **[the feature list for all Insiders projects](https://pawamoy.github.io/insiders/#whats-in-it-for-me).**" - ) -``` - - -Additionally, your sponsorship will give more weight to your upvotes on issues, helping us prioritize work items in our backlog. For more information on how we prioritize work, see this page: [Backlog management][backlog]. - -## How to become a sponsor - -Thanks for your interest in sponsoring! In order to become an eligible sponsor with your GitHub account, visit [pawamoy's sponsor profile][github sponsor profile], and complete a sponsorship of **$10 a month or more**. You can use your individual or organization GitHub account for sponsoring. - -Sponsorships lower than $10 a month are also very much appreciated, and useful. They won't grant you access to Insiders, but they will be counted towards reaching sponsorship goals. Every sponsorship helps us implementing new features and releasing them to the public. - -**Important:** By default, when you're sponsoring **[@pawamoy][github sponsor profile]** through a GitHub organization, all the publicly visible members of the organization will be invited to join our private repositories. If you wish to only grant access to a subset of users, please send a short email to insiders@pawamoy.fr with the name of your organization and the GitHub accounts of the users that should be granted access. - -**Tip:** to ensure that access is not tied to a particular individual GitHub account, you can create a bot account (i.e. a GitHub account that is not tied to a specific individual), and use this account for the sponsoring. After being granted access to our private repositories, the bot account can create private forks of our private repositories into your own organization, which all members of your organization will have access to. - -You can cancel your sponsorship anytime.[^5] - -[^5]: If you cancel your sponsorship, GitHub schedules a cancellation request which will become effective at the end of the billing cycle. This means that even though you cancel your sponsorship, you will keep your access to Insiders as long as your cancellation isn't effective. All charges are processed by GitHub through Stripe. As we don't receive any information regarding your payment, and GitHub doesn't offer refunds, sponsorships are non-refundable. - -[:octicons-heart-fill-24:{ .pulse }   Join our awesome sponsors][github sponsor profile]{ .md-button .md-button--primary } - -
    -
    -
    -
    -
    -
    -
    - -
    - - - If you sponsor publicly, you're automatically added here with a link to your profile and avatar to show your support for *mkdocstrings-python*. Alternatively, if you wish to keep your sponsorship private, you'll be a silent +1. You can select visibility during checkout and change it afterwards. - - -## Funding - -### Goals - -The following section lists all funding goals. Each goal contains a list of features prefixed with a checkmark symbol, denoting whether a feature is :octicons-check-circle-fill-24:{ style="color: #00e676" } already available or :octicons-check-circle-fill-24:{ style="color: var(--md-default-fg-color--lightest)" } planned, but not yet implemented. When the funding goal is hit, the features are released for general availability. - -```python exec="1" session="insiders" idprefix="" -for goal in goals.values(): - if not goal.complete: - goal.render() -``` - -### Goals completed - -This section lists all funding goals that were previously completed, which means that those features were part of Insiders, but are now generally available and can be used by all users. - -```python exec="1" session="insiders" idprefix="" -for goal in goals.values(): - if goal.complete: - goal.render() -``` - -## Frequently asked questions - -### Compatibility - -> We're building an open source project and want to allow outside collaborators to use *mkdocstrings-python* locally without having access to Insiders. Is this still possible? - -Yes. Insiders is compatible with *mkdocstrings-python*. Almost all new features and configuration options are either backward-compatible or implemented behind feature flags. Most Insiders features enhance the overall experience, though while these features add value for the users of your project, they shouldn't be necessary for previewing when making changes to content. - -### Payment - -> We don't want to pay for sponsorship every month. Are there any other options? - -Yes. You can sponsor on a yearly basis by [switching your GitHub account to a yearly billing cycle][billing cycle]. If for some reason you cannot do that, you could also create a dedicated GitHub account with a yearly billing cycle, which you only use for sponsoring (some sponsors already do that). - -If you have any problems or further questions, please reach out to insiders@pawamoy.fr. - -### Terms - -> Are we allowed to use Insiders under the same terms and conditions as *mkdocstrings-python*? - -Yes. Whether you're an individual or a company, you may use *mkdocstrings-python Insiders* precisely under the same terms as *mkdocstrings-python*, which are given by the [ISC license][license]. However, we kindly ask you to respect our **fair use policy**: - -- Please **don't distribute the source code** of Insiders. You may freely use it for public, private or commercial projects, privately fork or mirror it, but please don't make the source code public, as it would counteract the sponsorware strategy. -- If you cancel your subscription, your access to the private repository is revoked, and you will miss out on all future updates of Insiders. However, you may **use the latest version** that's available to you **as long as you like**. Just remember that [GitHub deletes private forks][private forks]. - -[backlog]: https://pawamoy.github.io/backlog/ -[insiders]: #what-is-insiders -[sponsorship]: #what-sponsorships-achieve -[sponsors]: #how-to-become-a-sponsor -[features]: #whats-in-it-for-me -[funding]: #funding -[goals completed]: #goals-completed -[github sponsor profile]: https://github.com/sponsors/pawamoy -[billing cycle]: https://docs.github.com/en/github/setting-up-and-managing-billing-and-payments-on-github/changing-the-duration-of-your-billing-cycle -[license]: ../license.md -[private forks]: https://docs.github.com/en/github/setting-up-and-managing-your-github-user-account/removing-a-collaborator-from-a-personal-repository - - - diff --git a/docs/insiders/installation.md b/docs/insiders/installation.md deleted file mode 100644 index 3e20e5d7..00000000 --- a/docs/insiders/installation.md +++ /dev/null @@ -1,67 +0,0 @@ ---- -title: Getting started with Insiders ---- - -# Getting started with Insiders - -*mkdocstrings-python Insiders* is a compatible drop-in replacement for *mkdocstrings-python*, and can be installed similarly using `pip` or `git`. Note that in order to access the Insiders repository, you need to [become an eligible sponsor][] of @pawamoy on GitHub. - -## Installation - -### with the `insiders` tool - -[`insiders`][insiders-tool] is a tool that helps you keep up-to-date versions of Insiders projects in the PyPI index of your choice (self-hosted, Google registry, Artifactory, etc.). - -**We kindly ask that you do not upload the distributions to public registries, as it is against our [Terms of use][].** - -### with pip (ssh/https) - -*mkdocstrings-python Insiders* can be installed with `pip` [using SSH][install-pip-ssh]: - -```bash -pip install git+ssh://git@github.com/pawamoy-insiders/mkdocstrings-python.git -``` - -Or using HTTPS: - -```bash -pip install git+https://${GH_TOKEN}@github.com/pawamoy-insiders/mkdocstrings-python.git -``` - ->? NOTE: **How to get a GitHub personal access token?** The `GH_TOKEN` environment variable is a GitHub token. It can be obtained by creating a [personal access token][github-pat] for your GitHub account. It will give you access to the Insiders repository, programmatically, from the command line or GitHub Actions workflows: -> -> 1. Go to https://github.com/settings/tokens -> 2. Click on [Generate a new token][github-pat-new] -> 3. Enter a name and select the [`repo`][scopes] scope -> 4. Generate the token and store it in a safe place -> -> Note that the personal access token must be kept secret at all times, as it allows the owner to access your private repositories. - -### with Git - -Of course, you can use *mkdocstrings-python Insiders* directly using Git: - -``` -git clone git@github.com:pawamoy-insiders/mkdocstrings-python -``` - -When cloning with Git, the package must be installed: - -``` -pip install -e mkdocstrings-python -``` - -## Upgrading - -When upgrading Insiders, you should always check the version of *mkdocstrings-python* which makes up the first part of the version qualifier. For example, a version like `8.x.x.4.x.x` means that Insiders `4.x.x` is currently based on `8.x.x`. - -If the major version increased, it's a good idea to consult the [changelog][] and go through the steps to ensure your configuration is up to date and all necessary changes have been made. - -[become an eligible sponsor]: ./index.md#how-to-become-a-sponsor -[changelog]: ./changelog.md -[github-pat]: https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token -[github-pat-new]: https://github.com/settings/tokens/new -[insiders-tool]: https://pawamoy.github.io/insiders-project/ -[install-pip-ssh]: https://docs.github.com/en/authentication/connecting-to-github-with-ssh -[scopes]: https://docs.github.com/en/developers/apps/scopes-for-oauth-apps#available-scopes -[terms of use]: ./index.md#terms diff --git a/docs/license.md b/docs/license.md deleted file mode 100644 index 5b25a00f..00000000 --- a/docs/license.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: License -hide: -- feedback ---- - -# License - -``` ---8<-- "LICENSE" -``` diff --git a/docs/logo.png b/docs/logo.png deleted file mode 100644 index 5b42478c..00000000 Binary files a/docs/logo.png and /dev/null differ diff --git a/docs/reference/api.md b/docs/reference/api.md deleted file mode 100644 index 587e99db..00000000 --- a/docs/reference/api.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: API reference -hide: -- navigation ---- - -# ::: mkdocstrings_handlers.python - options: - show_submodules: true diff --git a/docs/usage/configuration/docstrings.md b/docs/usage/configuration/docstrings.md deleted file mode 100644 index ae925f23..00000000 --- a/docs/usage/configuration/docstrings.md +++ /dev/null @@ -1,1358 +0,0 @@ -# Docstrings options - -[](){#option-docstring_style} -## `docstring_style` - -- **:octicons-package-24: Type [`str`][] :material-equal: `"google"`{ title="default value" }** - - -The docstring style to expect when parsing docstrings. - -Possible values: - -- `"google"`: see [Google style](../docstrings/google.md). -- `"numpy"`: see [Numpy style](../docstrings/numpy.md). -- `"sphinx"`: see [Sphinx style](../docstrings/sphinx.md). -- `None` (`null` or `~` in YAML): no style at all, parse as regular text. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - docstring_style: google -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.module - options: - docstring_style: numpy -``` - -WARNING: **The style is applied to the specified object only, not its members.** Local `docstring_style` options (in `:::` instructions) will only be applied to the specified object, and not its members. Instead of changing the style when rendering, we strongly recommend to *set the right style as early as possible*, for example by using the [auto-style](https://mkdocstrings.github.io/griffe/reference/docstrings/#auto-style) (sponsors only), or with a custom Griffe extension - - -/// admonition | Preview - type: preview - -Every style gets rendered the same way. -Here are some docstring examples. - -//// tab | Google -```python -def greet(name: str) -> str: - """Greet someone. - - Parameters: - name: The name of the person to greet. - - Returns: - A greeting message. - """ - return f"Hello {name}!" -``` -//// - -//// tab | Numpy -```python -def greet(name: str) -> str: - """Greet someone. - - Parameters - ---------- - name - The name of the person to greet. - - Returns - ------- - A greeting message. - """ - return f"Hello {name}!" -``` -//// - -//// tab | Sphinx -```python -def greet(name: str) -> str: - """Greet someone. - - :param name: The name of the person to greet. - :return: A greeting message. - """ - return f"Hello {name}!" -``` -//// -/// - -[](){#option-docstring_options} -## `docstring_options` - -- **:octicons-package-24: Type [`dict`][] :material-equal: `{}`{ title="default value" }** - - -The options for the docstring parser. - -- [Google-style options](https://mkdocstrings.github.io/griffe/docstrings/#parser-options){ .external } -- [Numpydoc-style options](https://mkdocstrings.github.io/griffe/docstrings/#parser-options_1){ .external } - -The Sphinx style does not offer any option. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - docstring_options: - ignore_init_summary: false - trim_doctest_flags: true -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.module - options: - docstring_options: - ignore_init_summary: true - trim_doctest_flags: false -``` - -```python -class PrintOK: - """Class docstring.""" - - def __init__(self): - """Initialize the instance. - - Examples: - >>> PrintOK() # doctest: +NORMALIZE_WHITESPACE - ok - """ - print("ok") -``` - -/// admonition | Preview - type: preview - -//// tab | Ignore init summary, trim doctest flags -

    PrintOK

    -

    Class docstring.

    -

    __init__

    -

    Examples:

    - -```pycon ->>> PrintOK() -ok -``` -//// - -//// tab | Keep init summary and doctest flags -

    PrintOK

    -

    Class docstring.

    -

    __init__

    -

    Initialize the instance.

    -

    Examples:

    - -```pycon ->>> PrintOK() # doctest: +NORMALIZE_WHITESPACE -ok -``` -//// -/// - -[](){#option-docstring_section_style} -## `docstring_section_style` - -- **:octicons-package-24: Type [`str`][] :material-equal: `"table"`{ title="default value" }** - - -The style used to render docstring sections. - -A section is a block of text that has a special meaning in a docstring. -There are sections for documenting attributes of an object, -parameters of a function, exceptions raised by a function, -the return value of a function, etc. - -Sections are parsed as structured data and can therefore be rendered -in different ways. Possible values: - -- `"table"`: a simple table, usually with type, name and description columns -- `"list"`: a simple list, akin to what you get with the [ReadTheDocs Sphinx theme]{ .external } -- `"spacy"`: a poor implementation of the amazing tables in [Spacy's documentation]{ .external } - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - docstring_section_style: table -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.module - options: - docstring_section_style: list -``` - -/// admonition | Preview - type: preview - -//// tab | Table -Tables work well when you have lots of items with short names, type annotations, descriptions, etc.. -With longer strings, the columns risk getting squished horizontally. -In that case, the Spacy tables can help. - -**Parameters:** - -**Type** | **Name** | **Description** | **Default** ----------- | ----------- | ------------------------ | ----------- -[`int`][] | `threshold` | Threshold for something. | *required* -[`bool`][] | `flag` | Enable something. | `False` - -**Other Parameters:** - -**Type** | **Name** | **Description** | **Default** ----------- | ----------- | ------------------------ | ----------- -list[int \| float] | `gravity_forces` | Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. | *required* -VacuumType \| Literal["regular"] | `vacuum_type` | Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. | `VacuumType.PLASMA` -//// - -//// tab | List -Lists work well whatever the length of names, type annotations, descriptions, etc. - -**Parameters:** - -- `threshold` ([`int`][]) — Threshold for something. -- `flag` ([`bool`][]) — Enable something. - -**Other Parameters:** - -- `gravity_forces` (list[int \| float]) — Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. -- `vacuum_type` (VacuumType \| Literal["regular"]) — Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. -//// - -//// tab | Spacy -Spacy tables work better than regular tables with longer names, type annotations, descriptions, etc., -by reserving more horizontal space on the second column. - -**Parameters:** - -**Name** | **Description** ------------ | --------------- -`threshold` | Threshold for something.
    **TYPE:** [`int`][] DEFAULT: required -`flag` | Enable something.
    **TYPE:** [`bool`][] DEFAULT: False - -**Other Parameters:** - -**Name** | **Description** ------------ | --------------- -`gravity_forces` | Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
    **TYPE:** list[int \| float] DEFAULT: required -`vacuum_type` | Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
    **TYPE:**VacuumType \| Literal["regular"] DEFAULT: VacuumType.PLASMA -//// -/// - -[](){#option-merge_init_into_class} -## `merge_init_into_class` - -- **:octicons-package-24: Type [`bool`][] :material-equal: `False`{ title="default value" }** - - -Whether to merge the `__init__` method into the class' signature and docstring. - -By default, only the class name is rendered in headings. -When merging, the `__init__` method parameters are added after the class name, -like a signature, and the `__init__` method docstring is appended to the class' docstring. -This option is well used in combination with the `ignore_init_summary` [docstring option][docstring_options], -to discard the first line of the `__init__` docstring which is not often useful. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - docstring_options: - ignore_init_summary: false - merge_init_into_class: false -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.module - options: - docstring_options: - ignore_init_summary: true - merge_init_into_class: true -``` - -```python -class Thing: - """A class for things.""" - - def __init__(self, value: int = 0): - """Initialize a thing. - - Parameters: - value: The thing's value. - """ - self.value = value -``` - -/// admonition | Preview - type: preview - -//// tab | Merged, summary discarded -

    Thing(value=0)

    -

    Class docstring.

    -

    Parameters:

    - -**Type** | **Name** | **Description** | **Default** ---------- | -------- | ------------------ | ----------- -[`int`][] | `value` | The thing's value. | `0` -//// - -//// tab | Unmerged, summary kept -

    Thing

    -

    Class docstring.

    -

    __init__(value=0)

    -

    Initialize a thing.

    -

    Parameters:

    - -**Type** | **Name** | **Description** | **Default** ---------- | -------- | ------------------ | ----------- -[`int`][] | `value` | The thing's value. | `0` -//// -/// - -[](){#option-relative_crossrefs} -## `relative_crossrefs` - -[:octicons-heart-fill-24:{ .pulse } Sponsors only](../../insiders/index.md){ .insiders } — -[:octicons-tag-24: Insiders 1.9.0](../../insiders/changelog.md#1.9.0) - -- **:octicons-package-24: Type [`bool`][] :material-equal: `False`{ title="default value" }** - - -Whether to enable the relative-crossref syntax. - -The relative-crossref syntax lets you reference the current object or its parent by prefixing a crossref identifier with dots. For example, to cross-reference the current object's `name` member, you can write `[link to name attribute][.name]`. The "current object" is the object containing the docstring being rendered. - - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - relative_crossrefs: false -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.module - options: - relative_crossrefs: true -``` - -/// admonition | Examples - type: preview - -```python title="pkg/module.py" -"""Summary. - -- Link to [`module`][.]. -- Link to [`module_attribute`][.module_attribute]. -- Link to [`Class`][.Class]. -- Link to [`class_attribute`][.Class.class_attribute]. -- Link to [`instance_attribute`][.Class.instance_attribute]. -- Link to [`method`][.Class.method]. -""" - -module_attribute = 0 -"""Summary. - -- Link to [`module`][..]. -- Link to [`module_attribute`][.]. -- Link to [`Class`][..Class]. -- Link to [`class_attribute`][..Class.class_attribute]. -- Link to [`instance_attribute`][..Class.instance_attribute]. -- Link to [`method`][..Class.method]. -""" - -class Class: - """Summary. - - - Link to [`module`][..]. - - Link to [`module_attribute`][..module_attribute]. - - Link to [`Class`][.]. - - Link to [`class_attribute`][.class_attribute]. - - Link to [`instance_attribute`][.instance_attribute]. - - Link to [`method`][.method]. - """ - - class_attribute = 0 - """Summary. - - - Link to [`module`][...]. - - Link to [`module_attribute`][...module_attribute]. - - Link to [`Class`][..]. - - Link to [`class_attribute`][.]. - - Link to [`instance_attribute`][..instance_attribute]. - - Link to [`method`][..method]. - """ - - def __init__(self): - """Summary. - - - Link to [`module`][...]. - - Link to [`module_attribute`][...module_attribute]. - - Link to [`Class`][..]. - - Link to [`class_attribute`][..class_attribute]. - - Link to [`instance_attribute`][..instance_attribute]. - - Link to [`method`][..method]. - """ - self.instance_attribute = 0 - """Summary. - - - Link to [`module`][...]. - - Link to [`module_attribute`][...module_attribute]. - - Link to [`Class`][..]. - - Link to [`class_attribute`][..class_attribute]. - - Link to [`instance_attribute`][.]. - - Link to [`method`][..method]. - """ - - def method(self): - """Summary. - - - Link to [`module`][...]. - - Link to [`module_attribute`][...module_attribute]. - - Link to [`Class`][..]. - - Link to [`class_attribute`][..class_attribute]. - - Link to [`instance_attribute`][..instance_attribute]. - - Link to [`method`][.]. - """ -``` - -/// - -INFO: **There is an alternative, third-party Python handler that handles relative references: [mkdocstrings-python-xref](https://github.com/analog-garage/mkdocstrings-python-xref).** - -[](){#option-scoped_crossrefs} -## `scoped_crossrefs` - -[:octicons-heart-fill-24:{ .pulse } Sponsors only](../../insiders/index.md){ .insiders } — -[:octicons-tag-24: Insiders 1.9.0](../../insiders/changelog.md#1.9.0) - -- **:octicons-package-24: Type [`bool`][] :material-equal: `False`{ title="default value" }** - - -Whether to enable scoped cross-references. - -With scoped cross-references, you can write identifiers as if you wanted to access them from the current object's scope. The scoping rules do not exactly match Python's: you can reference members and siblings too, without prefixing with `self.` or `cls.`. - -The following order is applied when resolving a name in a given scope: - -1. member of the current object -2. parent class -3. repeat 1-2 within parent's scope - -In practice, it means that the name is first looked up in members, then it is compared against the parent name (only if it's a class), then it is looked up in siblings. It continues climbing up the object tree until there's no parent, in which case it raises a name resolution error. - -Cross-referencing an imported object will directly link to this object if the objects inventory of the project it comes from was [loaded][inventories]. You won't be able to cross-reference it within your own documentation with scoped references, if you happen to be rendering this external object too. In that case, you can use an absolute reference or a [relative][relative_crossrefs] one instead. - -Another limitation is that you won't be able to reference an external package if its name can be resolved in the current object's scope. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - scoped_crossrefs: false -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.module - options: - scoped_crossrefs: true -``` - -/// admonition | Examples - type: preview - -```python title="pkg/module.py" -"""Summary. - -- Link to [`module_attribute`][module_attribute]. -- Link to [`Class`][Class]. -- Link to [`class_attribute`][Class.class_attribute]. -- Link to [`instance_attribute`][Class.instance_attribute]. -- Link to [`method`][Class.method]. -""" - -module_attribute = 0 -"""Summary. - -- Link to [`Class`][Class]. -- Link to [`class_attribute`][Class.class_attribute]. -- Link to [`instance_attribute`][Class.instance_attribute]. -- Link to [`method`][Class.method]. -""" - -class Class: - """Summary. - - - Link to [`module_attribute`][module_attribute]. - - Link to [`class_attribute`][class_attribute]. - - Link to [`instance_attribute`][instance_attribute]. - - Link to [`method`][method]. - """ - - class_attribute = 0 - """Summary. - - - Link to [`module_attribute`][module_attribute]. - - Link to [`Class`][Class]. - - Link to [`instance_attribute`][instance_attribute]. - - Link to [`method`][method]. - """ - - def __init__(self): - """Summary. - - - Link to [`module_attribute`][module_attribute]. - - Link to [`Class`][Class]. - - Link to [`class_attribute`][class_attribute]. - - Link to [`instance_attribute`][instance_attribute]. - - Link to [`method`][method]. - """ - self.instance_attribute = 0 - """Summary. - - - Link to [`module_attribute`][module_attribute]. - - Link to [`Class`][Class]. - - Link to [`class_attribute`][class_attribute]. - - Link to [`method`][method]. - """ - - def method(self): - """Summary. - - - Link to [`module_attribute`][module_attribute]. - - Link to [`Class`][Class]. - - Link to [`class_attribute`][class_attribute]. - - Link to [`instance_attribute`][instance_attribute]. - """ -``` - -/// - -[](){#option-show_if_no_docstring} -## `show_if_no_docstring` - -- **:octicons-package-24: Type [`bool`][] :material-equal: `False`{ title="default value" }** - - -Show the object heading even if it has no docstring or children with docstrings. - -Without an explicit list of [`members`][], members are selected based on [`filters`][], -and then filtered again to keep only those with docstrings. Checking if a member has a docstring -is done recursively: if at least one of its direct or indirect members (lower in the tree) -has a docstring, the member is rendered. If the member does not have a docstring, -and none of its members have a docstring, it is excluded. - -With this option you can tell the Python handler to skip the docstring check. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - show_if_no_docstring: false -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.module - options: - show_if_no_docstring: true -``` - -```python -def function_without_docstring(): - ... - - -def function_with_docstring(): - """Hello.""" - - -class ClassWithoutDocstring: - def method_without_docstring(self): - ... - - def method_with_docstring(self): - """Hello.""" -``` - -/// admonition | Preview - type: preview - -//// tab | Show -

    function_without_docstring

    -

    function_with_docstring

    -

    Hello.

    -

    ClassWithoutDocstring

    -

    method_without_docstring

    -

    method_with_docstring

    -

    Hello.

    -//// - -//// tab | Don't show -

    function_with_docstring

    -

    Hello.

    -

    ClassWithoutDocstring

    -

    method_with_docstring

    -

    Hello.

    -//// -/// - -[](){#option-show_docstring_attributes} -## `show_docstring_attributes` - -- **:octicons-package-24: Type [`bool`][] :material-equal: `True`{ title="default value" }** - - -Whether to render the "Attributes" sections of docstrings. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - show_docstring_attributes: true -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.module - options: - show_docstring_attributes: false -``` - -```python -class Class: - """Summary. - - Attributes: - attr: Some attribute. - """ - - attr: int = 1 -``` - -/// admonition | Preview - type: preview - -//// tab | With attributes -

    Class

    -

    Summary.

    -

    Attributes:

    - -**Type** | **Name** | **Description** ---------- | -------- | --------------- -[`int`][] | `attr` | Some attribute. -//// - -//// tab | Without attributes -

    Class

    -

    Summary.

    -//// -/// - -[](){#option-show_docstring_functions} -## `show_docstring_functions` - -- **:octicons-package-24: Type [`bool`][] :material-equal: `True`{ title="default value" }** - - -Whether to render the "Functions" or "Methods" sections of docstrings. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - show_docstring_functions: true -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.module - options: - show_docstring_functions: false -``` - -```python -"""Summary. - -Functions: - foo: Some function. -""" - - -def foo(): - ... - - -class Class: - """Summary. - - Methods: - bar: Some method. - """ - - def bar(self): - ... -``` - -/// admonition | Preview - type: preview - -//// tab | With functions -

    module

    -

    Summary.

    -

    Functions:

    - -**Name** | **Description** --------- | --------------- -`foo` | Some function. - -

    Class

    -

    Summary.

    -

    Methods:

    - -**Name** | **Description** --------- | --------------- -`bar` | Some method. -//// - -//// tab | Without functions -

    module

    -

    Summary.

    -

    Class

    -

    Summary.

    -//// -/// - -[](){#option-show_docstring_classes} -## `show_docstring_classes` - -- **:octicons-package-24: Type [`bool`][] :material-equal: `True`{ title="default value" }** - - -Whether to render the "Classes" sections of docstrings. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - show_docstring_classes: true -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.module - options: - show_docstring_classes: false -``` - -```python -"""Summary. - -Classes: - Class: Some class. -""" - - -class Class: - """Summary.""" -``` - -/// admonition | Preview - type: preview - -//// tab | With classes -

    module

    -

    Summary.

    -

    Classes:

    - -**Name** | **Description** --------- | --------------- -`Class` | Some class. - -

    Class

    -

    Summary.

    -//// - -//// tab | Without classes -

    module

    -

    Summary.

    -

    Class

    -

    Summary.

    -//// -/// - -[](){#option-show_docstring_modules} -## `show_docstring_modules` - -- **:octicons-package-24: Type [`bool`][] :material-equal: `True`{ title="default value" }** - - -Whether to render the "Modules" sections of docstrings. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - show_docstring_modules: true -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.module - options: - show_docstring_modules: false -``` - -```tree -module/ - __init__.py - submodule.py -``` - -```python title="module/__init__.py" -"""Summary. - -Modules: - submodule: Some module. -""" -``` - -/// admonition | Preview - type: preview - -//// tab | With modules -

    module

    -

    Summary.

    -

    Modules:

    - -**Name** | **Description** ------------ | --------------- -`submodule` | Some module. - -//// - -//// tab | Without modules -

    module

    -

    Summary.

    -//// -/// - -[](){#option-show_docstring_description} -## `show_docstring_description` - -- **:octicons-package-24: Type [`bool`][] :material-equal: `True`{ title="default value" }** - - -Whether to render the textual blocks (including admonitions) of docstrings. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - show_docstring_description: true -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.module - options: - show_docstring_description: false -``` - -```python -class Class: - """Summary. - - Long description. - - Warning: Deprecated - Stop using this class. - - Attributes: - attr: Some attribute. - """ - - attr: int = 1 -``` - -/// admonition | Preview - type: preview - -//// tab | With description blocks -

    Class

    -

    Summary.

    -

    Long description.

    -
    Deprecated

    Stop using this class.

    -

    Attributes:

    - -**Type** | **Name** | **Description** ---------- | -------- | --------------- -[`int`][] | `attr` | Some attribute. -//// - -//// tab | Without description blocks -

    Class

    -

    Attributes:

    - -**Type** | **Name** | **Description** ---------- | -------- | --------------- -[`int`][] | `attr` | Some attribute. -//// -/// - -[](){#option-show_docstring_examples} -## `show_docstring_examples` - -- **:octicons-package-24: Type [`bool`][] :material-equal: `True`{ title="default value" }** - - -Whether to render the "Examples" section of docstrings. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - show_docstring_examples: true -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.module - options: - show_docstring_examples: false -``` - -```python -def print_hello(): - """Print hello. - - Examples: - >>> print("hello") - hello - """ - print("hello") -``` - -/// admonition | Preview - type: preview - -//// tab | With examples -

    print_hello

    -

    Print hello.

    -

    Examples:

    - -```pycon ->>> print("hello") -hello -``` -//// - -//// tab | Without examples -

    print_hello

    -

    Print hello.

    -//// -/// - -[](){#option-show_docstring_other_parameters} -## `show_docstring_other_parameters` - -- **:octicons-package-24: Type [`bool`][] :material-equal: `True`{ title="default value" }** - - -Whether to render the "Other Parameters" section of docstrings. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - show_docstring_other_parameters: true -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.module - options: - show_docstring_other_parameters: false -``` - -```python -def do_something(**kwargs): - """Do something. - - Other parameters: - whatever (int): Some integer. - """ -``` - -/// admonition | Preview - type: preview - -//// tab | With other parameters -

    do_something

    -

    Do something.

    -

    Other parameters:

    - -**Type** | **Name** | **Description** ---------- | ---------- | --------------- -[`int`][] | `whatever` | Some integer. -//// - -//// tab | Without other parameters -

    do_something

    -

    Do something.

    -//// -/// - -[](){#option-show_docstring_parameters} -## `show_docstring_parameters` - -- **:octicons-package-24: Type [`bool`][] :material-equal: `True`{ title="default value" }** - - -Whether to render the "Parameters" section of docstrings. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - show_docstring_parameters: true -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.module - options: - show_docstring_parameters: false -``` - -```python -def do_something(whatever: int = 0): - """Do something. - - Parameters: - whatever: Some integer. - """ -``` - -/// admonition | Preview - type: preview - -//// tab | With parameters -

    do_something

    -

    Do something.

    -

    Parameters:

    - -**Type** | **Name** | **Description** | **Default** ---------- | ---------- | --------------- | ----------- -[`int`][] | `whatever` | Some integer. | `0` -//// - -//// tab | Without parameters -

    do_something

    -

    Do something.

    -//// -/// - -[](){#option-show_docstring_raises} -## `show_docstring_raises` - -- **:octicons-package-24: Type [`bool`][] :material-equal: `True`{ title="default value" }** - - -Whether to render the "Raises" section of docstrings. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - show_docstring_raises: true -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.module - options: - show_docstring_raises: false -``` - -```python -def raise_runtime_error(): - """Raise a runtime error. - - Raises: - RuntimeError: Not good. - """ - raise RuntimeError -``` - -/// admonition | Preview - type: preview - -//// tab | With exceptions -

    raise_runtime_error

    -

    Raise a runtime error.

    -

    Raises:

    - -**Type** | **Description** ------------------- | --------------- -[`RuntimeError`][] | Not good. -//// - -//// tab | Without exceptions -

    raise_runtime_error

    -

    Raise a runtime error.

    -//// -/// - -[](){#option-show_docstring_receives} -## `show_docstring_receives` - -- **:octicons-package-24: Type [`bool`][] :material-equal: `True`{ title="default value" }** - - -Whether to render the "Receives" section of docstrings. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - show_docstring_receives: true -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.module - options: - show_docstring_receives: false -``` - -```python -def iter_skip( - iterable: Iterable[T], - initial_skip: int = 0, -) -> Generator[T, int, None]: - """Iterate and skip elements. - - Receives: - skip: Number of elements to skip. - """ - skip = initial_skip - for element in iterable: - if skip or 0 > 0: - skip -= 1 - else: - skip = yield element -``` - -/// admonition | Preview - type: preview - -//// tab | With received values -

    iter_skip

    -

    Iterate and skip elements.

    -

    Receives:

    - -**Type** | **Description** ---------- | --------------- -[`int`][] | Number of elements to skip. -//// - -//// tab | Without received values -

    iter_skip

    -

    Iterate and skip elements.

    -//// -/// - -[](){#option-show_docstring_returns} -## `show_docstring_returns` - -- **:octicons-package-24: Type [`bool`][] :material-equal: `True`{ title="default value" }** - - -Whether to render the "Returns" section of docstrings. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - show_docstring_returns: true -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.module - options: - show_docstring_returns: false -``` - -```python -def rand() -> int: - """Return a random number. - - Returns: - A random number. - """ - return random.randint(0, 1000) -``` - -/// admonition | Preview - type: preview - -//// tab | With return value -

    rand

    -

    Return a random number.

    -

    Returns:

    - -**Type** | **Description** ---------- | --------------- -[`int`][] | A random number. -//// - -//// tab | Without return value -

    rand

    -

    Return a random number.

    -//// -/// - -[](){#option-show_docstring_warns} -## `show_docstring_warns` - -- **:octicons-package-24: Type [`bool`][] :material-equal: `True`{ title="default value" }** - - -Whether to render the "Warns" section of docstrings. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - show_docstring_warns: true -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.module - options: - show_docstring_warns: false -``` - -```python -def warn(): - """Warn user. - - Warns: - UserWarning: When this is inappropriate. - """ - warnings.warn(UserWarning("This is inappropriate")) -``` - -/// admonition | Preview - type: preview - -//// tab | With warnings -

    warn

    -

    Warn user.

    -

    Warns:

    - -**Type** | **Description** ------------------ | --------------- -[`UserWarning`][] | When this is inappropriate. -//// - -//// tab | Without warnings -

    warn

    -

    Warn user.

    -//// -/// - -[](){#option-show_docstring_yields} -## `show_docstring_yields` - -- **:octicons-package-24: Type [`bool`][] :material-equal: `True`{ title="default value" }** - - -Whether to render the "Yields" section of docstrings. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - show_docstring_yields: true -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.module - options: - show_docstring_yields: false -``` - -```python -def iter_skip( - iterable: Iterable[T], - initial_skip: int = 0, -) -> Generator[T, int, None]: - """Iterate and skip elements. - - Yields: - Elements of the iterable. - """ - skip = initial_skip - for element in iterable: - if skip or 0 > 0: - skip -= 1 - else: - skip = yield element -``` - -/// admonition | Preview - type: preview - -//// tab | With yielded values -

    iter_skip

    -

    Iterate and skip elements.

    -

    Yields:

    - -**Type** | **Description** ---------- | --------------- -`T` | Elements of the iterable. -//// - -//// tab | Without yielded values -

    iter_skip

    -

    Iterate and skip elements.

    -//// -/// diff --git a/docs/usage/configuration/general.md b/docs/usage/configuration/general.md deleted file mode 100644 index 973658c1..00000000 --- a/docs/usage/configuration/general.md +++ /dev/null @@ -1,496 +0,0 @@ -# General options - -[](){#option-allow_inspection} -## `allow_inspection` - -- **:octicons-package-24: Type [`bool`][] :material-equal: `True`{ title="default value" }** - - -Whether to allow inspecting modules (importing them) -when it is not possible to visit them (parse their source code). - -When loading data for a given package, [Griffe] discovers every Python module, -compiled or not, and inspects or visits them accordingly. - -If you have compiled modules but also provide stubs for them, -you might want to disable the inspection of these modules, -because inspection picks up many more members, -and sometimes the collected data is inaccurate -(depending on the tool that was used to compile the module) -or too low-level/technical for API documentation. - -See also [`force_inspection`](#force_inspection). - -WARNING: **Packages are loaded only once.** When mkdocstrings-python collects data from a Python package (thanks to [Griffe](https://mkdocstrings.github.io/griffe/)), it collects *the entire package* and *caches it*. Next time an object from the same package is rendered, the package is retrieved from the cache and not collected again. The `allow_inspection` option will therefore only have an effect the first time a package is collected, and will do nothing for objects rendered afterwards. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - allow_inspection: true -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.object - options: - allow_inspection: false -``` - -/// admonition | Preview - type: preview - -//// tab | With inspection -

    SomeClass

    -

    Docstring of the class.

    -

    __eq__

    -

    Method docstring.

    -

    __weakref__

    -

    Method docstring.

    -

    documented_method

    -

    Method docstring.

    -//// - -//// tab | Without inspection -

    SomeClass

    -

    Docstring of the class.

    -

    documented_method

    -

    Method docstring.

    -//// -/// - -[](){#option-backlinks} -## `backlinks` - -[:octicons-heart-fill-24:{ .pulse } Sponsors only](../../insiders/index.md){ .insiders } — -[:octicons-tag-24: Insiders 1.10.0](../../insiders/changelog.md#1.10.0) - -- **:octicons-package-24: Type Literal["flat", "tree", False] :material-equal: `False`{ title="default value" }** - -The `backlinks` option enables rendering of backlinks within your API documentation. - -When an arbitrary section of your documentation links to an API symbol, this link will be collected as a backlink, and rendered below your API symbol. In short, the API symbol will link back to the section that links to it. Such backlinks will help your users navigate the documentation, as they will immediately which functions return a specific symbol, or where a specific symbol is accepted as parameter, etc.. - -Each backlink is a list of breadcrumbs that represent the navigation, from the root page down to the given section. - -The available styles for rendering backlinks are **`flat`** and **`tree`**. - -- **`flat`** will render backlinks as a single-layer list. This can lead to repetition of breadcrumbs. -- **`tree`** will combine backlinks into a tree, to remove repetition of breadcrumbs. - -WARNING: **Global-only option.** For now, the option only works when set globally in `mkdocs.yml`. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - backlinks: tree -``` - -/// admonition | Preview - type: preview - -//// tab | Flat -![backlinks-flat](https://github.com/user-attachments/assets/f7a15b01-f194-4c55-8281-50adbb4a74af) -//// - -//// tab | Tree -![backlinks-tree](https://github.com/user-attachments/assets/3457db21-45e1-4e03-bd8c-2e9e75dc778b) -//// -/// - -[](){#option-extensions} -## `extensions` - -- **:octicons-package-24: Type list[str | dict[str, dict[str, Any]]] :material-equal: `[]`{ title="default value" }** - - -The `extensions` option lets you enable [Griffe extensions](https://mkdocstrings.github.io/griffe/extensions/), which enhance or modify the data collected from Python sources (or compiled modules). - -Elements in the list can be strings or dictionaries. - -Strings denote the path to an extension module, like `griffe_typingdoc`, or to an extension class directly, like `griffe_typingdoc.TypingDocExtension`. When using a module path, all extensions within that module will be loaded and enabled. Strings can also be the path to a Python module, and a class name separated with `:`, like `scripts/griffe_extensions.py` or `scripts/griffe_extensions.py:MyExtension`. - -Dictionaries have a single key, which is the module/class path (as a dot-separated qualifier or file path and colon-separated class name, like above), and its value is another dictionary specifying options that will be passed when to class constructors when instantiating extensions. - -WARNING: **Packages are loaded only once.** When mkdocstrings-python collects data from a Python package (thanks to [Griffe](https://mkdocstrings.github.io/griffe/)), it collects *the entire package* and *caches it*. Next time an object from the same package is rendered, the package is retrieved from the cache and not collected again. Only the extensions specified the first time the package is loaded will be used. You cannot use a different set of extensions for specific objects rendered afterwards, and you cannot deactivate extensions for objects rendered afterwards either. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - extensions: - - griffe_sphinx - - griffe_pydantic: {schema: true} - - scripts/exts.py:DynamicDocstrings: - paths: [mypkg.mymod.myobj] -``` - -```md title="or in docs/some_page.md (local configuration)" -::: your_package.your_module.your_func - options: - extensions: - - griffe_typingdoc -``` - -[](){#option-extra} -## `extra` - -- **:octicons-package-24: Type [`dict`][] :material-equal: `{}`{ title="default value" }** - - -The `extra` option lets you inject additional variables into the Jinja context used when rendering templates. You can then use this extra context in your [overridden templates][templates]. - -Local `extra` options will be merged into the global `extra` option: - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - extra: - hello: world -``` - -```md title="in docs/some_page.md (local configuration)" -::: your_package.your_module.your_func - options: - extra: - foo: bar -``` - -...will inject both `hello` and `foo` into the Jinja context when rendering `your_package.your_module.your_func`. - -> WARNING: Previously, extra options were supported directly under the `options` key. -> -> ```yaml -> plugins: -> - mkdocstrings: -> handlers: -> python: -> options: -> hello: world -> ``` -> -> Now that we introduced optional validation of options and automatic JSON schema generation thanks to Pydantic, we require extra options to be put under `options.extra`. Extra options directly under `options` are still supported, but deprecated, and will emit deprecation warnings. Support will be removed in a future version of mkdocstrings-python. - -[](){#option-find_stubs_package} -## `find_stubs_package` - -- **:octicons-package-24: Type [`bool`][] :material-equal: `False`{ title="default value" }** - - -When looking for documentation specified in [autodoc instructions][autodoc syntax] (`::: identifier`), also look for -the stubs package as defined in [PEP 561](https://peps.python.org/pep-0561/) if it exists. This is useful when -most of your documentation is separately provided by such a package and not inline in your main package. - -WARNING: **Packages are loaded only once.** When mkdocstrings-python collects data from a Python package (thanks to [Griffe](https://mkdocstrings.github.io/griffe/)), it collects *the entire package* and *caches it*. Next time an object from the same package is rendered, the package is retrieved from the cache and not collected again. The `find_stubs_package` option will therefore only have an effect the first time a package is collected, and will do nothing for objects rendered afterwards. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - find_stubs_package: true -``` - -```md title="or in docs/some_page.md (local configuration)" -::: your_package.your_module.your_func - options: - find_stubs_package: true -``` - -```python title="your_package/your_module.py" - -def your_func(a, b): - # Function code - ... - -# rest of your code -``` - -```python title="your_package-stubs/your_module.pyi" - -def your_func(a: int, b: str): - """ - - """ - ... - -# rest of your code -``` - -/// admonition | Preview - type: preview - -//// tab | With find_stubs_package -

    your_func

    -

    Function docstring

    -//// - -//// tab | Without find_stubs_package -

    your_func

    -//// -/// - -[](){#option-force_inspection} -## `force_inspection` - -- **:octicons-package-24: Type [`bool`][] :material-equal: `False`{ title="default value" }** - - -Whether to force inspecting modules (importing them) even if their source code is available. - -This option is useful when you know that dynamic analysis (inspection) yields better results than static analysis. Do not use this blindly: the recommended approach is to write a Griffe extension that will improve extracted API data. See [How to selectively inspect objects](https://mkdocstrings.github.io/griffe/guide/users/how-to/selectively-inspect/). - -See also [`allow_inspection`](#allow_inspection). - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - force_inspection: false -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.object - options: - force_inspection: true -``` - -WARNING: **Packages are loaded only once.** When mkdocstrings-python collects data from a Python package (thanks to [Griffe](https://mkdocstrings.github.io/griffe/)), it collects *the entire package* and *caches it*. Next time an object from the same package is rendered, the package is retrieved from the cache and not collected again. The `force_inspection` option will therefore only have an effect the first time a package is collected, and will do nothing for objects rendered afterwards. - -[](){#option-preload_modules} -## `preload_modules` - -- **:octicons-package-24: Type list[str] | None :material-equal: `None`{ title="default value" }** - - -Pre-load modules that are not specified directly in [autodoc instructions][autodoc syntax] (`::: identifier`). -It is useful when you want to render documentation for a particular member of an object, -and this member is imported from another package than its parent. - -For an imported member to be rendered, -you need to add it to the [`__all__`][__all__] attribute of the importing module. -The package from which the imported object originates must be accessible to the handler -(see [Finding modules](../index.md#finding-modules)). - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - preload_modules: - - their_package -``` - -```md title="or in docs/some_page.md (local configuration)" -::: your_package.your_module - options: - preload_modules: - - their_package -``` - -```python title="your_package/your_module.py" -from their_package.their_module import their_object - -__all__ = ["their_object"] - -# rest of your code -``` - -/// admonition | Preview - type: preview - -//// tab | With preloaded modules -

    your_module

    -

    Docstring of your module.

    -

    their_object

    -

    Docstring of their object.

    -//// - -//// tab | Without preloaded modules -

    your_module

    -

    Docstring of your module.

    -//// -/// - -[](){#option-show_bases} -## `show_bases` - -- **:octicons-package-24: Type [`bool`][] :material-equal: `True`{ title="default value" }** - - -Show the base classes of a class. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - show_bases: true -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.object - options: - show_bases: false -``` - -/// admonition | Preview - type: preview - -//// tab | With bases -

    SomeClass()

    -

    Bases: SomeBaseClass

    -

    Docstring of the class.

    -//// - -//// tab | Without bases -

    SomeClass()

    -

    Docstring of the class.

    -//// -/// - -[](){#option-show_inheritance_diagram} -## `show_inheritance_diagram` - -[:octicons-heart-fill-24:{ .pulse } Sponsors only](../../insiders/index.md){ .insiders } — -[:octicons-tag-24: Insiders 1.7.0](../../insiders/changelog.md#1.7.0) - -- **:octicons-package-24: Type [`bool`][] :material-equal: `False`{ title="default value" }** - - -Show the inheritance diagram of a class using [Mermaid](https://mermaid.js.org/). - -With this option enabled, an inheritance diagram (as a flowchart) -will be displayed after a class signature. -Each node will act as a cross-reference -and will bring you to the relevant class' documentation -when clicking on it. - -It should work out of the box with [Material for MkDocs][]. -For other themes, you must include Mermaid's Javascript code manually: - -```yaml title="mkdocs.yml" -extra_javascript: -- https://unpkg.com/mermaid@10.9.0/dist/mermaid.min.js -``` - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - show_inheritance_diagram: true -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.object - options: - show_inheritance_diagram: false -``` - -/// admonition | Preview - type: preview - -With the following classes: - -```python -class SuperAbstract: - """Super abstract class.""" -class Mixin1: - """Mixin 1.""" -class Abstract(SuperAbstract, Mixin1): - """Abstract class.""" -class Mixin2A: - """Mixin 2A.""" -class Mixin2B(Mixin2A): - """Mixin 2B.""" -class Concrete(Abstract, Mixin2B): - """Concrete class.""" -class SuperConcrete(Concrete): - """Super concrete class.""" -``` - -The diagram for `SuperConcrete` will look like this: - -```mermaid -flowchart TD -SuperConcrete[SuperConcrete] -Concrete[Concrete] -Abstract[Abstract] -SuperAbstract[SuperAbstract] -Mixin1[Mixin1] -Mixin2B[Mixin2B] -Mixin2A[Mixin2A] - -Concrete --> SuperConcrete -Abstract --> Concrete -SuperAbstract --> Abstract -Mixin1 --> Abstract -Mixin2B --> Concrete -Mixin2A --> Mixin2B -``` - -*Nodes are not clickable in this example -because these classes do not exist in our documentation.* -/// - -[](){#option-show_source} -## `show_source` - -- **:octicons-package-24: Type [`bool`][] :material-equal: `True`{ title="default value" }** - - -Show the source code of this object. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - show_source: true -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.object - options: - show_source: false -``` - -/// admonition | Preview - type: preview - -//// tab | With source -

    some_function()

    -

    Docstring of the function.

    - -///// details | Source code in `package/module.py` - type: quote - -```python linenums="1" -def some_function(): - ... -``` -///// -//// - -//// tab | Without source -

    some_function()

    -

    Docstring of the function.

    -//// -/// diff --git a/docs/usage/configuration/headings.md b/docs/usage/configuration/headings.md deleted file mode 100644 index b4314b77..00000000 --- a/docs/usage/configuration/headings.md +++ /dev/null @@ -1,684 +0,0 @@ -# Headings options - -[](){#option-heading} -## `heading` - -- **:octicons-package-24: Type [`str`][] :material-equal: `""`{ title="default value" }** - - -A custom string to use as the heading of the root object (i.e. the object specified directly after the identifier `:::`). This will override the default heading generated by the plugin. See also the [`toc_label` option][option-toc_label]. - -WARNING: **Not advised to be used as a global configuration option.** This option is not advised to be used as a global configuration option, as it will override the default heading for all objects. It is recommended to use it only in specific cases where you want to override the heading for a specific object. - -```md title="in docs/some_page.md (local configuration)" -::: path.to.module - options: - heading: "My fancy module" -``` - -[](){#option-heading_level} -## `heading_level` - -- **:octicons-package-24: Type [`int`][] :material-equal: `2`{ title="default value" }** - - -The initial heading level to use. - -When injecting documentation for an object, -the object itself and its members are rendered. -For each layer of objects, we increase the heading level by 1. - -The initial heading level will be used for the first layer. -If you set it to 3, then headings will start with `

    `. - -If the [heading for the root object][show_root_heading] is not shown, -then the initial heading level is used for its members. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - heading_level: 2 -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.module - options: - heading_level: 3 -``` - -/// admonition | Preview - type: preview - -//// tab | With level 3 and root heading -

    module (3)

    -

    Docstring of the module.

    -

    ClassA (4)

    -

    Docstring of class A.

    -

    ClassB (4)

    -

    Docstring of class B.

    -
    method_1 (5)
    -

    Docstring of the method.

    -//// - -//// tab | With level 3, without root heading -

    Docstring of the module.

    -

    ClassA (3)

    -

    Docstring of class A.

    -

    ClassB (3)

    -

    Docstring of class B.

    -

    method_1 (4)

    -

    Docstring of the method.

    -//// -/// - -[](){#option-parameter_headings} -## `parameter_headings` - -[:octicons-tag-24: Insiders 1.6.0](../../insiders/changelog.md#1.6.0) - -- **:octicons-package-24: Type [`bool`][] :material-equal: `False`{ title="default value" }** - - -Whether to render headings for function/method parameters. - -With this option enabled, each function/method parameter -(including parameters of `__init__` methods merged in their parent class -with the [`merge_init_into_class`][] option) -gets a permalink, an entry in the Table of Contents, -and an entry in the generated objects inventory. -The permalink and inventory entry allow cross-references -from internal and external pages. - -The identifier used in the permalink and inventory is of the following form: -`path.to.function(param_name)`. To manually cross-reference a parameter, -you can therefore use this Markdown syntax: - -```md -- Class parameter: [`param`][package.module.Class(param)] -- Method parameter: [`param`][package.module.Class.method(param)] -- Function parameter: [`param`][package.module.function(param)] -- Variadic positional parameters: [`*args`][package.module.function(*args)] -- Variadic keyword parameters: [`**kwargs`][package.module.function(**kwargs)] -``` - -Enabling this option along with [`signature_crossrefs`][] will automatically -render cross-references to parameters in class/function/method signatures -and attributes values. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - parameter_headings: false -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.module - options: - parameter_headings: true -``` - -/// admonition | Preview: Cross-references - type: preview - -```md exec="on" -::: package.get_version - options: - heading_level: 3 - parameter_headings: true - docstring_section_style: list - -::: package.current_version - options: - heading_level: 3 - line_length: 100 -``` - -/// - -/// admonition | Preview: Parameter sections - type: preview - -//// tab | Table style -```md exec="on" -::: package.get_version - options: - heading_level: 3 - show_root_heading: false - show_root_toc_entry: false - parameter_headings: true - docstring_section_style: table - show_docstring_returns: false - show_docstring_description: false -``` -//// - -//// tab | List style -```md exec="on" -::: package.get_version - options: - heading_level: 3 - show_root_heading: false - show_root_toc_entry: false - parameter_headings: true - docstring_section_style: list - show_docstring_returns: false - show_docstring_description: false -``` -//// - -//// tab | Spacy style -```md exec="on" -::: package.get_version - options: - heading_level: 3 - show_root_heading: false - show_root_toc_entry: false - parameter_headings: true - docstring_section_style: spacy - show_docstring_returns: false - show_docstring_description: false -``` -//// -/// - -/// admonition | Preview: Table of contents (with symbol types) - type: preview - - get_version
    - dist - -To customize symbols, see [Customizing symbol types](../customization.md/#symbol-types). - -/// - -[](){#option-show_root_heading} -## `show_root_heading` - -- **:octicons-package-24: Type [`bool`][] :material-equal: `False`{ title="default value" }** - - -Show the heading of the object at the root of the documentation tree -(i.e. the object referenced by the identifier after `:::`). - -It is pretty common to inject documentation for one module per page, -especially when following our [automatic reference pages recipe][autopages recipe]. -Since each page already has a title, usually being the module's name, -we can spare one heading level by not showing the heading for the module itself -(heading levels are limited to 6 by the HTML specification). - -Sparing that extra level can be helpful when your objects tree is deeply nested -(e.g. method in a class in a class in a module). -If your objects tree is not deeply nested, and you are injecting documentation -for many different objects on a single page, it might be preferable to render -the heading of each object. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - show_root_heading: false -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.ClassA - options: - show_root_heading: true - -::: path.to.ClassB - options: - show_root_heading: true -``` - -/// admonition | Preview - type: preview - -//// tab | With root heading -

    ClassA (2)

    -

    Docstring of class A.

    -

    method_a1 (3)

    -

    Docstring of the method.

    -

    ClassB (2)

    -

    Docstring of class B.

    -

    method_b1 (3)

    -

    Docstring of the method.

    -//// - -//// tab | Without root heading -

    Docstring of class A.

    -

    method_a1 (2)

    -

    Docstring of the method.

    -

    Docstring of class B.

    -

    method_b1 (2)

    -

    Docstring of the method.

    -//// -/// - -[](){#option-show_root_toc_entry} -## `show_root_toc_entry` - -- **:octicons-package-24: Type [`bool`][] :material-equal: `True`{ title="default value" }** - - -If the root heading is not shown, at least add a ToC entry for it. - -If you inject documentation for an object in the middle of a page, -after long paragraphs, and without showing the [root heading][show_root_heading], -then you will not be able to link to this particular object -as it won't have a permalink and will be "lost" in the middle of text. -In that case, it is useful to add a hidden anchor to the document, -which will also appear in the table of contents. - -In other cases, you might want to disable the entry to avoid polluting the ToC. -It is not possible to show the root heading *and* hide the ToC entry. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - show_root_toc_entry: true -``` - -```md title="or in docs/some_page.md (local configuration)" -## Some heading - -Lots of text. - -::: path.to.object - options: - show_root_toc_entry: false - -## Other heading. - -More text. -``` - -/// admonition | Preview - type: preview - -//// tab | With ToC entry -**Table of contents** -[Some heading](#permalink-to-some-heading){ title="#permalink-to-some-heading" } -[`object`](#permalink-to-object){ title="#permalink-to-object" } -[Other heading](#permalink-to-other-heading){ title="#permalink-to-other-heading" } -//// - -//// tab | Without ToC entry -**Table of contents** -[Some heading](#permalink-to-some-heading){ title="#permalink-to-some-heading" } -[Other heading](#permalink-to-other-heading){ title="#permalink-to-other-heading" } -//// -/// - -[](){#option-show_root_full_path} -## `show_root_full_path` - -- **:octicons-package-24: Type [`bool`][] :material-equal: `True`{ title="default value" }** - - -Show the full Python path for the root object heading. - -The path of a Python object is the dot-separated list of names -under which it is accessible, for example `package.module.Class.method`. - -With this option you can choose to show the full path of the object -you inject documentation for, or just its name. This option impacts -only the object you specify, not its members. For members, see the two -other options [`show_root_members_full_path`][] -and [`show_object_full_path`][]. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - show_root_full_path: true -``` - -```md title="or in docs/some_page.md (local configuration)" -::: package.module.Class.method - options: - show_root_full_path: false -``` - -/// admonition | Preview - type: preview - -//// tab | With root full path -

    package.module.Class.method

    -

    Docstring of the method.

    -//// - -//// tab | Without root full path -

    method

    -

    Docstring of the method.

    -//// -/// - -[](){#option-show_root_members_full_path} -## `show_root_members_full_path` - -- **:octicons-package-24: Type [`bool`][] :material-equal: `False`{ title="default value" }** - - -Show the full Python path of the root members. - -This option does the same thing as [`show_root_full_path`][], -but for direct members of the root object instead of the root object itself. - -To show the full path for every member recursively, -see [`show_object_full_path`][]. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - show_root_members_full_path: true -``` - -```md title="or in docs/some_page.md (local configuration)" -::: package.module - options: - show_root_members_full_path: false -``` - -/// admonition | Preview - type: preview - -//// tab | With members full path -

    Docstring of the module.

    -

    package.module.Class

    -

    Docstring of the class.

    -

    method

    -

    Docstring of the method.

    -//// - -//// tab | Without members full path -

    Docstring of the module.

    -

    Class

    -

    Docstring of the class.

    -

    method

    -

    Docstring of the method.

    -//// -/// - -[](){#option-show_object_full_path} -## `show_object_full_path` - -- **:octicons-package-24: Type [`bool`][] :material-equal: `False`{ title="default value" }** - - -Show the full Python path of every object. - -Same as for [`show_root_members_full_path`][], -but for every member, recursively. This option takes precedence over -[`show_root_members_full_path`][]: - -`show_root_members_full_path` | `show_object_full_path` | Direct root members path ------------------------------ | ----------------------- | ------------------------ -False | False | Name only -False | True | Full -True | False | Full -True | True | Full - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - show_object_full_path: true -``` - -```md title="or in docs/some_page.md (local configuration)" -::: package.module - options: - show_object_full_path: false -``` - -/// admonition | Preview - type: preview - -//// tab | With objects full path -

    Docstring of the module.

    -

    package.module.Class

    -

    Docstring of the class.

    -

    package.module.Class.method

    -

    Docstring of the method.

    -//// - -//// tab | Without objects full path -

    Docstring of the module.

    -

    Class

    -

    Docstring of the class.

    -

    method

    -

    Docstring of the method.

    -//// -/// - -[](){#option-show_category_heading} -## `show_category_heading` - -- **:octicons-package-24: Type [`bool`][] :material-equal: `False`{ title="default value" }** - - -When [grouped by categories][group_by_category], show a heading for each category. -These category headings will appear in the table of contents, -allowing you to link to them using their permalinks. - -WARNING: **Not recommended with deeply nested objects.** -When injecting documentation for deeply nested objects, -you'll quickly run out of heading levels, and the objects -at the bottom of the tree risk all getting documented -using H6 headings, which might decrease the readability -of your API docs. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - group_by_category: true - show_category_heading: true -``` - -```md title="or in docs/some_page.md (local configuration)" -::: package.module - options: - group_by_category: true - show_category_heading: false -``` - -/// admonition | Preview - type: preview - -//// tab | With category headings -

    Docstring of the module.

    -

    Attributes (2)

    -

    module_attribute (3)

    -

    Docstring of the module attribute.

    -

    Classes (2)

    -

    Class (3)

    -

    Docstring of the class.

    -

    Attributes (4)

    -
    class_attribute (5)
    -

    Docstring of the class attribute.

    -

    Methods (4)

    -
    method (5)
    -

    Docstring of the method.

    -//// - -//// tab | Without category headings -

    Docstring of the module.

    -

    module_attribute (2)

    -

    Docstring of the module attribute.

    -

    Class (2)

    -

    Docstring of the class.

    -

    class_attribute (3)

    -

    Docstring of the class attribute.

    -

    method (3)

    -

    Docstring of the method.

    -//// -/// - -[](){#option-show_symbol_type_heading} -## `show_symbol_type_heading` - -[:octicons-tag-24: Insiders 1.1.0](../../insiders/changelog.md#1.1.0) - -- **:octicons-package-24: Type [`bool`][] :material-equal: `False`{ title="default value" }** - - -Show the symbol type in headings. - -This option will prefix headings with -, -, -, - or - types. -See also [`show_symbol_type_toc`][show_symbol_type_toc]. - -To customize symbols, see [Customizing symbol types](../customization.md/#symbol-types). - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - show_symbol_type_heading: true -``` - -```md title="or in docs/some_page.md (local configuration)" -::: package.module - options: - show_symbol_type_heading: false -``` - -/// admonition | Preview - type: preview - -//// tab | With symbol type in headings -

    module

    -

    Docstring of the module.

    -

    attribute

    -

    Docstring of the module attribute.

    -

    function

    -

    Docstring of the function.

    -

    Class

    -

    Docstring of the class.

    -

    method

    -

    Docstring of the method.

    -//// - -//// tab | Without symbol type in headings -

    module

    -

    Docstring of the module.

    -

    attribute

    -

    Docstring of the module attribute.

    -

    function

    -

    Docstring of the function.

    -

    Class

    -

    Docstring of the class.

    -

    method

    -

    Docstring of the method.

    -//// -/// - -[](){#option-show_symbol_type_toc} -## `show_symbol_type_toc` - -[:octicons-tag-24: Insiders 1.1.0](../../insiders/changelog.md#1.1.0) - -- **:octicons-package-24: Type [`bool`][] :material-equal: `False`{ title="default value" }** - - -Show the symbol type in the Table of Contents. - -This option will prefix items in the ToC with -, -, -, - or - types. -See also [`show_symbol_type_heading`][show_symbol_type_heading]. - -To customize symbols, see [Customizing symbol types](../customization.md/#symbol-types). - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - show_symbol_type_toc: true -``` - -```md title="or in docs/some_page.md (local configuration)" -::: package.module - options: - show_symbol_type_toc: false -``` - -/// admonition | Preview - type: preview - -//// tab | With symbol type in ToC -
      -
    • module
    • -
    • attribute
    • -
    • function
    • -
    • Class -
        -
      • method
      • -
      -
    • -
    -//// - -//// tab | Without symbol type in ToC -
      -
    • module
    • -
    • attribute
    • -
    • function
    • -
    • Class -
        -
      • method
      • -
      -
    • -
    -//// -/// - -[](){#option-toc_label} -## `toc_label` - -- **:octicons-package-24: Type [`str`][] :material-equal: `""`{ title="default value" }** - - -A custom string to use as the label in the Table of Contents for the root object (i.e. the one specified directly after the identifier `:::`). This will override the default label generated by the plugin. See also the [`heading` option][option-heading]. - -WARNING: **Not advised to be used as a global configuration option.** This option is not advised to be used as a global configuration option, as it will override the default label for all objects. It is recommended to use it only in specific cases where you want to override the label for a specific object. - -NOTE: **Use with/without `heading`.** If you use this option without specifying a custom `heading`, the default heading will be used in the page, but the label in the Table of Contents will be the one you specified. By providing both an option for `heading` and `toc_label`, we leave the customization entirely up to you. - -```md title="in docs/some_page.md (local configuration)" -::: path.to.module - options: - heading: "My fancy module" - toc_label: "My fancy module" -``` diff --git a/docs/usage/configuration/members.md b/docs/usage/configuration/members.md deleted file mode 100644 index 7a5069a1..00000000 --- a/docs/usage/configuration/members.md +++ /dev/null @@ -1,716 +0,0 @@ -# Members options - -[](){#option-members} -## `members` - -- **:octicons-package-24: Type list[str] | - bool | None :material-equal: `None`{ title="default value" }** - - -An explicit list of members to render. - -Only members declared in this list will be rendered. -A member without a docstring will still be rendered, -even if [`show_if_no_docstring`][] is set to false. - -The members will be rendered in the specified order, -regardless of the value of [`members_order`][]. -**Note that members will still be grouped by category, -according to the [`group_by_category`][] option.** - -Passing a falsy value (`no`, `false` in YAML) or an empty list (`[]`) -will tell the Python handler not to render any member. -Passing a truthy value (`yes`, `true` in YAML) -will tell the Python handler to render every member. - -Any given value, except for an explicit `None` (`null` in YAML) -will tell the handler to ignore [`filters`][] for the object's members. -Filters will still be applied to the next layers of members (grand-children). - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - members: - - hello # (1) -``` - -1. :warning: Most of the time it won't make sense to use this option at the global level. - -```md title="or in docs/some_page.md (local configuration)" -::: package.module - options: - members: - - ThisClass - - this_function -``` - -```python title="package/module.py" -"""Module docstring.""" - - -def this_function(): - """Function docstring.""" - - -class ThisClass: - """Class docstring.""" - - def method(self): - """Method docstring.""" - - -this_attribute = 0 -"""Attribute docstring.""" -``` - -/// admonition | Preview - type: preview - -//// tab | With `members: true` -

    Module docstring.

    -

    this_function

    -

    Function docstring.

    -

    ThisClass

    -

    Class docstring.

    -

    method

    -

    Method docstring.

    -

    this_attribute

    -

    Attribute docstring.

    -//// - -//// tab | With `members: false` or `members: []` -

    Module docstring.

    -//// - -//// tab | With `members: [ThisClass]` -

    Module docstring.

    -

    ThisClass

    -

    Class docstring.

    -

    method

    -

    Method docstring.

    -//// -/// - -INFO: **The default behavior (with unspecified `members` or `members: null`) is to use [`filters`][].** - -[](){#option-inherited_members} -## `inherited_members` - -- **:octicons-package-24: Type list[str] | - bool :material-equal: `False`{ title="default value" }** - - -An explicit list of inherited members (for classes) to render. - -Inherited members are always fetched from classes that are in the same package -as the currently rendered class. To fetch members inherited from base classes, -themselves coming from external packages, use the [`preload_modules`][preload_modules] option. -For example, if your class inherits from Pydantic's `BaseModel`, and you want to render -`BaseModel`'s methods in your class, use `preload_modules: [pydantic]`. -The `pydantic` package must be available in the current environment. - -Passing a falsy value (`no`, `false` in YAML) or an empty list (`[]`) -will tell the Python handler not to render any inherited member. -Passing a truthy value (`yes`, `true` in YAML) -will tell the Python handler to render every inherited member. - -When all inherited members are selected with `inherited_members: true`, -it is possible to specify both members and inherited members in the `members` list: - -```yaml -inherited_members: true -members: -- inherited_member_a -- inherited_member_b -- member_x -- member_y -``` - -The alternative is not supported: - -```yaml -inherited_members: -- inherited_member_a -- inherited_member_b -members: -- member_x -- member_y -``` - -...because it would make members ordering ambiguous/unspecified. - -You can render inherited members *only* by setting `inherited_members: true` -(or a list of inherited members) and setting `members: false`: - -```yaml -inherited_members: true -members: false -``` - -```yaml -inherited_members: -- inherited_member_a -- inherited_member_b -members: false -``` - -You can render *all declared members* and all or specific inherited members -by leaving `members` as null (default): - -```yaml -inherited_members: -- inherited_member_a -- inherited_member_b -# members: null # (1) -``` - -1. In this case, only declared members will be subject -to further filtering with [`filters`][filters] and [`docstrings`][show_if_no_docstring]. - -```yaml -inherited_members: true # (1) -# members: null -``` - -1. In this case, both declared and inherited members will be subject -to further filtering with [`filters`][filters] and [`docstrings`][show_if_no_docstring]. - -You can render *all declared members* and all or specific inherited members, -avoiding further filtering with [`filters`][filters] and [`docstrings`][show_if_no_docstring] -by setting `members: true`: - -```yaml -inherited_members: true -members: true -``` - -```yaml -inherited_members: -- inherited_member_a -- inherited_member_b -members: true -``` - -The general rule is that declared or inherited members specified in lists -are never filtered out. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - inherited_members: false -``` - -```md title="or in docs/some_page.md (local configuration)" -::: package.module - options: - inherited_members: true -``` - -```python title="package/module.py" -"""Module docstring.""" - - -class Base: - """Base class.""" - - def base(self): - """Base method.""" - - -class Main(Base): - """Main class.""" - - def main(self): - """Main method.""" -``` - -/// admonition | Preview - type: preview - -//// tab | With inherited members -

    Module docstring.

    -

    Base

    -

    Base class.

    -

    base

    -

    Base method.

    -

    Main

    -

    Main class.

    -

    base

    -

    Base method.

    -

    main

    -

    Main method.

    -//// - -//// tab | Without inherited members -

    Module docstring.

    -

    Base

    -

    Base class.

    -

    base

    -

    Base method.

    -

    Main

    -

    Main class.

    -

    main

    -

    Main method.

    -//// - -/// - -[](){#option-members_order} -## `members_order` - -- **:octicons-package-24: Type `str | list[str]` :material-equal: `"alphabetical"`{ title="default value" }** - - -The members ordering to use. Possible values: - -- `__all__` ([:octicons-heart-fill-24:{ .pulse } Sponsors only](../../insiders/index.md){ .insiders } — [:octicons-tag-24: Insiders 1.12.0](../../insiders/changelog.md#1.12.0)): Order according to `__all__` attributes. Since classes do not define `__all__` attributes, you can specify a second ordering method by using a list. -- `alphabetical`: Order by the members names. -- `source`: Order members as they appear in the source file. - -The order applies for all members, recursively. -The order will be ignored for members that are explicitely sorted using the [`members`][] option. -**Note that members will still be grouped by category, -according to the [`group_by_category`][] option.** - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - members_order: alphabetical -``` - -```md title="or in docs/some_page.md (local configuration)" -::: package.module - options: - members_order: source -``` - -```md title="or in docs/some_page.md (local configuration)" -::: package.module - options: - members_order: [__all__, source] -``` - -```python title="package/module.py" -"""Module docstring.""" - - -def function_b(): - """Function a.""" - - -def function_a(): - """Function b.""" - - -def function_c(): - """Function c.""" -``` - -/// admonition | Preview - type: preview - -//// tab | With alphabetical order -

    Module docstring.

    -

    function_a

    -

    Function a.

    -

    function_b

    -

    Function b.

    -

    function_c

    -

    Function c.

    -//// - -//// tab | With source order -

    Module docstring.

    -

    function_b

    -

    Function b.

    -

    function_a

    -

    Function a.

    -

    function_c

    -

    Function c.

    -//// -/// - -[](){#option-filters} -## `filters` - -- **:octicons-package-24: Type list[str] | Literal["public"] | None :material-equal: `["!^_[^_]"]`{ title="default value" }** - - -A list of filters, or `"public"`. - -**Filtering methods** - -[](){#option-filters-public} - -[:octicons-heart-fill-24:{ .pulse } Sponsors only](../../insiders/index.md){ .insiders } — -[:octicons-tag-24: Insiders 1.11.0](../../insiders/changelog.md#1.11.0) - -The `public` filtering method will include only public objects: those added to the `__all__` attribute of modules, or not starting with a single underscore. Special methods and attributes ("dunder" methods/attributes, starting and ending with two underscores), like `__init__`, `__call__`, `__mult__`, etc., are always considered public. - -**List of filters** - -Filters are regular expressions. These regular expressions are evaluated by Python -and so must match the syntax supported by the [`re`][] module. -A filter starting with `!` (negative filter) will exclude matching objects instead of including them. - -The default value (`["!^_[^_]"]`) means: *render every object, except those -starting with one underscore, unless they start with two underscores*. -It means that an object whose name is `hello`, `__hello`, or `__hello__` -will be rendered, but not one whose name is `_hello`. - -Each filter takes precedence over the previous one. This allows for fine-grain -selection of objects by adding more specific filters. For example, you can -start by unselecting objects that start with `_`, and add a second filter -that re-select objects that start with `__`. The default filters can -therefore be rewritten like this: - -```yaml -filters: -- "!^_" -- "^__" -``` - -If there are no negative filters, the handler considers that everything -is **unselected** first, and then selects things based on your positive filters. -If there is at least one negative filter, the handler considers that everything -is **selected** first, and then re-selects/unselects things based on your other filters. -In short, `filters: ["a"]` means *"keep ***nothing*** except names containing `a`"*, while -`filters: ["!a"]` means *"keep ***everything*** except names containing `a`"*. - -An empty list of filters tells the Python handler to render every object. -The [`members`][] option takes precedence over filters -(filters will still be applied recursively to lower members in the hierarchy). - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - filters: - - "!^_[^_]" -``` - -```md title="or in docs/some_page.md (local configuration)" -::: package.module - options: - filters: public -``` - -```python title="package/module.py" -def hello(): - ... - - -def _world(): - ... -``` - -/// admonition | Preview - type: preview - -//// tab | With `filters: []` -

    Module docstring.

    -

    hello

    -

    Function docstring.

    -

    _world

    -

    Function docstring.

    -//// - -//// tab | With `filters: ["hello"]` -

    Module docstring.

    -

    hello

    -

    Function docstring.

    -//// - -//// tab | With `filters: ["!hello"]` -

    Module docstring.

    -

    _world

    -

    Function docstring.

    -//// -/// - -/// admonition | Common filters - type: tip - -Here are some common filters that you might to want to use. - -- `["!^_"]`: exclude all private/protected/special objects -- `["!^_", "^__init__$"]`: same as above, but keep `__init__` methods -- `["!^_[^_]"]`: exclude all private/protected objects, keep special ones (default filters) -/// - -[](){#option-group_by_category} -## `group_by_category` - -- **:octicons-package-24: Type [`bool`][] :material-equal: `True`{ title="default value" }** - - -Group the object members by categories: attributes, classes, functions, and modules. - -Members within a same category will be ordered according to the [`members_order`][] option. -You can use the [`show_category_heading`][] option to also render a heading for each category. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - group_by_category: true -``` - -```md title="or in docs/some_page.md (local configuration)" -::: package.module - options: - group_by_category: false -``` - -```python title="package/module.py" -def function_a(): - ... - - -class ClassB: - ... - - -attribute_C = 0 - - -def function_d(): - ... -``` - -/// admonition | Preview - type: preview - -//// tab | With category grouping -

    Module docstring.

    -

    attribute_c

    -

    Attribute docstring.

    -

    ClassB

    -

    Class docstring.

    -

    function_a

    -

    Function docstring.

    -

    function_d

    -

    Function docstring.

    -//// - -//// tab | Without category grouping -

    Module docstring.

    -

    function_a

    -

    Function docstring.

    -

    ClassB

    -

    Class docstring.

    -

    attribute_c

    -

    Attribute docstring.

    -

    function_d

    -

    Function docstring.

    -//// -/// - -[](){#option-show_submodules} -## `show_submodules` - -- **:octicons-package-24: Type [`bool`][] :material-equal: `False`{ title="default value" }** - - -When rendering a module, show its submodules recursively. - -This is false by default, because most of the time we render only one module per page, -and when rendering a package (a tree of modules and their members) on a single page, -we quickly run out of [heading levels][heading_level]. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - show_submodules: true -``` - -```md title="or in docs/some_page.md (local configuration)" -::: package.subpackage - options: - show_submodules: false -``` - -```tree title="package" -package - __init__.py - subpackage - __init__.py - submodule.py -``` - -/// admonition | Preview - type: preview - -//// tab | With submodules -

    Subpackage docstring.

    -

    subpackage_member

    -

    Member docstring.

    -

    submodule

    -

    Submodule docstring.

    -

    submodule_member

    -

    Member docstring.

    -//// - -//// tab | Without submodules -

    Subpackage docstring.

    -

    subpackage_member

    -

    Member docstring.

    -//// -/// - -[](){#option-summary} -## `summary` - -[:octicons-tag-24: Insiders 1.2.0](../../insiders/changelog.md#1.2.0) - -- **:octicons-package-24: Type bool | dict[str, bool] :material-equal: `False`{ title="default value" }** - - -Whether to render summaries of modules, classes, functions (methods) and attributes. - -This option accepts a boolean (`yes`, `true`, `no`, `false` in YAML) -or a dictionary with one or more of the following keys: `attributes`, `functions`, `classes`, `modules`, -with booleans as values. Class methods summary is (de)activated with the `functions` key. -By default, `summary` is false, and by extension all values are false. - -Examples: - -```yaml -summary: true -``` - -```yaml -summary: false -``` - -```yaml -summary: - attributes: false - functions: true - modules: false -``` - -Summaries will be rendered as the corresponding docstring sections. -For example, the summary for attributes will be rendered as an Attributes docstring section. -The section will be rendered in accordance with the [`docstring_section_style`][] option. -If the objects appearing in the summary are also rendered on the page -(or somewhere else on the site), their name will automatically link to their rendered documentation. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - summary: true -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.module - options: - summary: false -``` - -/// admonition | Preview - type: preview - -//// tab | With all summaries -``` -::: path.to.module.MyClass - options: - summary: true -``` -

    MyClass

    -

    Class docstring.

    -

    Methods:

    -
      -
    • my_method1: Summary of the method (first docstring line).
    • -
    • my_method2: Summary of the method (first docstring line).
    • -
    -

    Attributes:

    -
      -
    • attr1: Summary of the attribute (first docstring line).
    • -
    • attr2: Summary of the attribute (first docstring line).
    • -
    -//// - -//// tab | With methods summary only -``` -::: path.to.module.MyClass - options: - summary: - functions: true -``` - -

    MyClass

    -

    Class docstring.

    -

    Methods:

    -
      -
    • my_method1: Summary of the method (first docstring line).
    • -
    • my_method2: Summary of the method (first docstring line).
    • -
    -//// -/// - -[](){#option-show_labels} -## `show_labels` - -- **:octicons-package-24: Type [`bool`][] :material-equal: `True`{ title="default value" }** - - -Whether to show labels of the members. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - show_labels: true -``` - -```md title="or in docs/some_page.md (local configuration)" -::: package.module - options: - show_labels: false -``` - -```python title="package/module.py" -class SomeClass: - some_attr: int -``` - -/// admonition | Preview - type: preview - -//// tab | With labels - - some_attr: - int - -instance-attribute -//// - -//// tab | Without labels - - some_attr: - int - -//// -/// diff --git a/docs/usage/configuration/signatures.md b/docs/usage/configuration/signatures.md deleted file mode 100644 index 98c865e5..00000000 --- a/docs/usage/configuration/signatures.md +++ /dev/null @@ -1,557 +0,0 @@ -# Signatures options - -[](){#option-annotations_path} -## `annotations_path` - -- **:octicons-package-24: Type [`str`][] :material-equal: `"brief"`{ title="default value" }** - - -The verbosity for annotations path. - -Possible values: - -- `brief` (recommended): render only the last component of each type path, not their full paths. - For example, it will render `Sequence[Path]` and not `typing.Sequence[pathlib.Path]`. - Brief annotations will cross-reference the right object anyway, - and show the full path in a tooltip when hovering them. -- `source`: render annotations as written in the source. For example if you imported `typing` as `t`, - it will render `typing.Sequence` as `t.Sequence`. Each part will cross-reference the relevant object: - `t` will link to the `typing` module and `Sequence` will link to the `Sequence` type. -- `full`: render annotations with their full path (the opposite of brief). - For example if you import `Sequence` and `Pattern` from `typing` and annoate something using - `Sequence[Pattern]`, it will render as `typing.Sequence[typing.Pattern]`, with each part - cross-referencing the corresponding object. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - annotations_path: brief -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.module - options: - annotations_path: source -``` - - -/// admonition | Preview - type: preview - -//// tab | Brief annotations -```python -import markdown -import markupsafe - - -def convert(text: str, md: markdown.Markdown) -> markupsafe.Markup: - """Convert text to Markdown. - - Parameters: - text: The text to convert. - md: A Markdown instance. - - Returns: - Converted markup. - """ - return markupsafe.Markup(md.convert(text)) -``` - -

    convert(text, md)

    -

    Convert text to Markdown.

    -

    Parameters:

    - -**Type** | **Description** | **Default** ----------- | ------------------------ | ----------- -[`str`][] | The text to convert. | *required* -[`Markdown`](#ref-to-markdown){ .external title="markdown.Markdown" } | A Markdown instance. | *required* - -

    Returns:

    - -**Type** | **Name** | **Description** ----------- | ----------- | --------------- -[`Markup`](#ref-to-markup){ .external title="markupsafe.Markup" } | `text` | Converted markup. -//// - -//// tab | Source annotations -```python -import markdown -from markupsafe import Markup - - -def convert(text: str, md: markdown.Markdown) -> Markup: - """Convert text to Markdown. - - Parameters: - text: The text to convert. - md: A Markdown instance. - - Returns: - Converted markup. - """ - return Markup(md.convert(text)) -``` - -

    convert(text, md)

    -

    Convert text to Markdown.

    -

    Parameters:

    - -**Type** | **Description** | **Default** ----------- | ------------------------ | ----------- -[`str`][] | The text to convert. | *required* -markdown.Markdown | A Markdown instance. | *required* - -

    Returns:

    - -**Type** | **Name** | **Description** ----------- | ----------- | --------------- -[`Markup`](#ref-to-markup){ .external title="markupsafe.Markup" } | `text` | Converted markup. -//// - -//// tab | Full annotations -```python -from markdown import Markdown -from markupsafe import Markup - - -def convert(text: str, md: Markdown) -> Markup: - """Convert text to Markdown. - - Parameters: - text: The text to convert. - md: A Markdown instance. - - Returns: - Converted markup. - """ - return Markup(md.convert(text)) -``` - -

    convert(text, md)

    -

    Convert text to Markdown.

    -

    Parameters:

    - -**Type** | **Description** | **Default** ----------- | ------------------------ | ----------- -[`str`][] | The text to convert. | *required* -markdown.Markdown | A Markdown instance. | *required* - -

    Returns:

    - -**Type** | **Name** | **Description** ----------- | ----------- | --------------- -markupsafe.Markup | `text` | Converted markup. -//// -/// - -[](){#option-line_length} -## `line_length` - -- **:octicons-package-24: Type [`int`][] :material-equal: `60`{ title="default value" }** - - -Maximum line length when formatting code/signatures. - -When separating signatures from headings with the [`separate_signature`][] option, -the Python handler will try to format the signatures using a formatter and -the specified line length. - -The handler will automatically try to format using : - -1. [Black] -2. [Ruff] - -If a formatter is not found, the handler issues an INFO log once. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - separate_signature: true - line_length: 60 -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.module - options: - separate_signature: true - line_length: 80 -``` - -/// admonition | Preview - type: preview - -//// tab | Line length 60 -

    long_function_name

    -
    long_function_name(
    -    long_parameter_1="hello",
    -    long_parameter_2="world",
    -)
    -//// - -//// tab | Line length 80 -

    long_function_name

    -
    long_function_name(long_parameter_1="hello", long_parameter_2="world")
    -//// -/// - -[](){#option-modernize_annotations} -## `modernize_annotations` - -[:octicons-heart-fill-24:{ .pulse } Sponsors only](../../insiders/index.md){ .insiders } — -[:octicons-tag-24: Insiders 1.8.0](../../insiders/changelog.md#1.8.0) — -**This feature also requires -[Griffe Insiders](https://mkdocstrings.github.io/griffe/insiders/) -to be installed.** - -- **:octicons-package-24: Type [`bool`][] :material-equal: `False`{ title="default value" }** - - -Modernize annotations with latest features and PEPs of the Python language. - -The Python language keeps evolving, and often library developers -must continue to support a few minor versions of Python. -Therefore they cannot use some features that were introduced -in the latest versions. - -Yet this doesn't mean they can't enjoy latest features in their docs: -Griffe allows to "modernize" expressions, for example -by replacing `typing.Union` with [PEP 604][pep-604] type unions `|`. -Thanks to this, mkdocstrings' Python handler -can automatically transform type annotations into their modern equivalent. -This improves consistency in your docs, and shows users -how to use your code with the latest features of the language. - -[pep-604]: https://peps.python.org/pep-0604/ - -Modernizations applied: - -- `typing.Dict[A, B]` becomes `dict[A, B]` -- `typing.List[A]` becomes `list[A]` -- `typing.Set[A]` becomes `set[A]` -- `typing.Tuple[A]` becomes `tuple[A]` -- `typing.Union[A, B]` becomes `A | B` -- `typing.Optional[A]` becomes `A | None` - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - modernize_annotations: true -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.object - options: - modernize_annotations: false -``` - -/// admonition | Preview - type: preview - -```python ---8<-- "docs/snippets/package/modern.py" -``` - -//// tab | Unchanged annotations - -```md exec="on" -::: package.modern.example - options: - modernize_annotations: false - show_symbol_type_heading: false - show_labels: false -``` - -//// - -//// tab | Modernized annotations - -```md exec="on" -::: package.modern.example - options: - modernize_annotations: true - show_symbol_type_heading: false - show_labels: false -``` - -//// - -/// - -[](){#option-show_signature} -## `show_signature` - -- **:octicons-package-24: Type [`bool`][] :material-equal: `True`{ title="default value" }** - - -Show methods and functions signatures. - -Without it, just the function/method name is rendered. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - show_signature: true -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.module - options: - show_signature: false -``` - -/// admonition | Preview - type: preview - -//// tab | With signature -

    function(param1, param2=None)

    -

    Function docstring.

    -//// - -//// tab | Without signature -

    function

    -

    Function docstring.

    -//// -/// - -[](){#option-show_signature_annotations} -## `show_signature_annotations` - -- **:octicons-package-24: Type [`bool`][] :material-equal: `False`{ title="default value" }** - - -Show the type annotations in methods and functions signatures. - -Since the heading can become quite long when annotations are rendered, -it is usually best to [separate the signature][separate_signature] from the heading. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - separate_signature: true - show_signature_annotations: true -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.module - options: - separate_signature: true - show_signature_annotations: false -``` - -/// admonition | Preview - type: preview - -//// tab | With signature annotations -

    function

    - -```python -function( - param1: list[int | float], - param2: bool | None = None, -) -> float -``` - -

    Function docstring.

    -//// - -//// tab | Without signature annotations -

    function

    - -```python -function(param1, param2=None) -``` - -

    Function docstring.

    -//// -/// - -[](){#option-separate_signature} -## `separate_signature` - -- **:octicons-package-24: Type [`bool`][] :material-equal: `False`{ title="default value" }** - - -Whether to put the whole signature in a code block below the heading. - -When separating signatures from headings, -the Python handler will try to format the signatures using a formatter and -the specified [line length][line_length]. - -The handler will automatically try to format using : - -1. [Black] -2. [Ruff] - -If a formatter is not found, the handler issues an INFO log once. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - separate_signature: false -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.module - options: - separate_signature: true -``` - -/// admonition | Preview - type: preview - -//// tab | With separate signature -

    function

    - -```python -function(param1, param2=None) -``` - -

    Function docstring.

    -//// - -//// tab | Without separate signature -

    function(param1, param2=None)

    -

    Function docstring.

    -//// -/// - -[](){#option-show_overloads} -## `show_overloads` - -Whether to render function / method overloads. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - show_overloads: true -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.module - options: - show_overloads: false -``` - -/// admonition | Preview - type: preview -//// tab | With overloads -

    function

    - - -```python -@overload -function(param1: int): ... - -@overload -function(param1: str): ... - -function(param1: str | int) -``` -Function docstring. - -//// -//// tab | Without overloads -

    function

    - -```python -function(param1: str | int) -``` -Function docstring. - -//// -/// - -[](){#option-signature_crossrefs} -## `signature_crossrefs` - -[:octicons-tag-24: Insiders 1.0.0](../../insiders/changelog.md#1.0.0) - -Whether to render cross-references for type annotations in signatures. - -When signatures are separated from headings with the [`separate_signature`][] option -and type annotations are shown with the [`show_signature_annotations`][] option, -this option will render a cross-reference (link) for each type annotation in the signature. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - separate_signature: true - show_signature_annotations: true - signature_crossrefs: false -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.module - options: - separate_signature: true - show_signature_annotations: true - signature_crossrefs: true -``` - -/// admonition | Preview - type: preview - -//// tab | With signature cross-references -

    do_format_code

    -
    do_format_code(code: str, line_length: int) -> str
    -
    -

    Function docstring.

    -//// - -//// tab | Without signature cross-references -

    do_format_code

    -
    do_format_code(code: str, line_length: int) -> str
    -
    -

    Function docstring.

    -//// -/// - -[](){#option-unwrap_annotated} -## `unwrap_annotated` - -- **:octicons-package-24: Type [`bool`][] :material-equal: `False`{ title="default value" }** - - -Whether to unwrap [`Annotated`](https://docs.python.org/3/library/typing.html#typing.Annotated){ .external } -types to show only the type without the annotations. - -For example, unwrapping `Annotated[int, Gt(10)]` will render `int`. - -```yaml title="in mkdocs.yml (global configuration)" -plugins: -- mkdocstrings: - handlers: - python: - options: - unwrap_annotated: false -``` - -```md title="or in docs/some_page.md (local configuration)" -::: path.to.module - options: - unwrap_annotated: true -``` diff --git a/docs/usage/customization.md b/docs/usage/customization.md deleted file mode 100644 index 8239c2e9..00000000 --- a/docs/usage/customization.md +++ /dev/null @@ -1,442 +0,0 @@ -# Customization - -It is possible to customize the output of the generated documentation with CSS -and/or by overriding templates. - -## CSS classes - -Our templates add [CSS](https://www.w3schools.com/Css/) classes to many HTML elements -to make it possible for users to customize the resulting look and feel. - -To add CSS rules and style mkdocstrings' output, -put them in a CSS file in your docs folder, for example in `docs/css/mkdocstrings.css`, -and reference this file in [MkDocs' `extra_css` configuration option](https://www.mkdocs.org/user-guide/configuration/#extra_css): - -```yaml title="mkdocs.yml" -extra_css: -- css/mkdocstrings.css -``` - -Example: - -```css title="docs/css/mkdocstrings.css" -.doc-section-title { - font-weight: bold; -} -``` - -The following CSS classes are used in the generated HTML: - -- `doc`: on all the following elements -- `doc-children`: on `div`s containing the children of an object -- `doc-object`: on `div`s containing an object - - `doc-attribute`: on `div`s containing an attribute - - `doc-class`: on `div`s containing a class - - `doc-function`: on `div`s containing a function - - `doc-module`: on `div`s containing a module -- `doc-heading`: on objects headings - - `doc-object-name`: on `span`s wrapping objects names/paths in the heading - - `doc-KIND-name`: as above, specific to the kind of object (module, class, function, attribute) -- `doc-contents`: on `div`s wrapping the docstring then the children (if any) - - `first`: same, but only on the root object's contents `div` -- `doc-labels`: on `span`s wrapping the object's labels - - `doc-label`: on `small` elements containing a label - - `doc-label-LABEL`: same, where `LABEL` is replaced by the actual label -- `doc-section-title`: on section titles (depend on the [selected style for section rendering][docstring_style]) -- `doc-section-item`: on section items (depend on the [selected style for section rendering][docstring_style]) -- `doc-md-description`: on `div`s containing HTML descriptions converted from Markdown docstrings -- `doc-symbol`: on `code` tags of symbol types - - `doc-symbol-heading`: on symbol types in headings - - `doc-symbol-toc`: on symbol types in the ToC - - `doc-symbol-KIND`: specific to the kind of object (`module`, `class`, `function`, `method`, `attribute`) - -/// admonition | Example with colorful labels - type: example - -//// tab | CSS -```css -.doc-label { border-radius: 15px; padding: 2px 8px; font-weight: bold; } -.doc-label-special { background-color: #3330E4; color: white; } -.doc-label-private { background-color: #F637EC; color: white; } -.doc-label-property { background-color: #FBB454; color: black; } -.doc-label-read-only { background-color: #FAEA48; color: black; } -``` -//// - -//// tab | Result - -

    -

    - special - private - property - read-only -

    -

    -//// - -/// - -## Symbol types - -### Colors - -You can customize the colors of the symbol types -(see [`show_symbol_type_heading`][show_symbol_type_heading] and [`show_symbol_type_toc`][show_symbol_type_toc]) -by overriding the values of our CSS variables, for example: - -```css title="docs/css/mkdocstrings.css" -[data-md-color-scheme="default"] { - --doc-symbol-parameter-fg-color: #df50af; - --doc-symbol-attribute-fg-color: #0079ff; - --doc-symbol-function-fg-color: #00dfa2; - --doc-symbol-method-fg-color: #00dfa2; - --doc-symbol-class-fg-color: #d1b619; - --doc-symbol-module-fg-color: #ff0060; - - --doc-symbol-parameter-bg-color: #df50af1a; - --doc-symbol-attribute-bg-color: #0079ff1a; - --doc-symbol-function-bg-color: #00dfa21a; - --doc-symbol-method-bg-color: #00dfa21a; - --doc-symbol-class-bg-color: #d1b6191a; - --doc-symbol-module-bg-color: #ff00601a; -} - -[data-md-color-scheme="slate"] { - --doc-symbol-parameter-fg-color: #ffa8cc; - --doc-symbol-attribute-fg-color: #963fb8; - --doc-symbol-function-fg-color: #6d67e4; - --doc-symbol-method-fg-color: #6d67e4; - --doc-symbol-class-fg-color: #46c2cb; - --doc-symbol-module-fg-color: #f2f7a1; - - --doc-symbol-parameter-bg-color: #ffa8cc1a; - --doc-symbol-attribute-bg-color: #963fb81a; - --doc-symbol-function-bg-color: #6d67e41a; - --doc-symbol-method-bg-color: #6d67e41a; - --doc-symbol-class-bg-color: #46c2cb1a; - --doc-symbol-module-bg-color: #f2f7a11a; -} -``` - -The `[data-md-color-scheme="*"]` selectors work with the [Material for MkDocs] theme. -If you are using another theme, adapt the selectors to this theme -if it supports light and dark themes, -otherwise just override the variables at root level: - -```css title="docs/css/mkdocstrings.css" -:root { - --doc-symbol-parameter-fg-color: #df50af; - --doc-symbol-attribute-fg-color: #0079ff; - --doc-symbol-function-fg-color: #00dfa2; - --doc-symbol-method-fg-color: #00dfa2; - --doc-symbol-class-fg-color: #d1b619; - --doc-symbol-module-fg-color: #ff0060; - - --doc-symbol-parameter-bg-color: #df50af1a; - --doc-symbol-attribute-bg-color: #0079ff1a; - --doc-symbol-function-bg-color: #00dfa21a; - --doc-symbol-method-bg-color: #00dfa21a; - --doc-symbol-class-bg-color: #d1b6191a; - --doc-symbol-module-bg-color: #ff00601a; -} -``` - -/// admonition | Preview - type: preview - -
    - -

    - Try cycling through the themes to see the colors for each theme: - - - - - - -

    -
    - -/// - -### Names - -You can also change the actual symbol names. -For example, to use single letters instead of truncated types: - -```css title="docs/css/mkdocstrings.css" -.doc-symbol-parameter::after { - content: "P"; -} - -.doc-symbol-attribute::after { - content: "A"; -} - -.doc-symbol-function::after { - content: "F"; -} - -.doc-symbol-method::after { - content: "M"; -} - -.doc-symbol-class::after { - content: "C"; -} - -.doc-symbol-module::after { - content: "M"; -} -``` - -/// admonition | Preview - type: preview - -
    - -
      -
    • Parameter:
    • -
    • Attribute:
    • -
    • Function:
    • -
    • Method:
    • -
    • Class:
    • -
    • Module:
    • -
    -
    - -/// - -## Templates - -Templates are organized into the following tree: - -```python exec="1" result="tree" -from pathlib import Path - -basedir = "src/mkdocstrings_handlers/python/templates/material" -print("theme/") -for filepath in sorted(path for path in Path(basedir).rglob("*") if "_base" not in str(path) and path.suffix != ".css"): - print( - " " * (len(filepath.relative_to(basedir).parent.parts) + 1) - + filepath.name - + ("/" if filepath.is_dir() else "") - ) -``` - -See them [in the repository](https://github.com/mkdocstrings/python/tree/main/src/mkdocstrings_handlers/python/templates/). -See the general *mkdocstrings* documentation to learn how to override them: https://mkdocstrings.github.io/theming/#templates. - -Each one of these templates extends a base version in `theme/_base`. Example: - -```html+jinja title="theme/class.html" -{% extends "_base/class.html" %} -``` - -Some of these templates define [Jinja blocks](https://jinja.palletsprojects.com/en/3.0.x/templates/#template-inheritance). -allowing to customize only *parts* of a template -without having to fully copy-paste it into your project: - -```jinja title="templates/theme/class.html" -{% extends "_base/class.html" %} -{% block contents %} - {{ block.super }} - Additional contents -{% endblock contents %} -``` - -### Available blocks - -Only the templates for the **Material for MkDocs** provide Jinja blocks. -The following tables show the block names, description, -and the Jinja context available in their scope. - -#### `module.html` - -- `heading`: The module heading. -- `labels`: The module labels. -- `contents`: The module contents: docstring and children blocks. -- `docstring`: The module docstring. -- `summary`: The automatic summaries of members. -- `children`: The module children. - -Available context: - -- `config`: The handler configuration (dictionary). -- `module`: The [Module][griffe.Module] instance. - -#### `class.html` - -- `heading`: The class heading. -- `labels`: The class labels. -- `signature`: The class signature. -- `contents`: The class contents: bases, docstring, source and children blocks. -- `bases`: The class bases. -- `docstring`: The class docstring. -- `summary`: The automatic summaries of members. -- `source`: The class source code. -- `children`: The class children. - -Available context: - -- `config`: The handler configuration (dictionary). -- `class`: The [Class][griffe.Class] instance. - -#### `function.html` - -- `heading`: The function heading. -- `labels`: The function labels. -- `signature`: The function signature. -- `contents`: The function contents: docstring and source blocks. -- `docstring`: The function docstring. -- `source`: The function source code. - -Available context: - -- `config`: The handler configuration (dictionary). -- `function`: The [Function][griffe.Function] instance. - -#### `attribute.html` - -- `heading`: The attribute heading. -- `labels`: The attribute labels. -- `signature`: The attribute signature. -- `contents`: The attribute contents: docstring block. -- `docstring`: The attribute docstring. - -Available context: - -- `config`: The handler configuration (dictionary). -- `attribute`: The [Attribute][griffe.Attribute] instance. - -#### Docstring sections - -In `docstring/attributes.html`, -`docstring/functions.html`, -`docstring/classes.html`, -`docstring/modules.html`, -`docstring/other_parameters.html`, -`docstring/parameters.html`, -`docstring/raises.html`, -`docstring/receives.html`, -`docstring/returns.html`, -`docstring/warns.html`, -and `docstring/yields.html`: - -- `table_style`: The section as a table. -- `list_style`: The section as a list. -- `spacy_style`: The section as a Spacy table. - -Available context: - -- `section`: The [DocstringSection][griffe.DocstringSection] instance (see `DocstringSection*` subclasses). - -### Syntax highlight in signatures - -You can customize the colors in syntax highlighted signatures. -If you are using the [Material for MkDocs] theme, -here are some customization examples: - -```css -/* Fancier color for operators such as * and |. */ -.doc-signature .o { - color: var(--md-code-hl-special-color); -} - -/* Fancier color for constants such as None, True, and False. */ -.doc-signature .kc { - color: var(--md-code-hl-constant-color); -} - -/* Fancier color for built-in types (only useful when cross-references are used). */ -.doc-signature .n > a[href^="https://docs.python.org/"][href*="/functions.html#"], -.doc-signature .n > a[href^="https://docs.python.org/"][href*="/stdtypes.html#"] { - color: var(--md-code-hl-constant-color); -} -``` - -For other themes, use their own CSS variables, -or use plain colors such as `violet` or `#2987f2`. - -## Style recommendations - -[](){#recommended-style-material} -### Material - -Here are some CSS rules for the [Material for MkDocs] theme: - -```css ---8<-- "docs/css/mkdocstrings.css" -``` - -[](){#recommended-style-readthedocs} -### ReadTheDocs - -Here are some CSS rules for the built-in ReadTheDocs theme: - -```css -/* Indentation. */ -div.doc-contents:not(.first) { - padding-left: 25px; - border-left: .05rem solid rgba(200, 200, 200, 0.2); -} -``` diff --git a/docs/usage/docstrings/google.md b/docs/usage/docstrings/google.md deleted file mode 100644 index 1c843a3b..00000000 --- a/docs/usage/docstrings/google.md +++ /dev/null @@ -1,28 +0,0 @@ -# Google style - -## :warning: Work in Progress! - -### Google-style admonitions - -With Google-style docstrings, any section that is not recognized will be transformed into its admonition equivalent. -For example: - -=== "Docstring" - ```python - """ - Note: - It looks like a section, but it will be rendered as an admonition. - - Tip: You can even choose a title. - This admonition has a custom title! - """ - ``` - -=== "Result" - NOTE: It looks like a section, but it will be rendered as an admonition. - - TIP: **You can even choose a title.** - This admonition has a custom title! - -See [Napoleon's documentation](https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_google.html). -See the supported docstring sections on [Griffe's documentation](https://mkdocstrings.github.io/griffe/docstrings/). diff --git a/docs/usage/docstrings/numpy.md b/docs/usage/docstrings/numpy.md deleted file mode 100644 index 524bfbfe..00000000 --- a/docs/usage/docstrings/numpy.md +++ /dev/null @@ -1,11 +0,0 @@ -# Numpydoc style - -## :warning: Work in Progress! - -NOTE: As Numpy-style is partially supported by the underlying parser, -you may experience problems in the building process if your docstring -has a `Methods` section in the class docstring -(see [#366](https://github.com/mkdocstrings/mkdocstrings/issues/366)). - -See [Numpydoc's documentation](https://numpydoc.readthedocs.io/en/latest/format.html). -See the supported docstring sections on [Griffe's documentation](https://mkdocstrings.github.io/griffe/docstrings/). diff --git a/docs/usage/docstrings/sphinx.md b/docs/usage/docstrings/sphinx.md deleted file mode 100644 index bf88c19b..00000000 --- a/docs/usage/docstrings/sphinx.md +++ /dev/null @@ -1,6 +0,0 @@ -# Sphinx style - -## :warning: Work in Progress! - -See [Sphinx's documentation](https://sphinx-rtd-tutorial.readthedocs.io/en/latest/docstrings.html). -See the supported docstring sections on [Griffe's documentation](https://mkdocstrings.github.io/griffe/docstrings/). diff --git a/docs/usage/extensions.md b/docs/usage/extensions.md deleted file mode 100644 index 4f6b96b3..00000000 --- a/docs/usage/extensions.md +++ /dev/null @@ -1,17 +0,0 @@ -# Extensions - -## :warning: Work in Progress! - -The Python handler supports extensions through -[*mkdocstrings*' handler extensions](https://mkdocstrings.github.io/usage/handlers/#handler-extensions). - -Specifically, additional templates can be added to the handler, -and Griffe extensions can instruct the handler to use a particular template -for a particular object by setting a value in the Griffe object's `extra` dictionary: - -```python title="griffe_extension.py" -obj = ... # get a reference to a Griffe object -if "mkdocstrings" not in obj.extra: - obj.extra["mkdocstrings"] = {} -obj.extra["mkdocstrings"]["template"] = "template_name.html" -``` diff --git a/docs/usage/index.md b/docs/usage/index.md deleted file mode 100644 index b2a00955..00000000 --- a/docs/usage/index.md +++ /dev/null @@ -1,380 +0,0 @@ -# Usage - -TIP: **This is the documentation for the NEW Python handler.** -To read the documentation for the LEGACY handler, -go to the [legacy handler documentation](https://mkdocstrings.github.io/python-legacy). - -## Installation - -You can install this handler as a *mkdocstrings* extra: - -```toml title="pyproject.toml" -# PEP 621 dependencies declaration -# adapt to your dependencies manager -[project] -dependencies = [ - "mkdocstrings[python]>=0.18", -] -``` - -You can also explicitly depend on the handler: - -```toml title="pyproject.toml" -# PEP 621 dependencies declaration -# adapt to your dependencies manager -[project] -dependencies = [ - "mkdocstrings-python", -] -``` - -The Python handler is the default *mkdocstrings* handler. -You can change the default handler, -or explicitely set the Python handler as default by defining the `default_handler` -configuration option of `mkdocstrings` in `mkdocs.yml`: - -```yaml title="mkdocs.yml" -plugins: -- mkdocstrings: - default_handler: python -``` - -## Injecting documentation - -With the Python handler installed and configured as default handler, -you can inject documentation for a module, class, function, or any other Python object -with *mkdocstrings*' [autodoc syntax], in your Markdown pages: - -```md -::: path.to.object -``` - -If another handler was defined as default handler, -you can explicitely ask for the Python handler to be used when injecting documentation -with the `handler` option: - -```md -::: path.to.object - handler: python -``` - -## Configuration - -When installed, the Python handler becomes the default *mkdocstrings* handler. -You can configure it in `mkdocs.yml`: - -```yaml title="mkdocs.yml" -plugins: -- mkdocstrings: - handlers: - python: - ... # the Python handler configuration -``` - -### Global-only options - -Some options are **global only**, and go directly under the handler's name. - -[](){#setting-inventories} -#### `inventories` - -This option is used to load Sphinx-compatible objects inventories from other -documentation sites. For example, you can load the standard library -objects inventory like this: - -```yaml title="mkdocs.yml" -plugins: -- mkdocstrings: - handlers: - python: - inventories: - - https://docs.python.org/3/objects.inv -``` - -When loading an inventory, you enable automatic cross-references -to other documentation sites like the standard library docs -or any third-party package docs. Typically, you want to load -the inventories of your project's dependencies, at least those -that are used in the public API. - -See [*mkdocstrings*' documentation on inventories][inventories] -for more details. - - [inventories]: https://mkdocstrings.github.io/usage/#cross-references-to-other-projects-inventories - -Additionally, the Python handler accepts a `domains` option in the inventory options, -which allows to select the inventory domains to load. -By default the Python handler only selects the `py` domain (for Python objects). -You might find useful to also enable the [`std` domain][std domain]: - - [std domain]: https://www.sphinx-doc.org/en/master/usage/restructuredtext/domains.html#the-standard-domain - -```yaml title="mkdocs.yml" -plugins: -- mkdocstrings: - handlers: - python: - inventories: - - url: https://docs.python-requests.org/en/master/objects.inv - domains: [std, py] -``` - -[](){#setting-load_external_modules} -#### `load_external_modules` - -This option allows resolving aliases (imports) to any external module. -Modules are considered external when they are not part -of the package your are injecting documentation for. -Setting this option to `True` will tell the handler to resolve aliases recursively -when they are made public through the [`__all__`][__all__] variable. -By default, the handler will only resolve aliases when they point at a private sibling -of the source package, for example aliases going from `ast` to `_ast`. -Set `load_external_modules` to `False` to prevent even that. - -WARNING: **Use with caution** -This can load a *lot* of modules through [Griffe], -slowing down your build or triggering errors that Griffe does not yet handle. -**We recommend using the [`preload_modules`][] option instead**, -which acts as an include-list rather than as include-all. - -Example: - -```yaml title="mkdocs.yml" -plugins: -- mkdocstrings: - handlers: - python: - load_external_modules: true -``` - - [__all__]: https://docs.python.org/3/tutorial/modules.html#importing-from-a-package - -[](){#setting-locale} -#### `locale` - -The locale to use when translating template strings. The translation system is not fully ready yet, so we don't recommend setting the option for now. - -[](){#setting-paths} -#### `paths` - -This option is used to provide filesystem paths in which to search for Python modules. -Non-absolute paths are computed as relative to MkDocs configuration file. Example: - -```yaml title="mkdocs.yml" -plugins: -- mkdocstrings: - handlers: - python: - paths: [src] # search packages in the src folder -``` - -More details at [Finding modules](#finding-modules). - -[](){#setting-options} -### Global/local options - -The other options can be used both globally *and* locally, under the `options` key. -For example, globally: - -```yaml title="mkdocs.yml" -plugins: -- mkdocstrings: - handlers: - python: - options: - do_something: true -``` - -...and locally, overriding the global configuration: - -```md title="docs/some_page.md" -::: package.module.class - options: - do_something: false -``` - -These options affect how the documentation is collected from sources and rendered. -See the following tables summarizing the options, and get more details for each option -in the following pages: - -- [General options](configuration/general.md): various options that do not fit in the other categories -- [Headings options](configuration/headings.md): options related to headings and the table of contents - (or sidebar, depending on the theme used) -- [Members options](configuration/members.md): options related to filtering or ordering members - in the generated documentation -- [Docstrings options](configuration/docstrings.md): options related to docstrings (parsing and rendering) -- [Signature options](configuration/signatures.md): options related to signatures and type annotations - -## Finding modules - -There are multiple ways to tell the handler where to find your packages/modules. - -**The recommended method is to use the `paths` option, as it's the only one -that works with the `-f` option of MkDocs, allowing to build the documentation -from any location on the file system.** Indeed, the paths provided with the -`paths` option are computed as relative to the configuration file (mkdocs.yml), -so that the current working directory has no impact on the build process: -*you can build the docs from any location on your filesystem*. - -### Using the `paths` option - -TIP: **This is the recommended method.** - -1. mkdocs.yml in root, package in root - ```tree - root/ - mkdocs.yml - package/ - ``` - - ```yaml title="mkdocs.yml" - plugins: - - mkdocstrings: - handlers: - python: - paths: [.] # actually not needed, default - ``` - -1. mkdocs.yml in root, package in subfolder - ```tree - root/ - mkdocs.yml - src/ - package/ - ``` - - ```yaml title="mkdocs.yml" - plugins: - - mkdocstrings: - handlers: - python: - paths: [src] - ``` - -1. mkdocs.yml in subfolder, package in root - ```tree - root/ - docs/ - mkdocs.yml - package/ - ``` - - ```yaml title="mkdocs.yml" - plugins: - - mkdocstrings: - handlers: - python: - paths: [..] - ``` - -1. mkdocs.yml in subfolder, package in subfolder - ```tree - root/ - docs/ - mkdocs.yml - src/ - package/ - ``` - - ```yaml title="mkdocs.yml" - plugins: - - mkdocstrings: - handlers: - python: - paths: [../src] - ``` - -Except for case 1, which is supported by default, **we strongly recommend -setting the path to your packages using this option, even if it works without it** -(for example because your project manager automatically adds `src` to PYTHONPATH), -to make sure anyone can build your docs from any location on their filesystem. - -### Using the PYTHONPATH environment variable - -WARNING: **This method has limitations.** -This method might work for you, with your current setup, -but not for others trying your build your docs with their own setup/environment. -We recommend using the [`paths` method](#using-the-paths-option) instead. - -You can take advantage of the usual Python loading mechanisms. -In Bash and other shells, you can run your command like this -(note the prepended `PYTHONPATH=...`): - -1. mkdocs.yml in root, package in root - ```tree - root/ - mkdocs.yml - package/ - ``` - - ```bash - PYTHONPATH=. mkdocs build # actually not needed, default - ``` - -1. mkdocs.yml in root, package in subfolder - ```tree - root/ - mkdocs.yml - src/ - package/ - ``` - - ```bash - PYTHONPATH=src mkdocs build - ``` - -1. mkdocs.yml in subfolder, package in root - ```tree - root/ - docs/ - mkdocs.yml - package/ - ``` - - ```bash - PYTHONPATH=. mkdocs build -f docs/mkdocs.yml - ``` - -1. mkdocs.yml in subfolder, package in subfolder - ```tree - root/ - docs/ - mkdocs.yml - src/ - package/ - ``` - - ```bash - PYTHONPATH=src mkdocs build -f docs/mkdocs.yml - ``` - -### Installing your package in the current Python environment - -WARNING: **This method has limitations.** -This method might work for you, with your current setup, -but not for others trying your build your docs with their own setup/environment. -We recommend using the [`paths` method](#using-the-paths-option) instead. - -Install your package in the current environment, and run MkDocs: - -/// tab | pip -```bash -. venv/bin/activate -pip install -e . -mkdocs build -``` -/// - -/// tab | PDM -```bash -pdm install -pdm run mkdocs build -``` -/// - -/// tab | Poetry -```bash -poetry install -poetry run mkdocs build -``` -/// diff --git a/duties.py b/duties.py deleted file mode 100644 index 18282747..00000000 --- a/duties.py +++ /dev/null @@ -1,265 +0,0 @@ -"""Development tasks.""" - -from __future__ import annotations - -import os -import re -import sys -from contextlib import contextmanager -from functools import wraps -from importlib.metadata import version as pkgversion -from pathlib import Path -from typing import TYPE_CHECKING, Any, Callable - -from duty import duty, tools - -if TYPE_CHECKING: - from collections.abc import Iterator - - from duty.context import Context - - -PY_SRC_PATHS = (Path(_) for _ in ("src", "tests", "duties.py", "scripts")) -PY_SRC_LIST = tuple(str(_) for _ in PY_SRC_PATHS) -PY_SRC = " ".join(PY_SRC_LIST) -CI = os.environ.get("CI", "0") in {"1", "true", "yes", ""} -WINDOWS = os.name == "nt" -PTY = not WINDOWS and not CI -MULTIRUN = os.environ.get("MULTIRUN", "0") == "1" - - -def pyprefix(title: str) -> str: - if MULTIRUN: - prefix = f"(python{sys.version_info.major}.{sys.version_info.minor})" - return f"{prefix:14}{title}" - return title - - -def not_from_insiders(func: Callable) -> Callable: - @wraps(func) - def wrapper(ctx: Context, *args: Any, **kwargs: Any) -> None: - origin = ctx.run("git config --get remote.origin.url", silent=True) - if "pawamoy-insiders/griffe" in origin: - ctx.run( - lambda: False, - title="Not running this task from insiders repository (do that from public repo instead!)", - ) - return - func(ctx, *args, **kwargs) - - return wrapper - - -@contextmanager -def material_insiders() -> Iterator[bool]: - if "+insiders" in pkgversion("mkdocs-material"): - os.environ["MATERIAL_INSIDERS"] = "true" - try: - yield True - finally: - os.environ.pop("MATERIAL_INSIDERS") - else: - yield False - - -def _get_changelog_version() -> str: - changelog_version_re = re.compile(r"^## \[(\d+\.\d+\.\d+)\].*$") - with Path(__file__).parent.joinpath("CHANGELOG.md").open("r", encoding="utf8") as file: - return next(filter(bool, map(changelog_version_re.match, file))).group(1) # type: ignore[union-attr] - - -@duty -def changelog(ctx: Context, bump: str = "") -> None: - """Update the changelog in-place with latest commits. - - Parameters: - bump: Bump option passed to git-changelog. - """ - ctx.run(tools.git_changelog(bump=bump or None), title="Updating changelog") - ctx.run(tools.yore.check(bump=bump or _get_changelog_version()), title="Checking legacy code") - - -@duty(pre=["check-quality", "check-types", "check-docs", "check-api"]) -def check(ctx: Context) -> None: - """Check it all!""" - - -@duty -def check_quality(ctx: Context) -> None: - """Check the code quality.""" - ctx.run( - tools.ruff.check(*PY_SRC_LIST, config="config/ruff.toml"), - title=pyprefix("Checking code quality"), - ) - - -@duty -def check_docs(ctx: Context) -> None: - """Check if the documentation builds correctly.""" - Path("htmlcov").mkdir(parents=True, exist_ok=True) - Path("htmlcov/index.html").touch(exist_ok=True) - with material_insiders(): - ctx.run( - tools.mkdocs.build(strict=True, verbose=True), - title=pyprefix("Building documentation"), - ) - - -@duty -def check_types(ctx: Context) -> None: - """Check that the code is correctly typed.""" - os.environ["MYPYPATH"] = "src" - os.environ["FORCE_COLOR"] = "1" - ctx.run( - tools.mypy(*PY_SRC_LIST, config_file="config/mypy.ini"), - title=pyprefix("Type-checking"), - # TODO: Update when Pydantic supports 3.14. - nofail=sys.version_info >= (3, 14), - ) - - -@duty -def check_api(ctx: Context, *cli_args: str) -> None: - """Check for API breaking changes.""" - ctx.run( - tools.griffe.check("mkdocstrings_handlers.python", search=["src"], color=True).add_args(*cli_args), - title="Checking for API breaking changes", - nofail=True, - ) - - -@duty -def docs(ctx: Context, *cli_args: str, host: str = "127.0.0.1", port: int = 8000) -> None: - """Serve the documentation (localhost:8000). - - Parameters: - host: The host to serve the docs from. - port: The port to serve the docs on. - """ - with material_insiders(): - ctx.run( - tools.mkdocs.serve(dev_addr=f"{host}:{port}").add_args(*cli_args), - title="Serving documentation", - capture=False, - ) - - -@duty -def docs_deploy(ctx: Context, *, force: bool = False) -> None: - """Deploy the documentation to GitHub pages. - - Parameters: - force: Whether to force deployment, even from non-Insiders version. - """ - os.environ["DEPLOY"] = "true" - with material_insiders() as insiders: - if not insiders: - ctx.run(lambda: False, title="Not deploying docs without Material for MkDocs Insiders!") - origin = ctx.run("git config --get remote.origin.url", silent=True, allow_overrides=False) - if "pawamoy-insiders/mkdocstrings-python" in origin: - ctx.run( - "git remote add upstream git@github.com:mkdocstrings/python", - silent=True, - nofail=True, - allow_overrides=False, - ) - ctx.run( - tools.mkdocs.gh_deploy(remote_name="upstream", force=True), - title="Deploying documentation", - ) - elif force: - ctx.run( - tools.mkdocs.gh_deploy(force=True), - title="Deploying documentation", - ) - else: - ctx.run( - lambda: False, - title="Not deploying docs from public repository (do that from insiders instead!)", - nofail=True, - ) - - -@duty -def format(ctx: Context) -> None: - """Run formatting tools on the code.""" - ctx.run( - tools.ruff.check(*PY_SRC_LIST, config="config/ruff.toml", fix_only=True, exit_zero=True), - title="Auto-fixing code", - ) - ctx.run(tools.ruff.format(*PY_SRC_LIST, config="config/ruff.toml"), title="Formatting code") - - -@duty -def build(ctx: Context) -> None: - """Build source and wheel distributions.""" - ctx.run( - tools.build(), - title="Building source and wheel distributions", - pty=PTY, - ) - - -@duty -@not_from_insiders -def publish(ctx: Context) -> None: - """Publish source and wheel distributions to PyPI.""" - if not Path("dist").exists(): - ctx.run("false", title="No distribution files found") - dists = [str(dist) for dist in Path("dist").iterdir()] - ctx.run( - tools.twine.upload(*dists, skip_existing=True), - title="Publishing source and wheel distributions to PyPI", - pty=PTY, - ) - - -@duty(post=["build", "publish", "docs-deploy"]) -@not_from_insiders -def release(ctx: Context, version: str = "") -> None: - """Release a new Python package. - - Parameters: - version: The new version number to use. - """ - if not (version := (version or input("> Version to release: ")).strip()): - ctx.run("false", title="A version must be provided") - ctx.run("git add pyproject.toml CHANGELOG.md", title="Staging files", pty=PTY) - ctx.run(["git", "commit", "-m", f"chore: Prepare release {version}"], title="Committing changes", pty=PTY) - ctx.run(f"git tag {version}", title="Tagging commit", pty=PTY) - ctx.run("git push", title="Pushing commits", pty=False) - ctx.run("git push --tags", title="Pushing tags", pty=False) - - -@duty(silent=True, aliases=["cov"]) -def coverage(ctx: Context) -> None: - """Report coverage as text and HTML.""" - ctx.run(tools.coverage.combine(), nofail=True) - ctx.run(tools.coverage.report(rcfile="config/coverage.ini"), capture=False) - ctx.run(tools.coverage.html(rcfile="config/coverage.ini")) - - -@duty -def test(ctx: Context, *cli_args: str, match: str = "", snapshot: str = "report") -> None: - """Run the test suite. - - Parameters: - match: A pytest expression to filter selected tests. - snapshot: Whether to "create", "fix", "trim", or "update" snapshots. - """ - py_version = f"{sys.version_info.major}{sys.version_info.minor}" - os.environ["COVERAGE_FILE"] = f".coverage.{py_version}" - args = list(cli_args) - if snapshot == "disable" or not snapshot: - args = ["-n", "auto", "--inline-snapshot=disable"] - else: - args = [f"--inline-snapshot={snapshot}"] - ctx.run( - tools.pytest( - "tests", - config_file="config/pytest.ini", - select=match, - color="yes", - ).add_args(*args), - title=pyprefix("Running tests"), - ) diff --git a/index.html b/index.html new file mode 100644 index 00000000..b6cb52a8 --- /dev/null +++ b/index.html @@ -0,0 +1,47 @@ + Overview - mkdocstrings-python

    mkdocstrings-python

    A Python handler for mkdocstrings.

    ci documentation pypi version gitter


    The Python handler uses Griffe to collect documentation from Python source code. The word "griffe" can sometimes be used instead of "signature" in French. Griffe is able to visit the Abstract Syntax Tree (AST) of the source code to extract useful information. It is also able to execute the code (by importing it) and introspect objects in memory when source code is not available. Finally, it can parse docstrings following different styles.

    Installation¤

    You can install this handler as a mkdocstrings extra:

    pyproject.toml
    # PEP 621 dependencies declaration
    +# adapt to your dependencies manager
    +[project]
    +dependencies = [
    +    "mkdocstrings[python]>=0.18",
    +]
    +

    You can also explicitly depend on the handler:

    pyproject.toml
    # PEP 621 dependencies declaration
    +# adapt to your dependencies manager
    +[project]
    +dependencies = [
    +    "mkdocstrings-python",
    +]
    +

    Preview¤

    mkdocstrings_python_gif

    Features¤

    • Data collection from source code: collection of the object-tree and the docstrings is done thanks to Griffe.

    • Support for type annotations: Griffe collects your type annotations and mkdocstrings uses them to display parameter types or return types. It is even able to automatically add cross-references to other objects from your API, from the standard library or third-party libraries! See how to load inventories to enable it.

    • Recursive documentation of Python objects: just use the module dotted-path as an identifier, and you get the full module docs. You don't need to inject documentation for each class, function, etc.

    • Support for documented attributes: attributes (variables) followed by a docstring (triple-quoted string) will be recognized by Griffe in modules, classes and even in __init__ methods.

    • Multiple docstring-styles support: common support for Google-style, Numpydoc-style, and Sphinx-style docstrings. See Griffe's documentation on docstrings support.

    • Admonition support in Google docstrings: blocks like Note: or Warning: will be transformed to their admonition equivalent. We do not support nested admonitions in docstrings!

    • Every object has a TOC entry: we render a heading for each object, meaning MkDocs picks them into the Table of Contents, which is nicely displayed by the Material theme. Thanks to mkdocstrings cross-reference ability, you can reference other objects within your docstrings, with the classic Markdown syntax: [this object][package.module.object] or directly with [package.module.object][]

    • Source code display: mkdocstrings can add a collapsible div containing the highlighted source code of the Python object.

    \ No newline at end of file diff --git a/index.md b/index.md new file mode 100644 index 00000000..65b60f15 --- /dev/null +++ b/index.md @@ -0,0 +1,50 @@ +# mkdocstrings-python + +A Python handler for [*mkdocstrings*](https://github.com/mkdocstrings/mkdocstrings). + +______________________________________________________________________ + +The Python handler uses [Griffe](https://mkdocstrings.github.io/griffe) to collect documentation from Python source code. The word "griffe" can sometimes be used instead of "signature" in French. Griffe is able to visit the Abstract Syntax Tree (AST) of the source code to extract useful information. It is also able to execute the code (by importing it) and introspect objects in memory when source code is not available. Finally, it can parse docstrings following different styles. + +## Installation + +You can install this handler as a *mkdocstrings* extra: + +pyproject.toml + +```toml +# PEP 621 dependencies declaration +# adapt to your dependencies manager +[project] +dependencies = [ + "mkdocstrings[python]>=0.18", +] + +``` + +You can also explicitly depend on the handler: + +pyproject.toml + +```toml +# PEP 621 dependencies declaration +# adapt to your dependencies manager +[project] +dependencies = [ + "mkdocstrings-python", +] + +``` + +## Preview + +## Features + +- **Data collection from source code**: collection of the object-tree and the docstrings is done thanks to [Griffe](https://github.com/mkdocstrings/griffe). +- **Support for type annotations:** Griffe collects your type annotations and *mkdocstrings* uses them to display parameter types or return types. It is even able to automatically add cross-references to other objects from your API, from the standard library or third-party libraries! See [how to load inventories](https://mkdocstrings.github.io/usage/#cross-references-to-other-projects-inventories) to enable it. +- **Recursive documentation of Python objects:** just use the module dotted-path as an identifier, and you get the full module docs. You don't need to inject documentation for each class, function, etc. +- **Support for documented attributes:** attributes (variables) followed by a docstring (triple-quoted string) will be recognized by Griffe in modules, classes and even in `__init__` methods. +- **Multiple docstring-styles support:** common support for Google-style, Numpydoc-style, and Sphinx-style docstrings. See [Griffe's documentation](https://mkdocstrings.github.io/griffe/docstrings/) on docstrings support. +- **Admonition support in Google docstrings:** blocks like `Note:` or `Warning:` will be transformed to their [admonition](https://squidfunk.github.io/mkdocs-material/reference/admonitions/) equivalent. *We do not support nested admonitions in docstrings!* +- **Every object has a TOC entry:** we render a heading for each object, meaning *MkDocs* picks them into the Table of Contents, which is nicely displayed by the Material theme. Thanks to *mkdocstrings* cross-reference ability, you can reference other objects within your docstrings, with the classic Markdown syntax: `[this object][package.module.object]` or directly with `[package.module.object][]` +- **Source code display:** *mkdocstrings* can add a collapsible div containing the highlighted source code of the Python object. diff --git a/insiders/changelog/index.html b/insiders/changelog/index.html new file mode 100644 index 00000000..7e362033 --- /dev/null +++ b/insiders/changelog/index.html @@ -0,0 +1,35 @@ + Changelog - mkdocstrings-python

    Changelog¤

    mkdocstrings-python Insiders¤

    1.12.1 May 24, 2025¤

    • Visually-lighter admonitions for source code blocks

    1.12.0 March 24, 2025¤

    1.11.0 March 20, 2025¤

    1.10.0 March 10, 2025¤

    1.9.1 December 26, 2024¤

    • Re-add class template for RTD theme
    • Make inheritance diagrams rendering more robust

    1.9.0 September 03, 2024¤

    1.8.3 June 19, 2024¤

    • Update code for Griffe 0.46+ to avoid deprecation warnings

    1.8.2 May 09, 2024¤

    • Don't render cross-refs for default values when signatures aren't separated

    1.8.1 April 19, 2024¤

    • Render enumeration instance name instead of just "value", allowing proper cross-reference

    1.8.0 March 24, 2024¤

    1.7.0 March 24, 2024¤

    1.6.0 January 30, 2024¤

    • Render cross-references to parameters documentation in signatures and attribute values.
    • Add parameter_headings option to render headings for parameters (enabling permalinks and ToC/inventory entries).
    • Render cross-references for default parameter values in signatures.

    1.5.1 September 12, 2023¤

    • Prevent empty auto-summarized Methods section.

    1.5.0 September 05, 2023¤

    • Render function signature overloads.

    1.4.0 August 27, 2023¤

    • Render cross-references in attribute signatures.

    1.3.0 August 24, 2023¤

    • Add "method" symbol type.

    1.2.0 August 20, 2023¤

    1.1.4 July 17, 2023¤

    • Fix heading level increment for class members.

    1.1.3 July 17, 2023¤

    • Fix heading level (avoid with clause preventing to decrease it).

    1.1.2 July 15, 2023¤

    • Use non-breaking spaces after symbol types.

    1.1.1 June 27, 2023¤

    • Correctly escape expressions in signatures and other rendered types.

    1.1.0 June 4, 2023¤

    1.0.0 May 10, 2023¤

    \ No newline at end of file diff --git a/docs/insiders/goals.yml b/insiders/goals.yml similarity index 95% rename from docs/insiders/goals.yml rename to insiders/goals.yml index 71128361..313322fd 100644 --- a/docs/insiders/goals.yml +++ b/insiders/goals.yml @@ -50,4 +50,6 @@ goals: since: 2025/03/20 - name: "Ordering method: `__all__`" ref: /usage/configuration/members/#option-members_order - since: 2025/03/22 \ No newline at end of file + since: 2025/03/24 + - name: "Visually-lighter source code blocks" + since: 2025/05/24 diff --git a/insiders/index.html b/insiders/index.html new file mode 100644 index 00000000..0f3cd561 --- /dev/null +++ b/insiders/index.html @@ -0,0 +1,35 @@ + Insiders - mkdocstrings-python

    Insiders¤

    mkdocstrings-python follows the sponsorware release strategy, which means that new features are first exclusively released to sponsors as part of Insiders. Read on to learn what sponsorships achieve, how to become a sponsor to get access to Insiders, and what's in it for you!

    What is Insiders?¤

    mkdocstrings-python Insiders is a private fork of mkdocstrings-python, hosted as a private GitHub repository. Almost1 all new features are developed as part of this fork, which means that they are immediately available to all eligible sponsors, as they are granted access to this private repository.

    Every feature is tied to a funding goal in monthly subscriptions. When a funding goal is hit, the features that are tied to it are merged back into mkdocstrings-python and released for general availability, making them available to all users. Bugfixes are always released in tandem.

    Sponsorships start as low as $10 a month.2

    What sponsorships achieve¤

    Sponsorships make this project sustainable, as they buy the maintainers of this project time – a very scarce resource – which is spent on the development of new features, bug fixing, stability improvement, issue triage and general support. The biggest bottleneck in Open Source is time.3

    If you're unsure if you should sponsor this project, check out the list of completed funding goals to learn whether you're already using features that were developed with the help of sponsorships. You're most likely using at least a handful of them, thanks to our awesome sponsors!

    What's in it for me?¤

    The moment you become a sponsor, you'll get immediate access to 15 additional features that you can start using right away, and which are currently exclusively available to sponsors:

    These are just the features related to this project. See the complete feature list on the author's main Insiders page.

    Additionally, your sponsorship will give more weight to your upvotes on issues, helping us prioritize work items in our backlog. For more information on how we prioritize work, see this page: Backlog management.

    How to become a sponsor¤

    Thanks for your interest in sponsoring! In order to become an eligible sponsor with your GitHub account, visit pawamoy's sponsor profile, and complete a sponsorship of $10 a month or more. You can use your individual or organization GitHub account for sponsoring.

    Sponsorships lower than $10 a month are also very much appreciated, and useful. They won't grant you access to Insiders, but they will be counted towards reaching sponsorship goals. Every sponsorship helps us implementing new features and releasing them to the public.

    Important: By default, when you're sponsoring @pawamoy through a GitHub organization, all the publicly visible members of the organization will be invited to join our private repositories. If you wish to only grant access to a subset of users, please send a short email to insiders@pawamoy.fr with the name of your organization and the GitHub accounts of the users that should be granted access.

    Tip: to ensure that access is not tied to a particular individual GitHub account, you can create a bot account (i.e. a GitHub account that is not tied to a specific individual), and use this account for the sponsoring. After being granted access to our private repositories, the bot account can create private forks of our private repositories into your own organization, which all members of your organization will have access to.

    You can cancel your sponsorship anytime.4

      Join our awesome sponsors



    If you sponsor publicly, you're automatically added here with a link to your profile and avatar to show your support for mkdocstrings-python. Alternatively, if you wish to keep your sponsorship private, you'll be a silent +1. You can select visibility during checkout and change it afterwards.

    Funding ¤

    Goals¤

    The following section lists all funding goals. Each goal contains a list of features prefixed with a checkmark symbol, denoting whether a feature is already available or planned, but not yet implemented. When the funding goal is hit, the features are released for general availability.

    $ 1,000 — GraviFridge Fluid Renewal¤

    $ 1,500 — HyperLamp Navigation Tips¤

    $ 2,000 — FusionDrive Ejection Configuration¤

    Goals completed¤

    This section lists all funding goals that were previously completed, which means that those features were part of Insiders, but are now generally available and can be used by all users.

    $ 500 — PlasmaVac User Guide¤

    Frequently asked questions¤

    Compatibility¤

    We're building an open source project and want to allow outside collaborators to use mkdocstrings-python locally without having access to Insiders. Is this still possible?

    Yes. Insiders is compatible with mkdocstrings-python. Almost all new features and configuration options are either backward-compatible or implemented behind feature flags. Most Insiders features enhance the overall experience, though while these features add value for the users of your project, they shouldn't be necessary for previewing when making changes to content.

    Payment¤

    We don't want to pay for sponsorship every month. Are there any other options?

    Yes. You can sponsor on a yearly basis by switching your GitHub account to a yearly billing cycle. If for some reason you cannot do that, you could also create a dedicated GitHub account with a yearly billing cycle, which you only use for sponsoring (some sponsors already do that).

    If you have any problems or further questions, please reach out to insiders@pawamoy.fr.

    Terms¤

    Are we allowed to use Insiders under the same terms and conditions as mkdocstrings-python?

    Yes. Whether you're an individual or a company, you may use mkdocstrings-python Insiders precisely under the same terms as mkdocstrings-python, which are given by the ISC license. However, we kindly ask you to respect our fair use policy:

    • Please don't distribute the source code of Insiders. You may freely use it for public, private or commercial projects, privately fork or mirror it, but please don't make the source code public, as it would counteract the sponsorware strategy.
    • If you cancel your subscription, your access to the private repository is revoked, and you will miss out on all future updates of Insiders. However, you may use the latest version that's available to you as long as you like. Just remember that GitHub deletes private forks.

    1. In general, every new feature is first exclusively released to sponsors, but sometimes upstream dependencies enhance existing features that must be supported by mkdocstrings-python

    2. Note that $10 a month is the minimum amount to become eligible for Insiders. While GitHub Sponsors also allows to sponsor lower amounts or one-time amounts, those can't be granted access to Insiders due to technical reasons. Such contributions are still very much welcome as they help ensuring the project's sustainability. 

    3. Making an Open Source project sustainable is exceptionally hard: maintainers burn out, projects are abandoned. That's not great and very unpredictable. The sponsorware model ensures that if you decide to use mkdocstrings-python, you can be sure that bugs are fixed quickly and new features are added regularly. 

    4. If you cancel your sponsorship, GitHub schedules a cancellation request which will become effective at the end of the billing cycle. This means that even though you cancel your sponsorship, you will keep your access to Insiders as long as your cancellation isn't effective. All charges are processed by GitHub through Stripe. As we don't receive any information regarding your payment, and GitHub doesn't offer refunds, sponsorships are non-refundable. 

    \ No newline at end of file diff --git a/insiders/installation/index.html b/insiders/installation/index.html new file mode 100644 index 00000000..e08a4073 --- /dev/null +++ b/insiders/installation/index.html @@ -0,0 +1,39 @@ + Getting started with Insiders - mkdocstrings-python

    Getting started with Insiders¤

    mkdocstrings-python Insiders is a compatible drop-in replacement for mkdocstrings-python, and can be installed similarly using pip or git. Note that in order to access the Insiders repository, you need to become an eligible sponsor of @pawamoy on GitHub.

    Installation¤

    with the insiders tool¤

    insiders is a tool that helps you keep up-to-date versions of Insiders projects in the PyPI index of your choice (self-hosted, Google registry, Artifactory, etc.).

    We kindly ask that you do not upload the distributions to public registries, as it is against our Terms of use.

    with pip (ssh/https)¤

    mkdocstrings-python Insiders can be installed with pip using SSH:

    pip install git+ssh://git@github.com/pawamoy-insiders/mkdocstrings-python.git
    +

    Or using HTTPS:

    pip install git+https://${GH_TOKEN}@github.com/pawamoy-insiders/mkdocstrings-python.git
    +
    How to get a GitHub personal access token?

    The GH_TOKEN environment variable is a GitHub token. It can be obtained by creating a personal access token for your GitHub account. It will give you access to the Insiders repository, programmatically, from the command line or GitHub Actions workflows:

    1. Go to https://github.com/settings/tokens
    2. Click on Generate a new token
    3. Enter a name and select the repo scope
    4. Generate the token and store it in a safe place

    Note that the personal access token must be kept secret at all times, as it allows the owner to access your private repositories.

    with Git¤

    Of course, you can use mkdocstrings-python Insiders directly using Git:

    git clone git@github.com:pawamoy-insiders/mkdocstrings-python
    +

    When cloning with Git, the package must be installed:

    pip install -e mkdocstrings-python
    +

    Upgrading¤

    When upgrading Insiders, you should always check the version of mkdocstrings-python which makes up the first part of the version qualifier. For example, a version like 8.x.x.4.x.x means that Insiders 4.x.x is currently based on 8.x.x.

    If the major version increased, it's a good idea to consult the changelog and go through the steps to ensure your configuration is up to date and all necessary changes have been made.

    \ No newline at end of file diff --git a/docs/js/feedback.js b/js/feedback.js similarity index 100% rename from docs/js/feedback.js rename to js/feedback.js diff --git a/docs/js/insiders.js b/js/insiders.js similarity index 100% rename from docs/js/insiders.js rename to js/insiders.js diff --git a/js/timeago.min.js b/js/timeago.min.js new file mode 100644 index 00000000..a8530a5f --- /dev/null +++ b/js/timeago.min.js @@ -0,0 +1,2 @@ +/* Taken from https://cdnjs.cloudflare.com/ajax/libs/timeago.js/4.0.2/timeago.min.js */ +!function(s,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((s=s||self).timeago={})}(this,function(s){"use strict";var a=["second","minute","hour","day","week","month","year"];function n(s,n){if(0===n)return["just now","right now"];var e=a[Math.floor(n/2)];return 1=m[t]&&t=m[e]&&e 0) { + var locale = getLocale(nodes[0]); + timeago.render(nodes, locale); + } + }) +} else { + var nodes = document.querySelectorAll('.timeago'); + if (nodes.length > 0) { + var locale = getLocale(nodes[0]); + timeago.render(nodes, locale); + } +} diff --git a/license/index.html b/license/index.html new file mode 100644 index 00000000..592dd1f7 --- /dev/null +++ b/license/index.html @@ -0,0 +1,50 @@ + License - mkdocstrings-python

    License¤

    ISC License
    +
    +Copyright (c) 2021, Timothée Mazzucotelli
    +
    +Permission to use, copy, modify, and/or distribute this software for any
    +purpose with or without fee is hereby granted, provided that the above
    +copyright notice and this permission notice appear in all copies.
    +
    +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
    +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
    +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
    +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
    +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    +
    \ No newline at end of file diff --git a/llms-full.txt b/llms-full.txt new file mode 100644 index 00000000..741bd236 --- /dev/null +++ b/llms-full.txt @@ -0,0 +1,3287 @@ +# mkdocstrings-python + +> A Python handler for mkdocstrings. + +# Usage + +# mkdocstrings-python + +A Python handler for [*mkdocstrings*](https://github.com/mkdocstrings/mkdocstrings). + +______________________________________________________________________ + +The Python handler uses [Griffe](https://mkdocstrings.github.io/griffe) to collect documentation from Python source code. The word "griffe" can sometimes be used instead of "signature" in French. Griffe is able to visit the Abstract Syntax Tree (AST) of the source code to extract useful information. It is also able to execute the code (by importing it) and introspect objects in memory when source code is not available. Finally, it can parse docstrings following different styles. + +## Installation + +You can install this handler as a *mkdocstrings* extra: + +pyproject.toml + +```toml +# PEP 621 dependencies declaration +# adapt to your dependencies manager +[project] +dependencies = [ + "mkdocstrings[python]>=0.18", +] + +``` + +You can also explicitly depend on the handler: + +pyproject.toml + +```toml +# PEP 621 dependencies declaration +# adapt to your dependencies manager +[project] +dependencies = [ + "mkdocstrings-python", +] + +``` + +## Preview + +## Features + +- **Data collection from source code**: collection of the object-tree and the docstrings is done thanks to [Griffe](https://github.com/mkdocstrings/griffe). +- **Support for type annotations:** Griffe collects your type annotations and *mkdocstrings* uses them to display parameter types or return types. It is even able to automatically add cross-references to other objects from your API, from the standard library or third-party libraries! See [how to load inventories](https://mkdocstrings.github.io/usage/#cross-references-to-other-projects-inventories) to enable it. +- **Recursive documentation of Python objects:** just use the module dotted-path as an identifier, and you get the full module docs. You don't need to inject documentation for each class, function, etc. +- **Support for documented attributes:** attributes (variables) followed by a docstring (triple-quoted string) will be recognized by Griffe in modules, classes and even in `__init__` methods. +- **Multiple docstring-styles support:** common support for Google-style, Numpydoc-style, and Sphinx-style docstrings. See [Griffe's documentation](https://mkdocstrings.github.io/griffe/docstrings/) on docstrings support. +- **Admonition support in Google docstrings:** blocks like `Note:` or `Warning:` will be transformed to their [admonition](https://squidfunk.github.io/mkdocs-material/reference/admonitions/) equivalent. *We do not support nested admonitions in docstrings!* +- **Every object has a TOC entry:** we render a heading for each object, meaning *MkDocs* picks them into the Table of Contents, which is nicely displayed by the Material theme. Thanks to *mkdocstrings* cross-reference ability, you can reference other objects within your docstrings, with the classic Markdown syntax: `[this object][package.module.object]` or directly with `[package.module.object][]` +- **Source code display:** *mkdocstrings* can add a collapsible div containing the highlighted source code of the Python object. +# API + +# python + +Python handler for mkdocstrings. + +Modules: + +- **`config`** – Deprecated. Import from mkdocstrings_handlers.python directly. +- **`handler`** – Deprecated. Import from mkdocstrings_handlers.python directly. +- **`rendering`** – Deprecated. Import from mkdocstrings_handlers.python directly. + +Classes: + +- **`AutoStyleOptions`** – Auto style docstring options. +- **`AutorefsHook`** – Autorefs hook. +- **`GoogleStyleOptions`** – Google style docstring options. +- **`Inventory`** – An inventory. +- **`NumpyStyleOptions`** – Numpy style docstring options. +- **`PerStyleOptions`** – Per style options. +- **`PythonConfig`** – Python handler configuration. +- **`PythonHandler`** – The Python handler class. +- **`PythonInputConfig`** – Python handler configuration. +- **`PythonInputOptions`** – Accepted input options. +- **`PythonOptions`** – Final options passed as template context. +- **`SphinxStyleOptions`** – Sphinx style docstring options. +- **`SummaryOption`** – Summary option. + +Functions: + +- **`do_as_attributes_section`** – Build an attributes section from a list of attributes. +- **`do_as_classes_section`** – Build a classes section from a list of classes. +- **`do_as_functions_section`** – Build a functions section from a list of functions. +- **`do_as_modules_section`** – Build a modules section from a list of modules. +- **`do_backlink_tree`** – Build a tree of backlinks. +- **`do_crossref`** – Deprecated. Filter to create cross-references. +- **`do_filter_objects`** – Filter a dictionary of objects based on their docstrings. +- **`do_format_attribute`** – Format an attribute. +- **`do_format_code`** – Format code. +- **`do_format_signature`** – Format a signature. +- **`do_get_template`** – Get the template name used to render an object. +- **`do_multi_crossref`** – Deprecated. Filter to create cross-references. +- **`do_order_members`** – Order members given an ordering method. +- **`do_split_path`** – Split object paths for building cross-references. +- **`get_handler`** – Return an instance of PythonHandler. + +Attributes: + +- **`Order`** – Ordering methods. +- **`Tree`** – A tree type. Each node holds a tuple of items. +- **`do_stash_crossref`** – Filter to stash cross-references (and restore them after formatting and highlighting). + +## Order + +```python +Order = Literal['__all__', 'alphabetical', 'source'] + +``` + +Ordering methods. + +- `__all__`: order members according to `__all__` module attributes, if declared; +- `alphabetical`: order members alphabetically; +- `source`: order members as they appear in the source file. + +## Tree + +```python +Tree = dict[tuple[_T, ...], 'Tree'] + +``` + +A tree type. Each node holds a tuple of items. + +## do_stash_crossref + +```python +do_stash_crossref = _StashCrossRefFilter() + +``` + +Filter to stash cross-references (and restore them after formatting and highlighting). + +## AutoStyleOptions + +```python +AutoStyleOptions( + method: Literal["heuristics", "max_sections"] = "heuristics", + style_order: list[str] = lambda: ["sphinx", "google", "numpy"](), + default: str | None = None, + per_style_options: PerStyleOptions = PerStyleOptions(), +) + +``` + +Auto style docstring options. + +Methods: + +- **`from_data`** – Create an instance from a dictionary. + +Attributes: + +- **`default`** (`str | None`) – The default docstring style to use if no other style is detected. +- **`method`** (`Literal['heuristics', 'max_sections']`) – The method to use to determine the docstring style. +- **`per_style_options`** (`PerStyleOptions`) – Per-style options. +- **`style_order`** (`list[str]`) – The order of the docstring styles to try. + +### default + +```python +default: str | None = None + +``` + +The default docstring style to use if no other style is detected. + +### method + +```python +method: Literal['heuristics', 'max_sections'] = 'heuristics' + +``` + +The method to use to determine the docstring style. + +### per_style_options + +```python +per_style_options: PerStyleOptions = field(default_factory=PerStyleOptions) + +``` + +Per-style options. + +### style_order + +```python +style_order: list[str] = field(default_factory=lambda: ['sphinx', 'google', 'numpy']) + +``` + +The order of the docstring styles to try. + +### from_data + +```python +from_data(**data: Any) -> Self + +``` + +Create an instance from a dictionary. + +## AutorefsHook + +```python +AutorefsHook(current_object: Object | Alias, config: dict[str, Any]) + +``` + +``` + + flowchart TD + mkdocstrings_handlers.python.AutorefsHook[AutorefsHook] + + + + click mkdocstrings_handlers.python.AutorefsHook href "" "mkdocstrings_handlers.python.AutorefsHook" + +``` + +Autorefs hook. + +With this hook, we're able to add context to autorefs (cross-references), such as originating file path and line number, to improve error reporting. + +Parameters: + +- ### **`current_object`** + + (`Object | Alias`) – The object being rendered. + +- ### **`config`** + + (`dict[str, Any]`) – The configuration dictionary. + +Methods: + +- **`expand_identifier`** – Expand an identifier. +- **`get_context`** – Get the context for the current object. + +Attributes: + +- **`config`** – The configuration options. +- **`current_object`** – The current object being rendered. + +### config + +```python +config = config + +``` + +The configuration options. + +### current_object + +```python +current_object = current_object + +``` + +The current object being rendered. + +### expand_identifier + +```python +expand_identifier(identifier: str) -> str + +``` + +Expand an identifier. + +Parameters: + +- #### **`identifier`** + + (`str`) – The identifier to expand. + +Returns: + +- `str` – The expanded identifier. + +### get_context + +```python +get_context() -> Context + +``` + +Get the context for the current object. + +Returns: + +- `Context` – The context. + +## GoogleStyleOptions + +```python +GoogleStyleOptions( + ignore_init_summary: bool = False, + returns_multiple_items: bool = True, + returns_named_value: bool = True, + returns_type_in_property_summary: bool = False, + receives_multiple_items: bool = True, + receives_named_value: bool = True, + trim_doctest_flags: bool = True, + warn_unknown_params: bool = True, +) + +``` + +Google style docstring options. + +Attributes: + +- **`ignore_init_summary`** (`bool`) – Whether to ignore the summary in __init__ methods' docstrings. +- **`receives_multiple_items`** (`bool`) – Whether to parse multiple items in Receives sections. +- **`receives_named_value`** (`bool`) – Whether to parse Receives section items as name and description, rather than type and description. +- **`returns_multiple_items`** (`bool`) – Whether to parse multiple items in Yields and Returns sections. +- **`returns_named_value`** (`bool`) – Whether to parse Yields and Returns section items as name and description, rather than type and description. +- **`returns_type_in_property_summary`** (`bool`) – Whether to parse the return type of properties at the beginning of their summary: str: Summary of the property. +- **`trim_doctest_flags`** (`bool`) – Whether to remove doctest flags from Python example blocks. +- **`warn_unknown_params`** (`bool`) – Warn about documented parameters not appearing in the signature. + +### ignore_init_summary + +```python +ignore_init_summary: bool = False + +``` + +Whether to ignore the summary in `__init__` methods' docstrings. + +### receives_multiple_items + +```python +receives_multiple_items: bool = True + +``` + +Whether to parse multiple items in `Receives` sections. + +When true, each item's continuation lines must be indented. When false (single item), no further indentation is required. + +### receives_named_value + +```python +receives_named_value: bool = True + +``` + +Whether to parse `Receives` section items as name and description, rather than type and description. + +When true, type must be wrapped in parentheses: `(int): Description.`. Names are optional: `name (int): Description.`. When false, parentheses are optional but the items cannot be named: `int: Description`. + +### returns_multiple_items + +```python +returns_multiple_items: bool = True + +``` + +Whether to parse multiple items in `Yields` and `Returns` sections. + +When true, each item's continuation lines must be indented. When false (single item), no further indentation is required. + +### returns_named_value + +```python +returns_named_value: bool = True + +``` + +Whether to parse `Yields` and `Returns` section items as name and description, rather than type and description. + +When true, type must be wrapped in parentheses: `(int): Description.`. Names are optional: `name (int): Description.`. When false, parentheses are optional but the items cannot be named: `int: Description`. + +### returns_type_in_property_summary + +```python +returns_type_in_property_summary: bool = False + +``` + +Whether to parse the return type of properties at the beginning of their summary: `str: Summary of the property`. + +### trim_doctest_flags + +```python +trim_doctest_flags: bool = True + +``` + +Whether to remove doctest flags from Python example blocks. + +### warn_unknown_params + +```python +warn_unknown_params: bool = True + +``` + +Warn about documented parameters not appearing in the signature. + +## Inventory + +```python +Inventory(url: str, base_url: str | None = None, domains: list[str] = lambda: ['py']()) + +``` + +An inventory. + +Attributes: + +- **`base_url`** (`str | None`) – The base URL of the inventory. +- **`domains`** (`list[str]`) – The domains to load from the inventory. +- **`url`** (`str`) – The URL of the inventory. + +### base_url + +```python +base_url: str | None = None + +``` + +The base URL of the inventory. + +### domains + +```python +domains: list[str] = field(default_factory=lambda: ['py']) + +``` + +The domains to load from the inventory. + +### url + +```python +url: str + +``` + +The URL of the inventory. + +## NumpyStyleOptions + +```python +NumpyStyleOptions( + ignore_init_summary: bool = False, + trim_doctest_flags: bool = True, + warn_unknown_params: bool = True, +) + +``` + +Numpy style docstring options. + +Attributes: + +- **`ignore_init_summary`** (`bool`) – Whether to ignore the summary in __init__ methods' docstrings. +- **`trim_doctest_flags`** (`bool`) – Whether to remove doctest flags from Python example blocks. +- **`warn_unknown_params`** (`bool`) – Warn about documented parameters not appearing in the signature. + +### ignore_init_summary + +```python +ignore_init_summary: bool = False + +``` + +Whether to ignore the summary in `__init__` methods' docstrings. + +### trim_doctest_flags + +```python +trim_doctest_flags: bool = True + +``` + +Whether to remove doctest flags from Python example blocks. + +### warn_unknown_params + +```python +warn_unknown_params: bool = True + +``` + +Warn about documented parameters not appearing in the signature. + +## PerStyleOptions + +```python +PerStyleOptions( + google: GoogleStyleOptions = GoogleStyleOptions(), + numpy: NumpyStyleOptions = NumpyStyleOptions(), + sphinx: SphinxStyleOptions = SphinxStyleOptions(), +) + +``` + +Per style options. + +Methods: + +- **`from_data`** – Create an instance from a dictionary. + +Attributes: + +- **`google`** (`GoogleStyleOptions`) – Google-style options. +- **`numpy`** (`NumpyStyleOptions`) – Numpydoc-style options. +- **`sphinx`** (`SphinxStyleOptions`) – Sphinx-style options. + +### google + +```python +google: GoogleStyleOptions = field(default_factory=GoogleStyleOptions) + +``` + +Google-style options. + +### numpy + +```python +numpy: NumpyStyleOptions = field(default_factory=NumpyStyleOptions) + +``` + +Numpydoc-style options. + +### sphinx + +```python +sphinx: SphinxStyleOptions = field(default_factory=SphinxStyleOptions) + +``` + +Sphinx-style options. + +### from_data + +```python +from_data(**data: Any) -> Self + +``` + +Create an instance from a dictionary. + +## PythonConfig + +```python +PythonConfig( + inventories: list[Inventory] = list(), + paths: list[str] = lambda: ["."](), + load_external_modules: bool | None = None, + options: dict[str, Any] = dict(), + locale: str | None = None, +) + +``` + +``` + + flowchart TD + mkdocstrings_handlers.python.PythonConfig[PythonConfig] + mkdocstrings_handlers.python._internal.config.PythonInputConfig[PythonInputConfig] + + mkdocstrings_handlers.python._internal.config.PythonInputConfig --> mkdocstrings_handlers.python.PythonConfig + + + + click mkdocstrings_handlers.python.PythonConfig href "" "mkdocstrings_handlers.python.PythonConfig" + click mkdocstrings_handlers.python._internal.config.PythonInputConfig href "" "mkdocstrings_handlers.python._internal.config.PythonInputConfig" + +``` + +Python handler configuration. + +Methods: + +- **`coerce`** – Coerce data. +- **`from_data`** – Create an instance from a dictionary. + +Attributes: + +- **`inventories`** (`list[Inventory]`) – The object inventories to load. +- **`load_external_modules`** (`bool | None`) – Whether to always load external modules/packages. +- **`locale`** (`str | None`) – The locale to use when translating template strings. +- **`options`** (`dict[str, Any]`) – Configuration options for collecting and rendering objects. +- **`paths`** (`list[str]`) – The paths in which to search for Python packages. + +### inventories + +```python +inventories: list[Inventory] = field(default_factory=list) + +``` + +The object inventories to load. + +### load_external_modules + +```python +load_external_modules: bool | None = None + +``` + +Whether to always load external modules/packages. + +### locale + +```python +locale: str | None = None + +``` + +The locale to use when translating template strings. + +### options + +```python +options: dict[str, Any] = field(default_factory=dict) + +``` + +Configuration options for collecting and rendering objects. + +### paths + +```python +paths: list[str] = field(default_factory=lambda: ['.']) + +``` + +The paths in which to search for Python packages. + +### coerce + +```python +coerce(**data: Any) -> MutableMapping[str, Any] + +``` + +Coerce data. + +### from_data + +```python +from_data(**data: Any) -> Self + +``` + +Create an instance from a dictionary. + +## PythonHandler + +```python +PythonHandler(config: PythonConfig, base_dir: Path, **kwargs: Any) + +``` + +``` + + flowchart TD + mkdocstrings_handlers.python.PythonHandler[PythonHandler] + mkdocstrings._internal.handlers.base.BaseHandler[BaseHandler] + + mkdocstrings._internal.handlers.base.BaseHandler --> mkdocstrings_handlers.python.PythonHandler + + + + click mkdocstrings_handlers.python.PythonHandler href "" "mkdocstrings_handlers.python.PythonHandler" + click mkdocstrings._internal.handlers.base.BaseHandler href "" "mkdocstrings._internal.handlers.base.BaseHandler" + +``` + +The Python handler class. + +Parameters: + +- ### **`config`** + + (`PythonConfig`) – The handler configuration. + +- ### **`base_dir`** + + (`Path`) – The base directory of the project. + +- ### **`**kwargs`** + + (`Any`, default: `{}` ) – Arguments passed to the parent constructor. + +Methods: + +- **`collect`** – Collect the documentation for the given identifier. +- **`do_convert_markdown`** – Render Markdown text; for use inside templates. +- **`do_heading`** – Render an HTML heading and register it for the table of contents. For use inside templates. +- **`get_aliases`** – Get the aliases for the given identifier. +- **`get_extended_templates_dirs`** – Load template extensions for the given handler, return their templates directories. +- **`get_headings`** – Return and clear the headings gathered so far. +- **`get_inventory_urls`** – Return the URLs of the inventory files to download. +- **`get_options`** – Get combined default, global and local options. +- **`get_templates_dir`** – Return the path to the handler's templates directory. +- **`load_inventory`** – Yield items and their URLs from an inventory file streamed from in_file. +- **`normalize_extension_paths`** – Resolve extension paths relative to config file. +- **`render`** – Render the collected data. +- **`render_backlinks`** – Render the backlinks. +- **`teardown`** – Teardown the handler. +- **`update_env`** – Update the Jinja environment with custom filters and tests. + +Attributes: + +- **`base_dir`** – The base directory of the project. +- **`config`** – The handler configuration. +- **`custom_templates`** – The path to custom templates. +- **`domain`** (`str`) – The cross-documentation domain/language for this handler. +- **`enable_inventory`** (`bool`) – Whether this handler is interested in enabling the creation of the objects.inv Sphinx inventory file. +- **`env`** – The Jinja environment. +- **`extra_css`** (`str`) – Extra CSS. +- **`fallback_config`** (`dict`) – Fallback configuration when searching anchors for identifiers. +- **`fallback_theme`** (`str`) – The fallback theme. +- **`global_options`** – The global configuration options (in mkdocs.yml). +- **`md`** (`Markdown`) – The Markdown instance. +- **`mdx`** – The Markdown extensions to use. +- **`mdx_config`** – The configuration for the Markdown extensions. +- **`name`** (`str`) – The handler's name. +- **`outer_layer`** (`bool`) – Whether we're in the outer Markdown conversion layer. +- **`theme`** – The selected theme. + +### base_dir + +```python +base_dir = base_dir + +``` + +The base directory of the project. + +### config + +```python +config = config + +``` + +The handler configuration. + +### custom_templates + +```python +custom_templates = custom_templates + +``` + +The path to custom templates. + +### domain + +```python +domain: str = 'py' + +``` + +The cross-documentation domain/language for this handler. + +### enable_inventory + +```python +enable_inventory: bool = True + +``` + +Whether this handler is interested in enabling the creation of the `objects.inv` Sphinx inventory file. + +### env + +```python +env = Environment(autoescape=True, loader=FileSystemLoader(paths), auto_reload=False) + +``` + +The Jinja environment. + +### extra_css + +```python +extra_css: str = '' + +``` + +Extra CSS. + +### fallback_config + +```python +fallback_config: dict = {} + +``` + +Fallback configuration when searching anchors for identifiers. + +### fallback_theme + +```python +fallback_theme: str = 'material' + +``` + +The fallback theme. + +### global_options + +```python +global_options = global_options + +``` + +The global configuration options (in `mkdocs.yml`). + +### md + +```python +md: Markdown + +``` + +The Markdown instance. + +Raises: + +- `RuntimeError` – When the Markdown instance is not set yet. + +### mdx + +```python +mdx = mdx + +``` + +The Markdown extensions to use. + +### mdx_config + +```python +mdx_config = mdx_config + +``` + +The configuration for the Markdown extensions. + +### name + +```python +name: str = 'python' + +``` + +The handler's name. + +### outer_layer + +```python +outer_layer: bool + +``` + +Whether we're in the outer Markdown conversion layer. + +### theme + +```python +theme = theme + +``` + +The selected theme. + +### collect + +```python +collect(identifier: str, options: PythonOptions) -> CollectorItem + +``` + +Collect the documentation for the given identifier. + +Parameters: + +- #### **`identifier`** + + (`str`) – The identifier of the object to collect. + +- #### **`options`** + + (`PythonOptions`) – The options to use for the collection. + +Returns: + +- `CollectorItem` – The collected item. + +### do_convert_markdown + +```python +do_convert_markdown( + text: str, + heading_level: int, + html_id: str = "", + *, + strip_paragraph: bool = False, + autoref_hook: AutorefsHookInterface | None = None +) -> Markup + +``` + +Render Markdown text; for use inside templates. + +Parameters: + +- #### **`text`** + + (`str`) – The text to convert. + +- #### **`heading_level`** + + (`int`) – The base heading level to start all Markdown headings from. + +- #### **`html_id`** + + (`str`, default: `''` ) – The HTML id of the element that's considered the parent of this element. + +- #### **`strip_paragraph`** + + (`bool`, default: `False` ) – Whether to exclude the

    tag from around the whole output. + +Returns: + +- `Markup` – An HTML string. + +### do_heading + +```python +do_heading( + content: Markup, + heading_level: int, + *, + role: str | None = None, + hidden: bool = False, + toc_label: str | None = None, + **attributes: str +) -> Markup + +``` + +Render an HTML heading and register it for the table of contents. For use inside templates. + +Parameters: + +- #### **`content`** + + (`Markup`) – The HTML within the heading. + +- #### **`heading_level`** + + (`int`) – The level of heading (e.g. 3 -> h3). + +- #### **`role`** + + (`str | None`, default: `None` ) – An optional role for the object bound to this heading. + +- #### **`hidden`** + + (`bool`, default: `False` ) – If True, only register it for the table of contents, don't render anything. + +- #### **`toc_label`** + + (`str | None`, default: `None` ) – The title to use in the table of contents ('data-toc-label' attribute). + +- #### **`**attributes`** + + (`str`, default: `{}` ) – Any extra HTML attributes of the heading. + +Returns: + +- `Markup` – An HTML string. + +### get_aliases + +```python +get_aliases(identifier: str) -> tuple[str, ...] + +``` + +Get the aliases for the given identifier. + +Parameters: + +- #### **`identifier`** + + (`str`) – The identifier to get the aliases for. + +Returns: + +- `tuple[str, ...]` – The aliases. + +### get_extended_templates_dirs + +```python +get_extended_templates_dirs(handler: str) -> list[Path] + +``` + +Load template extensions for the given handler, return their templates directories. + +Parameters: + +- #### **`handler`** + + (`str`) – The name of the handler to get the extended templates directory of. + +Returns: + +- `list[Path]` – The extensions templates directories. + +### get_headings + +```python +get_headings() -> Sequence[Element] + +``` + +Return and clear the headings gathered so far. + +Returns: + +- `Sequence[Element]` – A list of HTML elements. + +### get_inventory_urls + +```python +get_inventory_urls() -> list[tuple[str, dict[str, Any]]] + +``` + +Return the URLs of the inventory files to download. + +### get_options + +```python +get_options(local_options: Mapping[str, Any]) -> HandlerOptions + +``` + +Get combined default, global and local options. + +Parameters: + +- #### **`local_options`** + + (`Mapping[str, Any]`) – The local options. + +Returns: + +- `HandlerOptions` – The combined options. + +### get_templates_dir + +```python +get_templates_dir(handler: str | None = None) -> Path + +``` + +Return the path to the handler's templates directory. + +Override to customize how the templates directory is found. + +Parameters: + +- #### **`handler`** + + (`str | None`, default: `None` ) – The name of the handler to get the templates directory of. + +Raises: + +- `ModuleNotFoundError` – When no such handler is installed. +- `FileNotFoundError` – When the templates directory cannot be found. + +Returns: + +- `Path` – The templates directory path. + +### load_inventory + +```python +load_inventory( + in_file: BinaryIO, + url: str, + base_url: str | None = None, + domains: list[str] | None = None, + **kwargs: Any +) -> Iterator[tuple[str, str]] + +``` + +Yield items and their URLs from an inventory file streamed from `in_file`. + +This implements mkdocstrings' `load_inventory` "protocol" (see mkdocstrings.plugin). + +Parameters: + +- #### **`in_file`** + + (`BinaryIO`) – The binary file-like object to read the inventory from. + +- #### **`url`** + + (`str`) – The URL that this file is being streamed from (used to guess base_url). + +- #### **`base_url`** + + (`str | None`, default: `None` ) – The URL that this inventory's sub-paths are relative to. + +- #### **`domains`** + + (`list[str] | None`, default: `None` ) – A list of domain strings to filter the inventory by, when not passed, "py" will be used. + +- #### **`**kwargs`** + + (`Any`, default: `{}` ) – Ignore additional arguments passed from the config. + +Yields: + +- `tuple[str, str]` – Tuples of (item identifier, item URL). + +### normalize_extension_paths + +```python +normalize_extension_paths(extensions: Sequence) -> Sequence + +``` + +Resolve extension paths relative to config file. + +Parameters: + +- #### **`extensions`** + + (`Sequence`) – The extensions (configuration) to normalize. + +Returns: + +- `Sequence` – The normalized extensions. + +### render + +```python +render(data: CollectorItem, options: PythonOptions) -> str + +``` + +Render the collected data. + +Parameters: + +- #### **`data`** + + (`CollectorItem`) – The collected data. + +- #### **`options`** + + (`PythonOptions`) – The options to use for rendering. + +Returns: + +- `str` – The rendered data (HTML). + +### render_backlinks + +```python +render_backlinks(backlinks: Mapping[str, Iterable[Backlink]]) -> str + +``` + +Render the backlinks. + +Parameters: + +- #### **`backlinks`** + + (`Mapping[str, Iterable[Backlink]]`) – The backlinks to render. + +Returns: + +- `str` – The rendered backlinks (HTML). + +### teardown + +```python +teardown() -> None + +``` + +Teardown the handler. + +This method should be implemented to, for example, terminate a subprocess that was started when creating the handler instance. + +### update_env + +```python +update_env(config: Any) -> None + +``` + +Update the Jinja environment with custom filters and tests. + +Parameters: + +- #### **`config`** + + (`Any`) – The SSG configuration. + +## PythonInputConfig + +```python +PythonInputConfig( + inventories: list[str | Inventory] = list(), + paths: list[str] = lambda: ["."](), + load_external_modules: bool | None = None, + options: PythonInputOptions = PythonInputOptions(), + locale: str | None = None, +) + +``` + +Python handler configuration. + +Methods: + +- **`coerce`** – Coerce data. +- **`from_data`** – Create an instance from a dictionary. + +Attributes: + +- **`inventories`** (`list[str | Inventory]`) – The inventories to load. +- **`load_external_modules`** (`bool | None`) – Whether to always load external modules/packages. +- **`locale`** (`str | None`) – The locale to use when translating template strings. +- **`options`** (`PythonInputOptions`) – Configuration options for collecting and rendering objects. +- **`paths`** (`list[str]`) – The paths in which to search for Python packages. + +### inventories + +```python +inventories: list[str | Inventory] = field(default_factory=list) + +``` + +The inventories to load. + +### load_external_modules + +```python +load_external_modules: bool | None = None + +``` + +Whether to always load external modules/packages. + +### locale + +```python +locale: str | None = None + +``` + +The locale to use when translating template strings. + +### options + +```python +options: PythonInputOptions = field(default_factory=PythonInputOptions) + +``` + +Configuration options for collecting and rendering objects. + +### paths + +```python +paths: list[str] = field(default_factory=lambda: ['.']) + +``` + +The paths in which to search for Python packages. + +### coerce + +```python +coerce(**data: Any) -> MutableMapping[str, Any] + +``` + +Coerce data. + +### from_data + +```python +from_data(**data: Any) -> Self + +``` + +Create an instance from a dictionary. + +## PythonInputOptions + +```python +PythonInputOptions( + allow_inspection: bool = True, + force_inspection: bool = False, + annotations_path: Literal["brief", "source", "full"] = "brief", + backlinks: Literal["flat", "tree", False] = False, + docstring_options: ( + GoogleStyleOptions + | NumpyStyleOptions + | SphinxStyleOptions + | AutoStyleOptions + | None + ) = None, + docstring_section_style: Literal["table", "list", "spacy"] = "table", + docstring_style: Literal["auto", "google", "numpy", "sphinx"] | None = "google", + extensions: list[str | dict[str, Any]] = list(), + filters: list[str] | Literal["public"] = lambda: copy()(), + find_stubs_package: bool = False, + group_by_category: bool = True, + heading: str = "", + heading_level: int = 2, + inherited_members: bool | list[str] = False, + line_length: int = 60, + members: list[str] | bool | None = None, + members_order: Order | list[Order] = "alphabetical", + merge_init_into_class: bool = False, + modernize_annotations: bool = False, + parameter_headings: bool = False, + preload_modules: list[str] = list(), + relative_crossrefs: bool = False, + scoped_crossrefs: bool = False, + show_overloads: bool = True, + separate_signature: bool = False, + show_bases: bool = True, + show_category_heading: bool = False, + show_docstring_attributes: bool = True, + show_docstring_classes: bool = True, + show_docstring_description: bool = True, + show_docstring_examples: bool = True, + show_docstring_functions: bool = True, + show_docstring_modules: bool = True, + show_docstring_other_parameters: bool = True, + show_docstring_parameters: bool = True, + show_docstring_raises: bool = True, + show_docstring_receives: bool = True, + show_docstring_returns: bool = True, + show_docstring_warns: bool = True, + show_docstring_yields: bool = True, + show_if_no_docstring: bool = False, + show_inheritance_diagram: bool = False, + show_labels: bool = True, + show_object_full_path: bool = False, + show_root_full_path: bool = True, + show_root_heading: bool = False, + show_root_members_full_path: bool = False, + show_root_toc_entry: bool = True, + show_signature_annotations: bool = False, + show_signature: bool = True, + show_source: bool = True, + show_submodules: bool = False, + show_symbol_type_heading: bool = False, + show_symbol_type_toc: bool = False, + signature_crossrefs: bool = False, + summary: bool | SummaryOption = SummaryOption(), + toc_label: str = "", + unwrap_annotated: bool = False, + extra: dict[str, Any] = dict(), +) + +``` + +Accepted input options. + +Methods: + +- **`coerce`** – Coerce data. +- **`from_data`** – Create an instance from a dictionary. + +Attributes: + +- **`allow_inspection`** (`bool`) – Whether to allow inspecting modules when visiting them is not possible. +- **`annotations_path`** (`Literal['brief', 'source', 'full']`) – The verbosity for annotations path: brief (recommended), source (as written in the source), or full. +- **`backlinks`** (`Literal['flat', 'tree', False]`) – Whether to render backlinks, and how. +- **`docstring_options`** (`GoogleStyleOptions | NumpyStyleOptions | SphinxStyleOptions | AutoStyleOptions | None`) – The options for the docstring parser. +- **`docstring_section_style`** (`Literal['table', 'list', 'spacy']`) – The style used to render docstring sections. +- **`docstring_style`** (`Literal['auto', 'google', 'numpy', 'sphinx'] | None`) – The docstring style to use: auto, google, numpy, sphinx, or None. +- **`extensions`** (`list[str | dict[str, Any]]`) – A list of Griffe extensions to load. +- **`extra`** (`dict[str, Any]`) – Extra options. +- **`filters`** (`list[str] | Literal['public']`) – A list of filters, or "public". +- **`find_stubs_package`** (`bool`) – Whether to load stubs package (package-stubs) when extracting docstrings. +- **`force_inspection`** (`bool`) – Whether to force using dynamic analysis when loading data. +- **`group_by_category`** (`bool`) – Group the object's children by categories: attributes, classes, functions, and modules. +- **`heading`** (`str`) – A custom string to override the autogenerated heading of the root object. +- **`heading_level`** (`int`) – The initial heading level to use. +- **`inherited_members`** (`bool | list[str]`) – A boolean, or an explicit list of inherited members to render. +- **`line_length`** (`int`) – Maximum line length when formatting code/signatures. +- **`members`** (`list[str] | bool | None`) – A boolean, or an explicit list of members to render. +- **`members_order`** (`Order | list[Order]`) – The members ordering to use. +- **`merge_init_into_class`** (`bool`) – Whether to merge the __init__ method into the class' signature and docstring. +- **`modernize_annotations`** (`bool`) – Whether to modernize annotations, for example Optional[str] into str | None. +- **`parameter_headings`** (`bool`) – Whether to render headings for parameters (therefore showing parameters in the ToC). +- **`preload_modules`** (`list[str]`) – Pre-load modules that are not specified directly in autodoc instructions (::: identifier). +- **`relative_crossrefs`** (`bool`) – Whether to enable the relative crossref syntax. +- **`scoped_crossrefs`** (`bool`) – Whether to enable the scoped crossref ability. +- **`separate_signature`** (`bool`) – Whether to put the whole signature in a code block below the heading. +- **`show_bases`** (`bool`) – Show the base classes of a class. +- **`show_category_heading`** (`bool`) – When grouped by categories, show a heading for each category. +- **`show_docstring_attributes`** (`bool`) – Whether to display the 'Attributes' section in the object's docstring. +- **`show_docstring_classes`** (`bool`) – Whether to display the 'Classes' section in the object's docstring. +- **`show_docstring_description`** (`bool`) – Whether to display the textual block (including admonitions) in the object's docstring. +- **`show_docstring_examples`** (`bool`) – Whether to display the 'Examples' section in the object's docstring. +- **`show_docstring_functions`** (`bool`) – Whether to display the 'Functions' or 'Methods' sections in the object's docstring. +- **`show_docstring_modules`** (`bool`) – Whether to display the 'Modules' section in the object's docstring. +- **`show_docstring_other_parameters`** (`bool`) – Whether to display the 'Other Parameters' section in the object's docstring. +- **`show_docstring_parameters`** (`bool`) – Whether to display the 'Parameters' section in the object's docstring. +- **`show_docstring_raises`** (`bool`) – Whether to display the 'Raises' section in the object's docstring. +- **`show_docstring_receives`** (`bool`) – Whether to display the 'Receives' section in the object's docstring. +- **`show_docstring_returns`** (`bool`) – Whether to display the 'Returns' section in the object's docstring. +- **`show_docstring_warns`** (`bool`) – Whether to display the 'Warns' section in the object's docstring. +- **`show_docstring_yields`** (`bool`) – Whether to display the 'Yields' section in the object's docstring. +- **`show_if_no_docstring`** (`bool`) – Show the object heading even if it has no docstring or children with docstrings. +- **`show_inheritance_diagram`** (`bool`) – Show the inheritance diagram of a class using Mermaid. +- **`show_labels`** (`bool`) – Whether to show labels of the members. +- **`show_object_full_path`** (`bool`) – Show the full Python path of every object. +- **`show_overloads`** (`bool`) – Show the overloads of a function or method. +- **`show_root_full_path`** (`bool`) – Show the full Python path for the root object heading. +- **`show_root_heading`** (`bool`) – Show the heading of the object at the root of the documentation tree. +- **`show_root_members_full_path`** (`bool`) – Show the full Python path of the root members. +- **`show_root_toc_entry`** (`bool`) – If the root heading is not shown, at least add a ToC entry for it. +- **`show_signature`** (`bool`) – Show methods and functions signatures. +- **`show_signature_annotations`** (`bool`) – Show the type annotations in methods and functions signatures. +- **`show_source`** (`bool`) – Show the source code of this object. +- **`show_submodules`** (`bool`) – When rendering a module, show its submodules recursively. +- **`show_symbol_type_heading`** (`bool`) – Show the symbol type in headings (e.g. mod, class, meth, func and attr). +- **`show_symbol_type_toc`** (`bool`) – Show the symbol type in the Table of Contents (e.g. mod, class, methd, func and attr). +- **`signature_crossrefs`** (`bool`) – Whether to render cross-references for type annotations in signatures. +- **`summary`** (`bool | SummaryOption`) – Whether to render summaries of modules, classes, functions (methods) and attributes. +- **`toc_label`** (`str`) – A custom string to override the autogenerated toc label of the root object. +- **`unwrap_annotated`** (`bool`) – Whether to unwrap Annotated types to show only the type without the annotations. + +### allow_inspection + +```python +allow_inspection: bool = True + +``` + +Whether to allow inspecting modules when visiting them is not possible. + +### annotations_path + +```python +annotations_path: Literal['brief', 'source', 'full'] = 'brief' + +``` + +The verbosity for annotations path: `brief` (recommended), `source` (as written in the source), or `full`. + +### backlinks + +```python +backlinks: Literal['flat', 'tree', False] = False + +``` + +Whether to render backlinks, and how. + +### docstring_options + +```python +docstring_options: ( + GoogleStyleOptions + | NumpyStyleOptions + | SphinxStyleOptions + | AutoStyleOptions + | None +) = None + +``` + +The options for the docstring parser. + +See [docstring parsers](https://mkdocstrings.github.io/griffe/reference/docstrings/) and their options in Griffe docs. + +### docstring_section_style + +```python +docstring_section_style: Literal['table', 'list', 'spacy'] = 'table' + +``` + +The style used to render docstring sections. + +### docstring_style + +```python +docstring_style: Literal['auto', 'google', 'numpy', 'sphinx'] | None = 'google' + +``` + +The docstring style to use: `auto`, `google`, `numpy`, `sphinx`, or `None`. + +### extensions + +```python +extensions: list[str | dict[str, Any]] = field(default_factory=list) + +``` + +A list of Griffe extensions to load. + +### extra + +```python +extra: dict[str, Any] = field(default_factory=dict) + +``` + +Extra options. + +### filters + +```python +filters: list[str] | Literal['public'] = field(default_factory=lambda: copy()) + +``` + +A list of filters, or `"public"`. + +**List of filters** + +A filter starting with `!` will exclude matching objects instead of including them. The `members` option takes precedence over `filters` (filters will still be applied recursively to lower members in the hierarchy). + +**Filtering methods** + +[Sponsors only](../../insiders/) — [Insiders 1.11.0](../../insiders/changelog/#1.11.0) + +The `public` method will include only public objects: those added to `__all__` or not starting with an underscore (except for special methods/attributes). + +### find_stubs_package + +```python +find_stubs_package: bool = False + +``` + +Whether to load stubs package (package-stubs) when extracting docstrings. + +### force_inspection + +```python +force_inspection: bool = False + +``` + +Whether to force using dynamic analysis when loading data. + +### group_by_category + +```python +group_by_category: bool = True + +``` + +Group the object's children by categories: attributes, classes, functions, and modules. + +### heading + +```python +heading: str = '' + +``` + +A custom string to override the autogenerated heading of the root object. + +### heading_level + +```python +heading_level: int = 2 + +``` + +The initial heading level to use. + +### inherited_members + +```python +inherited_members: bool | list[str] = False + +``` + +A boolean, or an explicit list of inherited members to render. + +If true, select all inherited members, which can then be filtered with `members`. If false or empty list, do not select any inherited member. + +### line_length + +```python +line_length: int = 60 + +``` + +Maximum line length when formatting code/signatures. + +### members + +```python +members: list[str] | bool | None = None + +``` + +A boolean, or an explicit list of members to render. + +If true, select all members without further filtering. If false or empty list, do not render members. If none, select all members and apply further filtering with filters and docstrings. + +### members_order + +```python +members_order: Order | list[Order] = 'alphabetical' + +``` + +The members ordering to use. + +- `__all__`: order members according to `__all__` module attributes, if declared; +- `alphabetical`: order members alphabetically; +- `source`: order members as they appear in the source file. + +Since `__all__` is a module-only attribute, it can't be used to sort class members, therefore the `members_order` option accepts a list of ordering methods, indicating ordering preferences. + +### merge_init_into_class + +```python +merge_init_into_class: bool = False + +``` + +Whether to merge the `__init__` method into the class' signature and docstring. + +### modernize_annotations + +```python +modernize_annotations: bool = False + +``` + +Whether to modernize annotations, for example `Optional[str]` into `str | None`. + +### parameter_headings + +```python +parameter_headings: bool = False + +``` + +Whether to render headings for parameters (therefore showing parameters in the ToC). + +### preload_modules + +```python +preload_modules: list[str] = field(default_factory=list) + +``` + +Pre-load modules that are not specified directly in autodoc instructions (`::: identifier`). + +It is useful when you want to render documentation for a particular member of an object, and this member is imported from another package than its parent. + +For an imported member to be rendered, you need to add it to the `__all__` attribute of the importing module. + +The modules must be listed as an array of strings. + +### relative_crossrefs + +```python +relative_crossrefs: bool = False + +``` + +Whether to enable the relative crossref syntax. + +### scoped_crossrefs + +```python +scoped_crossrefs: bool = False + +``` + +Whether to enable the scoped crossref ability. + +### separate_signature + +```python +separate_signature: bool = False + +``` + +Whether to put the whole signature in a code block below the heading. + +If Black or Ruff are installed, the signature is also formatted using them. + +### show_bases + +```python +show_bases: bool = True + +``` + +Show the base classes of a class. + +### show_category_heading + +```python +show_category_heading: bool = False + +``` + +When grouped by categories, show a heading for each category. + +### show_docstring_attributes + +```python +show_docstring_attributes: bool = True + +``` + +Whether to display the 'Attributes' section in the object's docstring. + +### show_docstring_classes + +```python +show_docstring_classes: bool = True + +``` + +Whether to display the 'Classes' section in the object's docstring. + +### show_docstring_description + +```python +show_docstring_description: bool = True + +``` + +Whether to display the textual block (including admonitions) in the object's docstring. + +### show_docstring_examples + +```python +show_docstring_examples: bool = True + +``` + +Whether to display the 'Examples' section in the object's docstring. + +### show_docstring_functions + +```python +show_docstring_functions: bool = True + +``` + +Whether to display the 'Functions' or 'Methods' sections in the object's docstring. + +### show_docstring_modules + +```python +show_docstring_modules: bool = True + +``` + +Whether to display the 'Modules' section in the object's docstring. + +### show_docstring_other_parameters + +```python +show_docstring_other_parameters: bool = True + +``` + +Whether to display the 'Other Parameters' section in the object's docstring. + +### show_docstring_parameters + +```python +show_docstring_parameters: bool = True + +``` + +Whether to display the 'Parameters' section in the object's docstring. + +### show_docstring_raises + +```python +show_docstring_raises: bool = True + +``` + +Whether to display the 'Raises' section in the object's docstring. + +### show_docstring_receives + +```python +show_docstring_receives: bool = True + +``` + +Whether to display the 'Receives' section in the object's docstring. + +### show_docstring_returns + +```python +show_docstring_returns: bool = True + +``` + +Whether to display the 'Returns' section in the object's docstring. + +### show_docstring_warns + +```python +show_docstring_warns: bool = True + +``` + +Whether to display the 'Warns' section in the object's docstring. + +### show_docstring_yields + +```python +show_docstring_yields: bool = True + +``` + +Whether to display the 'Yields' section in the object's docstring. + +### show_if_no_docstring + +```python +show_if_no_docstring: bool = False + +``` + +Show the object heading even if it has no docstring or children with docstrings. + +### show_inheritance_diagram + +```python +show_inheritance_diagram: bool = False + +``` + +Show the inheritance diagram of a class using Mermaid. + +### show_labels + +```python +show_labels: bool = True + +``` + +Whether to show labels of the members. + +### show_object_full_path + +```python +show_object_full_path: bool = False + +``` + +Show the full Python path of every object. + +### show_overloads + +```python +show_overloads: bool = True + +``` + +Show the overloads of a function or method. + +### show_root_full_path + +```python +show_root_full_path: bool = True + +``` + +Show the full Python path for the root object heading. + +### show_root_heading + +```python +show_root_heading: bool = False + +``` + +Show the heading of the object at the root of the documentation tree. + +The root object is the object referenced by the identifier after `:::`. + +### show_root_members_full_path + +```python +show_root_members_full_path: bool = False + +``` + +Show the full Python path of the root members. + +### show_root_toc_entry + +```python +show_root_toc_entry: bool = True + +``` + +If the root heading is not shown, at least add a ToC entry for it. + +### show_signature + +```python +show_signature: bool = True + +``` + +Show methods and functions signatures. + +### show_signature_annotations + +```python +show_signature_annotations: bool = False + +``` + +Show the type annotations in methods and functions signatures. + +### show_source + +```python +show_source: bool = True + +``` + +Show the source code of this object. + +### show_submodules + +```python +show_submodules: bool = False + +``` + +When rendering a module, show its submodules recursively. + +### show_symbol_type_heading + +```python +show_symbol_type_heading: bool = False + +``` + +Show the symbol type in headings (e.g. mod, class, meth, func and attr). + +### show_symbol_type_toc + +```python +show_symbol_type_toc: bool = False + +``` + +Show the symbol type in the Table of Contents (e.g. mod, class, methd, func and attr). + +### signature_crossrefs + +```python +signature_crossrefs: bool = False + +``` + +Whether to render cross-references for type annotations in signatures. + +### summary + +```python +summary: bool | SummaryOption = field(default_factory=SummaryOption) + +``` + +Whether to render summaries of modules, classes, functions (methods) and attributes. + +### toc_label + +```python +toc_label: str = '' + +``` + +A custom string to override the autogenerated toc label of the root object. + +### unwrap_annotated + +```python +unwrap_annotated: bool = False + +``` + +Whether to unwrap `Annotated` types to show only the type without the annotations. + +### coerce + +```python +coerce(**data: Any) -> MutableMapping[str, Any] + +``` + +Coerce data. + +### from_data + +```python +from_data(**data: Any) -> Self + +``` + +Create an instance from a dictionary. + +## PythonOptions + +```python +PythonOptions( + allow_inspection: bool = True, + force_inspection: bool = False, + annotations_path: Literal["brief", "source", "full"] = "brief", + backlinks: Literal["flat", "tree", False] = False, + docstring_options: ( + GoogleStyleOptions + | NumpyStyleOptions + | SphinxStyleOptions + | AutoStyleOptions + | None + ) = None, + docstring_section_style: Literal["table", "list", "spacy"] = "table", + docstring_style: Literal["auto", "google", "numpy", "sphinx"] | None = "google", + extensions: list[str | dict[str, Any]] = list(), + filters: list[tuple[Pattern, bool]] | Literal["public"] = lambda: [ + (compile(removeprefix("!")), startswith("!")) for filtr in _DEFAULT_FILTERS + ](), + find_stubs_package: bool = False, + group_by_category: bool = True, + heading: str = "", + heading_level: int = 2, + inherited_members: bool | list[str] = False, + line_length: int = 60, + members: list[str] | bool | None = None, + members_order: Order | list[Order] = "alphabetical", + merge_init_into_class: bool = False, + modernize_annotations: bool = False, + parameter_headings: bool = False, + preload_modules: list[str] = list(), + relative_crossrefs: bool = False, + scoped_crossrefs: bool = False, + show_overloads: bool = True, + separate_signature: bool = False, + show_bases: bool = True, + show_category_heading: bool = False, + show_docstring_attributes: bool = True, + show_docstring_classes: bool = True, + show_docstring_description: bool = True, + show_docstring_examples: bool = True, + show_docstring_functions: bool = True, + show_docstring_modules: bool = True, + show_docstring_other_parameters: bool = True, + show_docstring_parameters: bool = True, + show_docstring_raises: bool = True, + show_docstring_receives: bool = True, + show_docstring_returns: bool = True, + show_docstring_warns: bool = True, + show_docstring_yields: bool = True, + show_if_no_docstring: bool = False, + show_inheritance_diagram: bool = False, + show_labels: bool = True, + show_object_full_path: bool = False, + show_root_full_path: bool = True, + show_root_heading: bool = False, + show_root_members_full_path: bool = False, + show_root_toc_entry: bool = True, + show_signature_annotations: bool = False, + show_signature: bool = True, + show_source: bool = True, + show_submodules: bool = False, + show_symbol_type_heading: bool = False, + show_symbol_type_toc: bool = False, + signature_crossrefs: bool = False, + summary: SummaryOption = SummaryOption(), + toc_label: str = "", + unwrap_annotated: bool = False, + extra: dict[str, Any] = dict(), +) + +``` + +``` + + flowchart TD + mkdocstrings_handlers.python.PythonOptions[PythonOptions] + mkdocstrings_handlers.python._internal.config.PythonInputOptions[PythonInputOptions] + + mkdocstrings_handlers.python._internal.config.PythonInputOptions --> mkdocstrings_handlers.python.PythonOptions + + + + click mkdocstrings_handlers.python.PythonOptions href "" "mkdocstrings_handlers.python.PythonOptions" + click mkdocstrings_handlers.python._internal.config.PythonInputOptions href "" "mkdocstrings_handlers.python._internal.config.PythonInputOptions" + +``` + +Final options passed as template context. + +Methods: + +- **`coerce`** – Create an instance from a dictionary. +- **`from_data`** – Create an instance from a dictionary. + +Attributes: + +- **`allow_inspection`** (`bool`) – Whether to allow inspecting modules when visiting them is not possible. +- **`annotations_path`** (`Literal['brief', 'source', 'full']`) – The verbosity for annotations path: brief (recommended), source (as written in the source), or full. +- **`backlinks`** (`Literal['flat', 'tree', False]`) – Whether to render backlinks, and how. +- **`docstring_options`** (`GoogleStyleOptions | NumpyStyleOptions | SphinxStyleOptions | AutoStyleOptions | None`) – The options for the docstring parser. +- **`docstring_section_style`** (`Literal['table', 'list', 'spacy']`) – The style used to render docstring sections. +- **`docstring_style`** (`Literal['auto', 'google', 'numpy', 'sphinx'] | None`) – The docstring style to use: auto, google, numpy, sphinx, or None. +- **`extensions`** (`list[str | dict[str, Any]]`) – A list of Griffe extensions to load. +- **`extra`** (`dict[str, Any]`) – Extra options. +- **`filters`** (`list[tuple[Pattern, bool]] | Literal['public']`) – A list of filters, or "public". +- **`find_stubs_package`** (`bool`) – Whether to load stubs package (package-stubs) when extracting docstrings. +- **`force_inspection`** (`bool`) – Whether to force using dynamic analysis when loading data. +- **`group_by_category`** (`bool`) – Group the object's children by categories: attributes, classes, functions, and modules. +- **`heading`** (`str`) – A custom string to override the autogenerated heading of the root object. +- **`heading_level`** (`int`) – The initial heading level to use. +- **`inherited_members`** (`bool | list[str]`) – A boolean, or an explicit list of inherited members to render. +- **`line_length`** (`int`) – Maximum line length when formatting code/signatures. +- **`members`** (`list[str] | bool | None`) – A boolean, or an explicit list of members to render. +- **`members_order`** (`Order | list[Order]`) – The members ordering to use. +- **`merge_init_into_class`** (`bool`) – Whether to merge the __init__ method into the class' signature and docstring. +- **`modernize_annotations`** (`bool`) – Whether to modernize annotations, for example Optional[str] into str | None. +- **`parameter_headings`** (`bool`) – Whether to render headings for parameters (therefore showing parameters in the ToC). +- **`preload_modules`** (`list[str]`) – Pre-load modules that are not specified directly in autodoc instructions (::: identifier). +- **`relative_crossrefs`** (`bool`) – Whether to enable the relative crossref syntax. +- **`scoped_crossrefs`** (`bool`) – Whether to enable the scoped crossref ability. +- **`separate_signature`** (`bool`) – Whether to put the whole signature in a code block below the heading. +- **`show_bases`** (`bool`) – Show the base classes of a class. +- **`show_category_heading`** (`bool`) – When grouped by categories, show a heading for each category. +- **`show_docstring_attributes`** (`bool`) – Whether to display the 'Attributes' section in the object's docstring. +- **`show_docstring_classes`** (`bool`) – Whether to display the 'Classes' section in the object's docstring. +- **`show_docstring_description`** (`bool`) – Whether to display the textual block (including admonitions) in the object's docstring. +- **`show_docstring_examples`** (`bool`) – Whether to display the 'Examples' section in the object's docstring. +- **`show_docstring_functions`** (`bool`) – Whether to display the 'Functions' or 'Methods' sections in the object's docstring. +- **`show_docstring_modules`** (`bool`) – Whether to display the 'Modules' section in the object's docstring. +- **`show_docstring_other_parameters`** (`bool`) – Whether to display the 'Other Parameters' section in the object's docstring. +- **`show_docstring_parameters`** (`bool`) – Whether to display the 'Parameters' section in the object's docstring. +- **`show_docstring_raises`** (`bool`) – Whether to display the 'Raises' section in the object's docstring. +- **`show_docstring_receives`** (`bool`) – Whether to display the 'Receives' section in the object's docstring. +- **`show_docstring_returns`** (`bool`) – Whether to display the 'Returns' section in the object's docstring. +- **`show_docstring_warns`** (`bool`) – Whether to display the 'Warns' section in the object's docstring. +- **`show_docstring_yields`** (`bool`) – Whether to display the 'Yields' section in the object's docstring. +- **`show_if_no_docstring`** (`bool`) – Show the object heading even if it has no docstring or children with docstrings. +- **`show_inheritance_diagram`** (`bool`) – Show the inheritance diagram of a class using Mermaid. +- **`show_labels`** (`bool`) – Whether to show labels of the members. +- **`show_object_full_path`** (`bool`) – Show the full Python path of every object. +- **`show_overloads`** (`bool`) – Show the overloads of a function or method. +- **`show_root_full_path`** (`bool`) – Show the full Python path for the root object heading. +- **`show_root_heading`** (`bool`) – Show the heading of the object at the root of the documentation tree. +- **`show_root_members_full_path`** (`bool`) – Show the full Python path of the root members. +- **`show_root_toc_entry`** (`bool`) – If the root heading is not shown, at least add a ToC entry for it. +- **`show_signature`** (`bool`) – Show methods and functions signatures. +- **`show_signature_annotations`** (`bool`) – Show the type annotations in methods and functions signatures. +- **`show_source`** (`bool`) – Show the source code of this object. +- **`show_submodules`** (`bool`) – When rendering a module, show its submodules recursively. +- **`show_symbol_type_heading`** (`bool`) – Show the symbol type in headings (e.g. mod, class, meth, func and attr). +- **`show_symbol_type_toc`** (`bool`) – Show the symbol type in the Table of Contents (e.g. mod, class, methd, func and attr). +- **`signature_crossrefs`** (`bool`) – Whether to render cross-references for type annotations in signatures. +- **`summary`** (`SummaryOption`) – Whether to render summaries of modules, classes, functions (methods) and attributes. +- **`toc_label`** (`str`) – A custom string to override the autogenerated toc label of the root object. +- **`unwrap_annotated`** (`bool`) – Whether to unwrap Annotated types to show only the type without the annotations. + +### allow_inspection + +```python +allow_inspection: bool = True + +``` + +Whether to allow inspecting modules when visiting them is not possible. + +### annotations_path + +```python +annotations_path: Literal['brief', 'source', 'full'] = 'brief' + +``` + +The verbosity for annotations path: `brief` (recommended), `source` (as written in the source), or `full`. + +### backlinks + +```python +backlinks: Literal['flat', 'tree', False] = False + +``` + +Whether to render backlinks, and how. + +### docstring_options + +```python +docstring_options: ( + GoogleStyleOptions + | NumpyStyleOptions + | SphinxStyleOptions + | AutoStyleOptions + | None +) = None + +``` + +The options for the docstring parser. + +See [docstring parsers](https://mkdocstrings.github.io/griffe/reference/docstrings/) and their options in Griffe docs. + +### docstring_section_style + +```python +docstring_section_style: Literal['table', 'list', 'spacy'] = 'table' + +``` + +The style used to render docstring sections. + +### docstring_style + +```python +docstring_style: Literal['auto', 'google', 'numpy', 'sphinx'] | None = 'google' + +``` + +The docstring style to use: `auto`, `google`, `numpy`, `sphinx`, or `None`. + +### extensions + +```python +extensions: list[str | dict[str, Any]] = field(default_factory=list) + +``` + +A list of Griffe extensions to load. + +### extra + +```python +extra: dict[str, Any] = field(default_factory=dict) + +``` + +Extra options. + +### filters + +```python +filters: list[tuple[Pattern, bool]] | Literal["public"] = field( + default_factory=lambda: [ + (compile(removeprefix("!")), startswith("!")) for filtr in _DEFAULT_FILTERS + ] +) + +``` + +A list of filters, or `"public"`. + +### find_stubs_package + +```python +find_stubs_package: bool = False + +``` + +Whether to load stubs package (package-stubs) when extracting docstrings. + +### force_inspection + +```python +force_inspection: bool = False + +``` + +Whether to force using dynamic analysis when loading data. + +### group_by_category + +```python +group_by_category: bool = True + +``` + +Group the object's children by categories: attributes, classes, functions, and modules. + +### heading + +```python +heading: str = '' + +``` + +A custom string to override the autogenerated heading of the root object. + +### heading_level + +```python +heading_level: int = 2 + +``` + +The initial heading level to use. + +### inherited_members + +```python +inherited_members: bool | list[str] = False + +``` + +A boolean, or an explicit list of inherited members to render. + +If true, select all inherited members, which can then be filtered with `members`. If false or empty list, do not select any inherited member. + +### line_length + +```python +line_length: int = 60 + +``` + +Maximum line length when formatting code/signatures. + +### members + +```python +members: list[str] | bool | None = None + +``` + +A boolean, or an explicit list of members to render. + +If true, select all members without further filtering. If false or empty list, do not render members. If none, select all members and apply further filtering with filters and docstrings. + +### members_order + +```python +members_order: Order | list[Order] = 'alphabetical' + +``` + +The members ordering to use. + +- `__all__`: order members according to `__all__` module attributes, if declared; +- `alphabetical`: order members alphabetically; +- `source`: order members as they appear in the source file. + +Since `__all__` is a module-only attribute, it can't be used to sort class members, therefore the `members_order` option accepts a list of ordering methods, indicating ordering preferences. + +### merge_init_into_class + +```python +merge_init_into_class: bool = False + +``` + +Whether to merge the `__init__` method into the class' signature and docstring. + +### modernize_annotations + +```python +modernize_annotations: bool = False + +``` + +Whether to modernize annotations, for example `Optional[str]` into `str | None`. + +### parameter_headings + +```python +parameter_headings: bool = False + +``` + +Whether to render headings for parameters (therefore showing parameters in the ToC). + +### preload_modules + +```python +preload_modules: list[str] = field(default_factory=list) + +``` + +Pre-load modules that are not specified directly in autodoc instructions (`::: identifier`). + +It is useful when you want to render documentation for a particular member of an object, and this member is imported from another package than its parent. + +For an imported member to be rendered, you need to add it to the `__all__` attribute of the importing module. + +The modules must be listed as an array of strings. + +### relative_crossrefs + +```python +relative_crossrefs: bool = False + +``` + +Whether to enable the relative crossref syntax. + +### scoped_crossrefs + +```python +scoped_crossrefs: bool = False + +``` + +Whether to enable the scoped crossref ability. + +### separate_signature + +```python +separate_signature: bool = False + +``` + +Whether to put the whole signature in a code block below the heading. + +If Black or Ruff are installed, the signature is also formatted using them. + +### show_bases + +```python +show_bases: bool = True + +``` + +Show the base classes of a class. + +### show_category_heading + +```python +show_category_heading: bool = False + +``` + +When grouped by categories, show a heading for each category. + +### show_docstring_attributes + +```python +show_docstring_attributes: bool = True + +``` + +Whether to display the 'Attributes' section in the object's docstring. + +### show_docstring_classes + +```python +show_docstring_classes: bool = True + +``` + +Whether to display the 'Classes' section in the object's docstring. + +### show_docstring_description + +```python +show_docstring_description: bool = True + +``` + +Whether to display the textual block (including admonitions) in the object's docstring. + +### show_docstring_examples + +```python +show_docstring_examples: bool = True + +``` + +Whether to display the 'Examples' section in the object's docstring. + +### show_docstring_functions + +```python +show_docstring_functions: bool = True + +``` + +Whether to display the 'Functions' or 'Methods' sections in the object's docstring. + +### show_docstring_modules + +```python +show_docstring_modules: bool = True + +``` + +Whether to display the 'Modules' section in the object's docstring. + +### show_docstring_other_parameters + +```python +show_docstring_other_parameters: bool = True + +``` + +Whether to display the 'Other Parameters' section in the object's docstring. + +### show_docstring_parameters + +```python +show_docstring_parameters: bool = True + +``` + +Whether to display the 'Parameters' section in the object's docstring. + +### show_docstring_raises + +```python +show_docstring_raises: bool = True + +``` + +Whether to display the 'Raises' section in the object's docstring. + +### show_docstring_receives + +```python +show_docstring_receives: bool = True + +``` + +Whether to display the 'Receives' section in the object's docstring. + +### show_docstring_returns + +```python +show_docstring_returns: bool = True + +``` + +Whether to display the 'Returns' section in the object's docstring. + +### show_docstring_warns + +```python +show_docstring_warns: bool = True + +``` + +Whether to display the 'Warns' section in the object's docstring. + +### show_docstring_yields + +```python +show_docstring_yields: bool = True + +``` + +Whether to display the 'Yields' section in the object's docstring. + +### show_if_no_docstring + +```python +show_if_no_docstring: bool = False + +``` + +Show the object heading even if it has no docstring or children with docstrings. + +### show_inheritance_diagram + +```python +show_inheritance_diagram: bool = False + +``` + +Show the inheritance diagram of a class using Mermaid. + +### show_labels + +```python +show_labels: bool = True + +``` + +Whether to show labels of the members. + +### show_object_full_path + +```python +show_object_full_path: bool = False + +``` + +Show the full Python path of every object. + +### show_overloads + +```python +show_overloads: bool = True + +``` + +Show the overloads of a function or method. + +### show_root_full_path + +```python +show_root_full_path: bool = True + +``` + +Show the full Python path for the root object heading. + +### show_root_heading + +```python +show_root_heading: bool = False + +``` + +Show the heading of the object at the root of the documentation tree. + +The root object is the object referenced by the identifier after `:::`. + +### show_root_members_full_path + +```python +show_root_members_full_path: bool = False + +``` + +Show the full Python path of the root members. + +### show_root_toc_entry + +```python +show_root_toc_entry: bool = True + +``` + +If the root heading is not shown, at least add a ToC entry for it. + +### show_signature + +```python +show_signature: bool = True + +``` + +Show methods and functions signatures. + +### show_signature_annotations + +```python +show_signature_annotations: bool = False + +``` + +Show the type annotations in methods and functions signatures. + +### show_source + +```python +show_source: bool = True + +``` + +Show the source code of this object. + +### show_submodules + +```python +show_submodules: bool = False + +``` + +When rendering a module, show its submodules recursively. + +### show_symbol_type_heading + +```python +show_symbol_type_heading: bool = False + +``` + +Show the symbol type in headings (e.g. mod, class, meth, func and attr). + +### show_symbol_type_toc + +```python +show_symbol_type_toc: bool = False + +``` + +Show the symbol type in the Table of Contents (e.g. mod, class, methd, func and attr). + +### signature_crossrefs + +```python +signature_crossrefs: bool = False + +``` + +Whether to render cross-references for type annotations in signatures. + +### summary + +```python +summary: SummaryOption = field(default_factory=SummaryOption) + +``` + +Whether to render summaries of modules, classes, functions (methods) and attributes. + +### toc_label + +```python +toc_label: str = '' + +``` + +A custom string to override the autogenerated toc label of the root object. + +### unwrap_annotated + +```python +unwrap_annotated: bool = False + +``` + +Whether to unwrap `Annotated` types to show only the type without the annotations. + +### coerce + +```python +coerce(**data: Any) -> MutableMapping[str, Any] + +``` + +Create an instance from a dictionary. + +### from_data + +```python +from_data(**data: Any) -> Self + +``` + +Create an instance from a dictionary. + +## SphinxStyleOptions + +```python +SphinxStyleOptions() + +``` + +Sphinx style docstring options. + +## SummaryOption + +```python +SummaryOption( + attributes: bool = False, + functions: bool = False, + classes: bool = False, + modules: bool = False, +) + +``` + +Summary option. + +Attributes: + +- **`attributes`** (`bool`) – Whether to render summaries of attributes. +- **`classes`** (`bool`) – Whether to render summaries of classes. +- **`functions`** (`bool`) – Whether to render summaries of functions (methods). +- **`modules`** (`bool`) – Whether to render summaries of modules. + +### attributes + +```python +attributes: bool = False + +``` + +Whether to render summaries of attributes. + +### classes + +```python +classes: bool = False + +``` + +Whether to render summaries of classes. + +### functions + +```python +functions: bool = False + +``` + +Whether to render summaries of functions (methods). + +### modules + +```python +modules: bool = False + +``` + +Whether to render summaries of modules. + +## do_as_attributes_section + +```python +do_as_attributes_section( + context: Context, attributes: Sequence[Attribute], *, check_public: bool = True +) -> DocstringSectionAttributes + +``` + +Build an attributes section from a list of attributes. + +Parameters: + +- ### **`attributes`** + + (`Sequence[Attribute]`) – The attributes to build the section from. + +- ### **`check_public`** + + (`bool`, default: `True` ) – Whether to check if the attribute is public. + +Returns: + +- `DocstringSectionAttributes` – An attributes docstring section. + +## do_as_classes_section + +```python +do_as_classes_section( + context: Context, classes: Sequence[Class], *, check_public: bool = True +) -> DocstringSectionClasses + +``` + +Build a classes section from a list of classes. + +Parameters: + +- ### **`classes`** + + (`Sequence[Class]`) – The classes to build the section from. + +- ### **`check_public`** + + (`bool`, default: `True` ) – Whether to check if the class is public. + +Returns: + +- `DocstringSectionClasses` – A classes docstring section. + +## do_as_functions_section + +```python +do_as_functions_section( + context: Context, functions: Sequence[Function], *, check_public: bool = True +) -> DocstringSectionFunctions + +``` + +Build a functions section from a list of functions. + +Parameters: + +- ### **`functions`** + + (`Sequence[Function]`) – The functions to build the section from. + +- ### **`check_public`** + + (`bool`, default: `True` ) – Whether to check if the function is public. + +Returns: + +- `DocstringSectionFunctions` – A functions docstring section. + +## do_as_modules_section + +```python +do_as_modules_section( + context: Context, modules: Sequence[Module], *, check_public: bool = True +) -> DocstringSectionModules + +``` + +Build a modules section from a list of modules. + +Parameters: + +- ### **`modules`** + + (`Sequence[Module]`) – The modules to build the section from. + +- ### **`check_public`** + + (`bool`, default: `True` ) – Whether to check if the module is public. + +Returns: + +- `DocstringSectionModules` – A modules docstring section. + +## do_backlink_tree + +```python +do_backlink_tree(backlinks: list[Backlink]) -> Tree[BacklinkCrumb] + +``` + +Build a tree of backlinks. + +Parameters: + +- ### **`backlinks`** + + (`list[Backlink]`) – The list of backlinks. + +Returns: + +- `Tree[BacklinkCrumb]` – A tree of backlinks. + +## do_crossref + +```python +do_crossref(path: str, *, brief: bool = True) -> Markup + +``` + +Deprecated. Filter to create cross-references. + +Parameters: + +- ### **`path`** + + (`str`) – The path to link to. + +- ### **`brief`** + + (`bool`, default: `True` ) – Show only the last part of the path, add full path as hover. + +Returns: + +- `Markup` – Markup text. + +## do_filter_objects + +```python +do_filter_objects( + objects_dictionary: dict[str, Object | Alias], + *, + filters: Sequence[tuple[Pattern, bool]] | Literal["public"] | None = None, + members_list: bool | list[str] | None = None, + inherited_members: bool | list[str] = False, + keep_no_docstrings: bool = True +) -> list[Object | Alias] + +``` + +Filter a dictionary of objects based on their docstrings. + +Parameters: + +- ### **`objects_dictionary`** + + (`dict[str, Object | Alias]`) – The dictionary of objects. + +- ### **`filters`** + + (`Sequence[tuple[Pattern, bool]] | Literal['public'] | None`, default: `None` ) – Filters to apply, based on members' names, or "public". Each element is a tuple: a pattern, and a boolean indicating whether to reject the object if the pattern matches. + +- ### **`members_list`** + + (`bool | list[str] | None`, default: `None` ) – An optional, explicit list of members to keep. When given and empty, return an empty list. When given and not empty, ignore filters and docstrings presence/absence. + +- ### **`inherited_members`** + + (`bool | list[str]`, default: `False` ) – Whether to keep inherited members or exclude them. + +- ### **`keep_no_docstrings`** + + (`bool`, default: `True` ) – Whether to keep objects with no/empty docstrings (recursive check). + +Returns: + +- `list[Object | Alias]` – A list of objects. + +## do_format_attribute + +```python +do_format_attribute( + context: Context, + attribute_path: Markup, + attribute: Attribute, + line_length: int, + *, + crossrefs: bool = False +) -> str + +``` + +Format an attribute. + +Parameters: + +- ### **`context`** + + (`Context`) – Jinja context, passed automatically. + +- ### **`attribute_path`** + + (`Markup`) – The path of the callable we render the signature of. + +- ### **`attribute`** + + (`Attribute`) – The attribute we render the signature of. + +- ### **`line_length`** + + (`int`) – The line length. + +- ### **`crossrefs`** + + (`bool`, default: `False` ) – Whether to cross-reference types in the signature. + +Returns: + +- `str` – The same code, formatted. + +## do_format_code + +```python +do_format_code(code: str, line_length: int) -> str + +``` + +Format code. + +Parameters: + +- ### **`code`** + + (`str`) – The code to format. + +- ### **`line_length`** + + (`int`) – The line length. + +Returns: + +- `str` – The same code, formatted. + +## do_format_signature + +```python +do_format_signature( + context: Context, + callable_path: Markup, + function: Function, + line_length: int, + *, + annotations: bool | None = None, + crossrefs: bool = False +) -> str + +``` + +Format a signature. + +Parameters: + +- ### **`context`** + + (`Context`) – Jinja context, passed automatically. + +- ### **`callable_path`** + + (`Markup`) – The path of the callable we render the signature of. + +- ### **`function`** + + (`Function`) – The function we render the signature of. + +- ### **`line_length`** + + (`int`) – The line length. + +- ### **`annotations`** + + (`bool | None`, default: `None` ) – Whether to show type annotations. + +- ### **`crossrefs`** + + (`bool`, default: `False` ) – Whether to cross-reference types in the signature. + +Returns: + +- `str` – The same code, formatted. + +## do_get_template + +```python +do_get_template(env: Environment, obj: str | Object) -> str + +``` + +Get the template name used to render an object. + +Parameters: + +- ### **`env`** + + (`Environment`) – The Jinja environment, passed automatically. + +- ### **`obj`** + + (`str | Object`) – A Griffe object, or a template name. + +Returns: + +- `str` – A template name. + +## do_multi_crossref + +```python +do_multi_crossref(text: str, *, code: bool = True) -> Markup + +``` + +Deprecated. Filter to create cross-references. + +Parameters: + +- ### **`text`** + + (`str`) – The text to scan. + +- ### **`code`** + + (`bool`, default: `True` ) – Whether to wrap the result in a code tag. + +Returns: + +- `Markup` – Markup text. + +## do_order_members + +```python +do_order_members( + members: Sequence[Object | Alias], + order: Order | list[Order], + members_list: bool | list[str] | None, +) -> Sequence[Object | Alias] + +``` + +Order members given an ordering method. + +Parameters: + +- ### **`members`** + + (`Sequence[Object | Alias]`) – The members to order. + +- ### **`order`** + + (`Order | list[Order]`) – The ordering method. + +- ### **`members_list`** + + (`bool | list[str] | None`) – An optional member list (manual ordering). + +Returns: + +- `Sequence[Object | Alias]` – The same members, ordered. + +## do_split_path + +```python +do_split_path(path: str, full_path: str) -> Iterator[tuple[str, str, str, str]] + +``` + +Split object paths for building cross-references. + +Parameters: + +- ### **`path`** + + (`str`) – The path to split. + +- ### **`full_path`** + + (`str`) – The full path, used to compute correct paths for each part of the path. + +Yields: + +- `tuple[str, str, str, str]` – 4-tuples: prefix, word, full path, suffix. + +## get_handler + +```python +get_handler( + handler_config: MutableMapping[str, Any], tool_config: MkDocsConfig, **kwargs: Any +) -> PythonHandler + +``` + +Return an instance of `PythonHandler`. + +Parameters: + +- ### **`handler_config`** + + (`MutableMapping[str, Any]`) – The handler configuration. + +- ### **`tool_config`** + + (`MkDocsConfig`) – The tool (SSG) configuration. + +Returns: + +- `PythonHandler` – An instance of PythonHandler. + +## config + +Deprecated. Import from `mkdocstrings_handlers.python` directly. + +## handler + +Deprecated. Import from `mkdocstrings_handlers.python` directly. + +## rendering + +Deprecated. Import from `mkdocstrings_handlers.python` directly. diff --git a/llms.txt b/llms.txt new file mode 100644 index 00000000..8d6e85e4 --- /dev/null +++ b/llms.txt @@ -0,0 +1,12 @@ +# mkdocstrings-python + +> A Python handler for mkdocstrings. + +## Usage + +- [Overview](https://mkdocstrings.github.io/python/index.md) + +## API + +- [API reference](https://mkdocstrings.github.io/python/reference/api/index.md) + diff --git a/logo.png b/logo.png deleted file mode 120000 index d9c1f0ca..00000000 --- a/logo.png +++ /dev/null @@ -1 +0,0 @@ -docs/logo.png \ No newline at end of file diff --git a/logo.png b/logo.png new file mode 100644 index 00000000..5b42478c Binary files /dev/null and b/logo.png differ diff --git a/mkdocs.yml b/mkdocs.yml deleted file mode 100644 index 0199ea9a..00000000 --- a/mkdocs.yml +++ /dev/null @@ -1,233 +0,0 @@ -site_name: "mkdocstrings-python" -site_description: "A Python handler for mkdocstrings." -site_url: "https://mkdocstrings.github.io/python" -repo_url: "https://github.com/mkdocstrings/python" -repo_name: "mkdocstrings/python" -site_dir: "site" -watch: [mkdocs.yml, README.md, CONTRIBUTING.md, CHANGELOG.md, src/mkdocstrings_handlers] -copyright: Copyright © 2021 Timothée Mazzucotelli -edit_uri: edit/main/docs/ - -validation: - omitted_files: warn - absolute_links: warn - unrecognized_links: warn - -hooks: -- scripts/mkdocs_hooks.py - -nav: -- Home: - - Overview: index.md - - Changelog: changelog.md - - Credits: credits.md - - License: license.md -- Usage: - - usage/index.md - - Configuration options: - - General: usage/configuration/general.md - - Headings: usage/configuration/headings.md - - Members: usage/configuration/members.md - - Docstrings: usage/configuration/docstrings.md - - Signatures: usage/configuration/signatures.md - - Docstring styles: - - Google: usage/docstrings/google.md - - Numpy: usage/docstrings/numpy.md - - Sphinx: usage/docstrings/sphinx.md - - Advanced: - - Customization: usage/customization.md - - Extensions: usage/extensions.md -- API reference: reference/api.md -- Development: - - Contributing: contributing.md - - Code of Conduct: code_of_conduct.md - # - Coverage report: coverage.md -- Insiders: - - insiders/index.md - - Getting started: - - Installation: insiders/installation.md - - Changelog: insiders/changelog.md -- mkdocstrings: https://mkdocstrings.github.io/ - -theme: - name: material - custom_dir: docs/.overrides - logo: logo.png - features: - - announce.dismiss - - content.action.edit - - content.action.view - - content.code.annotate - - content.code.copy - - content.tooltips - - navigation.footer - - navigation.instant.preview - - navigation.path - - navigation.sections - - navigation.tabs - - navigation.tabs.sticky - - navigation.top - - search.highlight - - search.suggest - - toc.follow - palette: - - media: "(prefers-color-scheme)" - toggle: - icon: material/brightness-auto - name: Switch to light mode - - media: "(prefers-color-scheme: light)" - scheme: default - primary: teal - accent: purple - toggle: - icon: material/weather-sunny - name: Switch to dark mode - - media: "(prefers-color-scheme: dark)" - scheme: slate - primary: black - accent: lime - toggle: - icon: material/weather-night - name: Switch to system preference - -extra_css: -- css/material.css -- css/mkdocstrings.css -- css/insiders.css - -extra_javascript: -- js/feedback.js - -markdown_extensions: -- abbr -- attr_list -- admonition -- callouts: - strip_period: no -- footnotes -- md_in_html -- pymdownx.blocks.admonition -- pymdownx.blocks.details -- pymdownx.blocks.tab: - alternate_style: true - slugify: !!python/object/apply:pymdownx.slugs.slugify - kwds: - case: lower -- pymdownx.emoji: - emoji_index: !!python/name:material.extensions.emoji.twemoji - emoji_generator: !!python/name:material.extensions.emoji.to_svg -- pymdownx.highlight: - pygments_lang_class: true -- pymdownx.magiclink -- pymdownx.snippets: - auto_append: [docs/.glossary.md] - base_path: [!relative $config_dir] - check_paths: true -- pymdownx.superfences: - custom_fences: - - name: mermaid - class: mermaid - format: !!python/name:pymdownx.superfences.fence_code_format -- pymdownx.tabbed: - alternate_style: true - slugify: !!python/object/apply:pymdownx.slugs.slugify - kwds: - case: lower -- pymdownx.tasklist: - custom_checkbox: true -- toc: - permalink: "¤" - -plugins: -- search -- autorefs -- markdown-exec -- section-index -# - coverage -- mkdocstrings: - handlers: - python: - paths: [src, docs/snippets] - inventories: - - https://docs.python.org/3/objects.inv - - https://mkdocstrings.github.io/objects.inv - - https://mkdocstrings.github.io/autorefs/objects.inv - - https://mkdocstrings.github.io/griffe/objects.inv - - https://python-markdown.github.io/objects.inv - options: - backlinks: tree - docstring_options: - ignore_init_summary: true - docstring_section_style: list - extensions: [scripts/griffe_extensions.py] - filters: public - heading_level: 1 - inherited_members: true - line_length: 88 - merge_init_into_class: true - parameter_headings: true - preload_modules: [mkdocstrings] - relative_crossrefs: true - scoped_crossrefs: true - separate_signature: true - show_bases: false - show_inheritance_diagram: true - show_root_heading: true - show_root_full_path: false - show_signature_annotations: true - show_source: false - show_symbol_type_heading: true - show_symbol_type_toc: true - signature_crossrefs: true - summary: true - unwrap_annotated: true -- llmstxt: - full_output: llms-full.txt - sections: - Usage: - - index.md - API: - - reference/api.md -- git-revision-date-localized: - enabled: !ENV [DEPLOY, false] - enable_creation_date: true - type: timeago -- minify: - minify_html: !ENV [DEPLOY, false] -- redirects: - redirect_maps: - reference/mkdocstrings_handlers/python/index.md: reference/api.md - reference/mkdocstrings_handlers/python/config.md: reference/api.md#mkdocstrings_handlers.python.config - reference/mkdocstrings_handlers/python/debug.md: reference/api.md#mkdocstrings_handlers.python.debug - reference/mkdocstrings_handlers/python/handler.md: reference/api.md#mkdocstrings_handlers.python.handler - reference/mkdocstrings_handlers/python/rendering.md: reference/api.md#mkdocstrings_handlers.python.rendering - -- group: - enabled: !ENV [MATERIAL_INSIDERS, false] - plugins: - - typeset - -extra: - social: - - icon: fontawesome/brands/github - link: https://github.com/pawamoy - - icon: fontawesome/brands/mastodon - link: https://fosstodon.org/@pawamoy - - icon: fontawesome/brands/twitter - link: https://twitter.com/pawamoy - - icon: fontawesome/brands/gitter - link: https://gitter.im/mkdocstrings/python - - icon: fontawesome/brands/python - link: https://pypi.org/project/mkdocstrings-python/ - analytics: - feedback: - title: Was this page helpful? - ratings: - - icon: material/emoticon-happy-outline - name: This page was helpful - data: 1 - note: Thanks for your feedback! - - icon: material/emoticon-sad-outline - name: This page could be improved - data: 0 - note: Let us know how we can improve this page. diff --git a/objects.inv b/objects.inv new file mode 100644 index 00000000..ca9f4942 Binary files /dev/null and b/objects.inv differ diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index d93cb20c..00000000 --- a/pyproject.toml +++ /dev/null @@ -1,124 +0,0 @@ -[build-system] -requires = ["pdm-backend"] -build-backend = "pdm.backend" - -[project] -name = "mkdocstrings-python" -description = "A Python handler for mkdocstrings." -authors = [{name = "Timothée Mazzucotelli", email = "dev@pawamoy.fr"}] -license = "ISC" -license-files = ["LICENSE"] -readme = "README.md" -requires-python = ">=3.9" -keywords = [] -dynamic = ["version"] -classifiers = [ - "Development Status :: 4 - Beta", - "Intended Audience :: Developers", - "Programming Language :: Python", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Programming Language :: Python :: 3.14", - "Topic :: Documentation", - "Topic :: Software Development", - "Topic :: Software Development :: Documentation", - "Topic :: Utilities", - "Typing :: Typed", -] -dependencies = [ - "mkdocstrings>=0.28.3", - "mkdocs-autorefs>=1.4", - "griffe>=1.6.2", - "typing-extensions>=4.0; python_version < '3.11'", -] - -[project.urls] -Homepage = "https://mkdocstrings.github.io/python" -Documentation = "https://mkdocstrings.github.io/python" -Changelog = "https://mkdocstrings.github.io/python/changelog" -Repository = "https://github.com/mkdocstrings/python" -Issues = "https://github.com/mkdocstrings/python/issues" -Discussions = "https://github.com/mkdocstrings/python/discussions" -Gitter = "https://gitter.im/mkdocstrings/python" -Funding = "https://github.com/sponsors/pawamoy" - -[tool.pdm.version] -source = "call" -getter = "scripts.get_version:get_version" - -[tool.pdm.build] -package-dir = "src" -includes = ["src/mkdocstrings_handlers"] -editable-backend = "editables" - -# Include as much as possible in the source distribution, to help redistributors. -excludes = ["**/.pytest_cache", "**/.mypy_cache"] -source-includes = [ - "config", - "docs", - "scripts", - "share", - "tests", - "duties.py", - "mkdocs.yml", - "*.md", - "LICENSE", -] - -[tool.pdm.build.wheel-data] -# Manual pages can be included in the wheel. -# Depending on the installation tool, they will be accessible to users. -# pipx supports it, uv does not yet, see https://github.com/astral-sh/uv/issues/4731. -data = [ - {path = "share/**/*", relative-to = "."}, -] - -[dependency-groups] -maintain = [ - "build>=1.2", - "git-changelog>=2.5", - "twine>=5.1", - "yore>=0.3.3", -] -ci = [ - "black>=25.1", - "duty>=1.6", - "ruff>=0.4", - "pytest>=8.2", - "pytest-cov>=5.0", - "pytest-randomly>=3.15", - "pytest-xdist>=3.6", - "beautifulsoup4>=4.12.3", - "inline-snapshot>=0.18", - "mypy>=1.10", - "types-markdown>=3.6", - "types-pyyaml>=6.0", -] - docs = [ - "markdown-callouts>=0.4", - "markdown-exec>=1.8", - "mkdocs>=1.6", - "mkdocs-coverage>=1.0", - "mkdocs-git-revision-date-localized-plugin>=1.2", - "mkdocs-llmstxt>=0.2", - "mkdocs-material>=9.5", - "mkdocs-minify-plugin>=0.8", - "mkdocs-redirects>=1.2", - "mkdocs-section-index>=0.3", - "mkdocstrings>=0.29", - "pydantic>=2.10", - # YORE: EOL 3.10: Remove line. - "tomli>=2.0; python_version < '3.11'", -] - -[tool.inline-snapshot] -storage-dir = "tests/snapshots" -format-command = "ruff format --config config/ruff.toml --stdin-filename {filename}" - -[tool.uv] -default-groups = ["maintain", "ci", "docs"] diff --git a/reference/api/index.html b/reference/api/index.html new file mode 100644 index 00000000..1c5ac77c --- /dev/null +++ b/reference/api/index.html @@ -0,0 +1,590 @@ + API reference - mkdocstrings-python

    python ¤

    Python handler for mkdocstrings.

    Modules:

    • config

      Deprecated. Import from mkdocstrings_handlers.python directly.

    • handler

      Deprecated. Import from mkdocstrings_handlers.python directly.

    • rendering

      Deprecated. Import from mkdocstrings_handlers.python directly.

    Classes:

    Functions:

    Attributes:

    • Order

      Ordering methods.

    • Tree

      A tree type. Each node holds a tuple of items.

    • do_stash_crossref

      Filter to stash cross-references (and restore them after formatting and highlighting).

    Order module-attribute ¤

    Order = Literal['__all__', 'alphabetical', 'source']
    +

    Ordering methods.

    • __all__: order members according to __all__ module attributes, if declared;
    • alphabetical: order members alphabetically;
    • source: order members as they appear in the source file.

    Tree module-attribute ¤

    Tree = dict[tuple[_T, ...], 'Tree']
    +

    A tree type. Each node holds a tuple of items.

    do_stash_crossref module-attribute ¤

    do_stash_crossref = _StashCrossRefFilter()
    +

    Filter to stash cross-references (and restore them after formatting and highlighting).

    AutoStyleOptions dataclass ¤

    AutoStyleOptions(
    +    method: Literal["heuristics", "max_sections"] = "heuristics",
    +    style_order: list[str] = lambda: ["sphinx", "google", "numpy"](),
    +    default: str | None = None,
    +    per_style_options: PerStyleOptions = PerStyleOptions(),
    +)
    +

    Auto style docstring options.

    Methods:

    • from_data

      Create an instance from a dictionary.

    Attributes:

    default class-attribute instance-attribute ¤

    default: str | None = None
    +

    The default docstring style to use if no other style is detected.

    method class-attribute instance-attribute ¤

    method: Literal['heuristics', 'max_sections'] = 'heuristics'
    +

    The method to use to determine the docstring style.

    per_style_options class-attribute instance-attribute ¤

    per_style_options: PerStyleOptions = field(default_factory=PerStyleOptions)
    +

    Per-style options.

    style_order class-attribute instance-attribute ¤

    style_order: list[str] = field(default_factory=lambda: ['sphinx', 'google', 'numpy'])
    +

    The order of the docstring styles to try.

    from_data classmethod ¤

    from_data(**data: Any) -> Self
    +

    Create an instance from a dictionary.

    AutorefsHook ¤

    AutorefsHook(current_object: Object | Alias, config: dict[str, Any])
    +
    
    +              flowchart TD
    +              mkdocstrings_handlers.python.AutorefsHook[AutorefsHook]
    +
    +              
    +
    +              click mkdocstrings_handlers.python.AutorefsHook href "" "mkdocstrings_handlers.python.AutorefsHook"
    +            

    Autorefs hook.

    With this hook, we're able to add context to autorefs (cross-references), such as originating file path and line number, to improve error reporting.

    Parameters:

    • current_object ¤

      (Object | Alias) –

      The object being rendered.

    • config ¤

      (dict[str, Any]) –

      The configuration dictionary.

    Methods:

    Attributes:

    config instance-attribute ¤

    config = config
    +

    The configuration options.

    current_object instance-attribute ¤

    current_object = current_object
    +

    The current object being rendered.

    expand_identifier ¤

    expand_identifier(identifier: str) -> str
    +

    Expand an identifier.

    Parameters:

    • identifier ¤

      (str) –

      The identifier to expand.

    Returns:

    • str

      The expanded identifier.

    get_context ¤

    get_context() -> Context
    +

    Get the context for the current object.

    Returns:

    GoogleStyleOptions dataclass ¤

    GoogleStyleOptions(
    +    ignore_init_summary: bool = False,
    +    returns_multiple_items: bool = True,
    +    returns_named_value: bool = True,
    +    returns_type_in_property_summary: bool = False,
    +    receives_multiple_items: bool = True,
    +    receives_named_value: bool = True,
    +    trim_doctest_flags: bool = True,
    +    warn_unknown_params: bool = True,
    +)
    +

    Google style docstring options.

    Attributes:

    ignore_init_summary class-attribute instance-attribute ¤

    ignore_init_summary: bool = False
    +

    Whether to ignore the summary in __init__ methods' docstrings.

    receives_multiple_items class-attribute instance-attribute ¤

    receives_multiple_items: bool = True
    +

    Whether to parse multiple items in Receives sections.

    When true, each item's continuation lines must be indented. When false (single item), no further indentation is required.

    receives_named_value class-attribute instance-attribute ¤

    receives_named_value: bool = True
    +

    Whether to parse Receives section items as name and description, rather than type and description.

    When true, type must be wrapped in parentheses: (int): Description.. Names are optional: name (int): Description.. When false, parentheses are optional but the items cannot be named: int: Description.

    returns_multiple_items class-attribute instance-attribute ¤

    returns_multiple_items: bool = True
    +

    Whether to parse multiple items in Yields and Returns sections.

    When true, each item's continuation lines must be indented. When false (single item), no further indentation is required.

    returns_named_value class-attribute instance-attribute ¤

    returns_named_value: bool = True
    +

    Whether to parse Yields and Returns section items as name and description, rather than type and description.

    When true, type must be wrapped in parentheses: (int): Description.. Names are optional: name (int): Description.. When false, parentheses are optional but the items cannot be named: int: Description.

    returns_type_in_property_summary class-attribute instance-attribute ¤

    returns_type_in_property_summary: bool = False
    +

    Whether to parse the return type of properties at the beginning of their summary: str: Summary of the property.

    trim_doctest_flags class-attribute instance-attribute ¤

    trim_doctest_flags: bool = True
    +

    Whether to remove doctest flags from Python example blocks.

    warn_unknown_params class-attribute instance-attribute ¤

    warn_unknown_params: bool = True
    +

    Warn about documented parameters not appearing in the signature.

    Inventory dataclass ¤

    Inventory(url: str, base_url: str | None = None, domains: list[str] = lambda: ['py']())
    +

    An inventory.

    Attributes:

    • base_url (str | None) –

      The base URL of the inventory.

    • domains (list[str]) –

      The domains to load from the inventory.

    • url (str) –

      The URL of the inventory.

    base_url class-attribute instance-attribute ¤

    base_url: str | None = None
    +

    The base URL of the inventory.

    domains class-attribute instance-attribute ¤

    domains: list[str] = field(default_factory=lambda: ['py'])
    +

    The domains to load from the inventory.

    url instance-attribute ¤

    url: str
    +

    The URL of the inventory.

    NumpyStyleOptions dataclass ¤

    NumpyStyleOptions(
    +    ignore_init_summary: bool = False,
    +    trim_doctest_flags: bool = True,
    +    warn_unknown_params: bool = True,
    +)
    +

    Numpy style docstring options.

    Attributes:

    ignore_init_summary class-attribute instance-attribute ¤

    ignore_init_summary: bool = False
    +

    Whether to ignore the summary in __init__ methods' docstrings.

    trim_doctest_flags class-attribute instance-attribute ¤

    trim_doctest_flags: bool = True
    +

    Whether to remove doctest flags from Python example blocks.

    warn_unknown_params class-attribute instance-attribute ¤

    warn_unknown_params: bool = True
    +

    Warn about documented parameters not appearing in the signature.

    PerStyleOptions dataclass ¤

    PerStyleOptions(
    +    google: GoogleStyleOptions = GoogleStyleOptions(),
    +    numpy: NumpyStyleOptions = NumpyStyleOptions(),
    +    sphinx: SphinxStyleOptions = SphinxStyleOptions(),
    +)
    +

    Per style options.

    Methods:

    • from_data

      Create an instance from a dictionary.

    Attributes:

    google class-attribute instance-attribute ¤

    google: GoogleStyleOptions = field(default_factory=GoogleStyleOptions)
    +

    Google-style options.

    numpy class-attribute instance-attribute ¤

    numpy: NumpyStyleOptions = field(default_factory=NumpyStyleOptions)
    +

    Numpydoc-style options.

    sphinx class-attribute instance-attribute ¤

    sphinx: SphinxStyleOptions = field(default_factory=SphinxStyleOptions)
    +

    Sphinx-style options.

    from_data classmethod ¤

    from_data(**data: Any) -> Self
    +

    Create an instance from a dictionary.

    PythonConfig dataclass ¤

    PythonConfig(
    +    inventories: list[Inventory] = list(),
    +    paths: list[str] = lambda: ["."](),
    +    load_external_modules: bool | None = None,
    +    options: dict[str, Any] = dict(),
    +    locale: str | None = None,
    +)
    +
    
    +              flowchart TD
    +              mkdocstrings_handlers.python.PythonConfig[PythonConfig]
    +              mkdocstrings_handlers.python._internal.config.PythonInputConfig[PythonInputConfig]
    +
    +                              mkdocstrings_handlers.python._internal.config.PythonInputConfig --> mkdocstrings_handlers.python.PythonConfig
    +                
    +
    +
    +              click mkdocstrings_handlers.python.PythonConfig href "" "mkdocstrings_handlers.python.PythonConfig"
    +              click mkdocstrings_handlers.python._internal.config.PythonInputConfig href "" "mkdocstrings_handlers.python._internal.config.PythonInputConfig"
    +            

    Python handler configuration.

    Methods:

    • coerce

      Coerce data.

    • from_data

      Create an instance from a dictionary.

    Attributes:

    inventories class-attribute instance-attribute ¤

    inventories: list[Inventory] = field(default_factory=list)
    +

    The object inventories to load.

    load_external_modules class-attribute instance-attribute ¤

    load_external_modules: bool | None = None
    +

    Whether to always load external modules/packages.

    locale class-attribute instance-attribute ¤

    locale: str | None = None
    +

    The locale to use when translating template strings.

    options class-attribute instance-attribute ¤

    options: dict[str, Any] = field(default_factory=dict)
    +

    Configuration options for collecting and rendering objects.

    paths class-attribute instance-attribute ¤

    paths: list[str] = field(default_factory=lambda: ['.'])
    +

    The paths in which to search for Python packages.

    coerce classmethod ¤

    coerce(**data: Any) -> MutableMapping[str, Any]
    +

    Coerce data.

    from_data classmethod ¤

    from_data(**data: Any) -> Self
    +

    Create an instance from a dictionary.

    PythonHandler ¤

    PythonHandler(config: PythonConfig, base_dir: Path, **kwargs: Any)
    +
    
    +              flowchart TD
    +              mkdocstrings_handlers.python.PythonHandler[PythonHandler]
    +              mkdocstrings._internal.handlers.base.BaseHandler[BaseHandler]
    +
    +                              mkdocstrings._internal.handlers.base.BaseHandler --> mkdocstrings_handlers.python.PythonHandler
    +                
    +
    +
    +              click mkdocstrings_handlers.python.PythonHandler href "" "mkdocstrings_handlers.python.PythonHandler"
    +              click mkdocstrings._internal.handlers.base.BaseHandler href "" "mkdocstrings._internal.handlers.base.BaseHandler"
    +            

    The Python handler class.

    Parameters:

    • config ¤

      (PythonConfig) –

      The handler configuration.

    • base_dir ¤

      (Path) –

      The base directory of the project.

    • **kwargs ¤

      (Any, default: {} ) –

      Arguments passed to the parent constructor.

    Methods:

    • collect

      Collect the documentation for the given identifier.

    • do_convert_markdown

      Render Markdown text; for use inside templates.

    • do_heading

      Render an HTML heading and register it for the table of contents. For use inside templates.

    • get_aliases

      Get the aliases for the given identifier.

    • get_extended_templates_dirs

      Load template extensions for the given handler, return their templates directories.

    • get_headings

      Return and clear the headings gathered so far.

    • get_inventory_urls

      Return the URLs of the inventory files to download.

    • get_options

      Get combined default, global and local options.

    • get_templates_dir

      Return the path to the handler's templates directory.

    • load_inventory

      Yield items and their URLs from an inventory file streamed from in_file.

    • normalize_extension_paths

      Resolve extension paths relative to config file.

    • render

      Render the collected data.

    • render_backlinks

      Render the backlinks.

    • teardown

      Teardown the handler.

    • update_env

      Update the Jinja environment with custom filters and tests.

    Attributes:

    • base_dir

      The base directory of the project.

    • config

      The handler configuration.

    • custom_templates

      The path to custom templates.

    • domain (str) –

      The cross-documentation domain/language for this handler.

    • enable_inventory (bool) –

      Whether this handler is interested in enabling the creation of the objects.inv Sphinx inventory file.

    • env

      The Jinja environment.

    • extra_css (str) –

      Extra CSS.

    • fallback_config (dict) –

      Fallback configuration when searching anchors for identifiers.

    • fallback_theme (str) –

      The fallback theme.

    • global_options

      The global configuration options (in mkdocs.yml).

    • md (Markdown) –

      The Markdown instance.

    • mdx

      The Markdown extensions to use.

    • mdx_config

      The configuration for the Markdown extensions.

    • name (str) –

      The handler's name.

    • outer_layer (bool) –

      Whether we're in the outer Markdown conversion layer.

    • theme

      The selected theme.

    base_dir instance-attribute ¤

    base_dir = base_dir
    +

    The base directory of the project.

    config instance-attribute ¤

    config = config
    +

    The handler configuration.

    custom_templates instance-attribute ¤

    custom_templates = custom_templates
    +

    The path to custom templates.

    domain class-attribute ¤

    domain: str = 'py'
    +

    The cross-documentation domain/language for this handler.

    enable_inventory class-attribute ¤

    enable_inventory: bool = True
    +

    Whether this handler is interested in enabling the creation of the objects.inv Sphinx inventory file.

    env instance-attribute ¤

    env = Environment(autoescape=True, loader=FileSystemLoader(paths), auto_reload=False)
    +

    The Jinja environment.

    extra_css class-attribute instance-attribute ¤

    extra_css: str = ''
    +

    Extra CSS.

    fallback_config class-attribute ¤

    fallback_config: dict = {}
    +

    Fallback configuration when searching anchors for identifiers.

    fallback_theme class-attribute ¤

    fallback_theme: str = 'material'
    +

    The fallback theme.

    global_options instance-attribute ¤

    global_options = global_options
    +

    The global configuration options (in mkdocs.yml).

    md property ¤

    md: Markdown
    +

    The Markdown instance.

    Raises:

    • RuntimeError

      When the Markdown instance is not set yet.

    mdx instance-attribute ¤

    mdx = mdx
    +

    The Markdown extensions to use.

    mdx_config instance-attribute ¤

    mdx_config = mdx_config
    +

    The configuration for the Markdown extensions.

    name class-attribute ¤

    name: str = 'python'
    +

    The handler's name.

    outer_layer property ¤

    outer_layer: bool
    +

    Whether we're in the outer Markdown conversion layer.

    theme instance-attribute ¤

    theme = theme
    +

    The selected theme.

    collect ¤

    Collect the documentation for the given identifier.

    Parameters:

    • identifier ¤

      (str) –

      The identifier of the object to collect.

    • options ¤

      (PythonOptions) –

      The options to use for the collection.

    Returns:

    do_convert_markdown ¤

    do_convert_markdown(
    +    text: str,
    +    heading_level: int,
    +    html_id: str = "",
    +    *,
    +    strip_paragraph: bool = False,
    +    autoref_hook: AutorefsHookInterface | None = None
    +) -> Markup
    +

    Render Markdown text; for use inside templates.

    Parameters:

    • text ¤

      (str) –

      The text to convert.

    • heading_level ¤

      (int) –

      The base heading level to start all Markdown headings from.

    • html_id ¤

      (str, default: '' ) –

      The HTML id of the element that's considered the parent of this element.

    • strip_paragraph ¤

      (bool, default: False ) –

      Whether to exclude the <p> tag from around the whole output.

    Returns:

    • Markup

      An HTML string.

    do_heading ¤

    do_heading(
    +    content: Markup,
    +    heading_level: int,
    +    *,
    +    role: str | None = None,
    +    hidden: bool = False,
    +    toc_label: str | None = None,
    +    **attributes: str
    +) -> Markup
    +

    Render an HTML heading and register it for the table of contents. For use inside templates.

    Parameters:

    • content ¤

      (Markup) –

      The HTML within the heading.

    • heading_level ¤

      (int) –

      The level of heading (e.g. 3 -> h3).

    • role ¤

      (str | None, default: None ) –

      An optional role for the object bound to this heading.

    • hidden ¤

      (bool, default: False ) –

      If True, only register it for the table of contents, don't render anything.

    • toc_label ¤

      (str | None, default: None ) –

      The title to use in the table of contents ('data-toc-label' attribute).

    • **attributes ¤

      (str, default: {} ) –

      Any extra HTML attributes of the heading.

    Returns:

    • Markup

      An HTML string.

    get_aliases ¤

    get_aliases(identifier: str) -> tuple[str, ...]
    +

    Get the aliases for the given identifier.

    Parameters:

    • identifier ¤

      (str) –

      The identifier to get the aliases for.

    Returns:

    get_extended_templates_dirs ¤

    get_extended_templates_dirs(handler: str) -> list[Path]
    +

    Load template extensions for the given handler, return their templates directories.

    Parameters:

    • handler ¤

      (str) –

      The name of the handler to get the extended templates directory of.

    Returns:

    • list[Path]

      The extensions templates directories.

    get_headings ¤

    get_headings() -> Sequence[Element]
    +

    Return and clear the headings gathered so far.

    Returns:

    get_inventory_urls ¤

    get_inventory_urls() -> list[tuple[str, dict[str, Any]]]
    +

    Return the URLs of the inventory files to download.

    get_options ¤

    Get combined default, global and local options.

    Parameters:

    Returns:

    get_templates_dir ¤

    get_templates_dir(handler: str | None = None) -> Path
    +

    Return the path to the handler's templates directory.

    Override to customize how the templates directory is found.

    Parameters:

    • handler ¤

      (str | None, default: None ) –

      The name of the handler to get the templates directory of.

    Raises:

    Returns:

    • Path

      The templates directory path.

    load_inventory staticmethod ¤

    load_inventory(
    +    in_file: BinaryIO,
    +    url: str,
    +    base_url: str | None = None,
    +    domains: list[str] | None = None,
    +    **kwargs: Any
    +) -> Iterator[tuple[str, str]]
    +

    Yield items and their URLs from an inventory file streamed from in_file.

    This implements mkdocstrings' load_inventory "protocol" (see mkdocstrings.plugin).

    Parameters:

    • in_file ¤

      (BinaryIO) –

      The binary file-like object to read the inventory from.

    • url ¤

      (str) –

      The URL that this file is being streamed from (used to guess base_url).

    • base_url ¤

      (str | None, default: None ) –

      The URL that this inventory's sub-paths are relative to.

    • domains ¤

      (list[str] | None, default: None ) –

      A list of domain strings to filter the inventory by, when not passed, "py" will be used.

    • **kwargs ¤

      (Any, default: {} ) –

      Ignore additional arguments passed from the config.

    Yields:

    • tuple[str, str]

      Tuples of (item identifier, item URL).

    normalize_extension_paths ¤

    normalize_extension_paths(extensions: Sequence) -> Sequence
    +

    Resolve extension paths relative to config file.

    Parameters:

    • extensions ¤

      (Sequence) –

      The extensions (configuration) to normalize.

    Returns:

    • Sequence

      The normalized extensions.

    render ¤

    Render the collected data.

    Parameters:

    Returns:

    • str

      The rendered data (HTML).

    render_backlinks(backlinks: Mapping[str, Iterable[Backlink]]) -> str
    +

    Render the backlinks.

    Parameters:

    Returns:

    • str

      The rendered backlinks (HTML).

    teardown ¤

    teardown() -> None
    +

    Teardown the handler.

    This method should be implemented to, for example, terminate a subprocess that was started when creating the handler instance.

    update_env ¤

    update_env(config: Any) -> None
    +

    Update the Jinja environment with custom filters and tests.

    Parameters:

    • config ¤

      (Any) –

      The SSG configuration.

    PythonInputConfig dataclass ¤

    PythonInputConfig(
    +    inventories: list[str | Inventory] = list(),
    +    paths: list[str] = lambda: ["."](),
    +    load_external_modules: bool | None = None,
    +    options: PythonInputOptions = PythonInputOptions(),
    +    locale: str | None = None,
    +)
    +

    Python handler configuration.

    Methods:

    • coerce

      Coerce data.

    • from_data

      Create an instance from a dictionary.

    Attributes:

    inventories class-attribute instance-attribute ¤

    inventories: list[str | Inventory] = field(default_factory=list)
    +

    The inventories to load.

    load_external_modules class-attribute instance-attribute ¤

    load_external_modules: bool | None = None
    +

    Whether to always load external modules/packages.

    locale class-attribute instance-attribute ¤

    locale: str | None = None
    +

    The locale to use when translating template strings.

    options class-attribute instance-attribute ¤

    options: PythonInputOptions = field(default_factory=PythonInputOptions)
    +

    Configuration options for collecting and rendering objects.

    paths class-attribute instance-attribute ¤

    paths: list[str] = field(default_factory=lambda: ['.'])
    +

    The paths in which to search for Python packages.

    coerce classmethod ¤

    coerce(**data: Any) -> MutableMapping[str, Any]
    +

    Coerce data.

    from_data classmethod ¤

    from_data(**data: Any) -> Self
    +

    Create an instance from a dictionary.

    PythonInputOptions dataclass ¤

    PythonInputOptions(
    +    allow_inspection: bool = True,
    +    force_inspection: bool = False,
    +    annotations_path: Literal["brief", "source", "full"] = "brief",
    +    backlinks: Literal["flat", "tree", False] = False,
    +    docstring_options: (
    +        GoogleStyleOptions
    +        | NumpyStyleOptions
    +        | SphinxStyleOptions
    +        | AutoStyleOptions
    +        | None
    +    ) = None,
    +    docstring_section_style: Literal["table", "list", "spacy"] = "table",
    +    docstring_style: Literal["auto", "google", "numpy", "sphinx"] | None = "google",
    +    extensions: list[str | dict[str, Any]] = list(),
    +    filters: list[str] | Literal["public"] = lambda: copy()(),
    +    find_stubs_package: bool = False,
    +    group_by_category: bool = True,
    +    heading: str = "",
    +    heading_level: int = 2,
    +    inherited_members: bool | list[str] = False,
    +    line_length: int = 60,
    +    members: list[str] | bool | None = None,
    +    members_order: Order | list[Order] = "alphabetical",
    +    merge_init_into_class: bool = False,
    +    modernize_annotations: bool = False,
    +    parameter_headings: bool = False,
    +    preload_modules: list[str] = list(),
    +    relative_crossrefs: bool = False,
    +    scoped_crossrefs: bool = False,
    +    show_overloads: bool = True,
    +    separate_signature: bool = False,
    +    show_bases: bool = True,
    +    show_category_heading: bool = False,
    +    show_docstring_attributes: bool = True,
    +    show_docstring_classes: bool = True,
    +    show_docstring_description: bool = True,
    +    show_docstring_examples: bool = True,
    +    show_docstring_functions: bool = True,
    +    show_docstring_modules: bool = True,
    +    show_docstring_other_parameters: bool = True,
    +    show_docstring_parameters: bool = True,
    +    show_docstring_raises: bool = True,
    +    show_docstring_receives: bool = True,
    +    show_docstring_returns: bool = True,
    +    show_docstring_warns: bool = True,
    +    show_docstring_yields: bool = True,
    +    show_if_no_docstring: bool = False,
    +    show_inheritance_diagram: bool = False,
    +    show_labels: bool = True,
    +    show_object_full_path: bool = False,
    +    show_root_full_path: bool = True,
    +    show_root_heading: bool = False,
    +    show_root_members_full_path: bool = False,
    +    show_root_toc_entry: bool = True,
    +    show_signature_annotations: bool = False,
    +    show_signature: bool = True,
    +    show_source: bool = True,
    +    show_submodules: bool = False,
    +    show_symbol_type_heading: bool = False,
    +    show_symbol_type_toc: bool = False,
    +    signature_crossrefs: bool = False,
    +    summary: bool | SummaryOption = SummaryOption(),
    +    toc_label: str = "",
    +    unwrap_annotated: bool = False,
    +    extra: dict[str, Any] = dict(),
    +)
    +

    Accepted input options.

    Methods:

    • coerce

      Coerce data.

    • from_data

      Create an instance from a dictionary.

    Attributes:

    allow_inspection class-attribute instance-attribute ¤

    allow_inspection: bool = True
    +

    Whether to allow inspecting modules when visiting them is not possible.

    annotations_path class-attribute instance-attribute ¤

    annotations_path: Literal['brief', 'source', 'full'] = 'brief'
    +

    The verbosity for annotations path: brief (recommended), source (as written in the source), or full.

    backlinks: Literal['flat', 'tree', False] = False
    +

    Whether to render backlinks, and how.

    docstring_options class-attribute instance-attribute ¤

    docstring_options: (
    +    GoogleStyleOptions
    +    | NumpyStyleOptions
    +    | SphinxStyleOptions
    +    | AutoStyleOptions
    +    | None
    +) = None
    +

    The options for the docstring parser.

    See docstring parsers and their options in Griffe docs.

    docstring_section_style class-attribute instance-attribute ¤

    docstring_section_style: Literal['table', 'list', 'spacy'] = 'table'
    +

    The style used to render docstring sections.

    docstring_style class-attribute instance-attribute ¤

    docstring_style: Literal['auto', 'google', 'numpy', 'sphinx'] | None = 'google'
    +

    The docstring style to use: auto, google, numpy, sphinx, or None.

    extensions class-attribute instance-attribute ¤

    extensions: list[str | dict[str, Any]] = field(default_factory=list)
    +

    A list of Griffe extensions to load.

    extra class-attribute instance-attribute ¤

    extra: dict[str, Any] = field(default_factory=dict)
    +

    Extra options.

    filters class-attribute instance-attribute ¤

    filters: list[str] | Literal['public'] = field(default_factory=lambda: copy())
    +

    A list of filters, or "public".

    List of filters

    A filter starting with ! will exclude matching objects instead of including them. The members option takes precedence over filters (filters will still be applied recursively to lower members in the hierarchy).

    Filtering methods

    Sponsors only Insiders 1.11.0

    The public method will include only public objects: those added to __all__ or not starting with an underscore (except for special methods/attributes).

    find_stubs_package class-attribute instance-attribute ¤

    find_stubs_package: bool = False
    +

    Whether to load stubs package (package-stubs) when extracting docstrings.

    force_inspection class-attribute instance-attribute ¤

    force_inspection: bool = False
    +

    Whether to force using dynamic analysis when loading data.

    group_by_category class-attribute instance-attribute ¤

    group_by_category: bool = True
    +

    Group the object's children by categories: attributes, classes, functions, and modules.

    heading class-attribute instance-attribute ¤

    heading: str = ''
    +

    A custom string to override the autogenerated heading of the root object.

    heading_level class-attribute instance-attribute ¤

    heading_level: int = 2
    +

    The initial heading level to use.

    inherited_members class-attribute instance-attribute ¤

    inherited_members: bool | list[str] = False
    +

    A boolean, or an explicit list of inherited members to render.

    If true, select all inherited members, which can then be filtered with members. If false or empty list, do not select any inherited member.

    line_length class-attribute instance-attribute ¤

    line_length: int = 60
    +

    Maximum line length when formatting code/signatures.

    members class-attribute instance-attribute ¤

    members: list[str] | bool | None = None
    +

    A boolean, or an explicit list of members to render.

    If true, select all members without further filtering. If false or empty list, do not render members. If none, select all members and apply further filtering with filters and docstrings.

    members_order class-attribute instance-attribute ¤

    members_order: Order | list[Order] = 'alphabetical'
    +

    The members ordering to use.

    • __all__: order members according to __all__ module attributes, if declared;
    • alphabetical: order members alphabetically;
    • source: order members as they appear in the source file.

    Since __all__ is a module-only attribute, it can't be used to sort class members, therefore the members_order option accepts a list of ordering methods, indicating ordering preferences.

    merge_init_into_class class-attribute instance-attribute ¤

    merge_init_into_class: bool = False
    +

    Whether to merge the __init__ method into the class' signature and docstring.

    modernize_annotations class-attribute instance-attribute ¤

    modernize_annotations: bool = False
    +

    Whether to modernize annotations, for example Optional[str] into str | None.

    parameter_headings class-attribute instance-attribute ¤

    parameter_headings: bool = False
    +

    Whether to render headings for parameters (therefore showing parameters in the ToC).

    preload_modules class-attribute instance-attribute ¤

    preload_modules: list[str] = field(default_factory=list)
    +

    Pre-load modules that are not specified directly in autodoc instructions (::: identifier).

    It is useful when you want to render documentation for a particular member of an object, and this member is imported from another package than its parent.

    For an imported member to be rendered, you need to add it to the __all__ attribute of the importing module.

    The modules must be listed as an array of strings.

    relative_crossrefs class-attribute instance-attribute ¤

    relative_crossrefs: bool = False
    +

    Whether to enable the relative crossref syntax.

    scoped_crossrefs class-attribute instance-attribute ¤

    scoped_crossrefs: bool = False
    +

    Whether to enable the scoped crossref ability.

    separate_signature class-attribute instance-attribute ¤

    separate_signature: bool = False
    +

    Whether to put the whole signature in a code block below the heading.

    If Black or Ruff are installed, the signature is also formatted using them.

    show_bases class-attribute instance-attribute ¤

    show_bases: bool = True
    +

    Show the base classes of a class.

    show_category_heading class-attribute instance-attribute ¤

    show_category_heading: bool = False
    +

    When grouped by categories, show a heading for each category.

    show_docstring_attributes class-attribute instance-attribute ¤

    show_docstring_attributes: bool = True
    +

    Whether to display the 'Attributes' section in the object's docstring.

    show_docstring_classes class-attribute instance-attribute ¤

    show_docstring_classes: bool = True
    +

    Whether to display the 'Classes' section in the object's docstring.

    show_docstring_description class-attribute instance-attribute ¤

    show_docstring_description: bool = True
    +

    Whether to display the textual block (including admonitions) in the object's docstring.

    show_docstring_examples class-attribute instance-attribute ¤

    show_docstring_examples: bool = True
    +

    Whether to display the 'Examples' section in the object's docstring.

    show_docstring_functions class-attribute instance-attribute ¤

    show_docstring_functions: bool = True
    +

    Whether to display the 'Functions' or 'Methods' sections in the object's docstring.

    show_docstring_modules class-attribute instance-attribute ¤

    show_docstring_modules: bool = True
    +

    Whether to display the 'Modules' section in the object's docstring.

    show_docstring_other_parameters class-attribute instance-attribute ¤

    show_docstring_other_parameters: bool = True
    +

    Whether to display the 'Other Parameters' section in the object's docstring.

    show_docstring_parameters class-attribute instance-attribute ¤

    show_docstring_parameters: bool = True
    +

    Whether to display the 'Parameters' section in the object's docstring.

    show_docstring_raises class-attribute instance-attribute ¤

    show_docstring_raises: bool = True
    +

    Whether to display the 'Raises' section in the object's docstring.

    show_docstring_receives class-attribute instance-attribute ¤

    show_docstring_receives: bool = True
    +

    Whether to display the 'Receives' section in the object's docstring.

    show_docstring_returns class-attribute instance-attribute ¤

    show_docstring_returns: bool = True
    +

    Whether to display the 'Returns' section in the object's docstring.

    show_docstring_warns class-attribute instance-attribute ¤

    show_docstring_warns: bool = True
    +

    Whether to display the 'Warns' section in the object's docstring.

    show_docstring_yields class-attribute instance-attribute ¤

    show_docstring_yields: bool = True
    +

    Whether to display the 'Yields' section in the object's docstring.

    show_if_no_docstring class-attribute instance-attribute ¤

    show_if_no_docstring: bool = False
    +

    Show the object heading even if it has no docstring or children with docstrings.

    show_inheritance_diagram class-attribute instance-attribute ¤

    show_inheritance_diagram: bool = False
    +

    Show the inheritance diagram of a class using Mermaid.

    show_labels class-attribute instance-attribute ¤

    show_labels: bool = True
    +

    Whether to show labels of the members.

    show_object_full_path class-attribute instance-attribute ¤

    show_object_full_path: bool = False
    +

    Show the full Python path of every object.

    show_overloads class-attribute instance-attribute ¤

    show_overloads: bool = True
    +

    Show the overloads of a function or method.

    show_root_full_path class-attribute instance-attribute ¤

    show_root_full_path: bool = True
    +

    Show the full Python path for the root object heading.

    show_root_heading class-attribute instance-attribute ¤

    show_root_heading: bool = False
    +

    Show the heading of the object at the root of the documentation tree.

    The root object is the object referenced by the identifier after :::.

    show_root_members_full_path class-attribute instance-attribute ¤

    show_root_members_full_path: bool = False
    +

    Show the full Python path of the root members.

    show_root_toc_entry class-attribute instance-attribute ¤

    show_root_toc_entry: bool = True
    +

    If the root heading is not shown, at least add a ToC entry for it.

    show_signature class-attribute instance-attribute ¤

    show_signature: bool = True
    +

    Show methods and functions signatures.

    show_signature_annotations class-attribute instance-attribute ¤

    show_signature_annotations: bool = False
    +

    Show the type annotations in methods and functions signatures.

    show_source class-attribute instance-attribute ¤

    show_source: bool = True
    +

    Show the source code of this object.

    show_submodules class-attribute instance-attribute ¤

    show_submodules: bool = False
    +

    When rendering a module, show its submodules recursively.

    show_symbol_type_heading class-attribute instance-attribute ¤

    show_symbol_type_heading: bool = False
    +

    Show the symbol type in headings (e.g. mod, class, meth, func and attr).

    show_symbol_type_toc class-attribute instance-attribute ¤

    show_symbol_type_toc: bool = False
    +

    Show the symbol type in the Table of Contents (e.g. mod, class, methd, func and attr).

    signature_crossrefs class-attribute instance-attribute ¤

    signature_crossrefs: bool = False
    +

    Whether to render cross-references for type annotations in signatures.

    summary class-attribute instance-attribute ¤

    summary: bool | SummaryOption = field(default_factory=SummaryOption)
    +

    Whether to render summaries of modules, classes, functions (methods) and attributes.

    toc_label class-attribute instance-attribute ¤

    toc_label: str = ''
    +

    A custom string to override the autogenerated toc label of the root object.

    unwrap_annotated class-attribute instance-attribute ¤

    unwrap_annotated: bool = False
    +

    Whether to unwrap Annotated types to show only the type without the annotations.

    coerce classmethod ¤

    coerce(**data: Any) -> MutableMapping[str, Any]
    +

    Coerce data.

    from_data classmethod ¤

    from_data(**data: Any) -> Self
    +

    Create an instance from a dictionary.

    PythonOptions dataclass ¤

    PythonOptions(
    +    allow_inspection: bool = True,
    +    force_inspection: bool = False,
    +    annotations_path: Literal["brief", "source", "full"] = "brief",
    +    backlinks: Literal["flat", "tree", False] = False,
    +    docstring_options: (
    +        GoogleStyleOptions
    +        | NumpyStyleOptions
    +        | SphinxStyleOptions
    +        | AutoStyleOptions
    +        | None
    +    ) = None,
    +    docstring_section_style: Literal["table", "list", "spacy"] = "table",
    +    docstring_style: Literal["auto", "google", "numpy", "sphinx"] | None = "google",
    +    extensions: list[str | dict[str, Any]] = list(),
    +    filters: list[tuple[Pattern, bool]] | Literal["public"] = lambda: [
    +        (compile(removeprefix("!")), startswith("!")) for filtr in _DEFAULT_FILTERS
    +    ](),
    +    find_stubs_package: bool = False,
    +    group_by_category: bool = True,
    +    heading: str = "",
    +    heading_level: int = 2,
    +    inherited_members: bool | list[str] = False,
    +    line_length: int = 60,
    +    members: list[str] | bool | None = None,
    +    members_order: Order | list[Order] = "alphabetical",
    +    merge_init_into_class: bool = False,
    +    modernize_annotations: bool = False,
    +    parameter_headings: bool = False,
    +    preload_modules: list[str] = list(),
    +    relative_crossrefs: bool = False,
    +    scoped_crossrefs: bool = False,
    +    show_overloads: bool = True,
    +    separate_signature: bool = False,
    +    show_bases: bool = True,
    +    show_category_heading: bool = False,
    +    show_docstring_attributes: bool = True,
    +    show_docstring_classes: bool = True,
    +    show_docstring_description: bool = True,
    +    show_docstring_examples: bool = True,
    +    show_docstring_functions: bool = True,
    +    show_docstring_modules: bool = True,
    +    show_docstring_other_parameters: bool = True,
    +    show_docstring_parameters: bool = True,
    +    show_docstring_raises: bool = True,
    +    show_docstring_receives: bool = True,
    +    show_docstring_returns: bool = True,
    +    show_docstring_warns: bool = True,
    +    show_docstring_yields: bool = True,
    +    show_if_no_docstring: bool = False,
    +    show_inheritance_diagram: bool = False,
    +    show_labels: bool = True,
    +    show_object_full_path: bool = False,
    +    show_root_full_path: bool = True,
    +    show_root_heading: bool = False,
    +    show_root_members_full_path: bool = False,
    +    show_root_toc_entry: bool = True,
    +    show_signature_annotations: bool = False,
    +    show_signature: bool = True,
    +    show_source: bool = True,
    +    show_submodules: bool = False,
    +    show_symbol_type_heading: bool = False,
    +    show_symbol_type_toc: bool = False,
    +    signature_crossrefs: bool = False,
    +    summary: SummaryOption = SummaryOption(),
    +    toc_label: str = "",
    +    unwrap_annotated: bool = False,
    +    extra: dict[str, Any] = dict(),
    +)
    +
    
    +              flowchart TD
    +              mkdocstrings_handlers.python.PythonOptions[PythonOptions]
    +              mkdocstrings_handlers.python._internal.config.PythonInputOptions[PythonInputOptions]
    +
    +                              mkdocstrings_handlers.python._internal.config.PythonInputOptions --> mkdocstrings_handlers.python.PythonOptions
    +                
    +
    +
    +              click mkdocstrings_handlers.python.PythonOptions href "" "mkdocstrings_handlers.python.PythonOptions"
    +              click mkdocstrings_handlers.python._internal.config.PythonInputOptions href "" "mkdocstrings_handlers.python._internal.config.PythonInputOptions"
    +            

    Final options passed as template context.

    Methods:

    • coerce

      Create an instance from a dictionary.

    • from_data

      Create an instance from a dictionary.

    Attributes:

    allow_inspection class-attribute instance-attribute ¤

    allow_inspection: bool = True
    +

    Whether to allow inspecting modules when visiting them is not possible.

    annotations_path class-attribute instance-attribute ¤

    annotations_path: Literal['brief', 'source', 'full'] = 'brief'
    +

    The verbosity for annotations path: brief (recommended), source (as written in the source), or full.

    backlinks: Literal['flat', 'tree', False] = False
    +

    Whether to render backlinks, and how.

    docstring_options class-attribute instance-attribute ¤

    docstring_options: (
    +    GoogleStyleOptions
    +    | NumpyStyleOptions
    +    | SphinxStyleOptions
    +    | AutoStyleOptions
    +    | None
    +) = None
    +

    The options for the docstring parser.

    See docstring parsers and their options in Griffe docs.

    docstring_section_style class-attribute instance-attribute ¤

    docstring_section_style: Literal['table', 'list', 'spacy'] = 'table'
    +

    The style used to render docstring sections.

    docstring_style class-attribute instance-attribute ¤

    docstring_style: Literal['auto', 'google', 'numpy', 'sphinx'] | None = 'google'
    +

    The docstring style to use: auto, google, numpy, sphinx, or None.

    extensions class-attribute instance-attribute ¤

    extensions: list[str | dict[str, Any]] = field(default_factory=list)
    +

    A list of Griffe extensions to load.

    extra class-attribute instance-attribute ¤

    extra: dict[str, Any] = field(default_factory=dict)
    +

    Extra options.

    filters class-attribute instance-attribute ¤

    filters: list[tuple[Pattern, bool]] | Literal["public"] = field(
    +    default_factory=lambda: [
    +        (compile(removeprefix("!")), startswith("!")) for filtr in _DEFAULT_FILTERS
    +    ]
    +)
    +

    A list of filters, or "public".

    find_stubs_package class-attribute instance-attribute ¤

    find_stubs_package: bool = False
    +

    Whether to load stubs package (package-stubs) when extracting docstrings.

    force_inspection class-attribute instance-attribute ¤

    force_inspection: bool = False
    +

    Whether to force using dynamic analysis when loading data.

    group_by_category class-attribute instance-attribute ¤

    group_by_category: bool = True
    +

    Group the object's children by categories: attributes, classes, functions, and modules.

    heading class-attribute instance-attribute ¤

    heading: str = ''
    +

    A custom string to override the autogenerated heading of the root object.

    heading_level class-attribute instance-attribute ¤

    heading_level: int = 2
    +

    The initial heading level to use.

    inherited_members class-attribute instance-attribute ¤

    inherited_members: bool | list[str] = False
    +

    A boolean, or an explicit list of inherited members to render.

    If true, select all inherited members, which can then be filtered with members. If false or empty list, do not select any inherited member.

    line_length class-attribute instance-attribute ¤

    line_length: int = 60
    +

    Maximum line length when formatting code/signatures.

    members class-attribute instance-attribute ¤

    members: list[str] | bool | None = None
    +

    A boolean, or an explicit list of members to render.

    If true, select all members without further filtering. If false or empty list, do not render members. If none, select all members and apply further filtering with filters and docstrings.

    members_order class-attribute instance-attribute ¤

    members_order: Order | list[Order] = 'alphabetical'
    +

    The members ordering to use.

    • __all__: order members according to __all__ module attributes, if declared;
    • alphabetical: order members alphabetically;
    • source: order members as they appear in the source file.

    Since __all__ is a module-only attribute, it can't be used to sort class members, therefore the members_order option accepts a list of ordering methods, indicating ordering preferences.

    merge_init_into_class class-attribute instance-attribute ¤

    merge_init_into_class: bool = False
    +

    Whether to merge the __init__ method into the class' signature and docstring.

    modernize_annotations class-attribute instance-attribute ¤

    modernize_annotations: bool = False
    +

    Whether to modernize annotations, for example Optional[str] into str | None.

    parameter_headings class-attribute instance-attribute ¤

    parameter_headings: bool = False
    +

    Whether to render headings for parameters (therefore showing parameters in the ToC).

    preload_modules class-attribute instance-attribute ¤

    preload_modules: list[str] = field(default_factory=list)
    +

    Pre-load modules that are not specified directly in autodoc instructions (::: identifier).

    It is useful when you want to render documentation for a particular member of an object, and this member is imported from another package than its parent.

    For an imported member to be rendered, you need to add it to the __all__ attribute of the importing module.

    The modules must be listed as an array of strings.

    relative_crossrefs class-attribute instance-attribute ¤

    relative_crossrefs: bool = False
    +

    Whether to enable the relative crossref syntax.

    scoped_crossrefs class-attribute instance-attribute ¤

    scoped_crossrefs: bool = False
    +

    Whether to enable the scoped crossref ability.

    separate_signature class-attribute instance-attribute ¤

    separate_signature: bool = False
    +

    Whether to put the whole signature in a code block below the heading.

    If Black or Ruff are installed, the signature is also formatted using them.

    show_bases class-attribute instance-attribute ¤

    show_bases: bool = True
    +

    Show the base classes of a class.

    show_category_heading class-attribute instance-attribute ¤

    show_category_heading: bool = False
    +

    When grouped by categories, show a heading for each category.

    show_docstring_attributes class-attribute instance-attribute ¤

    show_docstring_attributes: bool = True
    +

    Whether to display the 'Attributes' section in the object's docstring.

    show_docstring_classes class-attribute instance-attribute ¤

    show_docstring_classes: bool = True
    +

    Whether to display the 'Classes' section in the object's docstring.

    show_docstring_description class-attribute instance-attribute ¤

    show_docstring_description: bool = True
    +

    Whether to display the textual block (including admonitions) in the object's docstring.

    show_docstring_examples class-attribute instance-attribute ¤

    show_docstring_examples: bool = True
    +

    Whether to display the 'Examples' section in the object's docstring.

    show_docstring_functions class-attribute instance-attribute ¤

    show_docstring_functions: bool = True
    +

    Whether to display the 'Functions' or 'Methods' sections in the object's docstring.

    show_docstring_modules class-attribute instance-attribute ¤

    show_docstring_modules: bool = True
    +

    Whether to display the 'Modules' section in the object's docstring.

    show_docstring_other_parameters class-attribute instance-attribute ¤

    show_docstring_other_parameters: bool = True
    +

    Whether to display the 'Other Parameters' section in the object's docstring.

    show_docstring_parameters class-attribute instance-attribute ¤

    show_docstring_parameters: bool = True
    +

    Whether to display the 'Parameters' section in the object's docstring.

    show_docstring_raises class-attribute instance-attribute ¤

    show_docstring_raises: bool = True
    +

    Whether to display the 'Raises' section in the object's docstring.

    show_docstring_receives class-attribute instance-attribute ¤

    show_docstring_receives: bool = True
    +

    Whether to display the 'Receives' section in the object's docstring.

    show_docstring_returns class-attribute instance-attribute ¤

    show_docstring_returns: bool = True
    +

    Whether to display the 'Returns' section in the object's docstring.

    show_docstring_warns class-attribute instance-attribute ¤

    show_docstring_warns: bool = True
    +

    Whether to display the 'Warns' section in the object's docstring.

    show_docstring_yields class-attribute instance-attribute ¤

    show_docstring_yields: bool = True
    +

    Whether to display the 'Yields' section in the object's docstring.

    show_if_no_docstring class-attribute instance-attribute ¤

    show_if_no_docstring: bool = False
    +

    Show the object heading even if it has no docstring or children with docstrings.

    show_inheritance_diagram class-attribute instance-attribute ¤

    show_inheritance_diagram: bool = False
    +

    Show the inheritance diagram of a class using Mermaid.

    show_labels class-attribute instance-attribute ¤

    show_labels: bool = True
    +

    Whether to show labels of the members.

    show_object_full_path class-attribute instance-attribute ¤

    show_object_full_path: bool = False
    +

    Show the full Python path of every object.

    show_overloads class-attribute instance-attribute ¤

    show_overloads: bool = True
    +

    Show the overloads of a function or method.

    show_root_full_path class-attribute instance-attribute ¤

    show_root_full_path: bool = True
    +

    Show the full Python path for the root object heading.

    show_root_heading class-attribute instance-attribute ¤

    show_root_heading: bool = False
    +

    Show the heading of the object at the root of the documentation tree.

    The root object is the object referenced by the identifier after :::.

    show_root_members_full_path class-attribute instance-attribute ¤

    show_root_members_full_path: bool = False
    +

    Show the full Python path of the root members.

    show_root_toc_entry class-attribute instance-attribute ¤

    show_root_toc_entry: bool = True
    +

    If the root heading is not shown, at least add a ToC entry for it.

    show_signature class-attribute instance-attribute ¤

    show_signature: bool = True
    +

    Show methods and functions signatures.

    show_signature_annotations class-attribute instance-attribute ¤

    show_signature_annotations: bool = False
    +

    Show the type annotations in methods and functions signatures.

    show_source class-attribute instance-attribute ¤

    show_source: bool = True
    +

    Show the source code of this object.

    show_submodules class-attribute instance-attribute ¤

    show_submodules: bool = False
    +

    When rendering a module, show its submodules recursively.

    show_symbol_type_heading class-attribute instance-attribute ¤

    show_symbol_type_heading: bool = False
    +

    Show the symbol type in headings (e.g. mod, class, meth, func and attr).

    show_symbol_type_toc class-attribute instance-attribute ¤

    show_symbol_type_toc: bool = False
    +

    Show the symbol type in the Table of Contents (e.g. mod, class, methd, func and attr).

    signature_crossrefs class-attribute instance-attribute ¤

    signature_crossrefs: bool = False
    +

    Whether to render cross-references for type annotations in signatures.

    summary class-attribute instance-attribute ¤

    summary: SummaryOption = field(default_factory=SummaryOption)
    +

    Whether to render summaries of modules, classes, functions (methods) and attributes.

    toc_label class-attribute instance-attribute ¤

    toc_label: str = ''
    +

    A custom string to override the autogenerated toc label of the root object.

    unwrap_annotated class-attribute instance-attribute ¤

    unwrap_annotated: bool = False
    +

    Whether to unwrap Annotated types to show only the type without the annotations.

    coerce classmethod ¤

    coerce(**data: Any) -> MutableMapping[str, Any]
    +

    Create an instance from a dictionary.

    from_data classmethod ¤

    from_data(**data: Any) -> Self
    +

    Create an instance from a dictionary.

    SphinxStyleOptions dataclass ¤

    SphinxStyleOptions()
    +

    Sphinx style docstring options.

    SummaryOption dataclass ¤

    SummaryOption(
    +    attributes: bool = False,
    +    functions: bool = False,
    +    classes: bool = False,
    +    modules: bool = False,
    +)
    +

    Summary option.

    Attributes:

    • attributes (bool) –

      Whether to render summaries of attributes.

    • classes (bool) –

      Whether to render summaries of classes.

    • functions (bool) –

      Whether to render summaries of functions (methods).

    • modules (bool) –

      Whether to render summaries of modules.

    attributes class-attribute instance-attribute ¤

    attributes: bool = False
    +

    Whether to render summaries of attributes.

    classes class-attribute instance-attribute ¤

    classes: bool = False
    +

    Whether to render summaries of classes.

    functions class-attribute instance-attribute ¤

    functions: bool = False
    +

    Whether to render summaries of functions (methods).

    modules class-attribute instance-attribute ¤

    modules: bool = False
    +

    Whether to render summaries of modules.

    do_as_attributes_section ¤

    do_as_attributes_section(
    +    context: Context, attributes: Sequence[Attribute], *, check_public: bool = True
    +) -> DocstringSectionAttributes
    +

    Build an attributes section from a list of attributes.

    Parameters:

    • attributes ¤

      (Sequence[Attribute]) –

      The attributes to build the section from.

    • check_public ¤

      (bool, default: True ) –

      Whether to check if the attribute is public.

    Returns:

    do_as_classes_section ¤

    do_as_classes_section(
    +    context: Context, classes: Sequence[Class], *, check_public: bool = True
    +) -> DocstringSectionClasses
    +

    Build a classes section from a list of classes.

    Parameters:

    • classes ¤

      (Sequence[Class]) –

      The classes to build the section from.

    • check_public ¤

      (bool, default: True ) –

      Whether to check if the class is public.

    Returns:

    do_as_functions_section ¤

    do_as_functions_section(
    +    context: Context, functions: Sequence[Function], *, check_public: bool = True
    +) -> DocstringSectionFunctions
    +

    Build a functions section from a list of functions.

    Parameters:

    • functions ¤

      (Sequence[Function]) –

      The functions to build the section from.

    • check_public ¤

      (bool, default: True ) –

      Whether to check if the function is public.

    Returns:

    do_as_modules_section ¤

    do_as_modules_section(
    +    context: Context, modules: Sequence[Module], *, check_public: bool = True
    +) -> DocstringSectionModules
    +

    Build a modules section from a list of modules.

    Parameters:

    • modules ¤

      (Sequence[Module]) –

      The modules to build the section from.

    • check_public ¤

      (bool, default: True ) –

      Whether to check if the module is public.

    Returns:

    do_backlink_tree(backlinks: list[Backlink]) -> Tree[BacklinkCrumb]
    +

    Build a tree of backlinks.

    Parameters:

    Returns:

    do_crossref ¤

    do_crossref(path: str, *, brief: bool = True) -> Markup
    +

    Deprecated. Filter to create cross-references.

    Parameters:

    • path ¤

      (str) –

      The path to link to.

    • brief ¤

      (bool, default: True ) –

      Show only the last part of the path, add full path as hover.

    Returns:

    • Markup

      Markup text.

    do_filter_objects ¤

    do_filter_objects(
    +    objects_dictionary: dict[str, Object | Alias],
    +    *,
    +    filters: Sequence[tuple[Pattern, bool]] | Literal["public"] | None = None,
    +    members_list: bool | list[str] | None = None,
    +    inherited_members: bool | list[str] = False,
    +    keep_no_docstrings: bool = True
    +) -> list[Object | Alias]
    +

    Filter a dictionary of objects based on their docstrings.

    Parameters:

    • objects_dictionary ¤

      (dict[str, Object | Alias]) –

      The dictionary of objects.

    • filters ¤

      (Sequence[tuple[Pattern, bool]] | Literal['public'] | None, default: None ) –

      Filters to apply, based on members' names, or "public". Each element is a tuple: a pattern, and a boolean indicating whether to reject the object if the pattern matches.

    • members_list ¤

      (bool | list[str] | None, default: None ) –

      An optional, explicit list of members to keep. When given and empty, return an empty list. When given and not empty, ignore filters and docstrings presence/absence.

    • inherited_members ¤

      (bool | list[str], default: False ) –

      Whether to keep inherited members or exclude them.

    • keep_no_docstrings ¤

      (bool, default: True ) –

      Whether to keep objects with no/empty docstrings (recursive check).

    Returns:

    do_format_attribute ¤

    do_format_attribute(
    +    context: Context,
    +    attribute_path: Markup,
    +    attribute: Attribute,
    +    line_length: int,
    +    *,
    +    crossrefs: bool = False
    +) -> str
    +

    Format an attribute.

    Parameters:

    • context ¤

      (Context) –

      Jinja context, passed automatically.

    • attribute_path ¤

      (Markup) –

      The path of the callable we render the signature of.

    • attribute ¤

      (Attribute) –

      The attribute we render the signature of.

    • line_length ¤

      (int) –

      The line length.

    • crossrefs ¤

      (bool, default: False ) –

      Whether to cross-reference types in the signature.

    Returns:

    • str

      The same code, formatted.

    do_format_code ¤

    do_format_code(code: str, line_length: int) -> str
    +

    Format code.

    Parameters:

    • code ¤

      (str) –

      The code to format.

    • line_length ¤

      (int) –

      The line length.

    Returns:

    • str

      The same code, formatted.

    do_format_signature ¤

    do_format_signature(
    +    context: Context,
    +    callable_path: Markup,
    +    function: Function,
    +    line_length: int,
    +    *,
    +    annotations: bool | None = None,
    +    crossrefs: bool = False
    +) -> str
    +

    Format a signature.

    Parameters:

    • context ¤

      (Context) –

      Jinja context, passed automatically.

    • callable_path ¤

      (Markup) –

      The path of the callable we render the signature of.

    • function ¤

      (Function) –

      The function we render the signature of.

    • line_length ¤

      (int) –

      The line length.

    • annotations ¤

      (bool | None, default: None ) –

      Whether to show type annotations.

    • crossrefs ¤

      (bool, default: False ) –

      Whether to cross-reference types in the signature.

    Returns:

    • str

      The same code, formatted.

    do_get_template ¤

    do_get_template(env: Environment, obj: str | Object) -> str
    +

    Get the template name used to render an object.

    Parameters:

    • env ¤

      (Environment) –

      The Jinja environment, passed automatically.

    • obj ¤

      (str | Object) –

      A Griffe object, or a template name.

    Returns:

    • str

      A template name.

    do_multi_crossref ¤

    do_multi_crossref(text: str, *, code: bool = True) -> Markup
    +

    Deprecated. Filter to create cross-references.

    Parameters:

    • text ¤

      (str) –

      The text to scan.

    • code ¤

      (bool, default: True ) –

      Whether to wrap the result in a code tag.

    Returns:

    • Markup

      Markup text.

    do_order_members ¤

    do_order_members(
    +    members: Sequence[Object | Alias],
    +    order: Order | list[Order],
    +    members_list: bool | list[str] | None,
    +) -> Sequence[Object | Alias]
    +

    Order members given an ordering method.

    Parameters:

    Returns:

    do_split_path ¤

    do_split_path(path: str, full_path: str) -> Iterator[tuple[str, str, str, str]]
    +

    Split object paths for building cross-references.

    Parameters:

    • path ¤

      (str) –

      The path to split.

    • full_path ¤

      (str) –

      The full path, used to compute correct paths for each part of the path.

    Yields:

    get_handler ¤

    get_handler(
    +    handler_config: MutableMapping[str, Any], tool_config: MkDocsConfig, **kwargs: Any
    +) -> PythonHandler
    +

    Return an instance of PythonHandler.

    Parameters:

    • handler_config ¤

      (MutableMapping[str, Any]) –

      The handler configuration.

    • tool_config ¤

      (MkDocsConfig) –

      The tool (SSG) configuration.

    Returns:

    config ¤

    Deprecated. Import from mkdocstrings_handlers.python directly.

    handler ¤

    Deprecated. Import from mkdocstrings_handlers.python directly.

    rendering ¤

    Deprecated. Import from mkdocstrings_handlers.python directly.

    \ No newline at end of file diff --git a/reference/api/index.md b/reference/api/index.md new file mode 100644 index 00000000..0f53bd1f --- /dev/null +++ b/reference/api/index.md @@ -0,0 +1,3229 @@ +# python + +Python handler for mkdocstrings. + +Modules: + +- **`config`** – Deprecated. Import from mkdocstrings_handlers.python directly. +- **`handler`** – Deprecated. Import from mkdocstrings_handlers.python directly. +- **`rendering`** – Deprecated. Import from mkdocstrings_handlers.python directly. + +Classes: + +- **`AutoStyleOptions`** – Auto style docstring options. +- **`AutorefsHook`** – Autorefs hook. +- **`GoogleStyleOptions`** – Google style docstring options. +- **`Inventory`** – An inventory. +- **`NumpyStyleOptions`** – Numpy style docstring options. +- **`PerStyleOptions`** – Per style options. +- **`PythonConfig`** – Python handler configuration. +- **`PythonHandler`** – The Python handler class. +- **`PythonInputConfig`** – Python handler configuration. +- **`PythonInputOptions`** – Accepted input options. +- **`PythonOptions`** – Final options passed as template context. +- **`SphinxStyleOptions`** – Sphinx style docstring options. +- **`SummaryOption`** – Summary option. + +Functions: + +- **`do_as_attributes_section`** – Build an attributes section from a list of attributes. +- **`do_as_classes_section`** – Build a classes section from a list of classes. +- **`do_as_functions_section`** – Build a functions section from a list of functions. +- **`do_as_modules_section`** – Build a modules section from a list of modules. +- **`do_backlink_tree`** – Build a tree of backlinks. +- **`do_crossref`** – Deprecated. Filter to create cross-references. +- **`do_filter_objects`** – Filter a dictionary of objects based on their docstrings. +- **`do_format_attribute`** – Format an attribute. +- **`do_format_code`** – Format code. +- **`do_format_signature`** – Format a signature. +- **`do_get_template`** – Get the template name used to render an object. +- **`do_multi_crossref`** – Deprecated. Filter to create cross-references. +- **`do_order_members`** – Order members given an ordering method. +- **`do_split_path`** – Split object paths for building cross-references. +- **`get_handler`** – Return an instance of PythonHandler. + +Attributes: + +- **`Order`** – Ordering methods. +- **`Tree`** – A tree type. Each node holds a tuple of items. +- **`do_stash_crossref`** – Filter to stash cross-references (and restore them after formatting and highlighting). + +## Order + +```python +Order = Literal['__all__', 'alphabetical', 'source'] + +``` + +Ordering methods. + +- `__all__`: order members according to `__all__` module attributes, if declared; +- `alphabetical`: order members alphabetically; +- `source`: order members as they appear in the source file. + +## Tree + +```python +Tree = dict[tuple[_T, ...], 'Tree'] + +``` + +A tree type. Each node holds a tuple of items. + +## do_stash_crossref + +```python +do_stash_crossref = _StashCrossRefFilter() + +``` + +Filter to stash cross-references (and restore them after formatting and highlighting). + +## AutoStyleOptions + +```python +AutoStyleOptions( + method: Literal["heuristics", "max_sections"] = "heuristics", + style_order: list[str] = lambda: ["sphinx", "google", "numpy"](), + default: str | None = None, + per_style_options: PerStyleOptions = PerStyleOptions(), +) + +``` + +Auto style docstring options. + +Methods: + +- **`from_data`** – Create an instance from a dictionary. + +Attributes: + +- **`default`** (`str | None`) – The default docstring style to use if no other style is detected. +- **`method`** (`Literal['heuristics', 'max_sections']`) – The method to use to determine the docstring style. +- **`per_style_options`** (`PerStyleOptions`) – Per-style options. +- **`style_order`** (`list[str]`) – The order of the docstring styles to try. + +### default + +```python +default: str | None = None + +``` + +The default docstring style to use if no other style is detected. + +### method + +```python +method: Literal['heuristics', 'max_sections'] = 'heuristics' + +``` + +The method to use to determine the docstring style. + +### per_style_options + +```python +per_style_options: PerStyleOptions = field(default_factory=PerStyleOptions) + +``` + +Per-style options. + +### style_order + +```python +style_order: list[str] = field(default_factory=lambda: ['sphinx', 'google', 'numpy']) + +``` + +The order of the docstring styles to try. + +### from_data + +```python +from_data(**data: Any) -> Self + +``` + +Create an instance from a dictionary. + +## AutorefsHook + +```python +AutorefsHook(current_object: Object | Alias, config: dict[str, Any]) + +``` + +``` + + flowchart TD + mkdocstrings_handlers.python.AutorefsHook[AutorefsHook] + + + + click mkdocstrings_handlers.python.AutorefsHook href "" "mkdocstrings_handlers.python.AutorefsHook" + +``` + +Autorefs hook. + +With this hook, we're able to add context to autorefs (cross-references), such as originating file path and line number, to improve error reporting. + +Parameters: + +- ### **`current_object`** + + (`Object | Alias`) – The object being rendered. + +- ### **`config`** + + (`dict[str, Any]`) – The configuration dictionary. + +Methods: + +- **`expand_identifier`** – Expand an identifier. +- **`get_context`** – Get the context for the current object. + +Attributes: + +- **`config`** – The configuration options. +- **`current_object`** – The current object being rendered. + +### config + +```python +config = config + +``` + +The configuration options. + +### current_object + +```python +current_object = current_object + +``` + +The current object being rendered. + +### expand_identifier + +```python +expand_identifier(identifier: str) -> str + +``` + +Expand an identifier. + +Parameters: + +- #### **`identifier`** + + (`str`) – The identifier to expand. + +Returns: + +- `str` – The expanded identifier. + +### get_context + +```python +get_context() -> Context + +``` + +Get the context for the current object. + +Returns: + +- `Context` – The context. + +## GoogleStyleOptions + +```python +GoogleStyleOptions( + ignore_init_summary: bool = False, + returns_multiple_items: bool = True, + returns_named_value: bool = True, + returns_type_in_property_summary: bool = False, + receives_multiple_items: bool = True, + receives_named_value: bool = True, + trim_doctest_flags: bool = True, + warn_unknown_params: bool = True, +) + +``` + +Google style docstring options. + +Attributes: + +- **`ignore_init_summary`** (`bool`) – Whether to ignore the summary in __init__ methods' docstrings. +- **`receives_multiple_items`** (`bool`) – Whether to parse multiple items in Receives sections. +- **`receives_named_value`** (`bool`) – Whether to parse Receives section items as name and description, rather than type and description. +- **`returns_multiple_items`** (`bool`) – Whether to parse multiple items in Yields and Returns sections. +- **`returns_named_value`** (`bool`) – Whether to parse Yields and Returns section items as name and description, rather than type and description. +- **`returns_type_in_property_summary`** (`bool`) – Whether to parse the return type of properties at the beginning of their summary: str: Summary of the property. +- **`trim_doctest_flags`** (`bool`) – Whether to remove doctest flags from Python example blocks. +- **`warn_unknown_params`** (`bool`) – Warn about documented parameters not appearing in the signature. + +### ignore_init_summary + +```python +ignore_init_summary: bool = False + +``` + +Whether to ignore the summary in `__init__` methods' docstrings. + +### receives_multiple_items + +```python +receives_multiple_items: bool = True + +``` + +Whether to parse multiple items in `Receives` sections. + +When true, each item's continuation lines must be indented. When false (single item), no further indentation is required. + +### receives_named_value + +```python +receives_named_value: bool = True + +``` + +Whether to parse `Receives` section items as name and description, rather than type and description. + +When true, type must be wrapped in parentheses: `(int): Description.`. Names are optional: `name (int): Description.`. When false, parentheses are optional but the items cannot be named: `int: Description`. + +### returns_multiple_items + +```python +returns_multiple_items: bool = True + +``` + +Whether to parse multiple items in `Yields` and `Returns` sections. + +When true, each item's continuation lines must be indented. When false (single item), no further indentation is required. + +### returns_named_value + +```python +returns_named_value: bool = True + +``` + +Whether to parse `Yields` and `Returns` section items as name and description, rather than type and description. + +When true, type must be wrapped in parentheses: `(int): Description.`. Names are optional: `name (int): Description.`. When false, parentheses are optional but the items cannot be named: `int: Description`. + +### returns_type_in_property_summary + +```python +returns_type_in_property_summary: bool = False + +``` + +Whether to parse the return type of properties at the beginning of their summary: `str: Summary of the property`. + +### trim_doctest_flags + +```python +trim_doctest_flags: bool = True + +``` + +Whether to remove doctest flags from Python example blocks. + +### warn_unknown_params + +```python +warn_unknown_params: bool = True + +``` + +Warn about documented parameters not appearing in the signature. + +## Inventory + +```python +Inventory(url: str, base_url: str | None = None, domains: list[str] = lambda: ['py']()) + +``` + +An inventory. + +Attributes: + +- **`base_url`** (`str | None`) – The base URL of the inventory. +- **`domains`** (`list[str]`) – The domains to load from the inventory. +- **`url`** (`str`) – The URL of the inventory. + +### base_url + +```python +base_url: str | None = None + +``` + +The base URL of the inventory. + +### domains + +```python +domains: list[str] = field(default_factory=lambda: ['py']) + +``` + +The domains to load from the inventory. + +### url + +```python +url: str + +``` + +The URL of the inventory. + +## NumpyStyleOptions + +```python +NumpyStyleOptions( + ignore_init_summary: bool = False, + trim_doctest_flags: bool = True, + warn_unknown_params: bool = True, +) + +``` + +Numpy style docstring options. + +Attributes: + +- **`ignore_init_summary`** (`bool`) – Whether to ignore the summary in __init__ methods' docstrings. +- **`trim_doctest_flags`** (`bool`) – Whether to remove doctest flags from Python example blocks. +- **`warn_unknown_params`** (`bool`) – Warn about documented parameters not appearing in the signature. + +### ignore_init_summary + +```python +ignore_init_summary: bool = False + +``` + +Whether to ignore the summary in `__init__` methods' docstrings. + +### trim_doctest_flags + +```python +trim_doctest_flags: bool = True + +``` + +Whether to remove doctest flags from Python example blocks. + +### warn_unknown_params + +```python +warn_unknown_params: bool = True + +``` + +Warn about documented parameters not appearing in the signature. + +## PerStyleOptions + +```python +PerStyleOptions( + google: GoogleStyleOptions = GoogleStyleOptions(), + numpy: NumpyStyleOptions = NumpyStyleOptions(), + sphinx: SphinxStyleOptions = SphinxStyleOptions(), +) + +``` + +Per style options. + +Methods: + +- **`from_data`** – Create an instance from a dictionary. + +Attributes: + +- **`google`** (`GoogleStyleOptions`) – Google-style options. +- **`numpy`** (`NumpyStyleOptions`) – Numpydoc-style options. +- **`sphinx`** (`SphinxStyleOptions`) – Sphinx-style options. + +### google + +```python +google: GoogleStyleOptions = field(default_factory=GoogleStyleOptions) + +``` + +Google-style options. + +### numpy + +```python +numpy: NumpyStyleOptions = field(default_factory=NumpyStyleOptions) + +``` + +Numpydoc-style options. + +### sphinx + +```python +sphinx: SphinxStyleOptions = field(default_factory=SphinxStyleOptions) + +``` + +Sphinx-style options. + +### from_data + +```python +from_data(**data: Any) -> Self + +``` + +Create an instance from a dictionary. + +## PythonConfig + +```python +PythonConfig( + inventories: list[Inventory] = list(), + paths: list[str] = lambda: ["."](), + load_external_modules: bool | None = None, + options: dict[str, Any] = dict(), + locale: str | None = None, +) + +``` + +``` + + flowchart TD + mkdocstrings_handlers.python.PythonConfig[PythonConfig] + mkdocstrings_handlers.python._internal.config.PythonInputConfig[PythonInputConfig] + + mkdocstrings_handlers.python._internal.config.PythonInputConfig --> mkdocstrings_handlers.python.PythonConfig + + + + click mkdocstrings_handlers.python.PythonConfig href "" "mkdocstrings_handlers.python.PythonConfig" + click mkdocstrings_handlers.python._internal.config.PythonInputConfig href "" "mkdocstrings_handlers.python._internal.config.PythonInputConfig" + +``` + +Python handler configuration. + +Methods: + +- **`coerce`** – Coerce data. +- **`from_data`** – Create an instance from a dictionary. + +Attributes: + +- **`inventories`** (`list[Inventory]`) – The object inventories to load. +- **`load_external_modules`** (`bool | None`) – Whether to always load external modules/packages. +- **`locale`** (`str | None`) – The locale to use when translating template strings. +- **`options`** (`dict[str, Any]`) – Configuration options for collecting and rendering objects. +- **`paths`** (`list[str]`) – The paths in which to search for Python packages. + +### inventories + +```python +inventories: list[Inventory] = field(default_factory=list) + +``` + +The object inventories to load. + +### load_external_modules + +```python +load_external_modules: bool | None = None + +``` + +Whether to always load external modules/packages. + +### locale + +```python +locale: str | None = None + +``` + +The locale to use when translating template strings. + +### options + +```python +options: dict[str, Any] = field(default_factory=dict) + +``` + +Configuration options for collecting and rendering objects. + +### paths + +```python +paths: list[str] = field(default_factory=lambda: ['.']) + +``` + +The paths in which to search for Python packages. + +### coerce + +```python +coerce(**data: Any) -> MutableMapping[str, Any] + +``` + +Coerce data. + +### from_data + +```python +from_data(**data: Any) -> Self + +``` + +Create an instance from a dictionary. + +## PythonHandler + +```python +PythonHandler(config: PythonConfig, base_dir: Path, **kwargs: Any) + +``` + +``` + + flowchart TD + mkdocstrings_handlers.python.PythonHandler[PythonHandler] + mkdocstrings._internal.handlers.base.BaseHandler[BaseHandler] + + mkdocstrings._internal.handlers.base.BaseHandler --> mkdocstrings_handlers.python.PythonHandler + + + + click mkdocstrings_handlers.python.PythonHandler href "" "mkdocstrings_handlers.python.PythonHandler" + click mkdocstrings._internal.handlers.base.BaseHandler href "" "mkdocstrings._internal.handlers.base.BaseHandler" + +``` + +The Python handler class. + +Parameters: + +- ### **`config`** + + (`PythonConfig`) – The handler configuration. + +- ### **`base_dir`** + + (`Path`) – The base directory of the project. + +- ### **`**kwargs`** + + (`Any`, default: `{}` ) – Arguments passed to the parent constructor. + +Methods: + +- **`collect`** – Collect the documentation for the given identifier. +- **`do_convert_markdown`** – Render Markdown text; for use inside templates. +- **`do_heading`** – Render an HTML heading and register it for the table of contents. For use inside templates. +- **`get_aliases`** – Get the aliases for the given identifier. +- **`get_extended_templates_dirs`** – Load template extensions for the given handler, return their templates directories. +- **`get_headings`** – Return and clear the headings gathered so far. +- **`get_inventory_urls`** – Return the URLs of the inventory files to download. +- **`get_options`** – Get combined default, global and local options. +- **`get_templates_dir`** – Return the path to the handler's templates directory. +- **`load_inventory`** – Yield items and their URLs from an inventory file streamed from in_file. +- **`normalize_extension_paths`** – Resolve extension paths relative to config file. +- **`render`** – Render the collected data. +- **`render_backlinks`** – Render the backlinks. +- **`teardown`** – Teardown the handler. +- **`update_env`** – Update the Jinja environment with custom filters and tests. + +Attributes: + +- **`base_dir`** – The base directory of the project. +- **`config`** – The handler configuration. +- **`custom_templates`** – The path to custom templates. +- **`domain`** (`str`) – The cross-documentation domain/language for this handler. +- **`enable_inventory`** (`bool`) – Whether this handler is interested in enabling the creation of the objects.inv Sphinx inventory file. +- **`env`** – The Jinja environment. +- **`extra_css`** (`str`) – Extra CSS. +- **`fallback_config`** (`dict`) – Fallback configuration when searching anchors for identifiers. +- **`fallback_theme`** (`str`) – The fallback theme. +- **`global_options`** – The global configuration options (in mkdocs.yml). +- **`md`** (`Markdown`) – The Markdown instance. +- **`mdx`** – The Markdown extensions to use. +- **`mdx_config`** – The configuration for the Markdown extensions. +- **`name`** (`str`) – The handler's name. +- **`outer_layer`** (`bool`) – Whether we're in the outer Markdown conversion layer. +- **`theme`** – The selected theme. + +### base_dir + +```python +base_dir = base_dir + +``` + +The base directory of the project. + +### config + +```python +config = config + +``` + +The handler configuration. + +### custom_templates + +```python +custom_templates = custom_templates + +``` + +The path to custom templates. + +### domain + +```python +domain: str = 'py' + +``` + +The cross-documentation domain/language for this handler. + +### enable_inventory + +```python +enable_inventory: bool = True + +``` + +Whether this handler is interested in enabling the creation of the `objects.inv` Sphinx inventory file. + +### env + +```python +env = Environment(autoescape=True, loader=FileSystemLoader(paths), auto_reload=False) + +``` + +The Jinja environment. + +### extra_css + +```python +extra_css: str = '' + +``` + +Extra CSS. + +### fallback_config + +```python +fallback_config: dict = {} + +``` + +Fallback configuration when searching anchors for identifiers. + +### fallback_theme + +```python +fallback_theme: str = 'material' + +``` + +The fallback theme. + +### global_options + +```python +global_options = global_options + +``` + +The global configuration options (in `mkdocs.yml`). + +### md + +```python +md: Markdown + +``` + +The Markdown instance. + +Raises: + +- `RuntimeError` – When the Markdown instance is not set yet. + +### mdx + +```python +mdx = mdx + +``` + +The Markdown extensions to use. + +### mdx_config + +```python +mdx_config = mdx_config + +``` + +The configuration for the Markdown extensions. + +### name + +```python +name: str = 'python' + +``` + +The handler's name. + +### outer_layer + +```python +outer_layer: bool + +``` + +Whether we're in the outer Markdown conversion layer. + +### theme + +```python +theme = theme + +``` + +The selected theme. + +### collect + +```python +collect(identifier: str, options: PythonOptions) -> CollectorItem + +``` + +Collect the documentation for the given identifier. + +Parameters: + +- #### **`identifier`** + + (`str`) – The identifier of the object to collect. + +- #### **`options`** + + (`PythonOptions`) – The options to use for the collection. + +Returns: + +- `CollectorItem` – The collected item. + +### do_convert_markdown + +```python +do_convert_markdown( + text: str, + heading_level: int, + html_id: str = "", + *, + strip_paragraph: bool = False, + autoref_hook: AutorefsHookInterface | None = None +) -> Markup + +``` + +Render Markdown text; for use inside templates. + +Parameters: + +- #### **`text`** + + (`str`) – The text to convert. + +- #### **`heading_level`** + + (`int`) – The base heading level to start all Markdown headings from. + +- #### **`html_id`** + + (`str`, default: `''` ) – The HTML id of the element that's considered the parent of this element. + +- #### **`strip_paragraph`** + + (`bool`, default: `False` ) – Whether to exclude the

    tag from around the whole output. + +Returns: + +- `Markup` – An HTML string. + +### do_heading + +```python +do_heading( + content: Markup, + heading_level: int, + *, + role: str | None = None, + hidden: bool = False, + toc_label: str | None = None, + **attributes: str +) -> Markup + +``` + +Render an HTML heading and register it for the table of contents. For use inside templates. + +Parameters: + +- #### **`content`** + + (`Markup`) – The HTML within the heading. + +- #### **`heading_level`** + + (`int`) – The level of heading (e.g. 3 -> h3). + +- #### **`role`** + + (`str | None`, default: `None` ) – An optional role for the object bound to this heading. + +- #### **`hidden`** + + (`bool`, default: `False` ) – If True, only register it for the table of contents, don't render anything. + +- #### **`toc_label`** + + (`str | None`, default: `None` ) – The title to use in the table of contents ('data-toc-label' attribute). + +- #### **`**attributes`** + + (`str`, default: `{}` ) – Any extra HTML attributes of the heading. + +Returns: + +- `Markup` – An HTML string. + +### get_aliases + +```python +get_aliases(identifier: str) -> tuple[str, ...] + +``` + +Get the aliases for the given identifier. + +Parameters: + +- #### **`identifier`** + + (`str`) – The identifier to get the aliases for. + +Returns: + +- `tuple[str, ...]` – The aliases. + +### get_extended_templates_dirs + +```python +get_extended_templates_dirs(handler: str) -> list[Path] + +``` + +Load template extensions for the given handler, return their templates directories. + +Parameters: + +- #### **`handler`** + + (`str`) – The name of the handler to get the extended templates directory of. + +Returns: + +- `list[Path]` – The extensions templates directories. + +### get_headings + +```python +get_headings() -> Sequence[Element] + +``` + +Return and clear the headings gathered so far. + +Returns: + +- `Sequence[Element]` – A list of HTML elements. + +### get_inventory_urls + +```python +get_inventory_urls() -> list[tuple[str, dict[str, Any]]] + +``` + +Return the URLs of the inventory files to download. + +### get_options + +```python +get_options(local_options: Mapping[str, Any]) -> HandlerOptions + +``` + +Get combined default, global and local options. + +Parameters: + +- #### **`local_options`** + + (`Mapping[str, Any]`) – The local options. + +Returns: + +- `HandlerOptions` – The combined options. + +### get_templates_dir + +```python +get_templates_dir(handler: str | None = None) -> Path + +``` + +Return the path to the handler's templates directory. + +Override to customize how the templates directory is found. + +Parameters: + +- #### **`handler`** + + (`str | None`, default: `None` ) – The name of the handler to get the templates directory of. + +Raises: + +- `ModuleNotFoundError` – When no such handler is installed. +- `FileNotFoundError` – When the templates directory cannot be found. + +Returns: + +- `Path` – The templates directory path. + +### load_inventory + +```python +load_inventory( + in_file: BinaryIO, + url: str, + base_url: str | None = None, + domains: list[str] | None = None, + **kwargs: Any +) -> Iterator[tuple[str, str]] + +``` + +Yield items and their URLs from an inventory file streamed from `in_file`. + +This implements mkdocstrings' `load_inventory` "protocol" (see mkdocstrings.plugin). + +Parameters: + +- #### **`in_file`** + + (`BinaryIO`) – The binary file-like object to read the inventory from. + +- #### **`url`** + + (`str`) – The URL that this file is being streamed from (used to guess base_url). + +- #### **`base_url`** + + (`str | None`, default: `None` ) – The URL that this inventory's sub-paths are relative to. + +- #### **`domains`** + + (`list[str] | None`, default: `None` ) – A list of domain strings to filter the inventory by, when not passed, "py" will be used. + +- #### **`**kwargs`** + + (`Any`, default: `{}` ) – Ignore additional arguments passed from the config. + +Yields: + +- `tuple[str, str]` – Tuples of (item identifier, item URL). + +### normalize_extension_paths + +```python +normalize_extension_paths(extensions: Sequence) -> Sequence + +``` + +Resolve extension paths relative to config file. + +Parameters: + +- #### **`extensions`** + + (`Sequence`) – The extensions (configuration) to normalize. + +Returns: + +- `Sequence` – The normalized extensions. + +### render + +```python +render(data: CollectorItem, options: PythonOptions) -> str + +``` + +Render the collected data. + +Parameters: + +- #### **`data`** + + (`CollectorItem`) – The collected data. + +- #### **`options`** + + (`PythonOptions`) – The options to use for rendering. + +Returns: + +- `str` – The rendered data (HTML). + +### render_backlinks + +```python +render_backlinks(backlinks: Mapping[str, Iterable[Backlink]]) -> str + +``` + +Render the backlinks. + +Parameters: + +- #### **`backlinks`** + + (`Mapping[str, Iterable[Backlink]]`) – The backlinks to render. + +Returns: + +- `str` – The rendered backlinks (HTML). + +### teardown + +```python +teardown() -> None + +``` + +Teardown the handler. + +This method should be implemented to, for example, terminate a subprocess that was started when creating the handler instance. + +### update_env + +```python +update_env(config: Any) -> None + +``` + +Update the Jinja environment with custom filters and tests. + +Parameters: + +- #### **`config`** + + (`Any`) – The SSG configuration. + +## PythonInputConfig + +```python +PythonInputConfig( + inventories: list[str | Inventory] = list(), + paths: list[str] = lambda: ["."](), + load_external_modules: bool | None = None, + options: PythonInputOptions = PythonInputOptions(), + locale: str | None = None, +) + +``` + +Python handler configuration. + +Methods: + +- **`coerce`** – Coerce data. +- **`from_data`** – Create an instance from a dictionary. + +Attributes: + +- **`inventories`** (`list[str | Inventory]`) – The inventories to load. +- **`load_external_modules`** (`bool | None`) – Whether to always load external modules/packages. +- **`locale`** (`str | None`) – The locale to use when translating template strings. +- **`options`** (`PythonInputOptions`) – Configuration options for collecting and rendering objects. +- **`paths`** (`list[str]`) – The paths in which to search for Python packages. + +### inventories + +```python +inventories: list[str | Inventory] = field(default_factory=list) + +``` + +The inventories to load. + +### load_external_modules + +```python +load_external_modules: bool | None = None + +``` + +Whether to always load external modules/packages. + +### locale + +```python +locale: str | None = None + +``` + +The locale to use when translating template strings. + +### options + +```python +options: PythonInputOptions = field(default_factory=PythonInputOptions) + +``` + +Configuration options for collecting and rendering objects. + +### paths + +```python +paths: list[str] = field(default_factory=lambda: ['.']) + +``` + +The paths in which to search for Python packages. + +### coerce + +```python +coerce(**data: Any) -> MutableMapping[str, Any] + +``` + +Coerce data. + +### from_data + +```python +from_data(**data: Any) -> Self + +``` + +Create an instance from a dictionary. + +## PythonInputOptions + +```python +PythonInputOptions( + allow_inspection: bool = True, + force_inspection: bool = False, + annotations_path: Literal["brief", "source", "full"] = "brief", + backlinks: Literal["flat", "tree", False] = False, + docstring_options: ( + GoogleStyleOptions + | NumpyStyleOptions + | SphinxStyleOptions + | AutoStyleOptions + | None + ) = None, + docstring_section_style: Literal["table", "list", "spacy"] = "table", + docstring_style: Literal["auto", "google", "numpy", "sphinx"] | None = "google", + extensions: list[str | dict[str, Any]] = list(), + filters: list[str] | Literal["public"] = lambda: copy()(), + find_stubs_package: bool = False, + group_by_category: bool = True, + heading: str = "", + heading_level: int = 2, + inherited_members: bool | list[str] = False, + line_length: int = 60, + members: list[str] | bool | None = None, + members_order: Order | list[Order] = "alphabetical", + merge_init_into_class: bool = False, + modernize_annotations: bool = False, + parameter_headings: bool = False, + preload_modules: list[str] = list(), + relative_crossrefs: bool = False, + scoped_crossrefs: bool = False, + show_overloads: bool = True, + separate_signature: bool = False, + show_bases: bool = True, + show_category_heading: bool = False, + show_docstring_attributes: bool = True, + show_docstring_classes: bool = True, + show_docstring_description: bool = True, + show_docstring_examples: bool = True, + show_docstring_functions: bool = True, + show_docstring_modules: bool = True, + show_docstring_other_parameters: bool = True, + show_docstring_parameters: bool = True, + show_docstring_raises: bool = True, + show_docstring_receives: bool = True, + show_docstring_returns: bool = True, + show_docstring_warns: bool = True, + show_docstring_yields: bool = True, + show_if_no_docstring: bool = False, + show_inheritance_diagram: bool = False, + show_labels: bool = True, + show_object_full_path: bool = False, + show_root_full_path: bool = True, + show_root_heading: bool = False, + show_root_members_full_path: bool = False, + show_root_toc_entry: bool = True, + show_signature_annotations: bool = False, + show_signature: bool = True, + show_source: bool = True, + show_submodules: bool = False, + show_symbol_type_heading: bool = False, + show_symbol_type_toc: bool = False, + signature_crossrefs: bool = False, + summary: bool | SummaryOption = SummaryOption(), + toc_label: str = "", + unwrap_annotated: bool = False, + extra: dict[str, Any] = dict(), +) + +``` + +Accepted input options. + +Methods: + +- **`coerce`** – Coerce data. +- **`from_data`** – Create an instance from a dictionary. + +Attributes: + +- **`allow_inspection`** (`bool`) – Whether to allow inspecting modules when visiting them is not possible. +- **`annotations_path`** (`Literal['brief', 'source', 'full']`) – The verbosity for annotations path: brief (recommended), source (as written in the source), or full. +- **`backlinks`** (`Literal['flat', 'tree', False]`) – Whether to render backlinks, and how. +- **`docstring_options`** (`GoogleStyleOptions | NumpyStyleOptions | SphinxStyleOptions | AutoStyleOptions | None`) – The options for the docstring parser. +- **`docstring_section_style`** (`Literal['table', 'list', 'spacy']`) – The style used to render docstring sections. +- **`docstring_style`** (`Literal['auto', 'google', 'numpy', 'sphinx'] | None`) – The docstring style to use: auto, google, numpy, sphinx, or None. +- **`extensions`** (`list[str | dict[str, Any]]`) – A list of Griffe extensions to load. +- **`extra`** (`dict[str, Any]`) – Extra options. +- **`filters`** (`list[str] | Literal['public']`) – A list of filters, or "public". +- **`find_stubs_package`** (`bool`) – Whether to load stubs package (package-stubs) when extracting docstrings. +- **`force_inspection`** (`bool`) – Whether to force using dynamic analysis when loading data. +- **`group_by_category`** (`bool`) – Group the object's children by categories: attributes, classes, functions, and modules. +- **`heading`** (`str`) – A custom string to override the autogenerated heading of the root object. +- **`heading_level`** (`int`) – The initial heading level to use. +- **`inherited_members`** (`bool | list[str]`) – A boolean, or an explicit list of inherited members to render. +- **`line_length`** (`int`) – Maximum line length when formatting code/signatures. +- **`members`** (`list[str] | bool | None`) – A boolean, or an explicit list of members to render. +- **`members_order`** (`Order | list[Order]`) – The members ordering to use. +- **`merge_init_into_class`** (`bool`) – Whether to merge the __init__ method into the class' signature and docstring. +- **`modernize_annotations`** (`bool`) – Whether to modernize annotations, for example Optional[str] into str | None. +- **`parameter_headings`** (`bool`) – Whether to render headings for parameters (therefore showing parameters in the ToC). +- **`preload_modules`** (`list[str]`) – Pre-load modules that are not specified directly in autodoc instructions (::: identifier). +- **`relative_crossrefs`** (`bool`) – Whether to enable the relative crossref syntax. +- **`scoped_crossrefs`** (`bool`) – Whether to enable the scoped crossref ability. +- **`separate_signature`** (`bool`) – Whether to put the whole signature in a code block below the heading. +- **`show_bases`** (`bool`) – Show the base classes of a class. +- **`show_category_heading`** (`bool`) – When grouped by categories, show a heading for each category. +- **`show_docstring_attributes`** (`bool`) – Whether to display the 'Attributes' section in the object's docstring. +- **`show_docstring_classes`** (`bool`) – Whether to display the 'Classes' section in the object's docstring. +- **`show_docstring_description`** (`bool`) – Whether to display the textual block (including admonitions) in the object's docstring. +- **`show_docstring_examples`** (`bool`) – Whether to display the 'Examples' section in the object's docstring. +- **`show_docstring_functions`** (`bool`) – Whether to display the 'Functions' or 'Methods' sections in the object's docstring. +- **`show_docstring_modules`** (`bool`) – Whether to display the 'Modules' section in the object's docstring. +- **`show_docstring_other_parameters`** (`bool`) – Whether to display the 'Other Parameters' section in the object's docstring. +- **`show_docstring_parameters`** (`bool`) – Whether to display the 'Parameters' section in the object's docstring. +- **`show_docstring_raises`** (`bool`) – Whether to display the 'Raises' section in the object's docstring. +- **`show_docstring_receives`** (`bool`) – Whether to display the 'Receives' section in the object's docstring. +- **`show_docstring_returns`** (`bool`) – Whether to display the 'Returns' section in the object's docstring. +- **`show_docstring_warns`** (`bool`) – Whether to display the 'Warns' section in the object's docstring. +- **`show_docstring_yields`** (`bool`) – Whether to display the 'Yields' section in the object's docstring. +- **`show_if_no_docstring`** (`bool`) – Show the object heading even if it has no docstring or children with docstrings. +- **`show_inheritance_diagram`** (`bool`) – Show the inheritance diagram of a class using Mermaid. +- **`show_labels`** (`bool`) – Whether to show labels of the members. +- **`show_object_full_path`** (`bool`) – Show the full Python path of every object. +- **`show_overloads`** (`bool`) – Show the overloads of a function or method. +- **`show_root_full_path`** (`bool`) – Show the full Python path for the root object heading. +- **`show_root_heading`** (`bool`) – Show the heading of the object at the root of the documentation tree. +- **`show_root_members_full_path`** (`bool`) – Show the full Python path of the root members. +- **`show_root_toc_entry`** (`bool`) – If the root heading is not shown, at least add a ToC entry for it. +- **`show_signature`** (`bool`) – Show methods and functions signatures. +- **`show_signature_annotations`** (`bool`) – Show the type annotations in methods and functions signatures. +- **`show_source`** (`bool`) – Show the source code of this object. +- **`show_submodules`** (`bool`) – When rendering a module, show its submodules recursively. +- **`show_symbol_type_heading`** (`bool`) – Show the symbol type in headings (e.g. mod, class, meth, func and attr). +- **`show_symbol_type_toc`** (`bool`) – Show the symbol type in the Table of Contents (e.g. mod, class, methd, func and attr). +- **`signature_crossrefs`** (`bool`) – Whether to render cross-references for type annotations in signatures. +- **`summary`** (`bool | SummaryOption`) – Whether to render summaries of modules, classes, functions (methods) and attributes. +- **`toc_label`** (`str`) – A custom string to override the autogenerated toc label of the root object. +- **`unwrap_annotated`** (`bool`) – Whether to unwrap Annotated types to show only the type without the annotations. + +### allow_inspection + +```python +allow_inspection: bool = True + +``` + +Whether to allow inspecting modules when visiting them is not possible. + +### annotations_path + +```python +annotations_path: Literal['brief', 'source', 'full'] = 'brief' + +``` + +The verbosity for annotations path: `brief` (recommended), `source` (as written in the source), or `full`. + +### backlinks + +```python +backlinks: Literal['flat', 'tree', False] = False + +``` + +Whether to render backlinks, and how. + +### docstring_options + +```python +docstring_options: ( + GoogleStyleOptions + | NumpyStyleOptions + | SphinxStyleOptions + | AutoStyleOptions + | None +) = None + +``` + +The options for the docstring parser. + +See [docstring parsers](https://mkdocstrings.github.io/griffe/reference/docstrings/) and their options in Griffe docs. + +### docstring_section_style + +```python +docstring_section_style: Literal['table', 'list', 'spacy'] = 'table' + +``` + +The style used to render docstring sections. + +### docstring_style + +```python +docstring_style: Literal['auto', 'google', 'numpy', 'sphinx'] | None = 'google' + +``` + +The docstring style to use: `auto`, `google`, `numpy`, `sphinx`, or `None`. + +### extensions + +```python +extensions: list[str | dict[str, Any]] = field(default_factory=list) + +``` + +A list of Griffe extensions to load. + +### extra + +```python +extra: dict[str, Any] = field(default_factory=dict) + +``` + +Extra options. + +### filters + +```python +filters: list[str] | Literal['public'] = field(default_factory=lambda: copy()) + +``` + +A list of filters, or `"public"`. + +**List of filters** + +A filter starting with `!` will exclude matching objects instead of including them. The `members` option takes precedence over `filters` (filters will still be applied recursively to lower members in the hierarchy). + +**Filtering methods** + +[Sponsors only](../../insiders/) — [Insiders 1.11.0](../../insiders/changelog/#1.11.0) + +The `public` method will include only public objects: those added to `__all__` or not starting with an underscore (except for special methods/attributes). + +### find_stubs_package + +```python +find_stubs_package: bool = False + +``` + +Whether to load stubs package (package-stubs) when extracting docstrings. + +### force_inspection + +```python +force_inspection: bool = False + +``` + +Whether to force using dynamic analysis when loading data. + +### group_by_category + +```python +group_by_category: bool = True + +``` + +Group the object's children by categories: attributes, classes, functions, and modules. + +### heading + +```python +heading: str = '' + +``` + +A custom string to override the autogenerated heading of the root object. + +### heading_level + +```python +heading_level: int = 2 + +``` + +The initial heading level to use. + +### inherited_members + +```python +inherited_members: bool | list[str] = False + +``` + +A boolean, or an explicit list of inherited members to render. + +If true, select all inherited members, which can then be filtered with `members`. If false or empty list, do not select any inherited member. + +### line_length + +```python +line_length: int = 60 + +``` + +Maximum line length when formatting code/signatures. + +### members + +```python +members: list[str] | bool | None = None + +``` + +A boolean, or an explicit list of members to render. + +If true, select all members without further filtering. If false or empty list, do not render members. If none, select all members and apply further filtering with filters and docstrings. + +### members_order + +```python +members_order: Order | list[Order] = 'alphabetical' + +``` + +The members ordering to use. + +- `__all__`: order members according to `__all__` module attributes, if declared; +- `alphabetical`: order members alphabetically; +- `source`: order members as they appear in the source file. + +Since `__all__` is a module-only attribute, it can't be used to sort class members, therefore the `members_order` option accepts a list of ordering methods, indicating ordering preferences. + +### merge_init_into_class + +```python +merge_init_into_class: bool = False + +``` + +Whether to merge the `__init__` method into the class' signature and docstring. + +### modernize_annotations + +```python +modernize_annotations: bool = False + +``` + +Whether to modernize annotations, for example `Optional[str]` into `str | None`. + +### parameter_headings + +```python +parameter_headings: bool = False + +``` + +Whether to render headings for parameters (therefore showing parameters in the ToC). + +### preload_modules + +```python +preload_modules: list[str] = field(default_factory=list) + +``` + +Pre-load modules that are not specified directly in autodoc instructions (`::: identifier`). + +It is useful when you want to render documentation for a particular member of an object, and this member is imported from another package than its parent. + +For an imported member to be rendered, you need to add it to the `__all__` attribute of the importing module. + +The modules must be listed as an array of strings. + +### relative_crossrefs + +```python +relative_crossrefs: bool = False + +``` + +Whether to enable the relative crossref syntax. + +### scoped_crossrefs + +```python +scoped_crossrefs: bool = False + +``` + +Whether to enable the scoped crossref ability. + +### separate_signature + +```python +separate_signature: bool = False + +``` + +Whether to put the whole signature in a code block below the heading. + +If Black or Ruff are installed, the signature is also formatted using them. + +### show_bases + +```python +show_bases: bool = True + +``` + +Show the base classes of a class. + +### show_category_heading + +```python +show_category_heading: bool = False + +``` + +When grouped by categories, show a heading for each category. + +### show_docstring_attributes + +```python +show_docstring_attributes: bool = True + +``` + +Whether to display the 'Attributes' section in the object's docstring. + +### show_docstring_classes + +```python +show_docstring_classes: bool = True + +``` + +Whether to display the 'Classes' section in the object's docstring. + +### show_docstring_description + +```python +show_docstring_description: bool = True + +``` + +Whether to display the textual block (including admonitions) in the object's docstring. + +### show_docstring_examples + +```python +show_docstring_examples: bool = True + +``` + +Whether to display the 'Examples' section in the object's docstring. + +### show_docstring_functions + +```python +show_docstring_functions: bool = True + +``` + +Whether to display the 'Functions' or 'Methods' sections in the object's docstring. + +### show_docstring_modules + +```python +show_docstring_modules: bool = True + +``` + +Whether to display the 'Modules' section in the object's docstring. + +### show_docstring_other_parameters + +```python +show_docstring_other_parameters: bool = True + +``` + +Whether to display the 'Other Parameters' section in the object's docstring. + +### show_docstring_parameters + +```python +show_docstring_parameters: bool = True + +``` + +Whether to display the 'Parameters' section in the object's docstring. + +### show_docstring_raises + +```python +show_docstring_raises: bool = True + +``` + +Whether to display the 'Raises' section in the object's docstring. + +### show_docstring_receives + +```python +show_docstring_receives: bool = True + +``` + +Whether to display the 'Receives' section in the object's docstring. + +### show_docstring_returns + +```python +show_docstring_returns: bool = True + +``` + +Whether to display the 'Returns' section in the object's docstring. + +### show_docstring_warns + +```python +show_docstring_warns: bool = True + +``` + +Whether to display the 'Warns' section in the object's docstring. + +### show_docstring_yields + +```python +show_docstring_yields: bool = True + +``` + +Whether to display the 'Yields' section in the object's docstring. + +### show_if_no_docstring + +```python +show_if_no_docstring: bool = False + +``` + +Show the object heading even if it has no docstring or children with docstrings. + +### show_inheritance_diagram + +```python +show_inheritance_diagram: bool = False + +``` + +Show the inheritance diagram of a class using Mermaid. + +### show_labels + +```python +show_labels: bool = True + +``` + +Whether to show labels of the members. + +### show_object_full_path + +```python +show_object_full_path: bool = False + +``` + +Show the full Python path of every object. + +### show_overloads + +```python +show_overloads: bool = True + +``` + +Show the overloads of a function or method. + +### show_root_full_path + +```python +show_root_full_path: bool = True + +``` + +Show the full Python path for the root object heading. + +### show_root_heading + +```python +show_root_heading: bool = False + +``` + +Show the heading of the object at the root of the documentation tree. + +The root object is the object referenced by the identifier after `:::`. + +### show_root_members_full_path + +```python +show_root_members_full_path: bool = False + +``` + +Show the full Python path of the root members. + +### show_root_toc_entry + +```python +show_root_toc_entry: bool = True + +``` + +If the root heading is not shown, at least add a ToC entry for it. + +### show_signature + +```python +show_signature: bool = True + +``` + +Show methods and functions signatures. + +### show_signature_annotations + +```python +show_signature_annotations: bool = False + +``` + +Show the type annotations in methods and functions signatures. + +### show_source + +```python +show_source: bool = True + +``` + +Show the source code of this object. + +### show_submodules + +```python +show_submodules: bool = False + +``` + +When rendering a module, show its submodules recursively. + +### show_symbol_type_heading + +```python +show_symbol_type_heading: bool = False + +``` + +Show the symbol type in headings (e.g. mod, class, meth, func and attr). + +### show_symbol_type_toc + +```python +show_symbol_type_toc: bool = False + +``` + +Show the symbol type in the Table of Contents (e.g. mod, class, methd, func and attr). + +### signature_crossrefs + +```python +signature_crossrefs: bool = False + +``` + +Whether to render cross-references for type annotations in signatures. + +### summary + +```python +summary: bool | SummaryOption = field(default_factory=SummaryOption) + +``` + +Whether to render summaries of modules, classes, functions (methods) and attributes. + +### toc_label + +```python +toc_label: str = '' + +``` + +A custom string to override the autogenerated toc label of the root object. + +### unwrap_annotated + +```python +unwrap_annotated: bool = False + +``` + +Whether to unwrap `Annotated` types to show only the type without the annotations. + +### coerce + +```python +coerce(**data: Any) -> MutableMapping[str, Any] + +``` + +Coerce data. + +### from_data + +```python +from_data(**data: Any) -> Self + +``` + +Create an instance from a dictionary. + +## PythonOptions + +```python +PythonOptions( + allow_inspection: bool = True, + force_inspection: bool = False, + annotations_path: Literal["brief", "source", "full"] = "brief", + backlinks: Literal["flat", "tree", False] = False, + docstring_options: ( + GoogleStyleOptions + | NumpyStyleOptions + | SphinxStyleOptions + | AutoStyleOptions + | None + ) = None, + docstring_section_style: Literal["table", "list", "spacy"] = "table", + docstring_style: Literal["auto", "google", "numpy", "sphinx"] | None = "google", + extensions: list[str | dict[str, Any]] = list(), + filters: list[tuple[Pattern, bool]] | Literal["public"] = lambda: [ + (compile(removeprefix("!")), startswith("!")) for filtr in _DEFAULT_FILTERS + ](), + find_stubs_package: bool = False, + group_by_category: bool = True, + heading: str = "", + heading_level: int = 2, + inherited_members: bool | list[str] = False, + line_length: int = 60, + members: list[str] | bool | None = None, + members_order: Order | list[Order] = "alphabetical", + merge_init_into_class: bool = False, + modernize_annotations: bool = False, + parameter_headings: bool = False, + preload_modules: list[str] = list(), + relative_crossrefs: bool = False, + scoped_crossrefs: bool = False, + show_overloads: bool = True, + separate_signature: bool = False, + show_bases: bool = True, + show_category_heading: bool = False, + show_docstring_attributes: bool = True, + show_docstring_classes: bool = True, + show_docstring_description: bool = True, + show_docstring_examples: bool = True, + show_docstring_functions: bool = True, + show_docstring_modules: bool = True, + show_docstring_other_parameters: bool = True, + show_docstring_parameters: bool = True, + show_docstring_raises: bool = True, + show_docstring_receives: bool = True, + show_docstring_returns: bool = True, + show_docstring_warns: bool = True, + show_docstring_yields: bool = True, + show_if_no_docstring: bool = False, + show_inheritance_diagram: bool = False, + show_labels: bool = True, + show_object_full_path: bool = False, + show_root_full_path: bool = True, + show_root_heading: bool = False, + show_root_members_full_path: bool = False, + show_root_toc_entry: bool = True, + show_signature_annotations: bool = False, + show_signature: bool = True, + show_source: bool = True, + show_submodules: bool = False, + show_symbol_type_heading: bool = False, + show_symbol_type_toc: bool = False, + signature_crossrefs: bool = False, + summary: SummaryOption = SummaryOption(), + toc_label: str = "", + unwrap_annotated: bool = False, + extra: dict[str, Any] = dict(), +) + +``` + +``` + + flowchart TD + mkdocstrings_handlers.python.PythonOptions[PythonOptions] + mkdocstrings_handlers.python._internal.config.PythonInputOptions[PythonInputOptions] + + mkdocstrings_handlers.python._internal.config.PythonInputOptions --> mkdocstrings_handlers.python.PythonOptions + + + + click mkdocstrings_handlers.python.PythonOptions href "" "mkdocstrings_handlers.python.PythonOptions" + click mkdocstrings_handlers.python._internal.config.PythonInputOptions href "" "mkdocstrings_handlers.python._internal.config.PythonInputOptions" + +``` + +Final options passed as template context. + +Methods: + +- **`coerce`** – Create an instance from a dictionary. +- **`from_data`** – Create an instance from a dictionary. + +Attributes: + +- **`allow_inspection`** (`bool`) – Whether to allow inspecting modules when visiting them is not possible. +- **`annotations_path`** (`Literal['brief', 'source', 'full']`) – The verbosity for annotations path: brief (recommended), source (as written in the source), or full. +- **`backlinks`** (`Literal['flat', 'tree', False]`) – Whether to render backlinks, and how. +- **`docstring_options`** (`GoogleStyleOptions | NumpyStyleOptions | SphinxStyleOptions | AutoStyleOptions | None`) – The options for the docstring parser. +- **`docstring_section_style`** (`Literal['table', 'list', 'spacy']`) – The style used to render docstring sections. +- **`docstring_style`** (`Literal['auto', 'google', 'numpy', 'sphinx'] | None`) – The docstring style to use: auto, google, numpy, sphinx, or None. +- **`extensions`** (`list[str | dict[str, Any]]`) – A list of Griffe extensions to load. +- **`extra`** (`dict[str, Any]`) – Extra options. +- **`filters`** (`list[tuple[Pattern, bool]] | Literal['public']`) – A list of filters, or "public". +- **`find_stubs_package`** (`bool`) – Whether to load stubs package (package-stubs) when extracting docstrings. +- **`force_inspection`** (`bool`) – Whether to force using dynamic analysis when loading data. +- **`group_by_category`** (`bool`) – Group the object's children by categories: attributes, classes, functions, and modules. +- **`heading`** (`str`) – A custom string to override the autogenerated heading of the root object. +- **`heading_level`** (`int`) – The initial heading level to use. +- **`inherited_members`** (`bool | list[str]`) – A boolean, or an explicit list of inherited members to render. +- **`line_length`** (`int`) – Maximum line length when formatting code/signatures. +- **`members`** (`list[str] | bool | None`) – A boolean, or an explicit list of members to render. +- **`members_order`** (`Order | list[Order]`) – The members ordering to use. +- **`merge_init_into_class`** (`bool`) – Whether to merge the __init__ method into the class' signature and docstring. +- **`modernize_annotations`** (`bool`) – Whether to modernize annotations, for example Optional[str] into str | None. +- **`parameter_headings`** (`bool`) – Whether to render headings for parameters (therefore showing parameters in the ToC). +- **`preload_modules`** (`list[str]`) – Pre-load modules that are not specified directly in autodoc instructions (::: identifier). +- **`relative_crossrefs`** (`bool`) – Whether to enable the relative crossref syntax. +- **`scoped_crossrefs`** (`bool`) – Whether to enable the scoped crossref ability. +- **`separate_signature`** (`bool`) – Whether to put the whole signature in a code block below the heading. +- **`show_bases`** (`bool`) – Show the base classes of a class. +- **`show_category_heading`** (`bool`) – When grouped by categories, show a heading for each category. +- **`show_docstring_attributes`** (`bool`) – Whether to display the 'Attributes' section in the object's docstring. +- **`show_docstring_classes`** (`bool`) – Whether to display the 'Classes' section in the object's docstring. +- **`show_docstring_description`** (`bool`) – Whether to display the textual block (including admonitions) in the object's docstring. +- **`show_docstring_examples`** (`bool`) – Whether to display the 'Examples' section in the object's docstring. +- **`show_docstring_functions`** (`bool`) – Whether to display the 'Functions' or 'Methods' sections in the object's docstring. +- **`show_docstring_modules`** (`bool`) – Whether to display the 'Modules' section in the object's docstring. +- **`show_docstring_other_parameters`** (`bool`) – Whether to display the 'Other Parameters' section in the object's docstring. +- **`show_docstring_parameters`** (`bool`) – Whether to display the 'Parameters' section in the object's docstring. +- **`show_docstring_raises`** (`bool`) – Whether to display the 'Raises' section in the object's docstring. +- **`show_docstring_receives`** (`bool`) – Whether to display the 'Receives' section in the object's docstring. +- **`show_docstring_returns`** (`bool`) – Whether to display the 'Returns' section in the object's docstring. +- **`show_docstring_warns`** (`bool`) – Whether to display the 'Warns' section in the object's docstring. +- **`show_docstring_yields`** (`bool`) – Whether to display the 'Yields' section in the object's docstring. +- **`show_if_no_docstring`** (`bool`) – Show the object heading even if it has no docstring or children with docstrings. +- **`show_inheritance_diagram`** (`bool`) – Show the inheritance diagram of a class using Mermaid. +- **`show_labels`** (`bool`) – Whether to show labels of the members. +- **`show_object_full_path`** (`bool`) – Show the full Python path of every object. +- **`show_overloads`** (`bool`) – Show the overloads of a function or method. +- **`show_root_full_path`** (`bool`) – Show the full Python path for the root object heading. +- **`show_root_heading`** (`bool`) – Show the heading of the object at the root of the documentation tree. +- **`show_root_members_full_path`** (`bool`) – Show the full Python path of the root members. +- **`show_root_toc_entry`** (`bool`) – If the root heading is not shown, at least add a ToC entry for it. +- **`show_signature`** (`bool`) – Show methods and functions signatures. +- **`show_signature_annotations`** (`bool`) – Show the type annotations in methods and functions signatures. +- **`show_source`** (`bool`) – Show the source code of this object. +- **`show_submodules`** (`bool`) – When rendering a module, show its submodules recursively. +- **`show_symbol_type_heading`** (`bool`) – Show the symbol type in headings (e.g. mod, class, meth, func and attr). +- **`show_symbol_type_toc`** (`bool`) – Show the symbol type in the Table of Contents (e.g. mod, class, methd, func and attr). +- **`signature_crossrefs`** (`bool`) – Whether to render cross-references for type annotations in signatures. +- **`summary`** (`SummaryOption`) – Whether to render summaries of modules, classes, functions (methods) and attributes. +- **`toc_label`** (`str`) – A custom string to override the autogenerated toc label of the root object. +- **`unwrap_annotated`** (`bool`) – Whether to unwrap Annotated types to show only the type without the annotations. + +### allow_inspection + +```python +allow_inspection: bool = True + +``` + +Whether to allow inspecting modules when visiting them is not possible. + +### annotations_path + +```python +annotations_path: Literal['brief', 'source', 'full'] = 'brief' + +``` + +The verbosity for annotations path: `brief` (recommended), `source` (as written in the source), or `full`. + +### backlinks + +```python +backlinks: Literal['flat', 'tree', False] = False + +``` + +Whether to render backlinks, and how. + +### docstring_options + +```python +docstring_options: ( + GoogleStyleOptions + | NumpyStyleOptions + | SphinxStyleOptions + | AutoStyleOptions + | None +) = None + +``` + +The options for the docstring parser. + +See [docstring parsers](https://mkdocstrings.github.io/griffe/reference/docstrings/) and their options in Griffe docs. + +### docstring_section_style + +```python +docstring_section_style: Literal['table', 'list', 'spacy'] = 'table' + +``` + +The style used to render docstring sections. + +### docstring_style + +```python +docstring_style: Literal['auto', 'google', 'numpy', 'sphinx'] | None = 'google' + +``` + +The docstring style to use: `auto`, `google`, `numpy`, `sphinx`, or `None`. + +### extensions + +```python +extensions: list[str | dict[str, Any]] = field(default_factory=list) + +``` + +A list of Griffe extensions to load. + +### extra + +```python +extra: dict[str, Any] = field(default_factory=dict) + +``` + +Extra options. + +### filters + +```python +filters: list[tuple[Pattern, bool]] | Literal["public"] = field( + default_factory=lambda: [ + (compile(removeprefix("!")), startswith("!")) for filtr in _DEFAULT_FILTERS + ] +) + +``` + +A list of filters, or `"public"`. + +### find_stubs_package + +```python +find_stubs_package: bool = False + +``` + +Whether to load stubs package (package-stubs) when extracting docstrings. + +### force_inspection + +```python +force_inspection: bool = False + +``` + +Whether to force using dynamic analysis when loading data. + +### group_by_category + +```python +group_by_category: bool = True + +``` + +Group the object's children by categories: attributes, classes, functions, and modules. + +### heading + +```python +heading: str = '' + +``` + +A custom string to override the autogenerated heading of the root object. + +### heading_level + +```python +heading_level: int = 2 + +``` + +The initial heading level to use. + +### inherited_members + +```python +inherited_members: bool | list[str] = False + +``` + +A boolean, or an explicit list of inherited members to render. + +If true, select all inherited members, which can then be filtered with `members`. If false or empty list, do not select any inherited member. + +### line_length + +```python +line_length: int = 60 + +``` + +Maximum line length when formatting code/signatures. + +### members + +```python +members: list[str] | bool | None = None + +``` + +A boolean, or an explicit list of members to render. + +If true, select all members without further filtering. If false or empty list, do not render members. If none, select all members and apply further filtering with filters and docstrings. + +### members_order + +```python +members_order: Order | list[Order] = 'alphabetical' + +``` + +The members ordering to use. + +- `__all__`: order members according to `__all__` module attributes, if declared; +- `alphabetical`: order members alphabetically; +- `source`: order members as they appear in the source file. + +Since `__all__` is a module-only attribute, it can't be used to sort class members, therefore the `members_order` option accepts a list of ordering methods, indicating ordering preferences. + +### merge_init_into_class + +```python +merge_init_into_class: bool = False + +``` + +Whether to merge the `__init__` method into the class' signature and docstring. + +### modernize_annotations + +```python +modernize_annotations: bool = False + +``` + +Whether to modernize annotations, for example `Optional[str]` into `str | None`. + +### parameter_headings + +```python +parameter_headings: bool = False + +``` + +Whether to render headings for parameters (therefore showing parameters in the ToC). + +### preload_modules + +```python +preload_modules: list[str] = field(default_factory=list) + +``` + +Pre-load modules that are not specified directly in autodoc instructions (`::: identifier`). + +It is useful when you want to render documentation for a particular member of an object, and this member is imported from another package than its parent. + +For an imported member to be rendered, you need to add it to the `__all__` attribute of the importing module. + +The modules must be listed as an array of strings. + +### relative_crossrefs + +```python +relative_crossrefs: bool = False + +``` + +Whether to enable the relative crossref syntax. + +### scoped_crossrefs + +```python +scoped_crossrefs: bool = False + +``` + +Whether to enable the scoped crossref ability. + +### separate_signature + +```python +separate_signature: bool = False + +``` + +Whether to put the whole signature in a code block below the heading. + +If Black or Ruff are installed, the signature is also formatted using them. + +### show_bases + +```python +show_bases: bool = True + +``` + +Show the base classes of a class. + +### show_category_heading + +```python +show_category_heading: bool = False + +``` + +When grouped by categories, show a heading for each category. + +### show_docstring_attributes + +```python +show_docstring_attributes: bool = True + +``` + +Whether to display the 'Attributes' section in the object's docstring. + +### show_docstring_classes + +```python +show_docstring_classes: bool = True + +``` + +Whether to display the 'Classes' section in the object's docstring. + +### show_docstring_description + +```python +show_docstring_description: bool = True + +``` + +Whether to display the textual block (including admonitions) in the object's docstring. + +### show_docstring_examples + +```python +show_docstring_examples: bool = True + +``` + +Whether to display the 'Examples' section in the object's docstring. + +### show_docstring_functions + +```python +show_docstring_functions: bool = True + +``` + +Whether to display the 'Functions' or 'Methods' sections in the object's docstring. + +### show_docstring_modules + +```python +show_docstring_modules: bool = True + +``` + +Whether to display the 'Modules' section in the object's docstring. + +### show_docstring_other_parameters + +```python +show_docstring_other_parameters: bool = True + +``` + +Whether to display the 'Other Parameters' section in the object's docstring. + +### show_docstring_parameters + +```python +show_docstring_parameters: bool = True + +``` + +Whether to display the 'Parameters' section in the object's docstring. + +### show_docstring_raises + +```python +show_docstring_raises: bool = True + +``` + +Whether to display the 'Raises' section in the object's docstring. + +### show_docstring_receives + +```python +show_docstring_receives: bool = True + +``` + +Whether to display the 'Receives' section in the object's docstring. + +### show_docstring_returns + +```python +show_docstring_returns: bool = True + +``` + +Whether to display the 'Returns' section in the object's docstring. + +### show_docstring_warns + +```python +show_docstring_warns: bool = True + +``` + +Whether to display the 'Warns' section in the object's docstring. + +### show_docstring_yields + +```python +show_docstring_yields: bool = True + +``` + +Whether to display the 'Yields' section in the object's docstring. + +### show_if_no_docstring + +```python +show_if_no_docstring: bool = False + +``` + +Show the object heading even if it has no docstring or children with docstrings. + +### show_inheritance_diagram + +```python +show_inheritance_diagram: bool = False + +``` + +Show the inheritance diagram of a class using Mermaid. + +### show_labels + +```python +show_labels: bool = True + +``` + +Whether to show labels of the members. + +### show_object_full_path + +```python +show_object_full_path: bool = False + +``` + +Show the full Python path of every object. + +### show_overloads + +```python +show_overloads: bool = True + +``` + +Show the overloads of a function or method. + +### show_root_full_path + +```python +show_root_full_path: bool = True + +``` + +Show the full Python path for the root object heading. + +### show_root_heading + +```python +show_root_heading: bool = False + +``` + +Show the heading of the object at the root of the documentation tree. + +The root object is the object referenced by the identifier after `:::`. + +### show_root_members_full_path + +```python +show_root_members_full_path: bool = False + +``` + +Show the full Python path of the root members. + +### show_root_toc_entry + +```python +show_root_toc_entry: bool = True + +``` + +If the root heading is not shown, at least add a ToC entry for it. + +### show_signature + +```python +show_signature: bool = True + +``` + +Show methods and functions signatures. + +### show_signature_annotations + +```python +show_signature_annotations: bool = False + +``` + +Show the type annotations in methods and functions signatures. + +### show_source + +```python +show_source: bool = True + +``` + +Show the source code of this object. + +### show_submodules + +```python +show_submodules: bool = False + +``` + +When rendering a module, show its submodules recursively. + +### show_symbol_type_heading + +```python +show_symbol_type_heading: bool = False + +``` + +Show the symbol type in headings (e.g. mod, class, meth, func and attr). + +### show_symbol_type_toc + +```python +show_symbol_type_toc: bool = False + +``` + +Show the symbol type in the Table of Contents (e.g. mod, class, methd, func and attr). + +### signature_crossrefs + +```python +signature_crossrefs: bool = False + +``` + +Whether to render cross-references for type annotations in signatures. + +### summary + +```python +summary: SummaryOption = field(default_factory=SummaryOption) + +``` + +Whether to render summaries of modules, classes, functions (methods) and attributes. + +### toc_label + +```python +toc_label: str = '' + +``` + +A custom string to override the autogenerated toc label of the root object. + +### unwrap_annotated + +```python +unwrap_annotated: bool = False + +``` + +Whether to unwrap `Annotated` types to show only the type without the annotations. + +### coerce + +```python +coerce(**data: Any) -> MutableMapping[str, Any] + +``` + +Create an instance from a dictionary. + +### from_data + +```python +from_data(**data: Any) -> Self + +``` + +Create an instance from a dictionary. + +## SphinxStyleOptions + +```python +SphinxStyleOptions() + +``` + +Sphinx style docstring options. + +## SummaryOption + +```python +SummaryOption( + attributes: bool = False, + functions: bool = False, + classes: bool = False, + modules: bool = False, +) + +``` + +Summary option. + +Attributes: + +- **`attributes`** (`bool`) – Whether to render summaries of attributes. +- **`classes`** (`bool`) – Whether to render summaries of classes. +- **`functions`** (`bool`) – Whether to render summaries of functions (methods). +- **`modules`** (`bool`) – Whether to render summaries of modules. + +### attributes + +```python +attributes: bool = False + +``` + +Whether to render summaries of attributes. + +### classes + +```python +classes: bool = False + +``` + +Whether to render summaries of classes. + +### functions + +```python +functions: bool = False + +``` + +Whether to render summaries of functions (methods). + +### modules + +```python +modules: bool = False + +``` + +Whether to render summaries of modules. + +## do_as_attributes_section + +```python +do_as_attributes_section( + context: Context, attributes: Sequence[Attribute], *, check_public: bool = True +) -> DocstringSectionAttributes + +``` + +Build an attributes section from a list of attributes. + +Parameters: + +- ### **`attributes`** + + (`Sequence[Attribute]`) – The attributes to build the section from. + +- ### **`check_public`** + + (`bool`, default: `True` ) – Whether to check if the attribute is public. + +Returns: + +- `DocstringSectionAttributes` – An attributes docstring section. + +## do_as_classes_section + +```python +do_as_classes_section( + context: Context, classes: Sequence[Class], *, check_public: bool = True +) -> DocstringSectionClasses + +``` + +Build a classes section from a list of classes. + +Parameters: + +- ### **`classes`** + + (`Sequence[Class]`) – The classes to build the section from. + +- ### **`check_public`** + + (`bool`, default: `True` ) – Whether to check if the class is public. + +Returns: + +- `DocstringSectionClasses` – A classes docstring section. + +## do_as_functions_section + +```python +do_as_functions_section( + context: Context, functions: Sequence[Function], *, check_public: bool = True +) -> DocstringSectionFunctions + +``` + +Build a functions section from a list of functions. + +Parameters: + +- ### **`functions`** + + (`Sequence[Function]`) – The functions to build the section from. + +- ### **`check_public`** + + (`bool`, default: `True` ) – Whether to check if the function is public. + +Returns: + +- `DocstringSectionFunctions` – A functions docstring section. + +## do_as_modules_section + +```python +do_as_modules_section( + context: Context, modules: Sequence[Module], *, check_public: bool = True +) -> DocstringSectionModules + +``` + +Build a modules section from a list of modules. + +Parameters: + +- ### **`modules`** + + (`Sequence[Module]`) – The modules to build the section from. + +- ### **`check_public`** + + (`bool`, default: `True` ) – Whether to check if the module is public. + +Returns: + +- `DocstringSectionModules` – A modules docstring section. + +## do_backlink_tree + +```python +do_backlink_tree(backlinks: list[Backlink]) -> Tree[BacklinkCrumb] + +``` + +Build a tree of backlinks. + +Parameters: + +- ### **`backlinks`** + + (`list[Backlink]`) – The list of backlinks. + +Returns: + +- `Tree[BacklinkCrumb]` – A tree of backlinks. + +## do_crossref + +```python +do_crossref(path: str, *, brief: bool = True) -> Markup + +``` + +Deprecated. Filter to create cross-references. + +Parameters: + +- ### **`path`** + + (`str`) – The path to link to. + +- ### **`brief`** + + (`bool`, default: `True` ) – Show only the last part of the path, add full path as hover. + +Returns: + +- `Markup` – Markup text. + +## do_filter_objects + +```python +do_filter_objects( + objects_dictionary: dict[str, Object | Alias], + *, + filters: Sequence[tuple[Pattern, bool]] | Literal["public"] | None = None, + members_list: bool | list[str] | None = None, + inherited_members: bool | list[str] = False, + keep_no_docstrings: bool = True +) -> list[Object | Alias] + +``` + +Filter a dictionary of objects based on their docstrings. + +Parameters: + +- ### **`objects_dictionary`** + + (`dict[str, Object | Alias]`) – The dictionary of objects. + +- ### **`filters`** + + (`Sequence[tuple[Pattern, bool]] | Literal['public'] | None`, default: `None` ) – Filters to apply, based on members' names, or "public". Each element is a tuple: a pattern, and a boolean indicating whether to reject the object if the pattern matches. + +- ### **`members_list`** + + (`bool | list[str] | None`, default: `None` ) – An optional, explicit list of members to keep. When given and empty, return an empty list. When given and not empty, ignore filters and docstrings presence/absence. + +- ### **`inherited_members`** + + (`bool | list[str]`, default: `False` ) – Whether to keep inherited members or exclude them. + +- ### **`keep_no_docstrings`** + + (`bool`, default: `True` ) – Whether to keep objects with no/empty docstrings (recursive check). + +Returns: + +- `list[Object | Alias]` – A list of objects. + +## do_format_attribute + +```python +do_format_attribute( + context: Context, + attribute_path: Markup, + attribute: Attribute, + line_length: int, + *, + crossrefs: bool = False +) -> str + +``` + +Format an attribute. + +Parameters: + +- ### **`context`** + + (`Context`) – Jinja context, passed automatically. + +- ### **`attribute_path`** + + (`Markup`) – The path of the callable we render the signature of. + +- ### **`attribute`** + + (`Attribute`) – The attribute we render the signature of. + +- ### **`line_length`** + + (`int`) – The line length. + +- ### **`crossrefs`** + + (`bool`, default: `False` ) – Whether to cross-reference types in the signature. + +Returns: + +- `str` – The same code, formatted. + +## do_format_code + +```python +do_format_code(code: str, line_length: int) -> str + +``` + +Format code. + +Parameters: + +- ### **`code`** + + (`str`) – The code to format. + +- ### **`line_length`** + + (`int`) – The line length. + +Returns: + +- `str` – The same code, formatted. + +## do_format_signature + +```python +do_format_signature( + context: Context, + callable_path: Markup, + function: Function, + line_length: int, + *, + annotations: bool | None = None, + crossrefs: bool = False +) -> str + +``` + +Format a signature. + +Parameters: + +- ### **`context`** + + (`Context`) – Jinja context, passed automatically. + +- ### **`callable_path`** + + (`Markup`) – The path of the callable we render the signature of. + +- ### **`function`** + + (`Function`) – The function we render the signature of. + +- ### **`line_length`** + + (`int`) – The line length. + +- ### **`annotations`** + + (`bool | None`, default: `None` ) – Whether to show type annotations. + +- ### **`crossrefs`** + + (`bool`, default: `False` ) – Whether to cross-reference types in the signature. + +Returns: + +- `str` – The same code, formatted. + +## do_get_template + +```python +do_get_template(env: Environment, obj: str | Object) -> str + +``` + +Get the template name used to render an object. + +Parameters: + +- ### **`env`** + + (`Environment`) – The Jinja environment, passed automatically. + +- ### **`obj`** + + (`str | Object`) – A Griffe object, or a template name. + +Returns: + +- `str` – A template name. + +## do_multi_crossref + +```python +do_multi_crossref(text: str, *, code: bool = True) -> Markup + +``` + +Deprecated. Filter to create cross-references. + +Parameters: + +- ### **`text`** + + (`str`) – The text to scan. + +- ### **`code`** + + (`bool`, default: `True` ) – Whether to wrap the result in a code tag. + +Returns: + +- `Markup` – Markup text. + +## do_order_members + +```python +do_order_members( + members: Sequence[Object | Alias], + order: Order | list[Order], + members_list: bool | list[str] | None, +) -> Sequence[Object | Alias] + +``` + +Order members given an ordering method. + +Parameters: + +- ### **`members`** + + (`Sequence[Object | Alias]`) – The members to order. + +- ### **`order`** + + (`Order | list[Order]`) – The ordering method. + +- ### **`members_list`** + + (`bool | list[str] | None`) – An optional member list (manual ordering). + +Returns: + +- `Sequence[Object | Alias]` – The same members, ordered. + +## do_split_path + +```python +do_split_path(path: str, full_path: str) -> Iterator[tuple[str, str, str, str]] + +``` + +Split object paths for building cross-references. + +Parameters: + +- ### **`path`** + + (`str`) – The path to split. + +- ### **`full_path`** + + (`str`) – The full path, used to compute correct paths for each part of the path. + +Yields: + +- `tuple[str, str, str, str]` – 4-tuples: prefix, word, full path, suffix. + +## get_handler + +```python +get_handler( + handler_config: MutableMapping[str, Any], tool_config: MkDocsConfig, **kwargs: Any +) -> PythonHandler + +``` + +Return an instance of `PythonHandler`. + +Parameters: + +- ### **`handler_config`** + + (`MutableMapping[str, Any]`) – The handler configuration. + +- ### **`tool_config`** + + (`MkDocsConfig`) – The tool (SSG) configuration. + +Returns: + +- `PythonHandler` – An instance of PythonHandler. + +## config + +Deprecated. Import from `mkdocstrings_handlers.python` directly. + +## handler + +Deprecated. Import from `mkdocstrings_handlers.python` directly. + +## rendering + +Deprecated. Import from `mkdocstrings_handlers.python` directly. diff --git a/reference/mkdocstrings_handlers/python/config/index.html b/reference/mkdocstrings_handlers/python/config/index.html new file mode 100644 index 00000000..c7d4d56c --- /dev/null +++ b/reference/mkdocstrings_handlers/python/config/index.html @@ -0,0 +1,14 @@ + + + + + + Redirecting... + + + + + +You're being redirected to a new destination. + + diff --git a/reference/mkdocstrings_handlers/python/debug/index.html b/reference/mkdocstrings_handlers/python/debug/index.html new file mode 100644 index 00000000..be69ef56 --- /dev/null +++ b/reference/mkdocstrings_handlers/python/debug/index.html @@ -0,0 +1,14 @@ + + + + + + Redirecting... + + + + + +You're being redirected to a new destination. + + diff --git a/reference/mkdocstrings_handlers/python/handler/index.html b/reference/mkdocstrings_handlers/python/handler/index.html new file mode 100644 index 00000000..e601a5b0 --- /dev/null +++ b/reference/mkdocstrings_handlers/python/handler/index.html @@ -0,0 +1,14 @@ + + + + + + Redirecting... + + + + + +You're being redirected to a new destination. + + diff --git a/reference/mkdocstrings_handlers/python/index.html b/reference/mkdocstrings_handlers/python/index.html new file mode 100644 index 00000000..8462a74a --- /dev/null +++ b/reference/mkdocstrings_handlers/python/index.html @@ -0,0 +1,14 @@ + + + + + + Redirecting... + + + + + +You're being redirected to a new destination. + + diff --git a/reference/mkdocstrings_handlers/python/rendering/index.html b/reference/mkdocstrings_handlers/python/rendering/index.html new file mode 100644 index 00000000..eb161fac --- /dev/null +++ b/reference/mkdocstrings_handlers/python/rendering/index.html @@ -0,0 +1,14 @@ + + + + + + Redirecting... + + + + + +You're being redirected to a new destination. + + diff --git a/schema.json b/schema.json new file mode 100644 index 00000000..c9f0784c --- /dev/null +++ b/schema.json @@ -0,0 +1,856 @@ +{ + "$defs": { + "AutoStyleOptions": { + "description": "Auto style docstring options.", + "properties": { + "method": { + "default": "heuristics", + "description": "The method to use to determine the docstring style.", + "enum": [ + "heuristics", + "max_sections" + ], + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#docstring_options)\n\nThe method to use to determine the docstring style.", + "title": "method", + "type": "string" + }, + "style_order": { + "description": "The order of the docstring styles to try.", + "items": { + "type": "string" + }, + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#docstring_options)\n\nThe order of the docstring styles to try.", + "title": "style_order", + "type": "array" + }, + "default": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "default", + "description": "The default docstring style to use if no other style is detected.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#docstring_options)\n\nThe default docstring style to use if no other style is detected." + }, + "per_style_options": { + "$ref": "#/$defs/PerStyleOptions", + "description": "Per-style options.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#docstring_options)\n\nPer-style options.", + "title": "per_style_options" + } + }, + "title": "AutoStyleOptions", + "type": "object" + }, + "GoogleStyleOptions": { + "description": "Google style docstring options.", + "properties": { + "ignore_init_summary": { + "default": false, + "description": "Whether to ignore the summary in `__init__` methods' docstrings.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#docstring_options)\n\nWhether to ignore the summary in `__init__` methods' docstrings.", + "title": "ignore_init_summary", + "type": "boolean" + }, + "returns_multiple_items": { + "default": true, + "description": "Whether to parse multiple items in `Yields` and `Returns` sections.\n\nWhen true, each item's continuation lines must be indented.\nWhen false (single item), no further indentation is required.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#docstring_options)\n\nWhether to parse multiple items in `Yields` and `Returns` sections.\n\nWhen true, each item's continuation lines must be indented.\nWhen false (single item), no further indentation is required.", + "title": "returns_multiple_items", + "type": "boolean" + }, + "returns_named_value": { + "default": true, + "description": "Whether to parse `Yields` and `Returns` section items as name and description, rather than type and description.\n\nWhen true, type must be wrapped in parentheses: `(int): Description.`. Names are optional: `name (int): Description.`.\nWhen false, parentheses are optional but the items cannot be named: `int: Description`.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#docstring_options)\n\nWhether to parse `Yields` and `Returns` section items as name and description, rather than type and description.\n\nWhen true, type must be wrapped in parentheses: `(int): Description.`. Names are optional: `name (int): Description.`.\nWhen false, parentheses are optional but the items cannot be named: `int: Description`.", + "title": "returns_named_value", + "type": "boolean" + }, + "returns_type_in_property_summary": { + "default": false, + "description": "Whether to parse the return type of properties at the beginning of their summary: `str: Summary of the property`.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#docstring_options)\n\nWhether to parse the return type of properties at the beginning of their summary: `str: Summary of the property`.", + "title": "returns_type_in_property_summary", + "type": "boolean" + }, + "receives_multiple_items": { + "default": true, + "description": "Whether to parse multiple items in `Receives` sections.\n\nWhen true, each item's continuation lines must be indented.\nWhen false (single item), no further indentation is required.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#docstring_options)\n\nWhether to parse multiple items in `Receives` sections.\n\nWhen true, each item's continuation lines must be indented.\nWhen false (single item), no further indentation is required.", + "title": "receives_multiple_items", + "type": "boolean" + }, + "receives_named_value": { + "default": true, + "description": "Whether to parse `Receives` section items as name and description, rather than type and description.\n\nWhen true, type must be wrapped in parentheses: `(int): Description.`. Names are optional: `name (int): Description.`.\nWhen false, parentheses are optional but the items cannot be named: `int: Description`.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#docstring_options)\n\nWhether to parse `Receives` section items as name and description, rather than type and description.\n\nWhen true, type must be wrapped in parentheses: `(int): Description.`. Names are optional: `name (int): Description.`.\nWhen false, parentheses are optional but the items cannot be named: `int: Description`.", + "title": "receives_named_value", + "type": "boolean" + }, + "trim_doctest_flags": { + "default": true, + "description": "Whether to remove doctest flags from Python example blocks.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#docstring_options)\n\nWhether to remove doctest flags from Python example blocks.", + "title": "trim_doctest_flags", + "type": "boolean" + }, + "warn_unknown_params": { + "default": true, + "description": "Warn about documented parameters not appearing in the signature.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#docstring_options)\n\nWarn about documented parameters not appearing in the signature.", + "title": "warn_unknown_params", + "type": "boolean" + } + }, + "title": "GoogleStyleOptions", + "type": "object" + }, + "Inventory": { + "description": "An inventory.", + "properties": { + "url": { + "description": "The URL of the inventory.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/#inventories)\n\nThe URL of the inventory.", + "title": "url", + "type": "string" + }, + "base_url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The base URL of the inventory.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/#inventories)\n\nThe base URL of the inventory.", + "title": "base_url" + }, + "domains": { + "description": "The domains to load from the inventory.", + "items": { + "type": "string" + }, + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/#inventories)\n\nThe domains to load from the inventory.", + "title": "domains", + "type": "array" + } + }, + "required": [ + "url" + ], + "title": "Inventory", + "type": "object" + }, + "NumpyStyleOptions": { + "description": "Numpy style docstring options.", + "properties": { + "ignore_init_summary": { + "default": false, + "description": "Whether to ignore the summary in `__init__` methods' docstrings.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#docstring_options)\n\nWhether to ignore the summary in `__init__` methods' docstrings.", + "title": "ignore_init_summary", + "type": "boolean" + }, + "trim_doctest_flags": { + "default": true, + "description": "Whether to remove doctest flags from Python example blocks.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#docstring_options)\n\nWhether to remove doctest flags from Python example blocks.", + "title": "trim_doctest_flags", + "type": "boolean" + }, + "warn_unknown_params": { + "default": true, + "description": "Warn about documented parameters not appearing in the signature.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#docstring_options)\n\nWarn about documented parameters not appearing in the signature.", + "title": "warn_unknown_params", + "type": "boolean" + } + }, + "title": "NumpyStyleOptions", + "type": "object" + }, + "PerStyleOptions": { + "description": "Per style options.", + "properties": { + "google": { + "$ref": "#/$defs/GoogleStyleOptions", + "description": "Google-style options.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#docstring_options)\n\nGoogle-style options.", + "title": "google" + }, + "numpy": { + "$ref": "#/$defs/NumpyStyleOptions", + "description": "Numpydoc-style options.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#docstring_options)\n\nNumpydoc-style options.", + "title": "numpy" + }, + "sphinx": { + "$ref": "#/$defs/SphinxStyleOptions", + "description": "Sphinx-style options.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#docstring_options)\n\nSphinx-style options.", + "title": "sphinx" + } + }, + "title": "PerStyleOptions", + "type": "object" + }, + "PythonInputConfig": { + "description": "Python handler configuration.", + "properties": { + "inventories": { + "description": "The inventories to load.", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/Inventory" + } + ] + }, + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/#inventories)\n\nThe inventories to load.", + "title": "inventories", + "type": "array" + }, + "paths": { + "description": "The paths in which to search for Python packages.", + "items": { + "type": "string" + }, + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/#paths)\n\nThe paths in which to search for Python packages.", + "title": "paths", + "type": "array" + }, + "load_external_modules": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Whether to always load external modules/packages.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/#load_external_modules)\n\nWhether to always load external modules/packages.", + "title": "load_external_modules" + }, + "options": { + "$ref": "#/$defs/PythonInputOptions", + "description": "Configuration options for collecting and rendering objects.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/#options)\n\nConfiguration options for collecting and rendering objects.", + "title": "options" + }, + "locale": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The locale to use when translating template strings.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/#locale)\n\nThe locale to use when translating template strings.", + "title": "locale" + } + }, + "title": "PythonInputConfig", + "type": "object" + }, + "PythonInputOptions": { + "description": "Accepted input options.", + "properties": { + "allow_inspection": { + "default": true, + "description": "Whether to allow inspecting modules when visiting them is not possible.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/general/#allow_inspection)\n\nWhether to allow inspecting modules when visiting them is not possible.", + "title": "allow_inspection", + "type": "boolean" + }, + "force_inspection": { + "default": false, + "description": "Whether to force using dynamic analysis when loading data.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/general/#force_inspection)\n\nWhether to force using dynamic analysis when loading data.", + "title": "force_inspection", + "type": "boolean" + }, + "annotations_path": { + "default": "brief", + "description": "The verbosity for annotations path: `brief` (recommended), `source` (as written in the source), or `full`.", + "enum": [ + "brief", + "source", + "full" + ], + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/signatures/#annotations_path)\n\nThe verbosity for annotations path: `brief` (recommended), `source` (as written in the source), or `full`.", + "title": "annotations_path", + "type": "string" + }, + "backlinks": { + "default": false, + "description": "Whether to render backlinks, and how.", + "enum": [ + "flat", + "tree", + false + ], + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/general/#backlinks)\n\nWhether to render backlinks, and how.", + "title": "backlinks" + }, + "docstring_options": { + "anyOf": [ + { + "$ref": "#/$defs/GoogleStyleOptions" + }, + { + "$ref": "#/$defs/NumpyStyleOptions" + }, + { + "$ref": "#/$defs/SphinxStyleOptions" + }, + { + "$ref": "#/$defs/AutoStyleOptions" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The options for the docstring parser.\n\nSee [docstring parsers](https://mkdocstrings.github.io/griffe/reference/docstrings/) and their options in Griffe docs.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#docstring_options)\n\nThe options for the docstring parser.\n\nSee [docstring parsers](https://mkdocstrings.github.io/griffe/reference/docstrings/) and their options in Griffe docs.", + "title": "docstring_options" + }, + "docstring_section_style": { + "default": "table", + "description": "The style used to render docstring sections.", + "enum": [ + "table", + "list", + "spacy" + ], + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#docstring_section_style)\n\nThe style used to render docstring sections.", + "title": "docstring_section_style", + "type": "string" + }, + "docstring_style": { + "anyOf": [ + { + "enum": [ + "auto", + "google", + "numpy", + "sphinx" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": "google", + "description": "The docstring style to use: `auto`, `google`, `numpy`, `sphinx`, or `None`.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#docstring_style)\n\nThe docstring style to use: `auto`, `google`, `numpy`, `sphinx`, or `None`.", + "title": "docstring_style" + }, + "extensions": { + "description": "A list of Griffe extensions to load.", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object" + } + ] + }, + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/general/#extensions)\n\nA list of Griffe extensions to load.", + "title": "extensions", + "type": "array" + }, + "filters": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "const": "public", + "type": "string" + } + ], + "description": "A list of filters, or `\"public\"`.\n\n**List of filters**\n\nA filter starting with `!` will exclude matching objects instead of including them.\nThe `members` option takes precedence over `filters` (filters will still be applied recursively\nto lower members in the hierarchy).\n\n**Filtering methods**\n\n[:octicons-heart-fill-24:{ .pulse } Sponsors only](../insiders/index.md){ .insiders } —\n[:octicons-tag-24: Insiders 1.11.0](../insiders/changelog.md#1.11.0)\n\nThe `public` method will include only public objects:\nthose added to `__all__` or not starting with an underscore (except for special methods/attributes).", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/members/#filters)\n\nA list of filters, or `\"public\"`.\n\n**List of filters**\n\nA filter starting with `!` will exclude matching objects instead of including them.\nThe `members` option takes precedence over `filters` (filters will still be applied recursively\nto lower members in the hierarchy).\n\n**Filtering methods**\n\n[:octicons-heart-fill-24:{ .pulse } Sponsors only](../insiders/index.md){ .insiders } —\n[:octicons-tag-24: Insiders 1.11.0](../insiders/changelog.md#1.11.0)\n\nThe `public` method will include only public objects:\nthose added to `__all__` or not starting with an underscore (except for special methods/attributes).", + "title": "filters" + }, + "find_stubs_package": { + "default": false, + "description": "Whether to load stubs package (package-stubs) when extracting docstrings.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/general/#find_stubs_package)\n\nWhether to load stubs package (package-stubs) when extracting docstrings.", + "title": "find_stubs_package", + "type": "boolean" + }, + "group_by_category": { + "default": true, + "description": "Group the object's children by categories: attributes, classes, functions, and modules.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/members/#group_by_category)\n\nGroup the object's children by categories: attributes, classes, functions, and modules.", + "title": "group_by_category", + "type": "boolean" + }, + "heading": { + "default": "", + "description": "A custom string to override the autogenerated heading of the root object.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/headings/#heading)\n\nA custom string to override the autogenerated heading of the root object.", + "title": "heading", + "type": "string" + }, + "heading_level": { + "default": 2, + "description": "The initial heading level to use.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/headings/#heading_level)\n\nThe initial heading level to use.", + "title": "heading_level", + "type": "integer" + }, + "inherited_members": { + "anyOf": [ + { + "type": "boolean" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ], + "default": false, + "description": "A boolean, or an explicit list of inherited members to render.\n\nIf true, select all inherited members, which can then be filtered with `members`.\nIf false or empty list, do not select any inherited member.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/members/#inherited_members)\n\nA boolean, or an explicit list of inherited members to render.\n\nIf true, select all inherited members, which can then be filtered with `members`.\nIf false or empty list, do not select any inherited member.", + "title": "inherited_members" + }, + "line_length": { + "default": 60, + "description": "Maximum line length when formatting code/signatures.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/signatures/#line_length)\n\nMaximum line length when formatting code/signatures.", + "title": "line_length", + "type": "integer" + }, + "members": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "A boolean, or an explicit list of members to render.\n\nIf true, select all members without further filtering.\nIf false or empty list, do not render members.\nIf none, select all members and apply further filtering with filters and docstrings.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/members/#members)\n\nA boolean, or an explicit list of members to render.\n\nIf true, select all members without further filtering.\nIf false or empty list, do not render members.\nIf none, select all members and apply further filtering with filters and docstrings.", + "title": "members" + }, + "members_order": { + "anyOf": [ + { + "enum": [ + "__all__", + "alphabetical", + "source" + ], + "type": "string" + }, + { + "items": { + "enum": [ + "__all__", + "alphabetical", + "source" + ], + "type": "string" + }, + "type": "array" + } + ], + "default": "alphabetical", + "description": "The members ordering to use.\n\n- `__all__`: order members according to `__all__` module attributes, if declared;\n- `alphabetical`: order members alphabetically;\n- `source`: order members as they appear in the source file.\n\nSince `__all__` is a module-only attribute, it can't be used to sort class members,\ntherefore the `members_order` option accepts a list of ordering methods,\nindicating ordering preferences.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/members/#members_order)\n\nThe members ordering to use.\n\n- `__all__`: order members according to `__all__` module attributes, if declared;\n- `alphabetical`: order members alphabetically;\n- `source`: order members as they appear in the source file.\n\nSince `__all__` is a module-only attribute, it can't be used to sort class members,\ntherefore the `members_order` option accepts a list of ordering methods,\nindicating ordering preferences.", + "title": "members_order" + }, + "merge_init_into_class": { + "default": false, + "description": "Whether to merge the `__init__` method into the class' signature and docstring.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#merge_init_into_class)\n\nWhether to merge the `__init__` method into the class' signature and docstring.", + "title": "merge_init_into_class", + "type": "boolean" + }, + "modernize_annotations": { + "default": false, + "description": "Whether to modernize annotations, for example `Optional[str]` into `str | None`.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/signatures/#modernize_annotations)\n\nWhether to modernize annotations, for example `Optional[str]` into `str | None`.", + "title": "modernize_annotations", + "type": "boolean" + }, + "parameter_headings": { + "default": false, + "description": "Whether to render headings for parameters (therefore showing parameters in the ToC).", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/headings/#parameter_headings)\n\nWhether to render headings for parameters (therefore showing parameters in the ToC).", + "title": "parameter_headings", + "type": "boolean" + }, + "preload_modules": { + "description": "Pre-load modules that are not specified directly in autodoc instructions (`::: identifier`).\n\nIt is useful when you want to render documentation for a particular member of an object,\nand this member is imported from another package than its parent.\n\nFor an imported member to be rendered, you need to add it to the `__all__` attribute\nof the importing module.\n\nThe modules must be listed as an array of strings.", + "items": { + "type": "string" + }, + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/general/#preload_modules)\n\nPre-load modules that are not specified directly in autodoc instructions (`::: identifier`).\n\nIt is useful when you want to render documentation for a particular member of an object,\nand this member is imported from another package than its parent.\n\nFor an imported member to be rendered, you need to add it to the `__all__` attribute\nof the importing module.\n\nThe modules must be listed as an array of strings.", + "title": "preload_modules", + "type": "array" + }, + "relative_crossrefs": { + "default": false, + "description": "Whether to enable the relative crossref syntax.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#relative_crossrefs)\n\nWhether to enable the relative crossref syntax.", + "title": "relative_crossrefs", + "type": "boolean" + }, + "scoped_crossrefs": { + "default": false, + "description": "Whether to enable the scoped crossref ability.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#scoped_crossrefs)\n\nWhether to enable the scoped crossref ability.", + "title": "scoped_crossrefs", + "type": "boolean" + }, + "show_overloads": { + "default": true, + "description": "Show the overloads of a function or method.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/signatures/#show_overloads)\n\nShow the overloads of a function or method.", + "title": "show_overloads", + "type": "boolean" + }, + "separate_signature": { + "default": false, + "description": "Whether to put the whole signature in a code block below the heading.\n\nIf Black or Ruff are installed, the signature is also formatted using them.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/signatures/#separate_signature)\n\nWhether to put the whole signature in a code block below the heading.\n\nIf Black or Ruff are installed, the signature is also formatted using them.", + "title": "separate_signature", + "type": "boolean" + }, + "show_bases": { + "default": true, + "description": "Show the base classes of a class.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/general/#show_bases)\n\nShow the base classes of a class.", + "title": "show_bases", + "type": "boolean" + }, + "show_category_heading": { + "default": false, + "description": "When grouped by categories, show a heading for each category.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/headings/#show_category_heading)\n\nWhen grouped by categories, show a heading for each category.", + "title": "show_category_heading", + "type": "boolean" + }, + "show_docstring_attributes": { + "default": true, + "description": "Whether to display the 'Attributes' section in the object's docstring.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#show_docstring_attributes)\n\nWhether to display the 'Attributes' section in the object's docstring.", + "title": "show_docstring_attributes", + "type": "boolean" + }, + "show_docstring_classes": { + "default": true, + "description": "Whether to display the 'Classes' section in the object's docstring.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#show_docstring_classes)\n\nWhether to display the 'Classes' section in the object's docstring.", + "title": "show_docstring_classes", + "type": "boolean" + }, + "show_docstring_description": { + "default": true, + "description": "Whether to display the textual block (including admonitions) in the object's docstring.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#show_docstring_description)\n\nWhether to display the textual block (including admonitions) in the object's docstring.", + "title": "show_docstring_description", + "type": "boolean" + }, + "show_docstring_examples": { + "default": true, + "description": "Whether to display the 'Examples' section in the object's docstring.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#show_docstring_examples)\n\nWhether to display the 'Examples' section in the object's docstring.", + "title": "show_docstring_examples", + "type": "boolean" + }, + "show_docstring_functions": { + "default": true, + "description": "Whether to display the 'Functions' or 'Methods' sections in the object's docstring.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#show_docstring_functions)\n\nWhether to display the 'Functions' or 'Methods' sections in the object's docstring.", + "title": "show_docstring_functions", + "type": "boolean" + }, + "show_docstring_modules": { + "default": true, + "description": "Whether to display the 'Modules' section in the object's docstring.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#show_docstring_modules)\n\nWhether to display the 'Modules' section in the object's docstring.", + "title": "show_docstring_modules", + "type": "boolean" + }, + "show_docstring_other_parameters": { + "default": true, + "description": "Whether to display the 'Other Parameters' section in the object's docstring.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#show_docstring_other_parameters)\n\nWhether to display the 'Other Parameters' section in the object's docstring.", + "title": "show_docstring_other_parameters", + "type": "boolean" + }, + "show_docstring_parameters": { + "default": true, + "description": "Whether to display the 'Parameters' section in the object's docstring.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#show_docstring_parameters)\n\nWhether to display the 'Parameters' section in the object's docstring.", + "title": "show_docstring_parameters", + "type": "boolean" + }, + "show_docstring_raises": { + "default": true, + "description": "Whether to display the 'Raises' section in the object's docstring.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#show_docstring_raises)\n\nWhether to display the 'Raises' section in the object's docstring.", + "title": "show_docstring_raises", + "type": "boolean" + }, + "show_docstring_receives": { + "default": true, + "description": "Whether to display the 'Receives' section in the object's docstring.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#show_docstring_receives)\n\nWhether to display the 'Receives' section in the object's docstring.", + "title": "show_docstring_receives", + "type": "boolean" + }, + "show_docstring_returns": { + "default": true, + "description": "Whether to display the 'Returns' section in the object's docstring.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#show_docstring_returns)\n\nWhether to display the 'Returns' section in the object's docstring.", + "title": "show_docstring_returns", + "type": "boolean" + }, + "show_docstring_warns": { + "default": true, + "description": "Whether to display the 'Warns' section in the object's docstring.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#show_docstring_warns)\n\nWhether to display the 'Warns' section in the object's docstring.", + "title": "show_docstring_warns", + "type": "boolean" + }, + "show_docstring_yields": { + "default": true, + "description": "Whether to display the 'Yields' section in the object's docstring.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#show_docstring_yields)\n\nWhether to display the 'Yields' section in the object's docstring.", + "title": "show_docstring_yields", + "type": "boolean" + }, + "show_if_no_docstring": { + "default": false, + "description": "Show the object heading even if it has no docstring or children with docstrings.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#show_if_no_docstring)\n\nShow the object heading even if it has no docstring or children with docstrings.", + "title": "show_if_no_docstring", + "type": "boolean" + }, + "show_inheritance_diagram": { + "default": false, + "description": "Show the inheritance diagram of a class using Mermaid.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#show_inheritance_diagram)\n\nShow the inheritance diagram of a class using Mermaid.", + "title": "show_inheritance_diagram", + "type": "boolean" + }, + "show_labels": { + "default": true, + "description": "Whether to show labels of the members.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#show_labels)\n\nWhether to show labels of the members.", + "title": "show_labels", + "type": "boolean" + }, + "show_object_full_path": { + "default": false, + "description": "Show the full Python path of every object.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#show_object_full_path)\n\nShow the full Python path of every object.", + "title": "show_object_full_path", + "type": "boolean" + }, + "show_root_full_path": { + "default": true, + "description": "Show the full Python path for the root object heading.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/docstrings/#show_root_full_path)\n\nShow the full Python path for the root object heading.", + "title": "show_root_full_path", + "type": "boolean" + }, + "show_root_heading": { + "default": false, + "description": "Show the heading of the object at the root of the documentation tree.\n\nThe root object is the object referenced by the identifier after `:::`.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/headings/#show_root_heading)\n\nShow the heading of the object at the root of the documentation tree.\n\nThe root object is the object referenced by the identifier after `:::`.", + "title": "show_root_heading", + "type": "boolean" + }, + "show_root_members_full_path": { + "default": false, + "description": "Show the full Python path of the root members.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/headings/#show_root_members_full_path)\n\nShow the full Python path of the root members.", + "title": "show_root_members_full_path", + "type": "boolean" + }, + "show_root_toc_entry": { + "default": true, + "description": "If the root heading is not shown, at least add a ToC entry for it.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/headings/#show_root_toc_entry)\n\nIf the root heading is not shown, at least add a ToC entry for it.", + "title": "show_root_toc_entry", + "type": "boolean" + }, + "show_signature_annotations": { + "default": false, + "description": "Show the type annotations in methods and functions signatures.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/signatures/#show_signature_annotations)\n\nShow the type annotations in methods and functions signatures.", + "title": "show_signature_annotations", + "type": "boolean" + }, + "show_signature": { + "default": true, + "description": "Show methods and functions signatures.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/signatures/#show_signature)\n\nShow methods and functions signatures.", + "title": "show_signature", + "type": "boolean" + }, + "show_source": { + "default": true, + "description": "Show the source code of this object.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/general/#show_source)\n\nShow the source code of this object.", + "title": "show_source", + "type": "boolean" + }, + "show_submodules": { + "default": false, + "description": "When rendering a module, show its submodules recursively.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/members/#show_submodules)\n\nWhen rendering a module, show its submodules recursively.", + "title": "show_submodules", + "type": "boolean" + }, + "show_symbol_type_heading": { + "default": false, + "description": "Show the symbol type in headings (e.g. mod, class, meth, func and attr).", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/headings/#show_symbol_type_heading)\n\nShow the symbol type in headings (e.g. mod, class, meth, func and attr).", + "title": "show_symbol_type_heading", + "type": "boolean" + }, + "show_symbol_type_toc": { + "default": false, + "description": "Show the symbol type in the Table of Contents (e.g. mod, class, methd, func and attr).", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/headings/#show_symbol_type_toc)\n\nShow the symbol type in the Table of Contents (e.g. mod, class, methd, func and attr).", + "title": "show_symbol_type_toc", + "type": "boolean" + }, + "signature_crossrefs": { + "default": false, + "description": "Whether to render cross-references for type annotations in signatures.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/signatures/#signature_crossrefs)\n\nWhether to render cross-references for type annotations in signatures.", + "title": "signature_crossrefs", + "type": "boolean" + }, + "summary": { + "anyOf": [ + { + "type": "boolean" + }, + { + "$ref": "#/$defs/SummaryOption" + } + ], + "description": "Whether to render summaries of modules, classes, functions (methods) and attributes.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/members/#summary)\n\nWhether to render summaries of modules, classes, functions (methods) and attributes.", + "title": "summary" + }, + "toc_label": { + "default": "", + "description": "A custom string to override the autogenerated toc label of the root object.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/headings/#toc_label)\n\nA custom string to override the autogenerated toc label of the root object.", + "title": "toc_label", + "type": "string" + }, + "unwrap_annotated": { + "default": false, + "description": "Whether to unwrap `Annotated` types to show only the type without the annotations.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/signatures/#unwrap_annotated)\n\nWhether to unwrap `Annotated` types to show only the type without the annotations.", + "title": "unwrap_annotated", + "type": "boolean" + }, + "extra": { + "description": "Extra options.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/general/#extra)\n\nExtra options.", + "title": "extra", + "type": "object" + } + }, + "title": "PythonInputOptions", + "type": "object" + }, + "SphinxStyleOptions": { + "description": "Sphinx style docstring options.", + "properties": {}, + "title": "SphinxStyleOptions", + "type": "object" + }, + "SummaryOption": { + "description": "Summary option.", + "properties": { + "attributes": { + "default": false, + "description": "Whether to render summaries of attributes.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/members/#summary)\n\nWhether to render summaries of attributes.", + "title": "attributes", + "type": "boolean" + }, + "functions": { + "default": false, + "description": "Whether to render summaries of functions (methods).", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/members/#summary)\n\nWhether to render summaries of functions (methods).", + "title": "functions", + "type": "boolean" + }, + "classes": { + "default": false, + "description": "Whether to render summaries of classes.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/members/#summary)\n\nWhether to render summaries of classes.", + "title": "classes", + "type": "boolean" + }, + "modules": { + "default": false, + "description": "Whether to render summaries of modules.", + "markdownDescription": "[DOCUMENTATION](https://mkdocstrings.github.io/python/usage/configuration/members/#summary)\n\nWhether to render summaries of modules.", + "title": "modules", + "type": "boolean" + } + }, + "title": "SummaryOption", + "type": "object" + } + }, + "properties": { + "python": { + "$ref": "#/$defs/PythonInputConfig" + } + }, + "required": [ + "python" + ], + "title": "PythonHandlerSchema", + "type": "object", + "$schema": "https://json-schema.org/draft-07/schema" +} \ No newline at end of file diff --git a/scripts/gen_credits.py b/scripts/gen_credits.py deleted file mode 100644 index 6a81e239..00000000 --- a/scripts/gen_credits.py +++ /dev/null @@ -1,179 +0,0 @@ -# Script to generate the project's credits. - -from __future__ import annotations - -import os -import sys -from collections import defaultdict -from collections.abc import Iterable -from importlib.metadata import distributions -from itertools import chain -from pathlib import Path -from textwrap import dedent -from typing import Union - -from jinja2 import StrictUndefined -from jinja2.sandbox import SandboxedEnvironment -from packaging.requirements import Requirement - -# YORE: EOL 3.10: Replace block with line 2. -if sys.version_info >= (3, 11): - import tomllib -else: - import tomli as tomllib - -project_dir = Path(os.getenv("MKDOCS_CONFIG_DIR", ".")) -with project_dir.joinpath("pyproject.toml").open("rb") as pyproject_file: - pyproject = tomllib.load(pyproject_file) -project = pyproject["project"] -project_name = project["name"] -devdeps = [dep for group in pyproject["dependency-groups"].values() for dep in group if not dep.startswith("-e")] - -PackageMetadata = dict[str, Union[str, Iterable[str]]] -Metadata = dict[str, PackageMetadata] - - -def _merge_fields(metadata: dict) -> PackageMetadata: - fields = defaultdict(list) - for header, value in metadata.items(): - fields[header.lower()].append(value.strip()) - return { - field: value if len(value) > 1 or field in ("classifier", "requires-dist") else value[0] - for field, value in fields.items() - } - - -def _norm_name(name: str) -> str: - return name.replace("_", "-").replace(".", "-").lower() - - -def _requirements(deps: list[str]) -> dict[str, Requirement]: - return {_norm_name((req := Requirement(dep)).name): req for dep in deps} - - -def _extra_marker(req: Requirement) -> str | None: - if not req.marker: - return None - try: - return next(marker[2].value for marker in req.marker._markers if getattr(marker[0], "value", None) == "extra") - except StopIteration: - return None - - -def _get_metadata() -> Metadata: - metadata = {} - for pkg in distributions(): - name = _norm_name(pkg.name) # type: ignore[attr-defined,unused-ignore] - metadata[name] = _merge_fields(pkg.metadata) # type: ignore[arg-type] - metadata[name]["spec"] = set() - metadata[name]["extras"] = set() - metadata[name].setdefault("summary", "") - _set_license(metadata[name]) - return metadata - - -def _set_license(metadata: PackageMetadata) -> None: - license_field = metadata.get("license-expression", metadata.get("license", "")) - license_name = license_field if isinstance(license_field, str) else " + ".join(license_field) - check_classifiers = license_name in ("UNKNOWN", "Dual License", "") or license_name.count("\n") - if check_classifiers: - license_names = [] - for classifier in metadata["classifier"]: - if classifier.startswith("License ::"): - license_names.append(classifier.rsplit("::", 1)[1].strip()) - license_name = " + ".join(license_names) - metadata["license"] = license_name or "?" - - -def _get_deps(base_deps: dict[str, Requirement], metadata: Metadata) -> Metadata: - deps = {} - for dep_name, dep_req in base_deps.items(): - if dep_name not in metadata or dep_name == "mkdocstrings-python": - continue - metadata[dep_name]["spec"] |= {str(spec) for spec in dep_req.specifier} # type: ignore[operator] - metadata[dep_name]["extras"] |= dep_req.extras # type: ignore[operator] - deps[dep_name] = metadata[dep_name] - - again = True - while again: - again = False - for pkg_name in metadata: - if pkg_name in deps: - for pkg_dependency in metadata[pkg_name].get("requires-dist", []): - requirement = Requirement(pkg_dependency) - dep_name = _norm_name(requirement.name) - extra_marker = _extra_marker(requirement) - if ( - dep_name in metadata - and dep_name not in deps - and dep_name != project["name"] - and (not extra_marker or extra_marker in deps[pkg_name]["extras"]) - ): - metadata[dep_name]["spec"] |= {str(spec) for spec in requirement.specifier} # type: ignore[operator] - deps[dep_name] = metadata[dep_name] - again = True - - return deps - - -def _render_credits() -> str: - metadata = _get_metadata() - dev_dependencies = _get_deps(_requirements(devdeps), metadata) - prod_dependencies = _get_deps( - _requirements( - chain( # type: ignore[arg-type] - project.get("dependencies", []), - chain(*project.get("optional-dependencies", {}).values()), - ), - ), - metadata, - ) - - template_data = { - "project_name": project_name, - "prod_dependencies": sorted(prod_dependencies.values(), key=lambda dep: str(dep["name"]).lower()), - "dev_dependencies": sorted(dev_dependencies.values(), key=lambda dep: str(dep["name"]).lower()), - "more_credits": "http://pawamoy.github.io/credits/", - } - template_text = dedent( - """ - # Credits - - These projects were used to build *{{ project_name }}*. **Thank you!** - - [Python](https://www.python.org/) | - [uv](https://github.com/astral-sh/uv) | - [copier-uv](https://github.com/pawamoy/copier-uv) - - {% macro dep_line(dep) -%} - [{{ dep.name }}](https://pypi.org/project/{{ dep.name }}/) | {{ dep.summary }} | {{ ("`" ~ dep.spec|sort(reverse=True)|join(", ") ~ "`") if dep.spec else "" }} | `{{ dep.version }}` | {{ dep.license }} - {%- endmacro %} - - {% if prod_dependencies -%} - ### Runtime dependencies - - Project | Summary | Version (accepted) | Version (last resolved) | License - ------- | ------- | ------------------ | ----------------------- | ------- - {% for dep in prod_dependencies -%} - {{ dep_line(dep) }} - {% endfor %} - - {% endif -%} - {% if dev_dependencies -%} - ### Development dependencies - - Project | Summary | Version (accepted) | Version (last resolved) | License - ------- | ------- | ------------------ | ----------------------- | ------- - {% for dep in dev_dependencies -%} - {{ dep_line(dep) }} - {% endfor %} - - {% endif -%} - {% if more_credits %}**[More credits from the author]({{ more_credits }})**{% endif %} - """, - ) - jinja_env = SandboxedEnvironment(undefined=StrictUndefined) - return jinja_env.from_string(template_text).render(**template_data) - - -print(_render_credits()) diff --git a/scripts/get_version.py b/scripts/get_version.py deleted file mode 100644 index 6734e5b6..00000000 --- a/scripts/get_version.py +++ /dev/null @@ -1,26 +0,0 @@ -# Get current project version from Git tags or changelog. - -import re -from contextlib import suppress -from pathlib import Path - -from pdm.backend.hooks.version import SCMVersion, Version, default_version_formatter, get_version_from_scm - -_root = Path(__file__).parent.parent -_changelog = _root / "CHANGELOG.md" -_changelog_version_re = re.compile(r"^## \[(\d+\.\d+\.\d+)\].*$") -_default_scm_version = SCMVersion(Version("0.0.0"), None, False, None, None) # noqa: FBT003 - - -def get_version() -> str: - scm_version = get_version_from_scm(_root) or _default_scm_version - if scm_version.version <= Version("0.1"): # Missing Git tags? - with suppress(OSError, StopIteration): # noqa: SIM117 - with _changelog.open("r", encoding="utf8") as file: - match = next(filter(None, map(_changelog_version_re.match, file))) - scm_version = scm_version._replace(version=Version(match.group(1))) - return default_version_formatter(scm_version) - - -if __name__ == "__main__": - print(get_version()) diff --git a/scripts/griffe_extensions.py b/scripts/griffe_extensions.py deleted file mode 100644 index eb50f5f2..00000000 --- a/scripts/griffe_extensions.py +++ /dev/null @@ -1,46 +0,0 @@ -# Custom extensions for Griffe. - -from __future__ import annotations - -import ast -from typing import Any - -import griffe - -_logger = griffe.get_logger("griffe_extensions") - - -class CustomFields(griffe.Extension): - """Support our custom dataclass fields.""" - - def on_attribute_instance( - self, - *, - attr: griffe.Attribute, - agent: griffe.Visitor | griffe.Inspector, - **kwargs: Any, # noqa: ARG002 - ) -> None: - """Fetch descriptions from `Field` annotations.""" - if attr.docstring: - return - try: - field: griffe.ExprCall = attr.annotation.slice.elements[1] # type: ignore[union-attr] - except AttributeError: - return - - if field.canonical_path == "mkdocstrings_handlers.python._internal.config._Field": - description = next( - attr.value - for attr in field.arguments - if isinstance(attr, griffe.ExprKeyword) and attr.name == "description" - ) - if not isinstance(description, str): - _logger.warning(f"Field description of {attr.path} is not a static string") - description = str(description) - - attr.docstring = griffe.Docstring( - ast.literal_eval(description), - parent=attr, - parser=agent.docstring_parser, - parser_options=agent.docstring_options, - ) diff --git a/scripts/insiders.py b/scripts/insiders.py deleted file mode 100644 index 4cd438d4..00000000 --- a/scripts/insiders.py +++ /dev/null @@ -1,173 +0,0 @@ -# Functions related to Insiders funding goals. - -from __future__ import annotations - -import json -import logging -import os -import posixpath -from dataclasses import dataclass -from datetime import date, datetime, timedelta -from itertools import chain -from pathlib import Path -from typing import TYPE_CHECKING, cast -from urllib.error import HTTPError -from urllib.parse import urljoin -from urllib.request import urlopen - -import yaml - -if TYPE_CHECKING: - from collections.abc import Iterable - -logger = logging.getLogger(f"mkdocs.logs.{__name__}") - - -def human_readable_amount(amount: int) -> str: - str_amount = str(amount) - if len(str_amount) >= 4: # noqa: PLR2004 - return f"{str_amount[: len(str_amount) - 3]},{str_amount[-3:]}" - return str_amount - - -@dataclass -class Project: - name: str - url: str - - -@dataclass -class Feature: - name: str - ref: str | None - since: date | None - project: Project | None - - def url(self, rel_base: str = "..") -> str | None: # noqa: D102 - if not self.ref: - return None - if self.project: - rel_base = self.project.url - return posixpath.join(rel_base, self.ref.lstrip("/")) - - def render(self, rel_base: str = "..", *, badge: bool = False) -> None: # noqa: D102 - new = "" - if badge: - recent = self.since and date.today() - self.since <= timedelta(days=60) # noqa: DTZ011 - if recent: - ft_date = self.since.strftime("%B %d, %Y") # type: ignore[union-attr] - new = f' :material-alert-decagram:{{ .new-feature .vibrate title="Added on {ft_date}" }}' - project = f"[{self.project.name}]({self.project.url}) — " if self.project else "" - feature = f"[{self.name}]({self.url(rel_base)})" if self.ref else self.name - print(f"- [{'x' if self.since else ' '}] {project}{feature}{new}") - - -@dataclass -class Goal: - name: str - amount: int - features: list[Feature] - complete: bool = False - - @property - def human_readable_amount(self) -> str: # noqa: D102 - return human_readable_amount(self.amount) - - def render(self, rel_base: str = "..") -> None: # noqa: D102 - print(f"#### $ {self.human_readable_amount} — {self.name}\n") - if self.features: - for feature in self.features: - feature.render(rel_base) - print("") - else: - print("There are no features in this goal for this project. ") - print( - "[See the features in this goal **for all Insiders projects.**]" - f"(https://pawamoy.github.io/insiders/#{self.amount}-{self.name.lower().replace(' ', '-')})", - ) - - -def load_goals(data: str, funding: int = 0, project: Project | None = None) -> dict[int, Goal]: - goals_data = yaml.safe_load(data)["goals"] - return { - amount: Goal( - name=goal_data["name"], - amount=amount, - complete=funding >= amount, - features=[ - Feature( - name=feature_data["name"], - ref=feature_data.get("ref"), - since=feature_data.get("since") and datetime.strptime(feature_data["since"], "%Y/%m/%d").date(), # noqa: DTZ007 - project=project, - ) - for feature_data in goal_data["features"] - ], - ) - for amount, goal_data in goals_data.items() - } - - -def _load_goals_from_disk(path: str, funding: int = 0) -> dict[int, Goal]: - project_dir = os.getenv("MKDOCS_CONFIG_DIR", ".") - try: - data = Path(project_dir, path).read_text() - except OSError as error: - raise RuntimeError(f"Could not load data from disk: {path}") from error - return load_goals(data, funding) - - -def _load_goals_from_url(source_data: tuple[str, str, str], funding: int = 0) -> dict[int, Goal]: - project_name, project_url, data_fragment = source_data - data_url = urljoin(project_url, data_fragment) - try: - with urlopen(data_url) as response: # noqa: S310 - data = response.read() - except HTTPError as error: - raise RuntimeError(f"Could not load data from network: {data_url}") from error - return load_goals(data, funding, project=Project(name=project_name, url=project_url)) - - -def _load_goals(source: str | tuple[str, str, str], funding: int = 0) -> dict[int, Goal]: - if isinstance(source, str): - return _load_goals_from_disk(source, funding) - return _load_goals_from_url(source, funding) - - -def funding_goals(source: str | list[str | tuple[str, str, str]], funding: int = 0) -> dict[int, Goal]: - if isinstance(source, str): - return _load_goals_from_disk(source, funding) - goals = {} - for src in source: - source_goals = _load_goals(src, funding) - for amount, goal in source_goals.items(): - if amount not in goals: - goals[amount] = goal - else: - goals[amount].features.extend(goal.features) - return {amount: goals[amount] for amount in sorted(goals)} - - -def feature_list(goals: Iterable[Goal]) -> list[Feature]: - return list(chain.from_iterable(goal.features for goal in goals)) - - -def load_json(url: str) -> str | list | dict: - with urlopen(url) as response: # noqa: S310 - return json.loads(response.read().decode()) - - -data_source = globals()["data_source"] -sponsor_url = "https://github.com/sponsors/pawamoy" -data_url = "https://raw.githubusercontent.com/pawamoy/sponsors/main" -numbers: dict[str, int] = load_json(f"{data_url}/numbers.json") # type: ignore[assignment] -sponsors: list[dict] = load_json(f"{data_url}/sponsors.json") # type: ignore[assignment] -current_funding = numbers["total"] -sponsors_count = numbers["count"] -goals = funding_goals(data_source, funding=current_funding) -ongoing_goals = [goal for goal in goals.values() if not goal.complete] -unreleased_features = sorted( - (ft for ft in feature_list(ongoing_goals) if ft.since), - key=lambda ft: cast("date", ft.since), - reverse=True, -) diff --git a/scripts/make b/scripts/make deleted file mode 120000 index c2eda0df..00000000 --- a/scripts/make +++ /dev/null @@ -1 +0,0 @@ -make.py \ No newline at end of file diff --git a/scripts/make.py b/scripts/make.py deleted file mode 100755 index 5a7fb4c2..00000000 --- a/scripts/make.py +++ /dev/null @@ -1,189 +0,0 @@ -#!/usr/bin/env python3 -from __future__ import annotations - -import os -import shutil -import subprocess -import sys -from contextlib import contextmanager -from pathlib import Path -from textwrap import dedent -from typing import TYPE_CHECKING, Any - -if TYPE_CHECKING: - from collections.abc import Iterator - - -PYTHON_VERSIONS = os.getenv("PYTHON_VERSIONS", "3.9 3.10 3.11 3.12 3.13").split() - - -def shell(cmd: str, *, capture_output: bool = False, **kwargs: Any) -> str | None: - """Run a shell command.""" - if capture_output: - return subprocess.check_output(cmd, shell=True, text=True, **kwargs) # noqa: S602 - subprocess.run(cmd, shell=True, check=True, stderr=subprocess.STDOUT, **kwargs) # noqa: S602 - return None - - -@contextmanager -def environ(**kwargs: str) -> Iterator[None]: - """Temporarily set environment variables.""" - original = dict(os.environ) - os.environ.update(kwargs) - try: - yield - finally: - os.environ.clear() - os.environ.update(original) - - -def uv_install(venv: Path) -> None: - """Install dependencies using uv.""" - with environ(UV_PROJECT_ENVIRONMENT=str(venv), PYO3_USE_ABI3_FORWARD_COMPATIBILITY="1"): - if "CI" in os.environ: - shell("uv sync --no-editable") - else: - shell("uv sync") - - -def setup() -> None: - """Setup the project.""" - if not shutil.which("uv"): - raise ValueError("make: setup: uv must be installed, see https://github.com/astral-sh/uv") - - print("Installing dependencies (default environment)") - default_venv = Path(".venv") - if not default_venv.exists(): - shell("uv venv") - uv_install(default_venv) - - if PYTHON_VERSIONS: - for version in PYTHON_VERSIONS: - print(f"\nInstalling dependencies (python{version})") - venv_path = Path(f".venvs/{version}") - if not venv_path.exists(): - shell(f"uv venv --python {version} {venv_path}") - with environ(UV_PROJECT_ENVIRONMENT=str(venv_path.resolve())): - uv_install(venv_path) - - -def run(version: str, cmd: str, *args: str, **kwargs: Any) -> None: - """Run a command in a virtual environment.""" - kwargs = {"check": True, **kwargs} - uv_run = ["uv", "run", "--no-sync"] - if version == "default": - with environ(UV_PROJECT_ENVIRONMENT=".venv"): - subprocess.run([*uv_run, cmd, *args], **kwargs) # noqa: S603, PLW1510 - else: - with environ(UV_PROJECT_ENVIRONMENT=f".venvs/{version}", MULTIRUN="1"): - subprocess.run([*uv_run, cmd, *args], **kwargs) # noqa: S603, PLW1510 - - -def multirun(cmd: str, *args: str, **kwargs: Any) -> None: - """Run a command for all configured Python versions.""" - if PYTHON_VERSIONS: - for version in PYTHON_VERSIONS: - run(version, cmd, *args, **kwargs) - else: - run("default", cmd, *args, **kwargs) - - -def allrun(cmd: str, *args: str, **kwargs: Any) -> None: - """Run a command in all virtual environments.""" - run("default", cmd, *args, **kwargs) - if PYTHON_VERSIONS: - multirun(cmd, *args, **kwargs) - - -def clean() -> None: - """Delete build artifacts and cache files.""" - paths_to_clean = ["build", "dist", "htmlcov", "site", ".coverage*", ".pdm-build"] - for path in paths_to_clean: - shutil.rmtree(path, ignore_errors=True) - - cache_dirs = {".cache", ".pytest_cache", ".mypy_cache", ".ruff_cache", "__pycache__"} - for dirpath in Path(".").rglob("*/"): - if dirpath.parts[0] not in (".venv", ".venvs") and dirpath.name in cache_dirs: - shutil.rmtree(dirpath, ignore_errors=True) - - -def vscode() -> None: - """Configure VSCode to work on this project.""" - shutil.copytree("config/vscode", ".vscode", dirs_exist_ok=True) - - -def main() -> int: - """Main entry point.""" - args = list(sys.argv[1:]) - if not args or args[0] == "help": - if len(args) > 1: - run("default", "duty", "--help", args[1]) - else: - print( - dedent( - """ - Available commands - help Print this help. Add task name to print help. - setup Setup all virtual environments (install dependencies). - run Run a command in the default virtual environment. - multirun Run a command for all configured Python versions. - allrun Run a command in all virtual environments. - 3.x Run a command in the virtual environment for Python 3.x. - clean Delete build artifacts and cache files. - vscode Configure VSCode to work on this project. - """, - ), - flush=True, - ) - if os.path.exists(".venv"): - print("\nAvailable tasks", flush=True) - run("default", "duty", "--list") - return 0 - - while args: - cmd = args.pop(0) - - if cmd == "run": - run("default", *args) - return 0 - - if cmd == "multirun": - multirun(*args) - return 0 - - if cmd == "allrun": - allrun(*args) - return 0 - - if cmd.startswith("3."): - run(cmd, *args) - return 0 - - opts = [] - while args and (args[0].startswith("-") or "=" in args[0]): - opts.append(args.pop(0)) - - if cmd == "clean": - clean() - elif cmd == "setup": - setup() - elif cmd == "vscode": - vscode() - elif cmd == "check": - multirun("duty", "check-quality", "check-types", "check-docs") - run("default", "duty", "check-api") - elif cmd in {"check-quality", "check-docs", "check-types", "test"}: - multirun("duty", cmd, *opts) - else: - run("default", "duty", cmd, *opts) - - return 0 - - -if __name__ == "__main__": - try: - sys.exit(main()) - except subprocess.CalledProcessError as process: - if process.output: - print(process.output, file=sys.stderr) - sys.exit(process.returncode) diff --git a/scripts/mkdocs_hooks.py b/scripts/mkdocs_hooks.py deleted file mode 100644 index 739f93b3..00000000 --- a/scripts/mkdocs_hooks.py +++ /dev/null @@ -1,46 +0,0 @@ -# Generate a JSON schema of the Python handler configuration. - -import json -from dataclasses import dataclass, fields -from os.path import join -from typing import Any - -from mkdocs.config.defaults import MkDocsConfig -from mkdocs.plugins import get_plugin_logger - -from mkdocstrings_handlers.python import PythonInputConfig, PythonInputOptions - -# TODO: Update when Pydantic supports Python 3.14 (sources and duties as well). -try: - from pydantic import TypeAdapter -except ImportError: - TypeAdapter = None # type: ignore[assignment,misc] - - -_logger = get_plugin_logger(__name__) - - -def on_post_build(config: MkDocsConfig, **kwargs: Any) -> None: # noqa: ARG001 - """Write `schema.json` to the site directory.""" - if TypeAdapter is None: - _logger.info("Pydantic is not installed, skipping JSON schema generation") - return - - @dataclass - class PythonHandlerSchema: - python: PythonInputConfig - - adapter = TypeAdapter(PythonHandlerSchema) - schema = adapter.json_schema() - schema["$schema"] = "https://json-schema.org/draft-07/schema" - with open(join(config.site_dir, "schema.json"), "w") as file: - json.dump(schema, file, indent=2) - _logger.debug("Generated JSON schema") - - autorefs = config["plugins"]["autorefs"] - for field in fields(PythonInputConfig): - if f"setting-{field.name}" not in autorefs._primary_url_map: - _logger.warning(f"Handler setting `{field.name}` is not documented") - for field in fields(PythonInputOptions): - if f"option-{field.name}" not in autorefs._primary_url_map: - _logger.warning(f"Configuration option `{field.name}` is not documented") diff --git a/search/search_index.json b/search/search_index.json new file mode 100644 index 00000000..0a402dac --- /dev/null +++ b/search/search_index.json @@ -0,0 +1 @@ +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"],"fields":{"title":{"boost":1000.0},"text":{"boost":1.0},"tags":{"boost":1000000.0}}},"docs":[{"location":"","title":"Overview","text":"mkdocstrings-python

    A Python handler for mkdocstrings.

    The Python handler uses Griffe to collect documentation from Python source code. The word \"griffe\" can sometimes be used instead of \"signature\" in French. Griffe is able to visit the Abstract Syntax Tree (AST) of the source code to extract useful information. It is also able to execute the code (by importing it) and introspect objects in memory when source code is not available. Finally, it can parse docstrings following different styles.

    "},{"location":"#installation","title":"Installation","text":"

    You can install this handler as a mkdocstrings extra:

    pyproject.toml
    # PEP 621 dependencies declaration\n# adapt to your dependencies manager\n[project]\ndependencies = [\n    \"mkdocstrings[python]>=0.18\",\n]\n

    You can also explicitly depend on the handler:

    pyproject.toml
    # PEP 621 dependencies declaration\n# adapt to your dependencies manager\n[project]\ndependencies = [\n    \"mkdocstrings-python\",\n]\n
    "},{"location":"#preview","title":"Preview","text":""},{"location":"#features","title":"Features","text":"
    • Data collection from source code: collection of the object-tree and the docstrings is done thanks to Griffe.

    • Support for type annotations: Griffe collects your type annotations and mkdocstrings uses them to display parameter types or return types. It is even able to automatically add cross-references to other objects from your API, from the standard library or third-party libraries! See how to load inventories to enable it.

    • Recursive documentation of Python objects: just use the module dotted-path as an identifier, and you get the full module docs. You don't need to inject documentation for each class, function, etc.

    • Support for documented attributes: attributes (variables) followed by a docstring (triple-quoted string) will be recognized by Griffe in modules, classes and even in __init__ methods.

    • Multiple docstring-styles support: common support for Google-style, Numpydoc-style, and Sphinx-style docstrings. See Griffe's documentation on docstrings support.

    • Admonition support in Google docstrings: blocks like Note: or Warning: will be transformed to their admonition equivalent. We do not support nested admonitions in docstrings!

    • Every object has a TOC entry: we render a heading for each object, meaning MkDocs picks them into the Table of Contents, which is nicely displayed by the Material theme. Thanks to mkdocstrings cross-reference ability, you can reference other objects within your docstrings, with the classic Markdown syntax: [this object][package.module.object] or directly with [package.module.object][]

    • Source code display: mkdocstrings can add a collapsible div containing the highlighted source code of the Python object.

    "},{"location":"changelog/","title":"Changelog","text":"

    All notable changes to this project will be documented in this file.

    The format is based on Keep a Changelog and this project adheres to Semantic Versioning.

    "},{"location":"changelog/#11611-2025-05-24","title":"1.16.11 - 2025-05-24","text":"

    Compare with 1.16.10

    "},{"location":"changelog/#bug-fixes","title":"Bug Fixes","text":"
    • Fix highlighting for signature with known special names like __init__ (7f95686 by Timoth\u00e9e Mazzucotelli). Issue-mkdocstrings-757
    • Use default font-size for parameter headings (0a35b20 by Timoth\u00e9e Mazzucotelli). Issue-mkdocstrings-697
    • Prevent uppercasing H5 titles (by Material for MkDocs) (ba66969 by Timoth\u00e9e Mazzucotelli). Issue-mkdocstrings-697, Issue-276
    • Use configured heading even when signature is not separated (096960a by Timoth\u00e9e Mazzucotelli). Issue-mkdocstrings-767, PR-278
    • Render attribute names without full path in ToC (d4e618a by David Lee). Issue-271, PR-272
    "},{"location":"changelog/#11610-2025-04-03","title":"1.16.10 - 2025-04-03","text":"

    Compare with 1.16.9

    "},{"location":"changelog/#bug-fixes_1","title":"Bug Fixes","text":"
    • Fix inventory base_url being ignored (8870eb9 by Stefan Mejlgaard). Issue-268, PR-269
    "},{"location":"changelog/#1169-2025-04-03","title":"1.16.9 - 2025-04-03","text":"

    Compare with 1.16.8

    "},{"location":"changelog/#bug-fixes_2","title":"Bug Fixes","text":"
    • Use toc_label option in a few missing places (337b46b by Timoth\u00e9e Mazzucotelli). Issue-267
    "},{"location":"changelog/#1168-2025-03-24","title":"1.16.8 - 2025-03-24","text":"

    Compare with 1.16.7

    "},{"location":"changelog/#bug-fixes_3","title":"Bug Fixes","text":"
    • Prevent infinite recursion by detecting parent-member cycles (f3917e9 by Timoth\u00e9e Mazzucotelli). Issue-griffe-368
    "},{"location":"changelog/#code-refactoring","title":"Code Refactoring","text":"
    • Prepare feature for ordering by __all__ value (bfb5b30 by Timoth\u00e9e Mazzucotelli). Issue-219
    • Sort objects without line numbers last instead of first (681afb1 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#1167-2025-03-20","title":"1.16.7 - 2025-03-20","text":"

    Compare with 1.16.6

    "},{"location":"changelog/#code-refactoring_1","title":"Code Refactoring","text":"
    • Prepare public filtering method feature (fde2019 by Timoth\u00e9e Mazzucotelli). Issue-78
    "},{"location":"changelog/#1166-2025-03-18","title":"1.16.6 - 2025-03-18","text":"

    Compare with 1.16.5

    "},{"location":"changelog/#deprecations","title":"Deprecations","text":"

    Importing from submodules is now deprecated: the public API is fully exposed under the top-level mkdocstrings_handler.python module.

    "},{"location":"changelog/#bug-fixes_4","title":"Bug Fixes","text":"
    • Add back default compiled filters (regression) (2d83900 by Timoth\u00e9e Mazzucotelli). Issue-264
    "},{"location":"changelog/#code-refactoring_2","title":"Code Refactoring","text":"
    • Start logging warnings instead of info messages about deprecated use of templates (7606f33 by Timoth\u00e9e Mazzucotelli).
    • Move modules into internal folder, expose API in top-level module (93a68d0 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#1165-2025-03-10","title":"1.16.5 - 2025-03-10","text":"

    Compare with 1.16.4

    "},{"location":"changelog/#code-refactoring_3","title":"Code Refactoring","text":"
    • Prepare backlinks support (56bf627 by Timoth\u00e9e Mazzucotelli). Issue-153, PR-252
    "},{"location":"changelog/#1164-2025-03-10","title":"1.16.4 - 2025-03-10","text":"

    Compare with 1.16.3

    "},{"location":"changelog/#bug-fixes_5","title":"Bug Fixes","text":"
    • Fix de-duplication of summary sections (dc46ac9 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#1163-2025-03-08","title":"1.16.3 - 2025-03-08","text":"

    Compare with 1.16.2

    "},{"location":"changelog/#build","title":"Build","text":"
    • Depend on mkdocstrings 0.28.3 (9fa4f16 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#bug-fixes_6","title":"Bug Fixes","text":"
    • De-duplicate summary sections (a657d07 by Timoth\u00e9e Mazzucotelli). Issue-134
    "},{"location":"changelog/#code-refactoring_4","title":"Code Refactoring","text":"
    • Import from top-level mkdocstrings module (da2ba13 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#1162-2025-02-24","title":"1.16.2 - 2025-02-24","text":"

    Compare with 1.16.1

    "},{"location":"changelog/#build_1","title":"Build","text":"
    • Depend on mkdocs-autorefs >= 1.4 and mkdocstrings >= 0.28.2 (ea1ab49 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#1161-2025-02-18","title":"1.16.1 - 2025-02-18","text":"

    Compare with 1.16.0

    "},{"location":"changelog/#bug-fixes_7","title":"Bug Fixes","text":"
    • Give precedence to user-provided paths when they are already listed in sys.path (0f497d1 by Timoth\u00e9e Mazzucotelli). Issue-248
    "},{"location":"changelog/#1160-2025-02-17","title":"1.16.0 - 2025-02-17","text":"

    Compare with 1.15.1

    "},{"location":"changelog/#features","title":"Features","text":"
    • Add option to show/hide overloads (4a5ee10 by Pete Stenger). PR-250
    "},{"location":"changelog/#1151-2025-02-17","title":"1.15.1 - 2025-02-17","text":"

    Compare with 1.15.0

    "},{"location":"changelog/#bug-fixes_8","title":"Bug Fixes","text":"
    • Unwrap Annotated regardless of signature_crossrefs (d809f1a by Timoth\u00e9e Mazzucotelli). Issue-249
    "},{"location":"changelog/#1150-2025-02-11","title":"1.15.0 - 2025-02-11","text":"

    Compare with 1.14.6

    "},{"location":"changelog/#features_1","title":"Features","text":"
    • Support cross-referencing constructor parameters in instance attribute values (f07bf58 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#1146-2025-02-07","title":"1.14.6 - 2025-02-07","text":"

    Compare with 1.14.5

    "},{"location":"changelog/#bug-fixes_9","title":"Bug Fixes","text":"
    • Catch alias resolution errors when getting aliases for an identifier (0aaa260 by Timoth\u00e9e Mazzucotelli). Issue-358
    "},{"location":"changelog/#code-refactoring_5","title":"Code Refactoring","text":"
    • Improve translations for Simplified Chinese and Japanese (753a0df by Zhikang Yan). PR-244
    "},{"location":"changelog/#1145-2025-02-05","title":"1.14.5 - 2025-02-05","text":"

    Compare with 1.14.4

    "},{"location":"changelog/#bug-fixes_10","title":"Bug Fixes","text":"
    • Remove type from property docstring summary in summary sections (15f2cd4 by Uchechukwu Orji). PR-242
    "},{"location":"changelog/#1144-2025-02-04","title":"1.14.4 - 2025-02-04","text":"

    Compare with 1.14.3

    "},{"location":"changelog/#bug-fixes_11","title":"Bug Fixes","text":"
    • Deactivate Pydantic validation on Python 3.9 is eval-type-backport is not available (for modern typing syntax support) (0de0e5e by Timoth\u00e9e Mazzucotelli). Issue-241
    "},{"location":"changelog/#1143-2025-02-04","title":"1.14.3 - 2025-02-04","text":"

    Compare with 1.14.2

    "},{"location":"changelog/#bug-fixes_12","title":"Bug Fixes","text":"
    • Let dataclass implement __init__ method, set extra fields in get_options (477b9e4 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#1142-2025-02-03","title":"1.14.2 - 2025-02-03","text":"

    Compare with 1.14.1

    "},{"location":"changelog/#bug-fixes_13","title":"Bug Fixes","text":"
    • Deactivate Pydantic logic if v1 is installed instead of v2 (c5ecd70 by Timoth\u00e9e Mazzucotelli). Issue-240
    "},{"location":"changelog/#1141-2025-02-03","title":"1.14.1 - 2025-02-03","text":"

    Compare with 1.14.0

    "},{"location":"changelog/#bug-fixes_14","title":"Bug Fixes","text":"
    • Fix type errors with options during collection and docstring parsing (15ca6d8 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#1140-2025-02-03","title":"1.14.0 - 2025-02-03","text":"

    Compare with 1.13.0

    "},{"location":"changelog/#features_2","title":"Features","text":"
    • Add heading and toc_label options (7cabacf by Yann Van Crombrugge). Issue-mkdocstrings-725, PR-236
    • Add force_inspection option to force dynamic analysis (83823be by Uchechukwu Orji). Issue-94, PR-231
    "},{"location":"changelog/#code-refactoring_6","title":"Code Refactoring","text":"
    • Use dataclasses for configuration/options and automate schema generation (5ebeda6 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#1130-2024-12-26","title":"1.13.0 - 2024-12-26","text":"

    Compare with 1.12.2

    "},{"location":"changelog/#features_3","title":"Features","text":"
    • Allow using Ruff to format signatures and attribute values (d67215c by dm). PR-216
    "},{"location":"changelog/#bug-fixes_15","title":"Bug Fixes","text":"
    • Respect show_signature_annotations option for attribute signatures in headings (e93d166 by Timoth\u00e9e Mazzucotelli). Issue-griffe-pydantic#9
    • Handle __init__ overloads when merging into class (af6fab3 by Timoth\u00e9e Mazzucotelli). Issue-212
    • Actually check if a module is public when rendering auto-generated summary table for modules (3bf55b2 by Timoth\u00e9e Mazzucotelli). Issue-203
    • Never render line numbers for signatures and attribute values (a669f1c by Timoth\u00e9e Mazzucotelli). Issue-192
    • Respect highlight's linenums config for pycon examples in docstrings (53eb82a by Timoth\u00e9e Mazzucotelli). Related-to-#192
    • Fix normalization of extension paths on the annoying operating system and Python 3.13 (101a6dc by Timoth\u00e9e Mazzucotelli).
    • Don't merge parent __init__ docstring into class docstring if such inherited method wasn't selected through the inherited_members configuration option (6c5b5c3 by Timoth\u00e9e Mazzucotelli). Issue-189
    "},{"location":"changelog/#code-refactoring_7","title":"Code Refactoring","text":"
    • Render * and ** outside of cross-references in signatures (c4506f0 by Timoth\u00e9e Mazzucotelli). Needed-for-PR-216
    "},{"location":"changelog/#1122-2024-10-19","title":"1.12.2 - 2024-10-19","text":"

    Compare with 1.12.1

    "},{"location":"changelog/#bug-fixes_16","title":"Bug Fixes","text":"
    • Always render cross-references outside of signatures (73f11dc by Timoth\u00e9e Mazzucotelli). Issue-mkdocstrings#700
    "},{"location":"changelog/#1121-2024-10-14","title":"1.12.1 - 2024-10-14","text":"

    Compare with 1.12.0

    "},{"location":"changelog/#bug-fixes_17","title":"Bug Fixes","text":"
    • Don't escape parameter default values (9dee4d4 by Timoth\u00e9e Mazzucotelli). Issue-191
    "},{"location":"changelog/#1120-2024-10-12","title":"1.12.0 - 2024-10-12","text":"

    Compare with 1.11.1

    "},{"location":"changelog/#build_2","title":"Build","text":"
    • Drop support for Python 3.8 (6615c91 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#features_4","title":"Features","text":"
    • Auto-summary of members (7f9757d by Timoth\u00e9e Mazzucotelli).
    • Render function overloads (0f2c25c by Timoth\u00e9e Mazzucotelli).
    • Parameter headings, more automatic cross-references (0176b83 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#code-refactoring_8","title":"Code Refactoring","text":"
    • Declare default CSS symbol colors under :host as well (3b9dba2 by James McDonnell). PR-186
    "},{"location":"changelog/#1111-2024-09-03","title":"1.11.1 - 2024-09-03","text":"

    Compare with 1.11.0

    "},{"location":"changelog/#code-refactoring_9","title":"Code Refactoring","text":"
    • Prepare relative_crossrefs and scoped_crossrefs insiders features (dd8b014 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#1110-2024-09-03","title":"1.11.0 - 2024-09-03","text":"

    Compare with 1.10.9

    "},{"location":"changelog/#features_5","title":"Features","text":"
    • Hook into autorefs to provide context around cross-ref errors (bb4be5b by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#1109-2024-08-30","title":"1.10.9 - 2024-08-30","text":"

    Compare with 1.10.8

    "},{"location":"changelog/#build_3","title":"Build","text":"
    • Explicitly depend on mkdocs-autorefs to be able to specify lower bound (2299ab5 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#code-refactoring_10","title":"Code Refactoring","text":"
    • Use new autorefs syntax (68cb72f by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#1108-2024-08-14","title":"1.10.8 - 2024-08-14","text":"

    Compare with 1.10.7

    "},{"location":"changelog/#build_4","title":"Build","text":"
    • Depend on Griffe 0.49 (a87dcad by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#1107-2024-07-25","title":"1.10.7 - 2024-07-25","text":"

    Compare with 1.10.6

    "},{"location":"changelog/#packaging","title":"Packaging","text":"
    • Include tests and all relevant files for downstream packaging in source distribution
    "},{"location":"changelog/#1106-2024-07-25","title":"1.10.6 - 2024-07-25","text":"

    Compare with 1.10.5

    "},{"location":"changelog/#bug-fixes_18","title":"Bug Fixes","text":"
    • Fix condition to display members (check all members, not just non-inherited ones) (3d838a9 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#code-refactoring_11","title":"Code Refactoring","text":"
    • Update code for Griffe 0.48 (removing deprecation warnings) (eff10cc by Timoth\u00e9e Mazzucotelli). Issue-173
    "},{"location":"changelog/#1105-2024-06-19","title":"1.10.5 - 2024-06-19","text":"

    Compare with 1.10.4

    "},{"location":"changelog/#bug-fixes_19","title":"Bug Fixes","text":"
    • Mix both previous checks for displaying objects: not imported or public (587963b by Timoth\u00e9e Mazzucotelli). Issue-294
    "},{"location":"changelog/#1104-2024-06-18","title":"1.10.4 - 2024-06-18","text":"

    Compare with 1.10.3

    "},{"location":"changelog/#code-refactoring_12","title":"Code Refactoring","text":"
    • Only filter out imported objects instead of non-public ones after applying filters (e2f4b35 by Timoth\u00e9e Mazzucotelli). Issue-mkdocstrings/griffe-294
    • Update code for Griffe 0.46 to avoid deprecation warnings (321b407 by Timoth\u00e9e Mazzucotelli).
    • Change load_external_modules default value to None to support new default mode in Griffe (ae5896c by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#1103-2024-05-22","title":"1.10.3 - 2024-05-22","text":"

    Compare with 1.10.2

    "},{"location":"changelog/#bug-fixes_20","title":"Bug Fixes","text":"
    • Don't crash when rendering the source of an object whose lineno is none (64df00b by Timoth\u00e9e Mazzucotelli). Issue-163
    "},{"location":"changelog/#1102-2024-05-16","title":"1.10.2 - 2024-05-16","text":"

    Compare with 1.10.1

    "},{"location":"changelog/#bug-fixes_21","title":"Bug Fixes","text":"
    • Actually make use of custom .html.jinja templates (5668abb by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#1101-2024-05-14","title":"1.10.1 - 2024-05-14","text":"

    Compare with 1.10.0

    "},{"location":"changelog/#build_5","title":"Build","text":"
    • Depend on mkdocstrings 0.25 which adds support for parameter once when logging messages (2bc156b by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#code-refactoring_13","title":"Code Refactoring","text":"
    • Set handler's name (a71ab12 by Timoth\u00e9e Mazzucotelli).
    • Update *.html top-level templates to extend the *.html.jinja base templates (a8c540e by Timoth\u00e9e Mazzucotelli). Issue-151
    • Update *.html base templates to extend their *.html.jinja counterpart, while overriding the logs block to issue a logging message (info) stating that extending *.html templates is deprecated (e6f1b9c by Timoth\u00e9e Mazzucotelli). Issue-151
    • Add *.html.jinja top-level (overridable) templates, extending their base counterpart (7c14924 by Timoth\u00e9e Mazzucotelli). Issue-151
    • Add *.html.jinja base templates, which are copies of *.html templates, with an additional logs block, and using the updated get_template filter (eced9a5 by Timoth\u00e9e Mazzucotelli). Issue-151
    • Update get_template filter to support both *.html and *.html.jinja templates, logging a message (info) when *.html templates are overridden by users (3546fd7 by Timoth\u00e9e Mazzucotelli). Issue-151
    • Log a warning when base templates are overridden (26e3d66 by Timoth\u00e9e Mazzucotelli). Issue-151
    "},{"location":"changelog/#1100-2024-04-19","title":"1.10.0 - 2024-04-19","text":"

    Compare with 1.9.2

    "},{"location":"changelog/#features_6","title":"Features","text":"
    • Add CSS classes doc-section-title and doc-section-item in docstring sections (d6e1d68 by Timoth\u00e9e Mazzucotelli). Issue-17
    "},{"location":"changelog/#bug-fixes_22","title":"Bug Fixes","text":"
    • Render enumeration instance name instead of just \"value\", allowing proper cross-reference (11d81d8 by Timoth\u00e9e Mazzucotelli). Issue-124
    "},{"location":"changelog/#192-2024-04-02","title":"1.9.2 - 2024-04-02","text":"

    Compare with 1.9.1

    "},{"location":"changelog/#dependencies","title":"Dependencies","text":"
    • Remove cap on Python-Markdown 3.6 now that ToC labels are fixed by mkdocstrings (0c1e2c1 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#191-2024-04-02","title":"1.9.1 - 2024-04-02","text":"

    Compare with 1.9.0

    "},{"location":"changelog/#bug-fixes_23","title":"Bug Fixes","text":"
    • Don't try loading packages from relative paths (bd73497 by Timoth\u00e9e Mazzucotelli). Issue-145
    "},{"location":"changelog/#code-refactoring_14","title":"Code Refactoring","text":"
    • Allow first name in a separate signature to be highlighted as a function name (f798a1e by Timoth\u00e9e Mazzucotelli).
    • Maintain original Pygments color for cross-refs in signatures (7c8b885 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#190-2024-03-13","title":"1.9.0 - 2024-03-13","text":"

    Compare with 1.8.0

    "},{"location":"changelog/#dependencies_1","title":"Dependencies","text":"
    • Add upper bound on Python-Markdown 3.6 to temporarily prevent breaking changes (cd93ee3 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#features_7","title":"Features","text":"
    • Add show_labels option to show/hide labels (eaf9b82 by Viicos). Issue #120, PR #130
    • Add option to search for stubs packages (0c6aa32 by Romain). PR #128, PR griffe#221: : https://github.com/mkdocstrings/griffe/pull/221
    "},{"location":"changelog/#code-refactoring_15","title":"Code Refactoring","text":"
    • Mark all Jinja blocks as scoped (548bdad by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#180-2024-01-08","title":"1.8.0 - 2024-01-08","text":"

    Compare with 1.7.5

    "},{"location":"changelog/#features_8","title":"Features","text":"
    • Release Insiders features of the $500/month funding goal (bd30106 by Timoth\u00e9e Mazzucotelli). The features and projects related to mkdocstrings-python are:

      • Cross-references for type annotations in signatures
      • Symbol types in headings and table of contents
      • griffe-inherited-docstrings, a Griffe extension for inheriting docstrings
      • griffe2md, a tool to output API docs to Markdown using Griffe

      See the complete list of features and projects here: https://pawamoy.github.io/insiders/#500-plasmavac-user-guide.

    "},{"location":"changelog/#175-2023-11-21","title":"1.7.5 - 2023-11-21","text":"

    Compare with 1.7.4

    "},{"location":"changelog/#bug-fixes_24","title":"Bug Fixes","text":"
    • Add missing translations (fallback theme) for ReadTheDocs (2fb6513 by Timoth\u00e9e Mazzucotelli). Issue #115
    "},{"location":"changelog/#174-2023-11-12","title":"1.7.4 - 2023-11-12","text":"

    Compare with 1.7.3

    "},{"location":"changelog/#bug-fixes_25","title":"Bug Fixes","text":"
    • Make extension paths relative to config file (5035e92 by Waylan Limberg). PR #112, Co-authored-by: Timoth\u00e9e Mazzucotelli pawamoy@pm.me
    "},{"location":"changelog/#code-refactoring_16","title":"Code Refactoring","text":"
    • Prepare for Griffe 0.37 (b5bb8a9 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#173-2023-10-09","title":"1.7.3 - 2023-10-09","text":"

    Compare with 1.7.2

    "},{"location":"changelog/#bug-fixes_26","title":"Bug Fixes","text":"
    • Don't deepcopy the local config (1300d2c by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#172-2023-10-05","title":"1.7.2 - 2023-10-05","text":"

    Compare with 1.7.1

    "},{"location":"changelog/#bug-fixes_27","title":"Bug Fixes","text":"
    • Prevent alias resolution error when source-ordering members (67df10c by Timoth\u00e9e Mazzucotelli). Issue griffe#213
    "},{"location":"changelog/#code-refactoring_17","title":"Code Refactoring","text":"
    • Use package relative filepath if filepath is not relative (aa5a3f7 by Timoth\u00e9e Mazzucotelli). Discussion mkdocstrings#622
    "},{"location":"changelog/#171-2023-09-28","title":"1.7.1 - 2023-09-28","text":"

    Compare with 1.7.0

    "},{"location":"changelog/#bug-fixes_28","title":"Bug Fixes","text":"
    • Stop propagation of annotation to next parameter in signature template (3a760ac by Timoth\u00e9e Mazzucotelli). Issue #110
    "},{"location":"changelog/#code-refactoring_18","title":"Code Refactoring","text":"
    • Look into inherited members for __init__ methods when merging docstrings (b97d51f by Timoth\u00e9e Mazzucotelli). Issue #106
    "},{"location":"changelog/#170-2023-09-14","title":"1.7.0 - 2023-09-14","text":"

    Compare with 1.6.3

    "},{"location":"changelog/#features_9","title":"Features","text":"
    • Add option to unwrap Annotated types (53db04b by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#163-2023-09-11","title":"1.6.3 - 2023-09-11","text":"

    Compare with 1.6.2

    "},{"location":"changelog/#bug-fixes_29","title":"Bug Fixes","text":"
    • Make load_external_modules a global-only option (266f41f by Timoth\u00e9e Mazzucotelli). Issue #87
    • Never fail when trying to format code with Black (df24bbc by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#code-refactoring_19","title":"Code Refactoring","text":"
    • Wrap docstring section elements (list style) in code tags to prevent spell checker errors (1ae8dd8 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#162-2023-09-05","title":"1.6.2 - 2023-09-05","text":"

    Compare with 1.6.1

    "},{"location":"changelog/#bug-fixes_30","title":"Bug Fixes","text":"
    • Don't render cross-ref spans when they're not enabled (eed51ee by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#161-2023-09-04","title":"1.6.1 - 2023-09-04","text":"

    Compare with 1.6.0

    "},{"location":"changelog/#bug-fixes_31","title":"Bug Fixes","text":"
    • Fix spacing for rendered named items in Yields, Receives and Returns sections (list style) (e12688e by Timoth\u00e9e Mazzucotelli).
    • Fix rendering Receives sections as lists (9ff7e68 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#160-2023-08-27","title":"1.6.0 - 2023-08-27","text":"

    Compare with 1.5.2

    "},{"location":"changelog/#features_10","title":"Features","text":"
    • Add doc-signature CSS class to separate signature code blocks (b6c648f by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#code-refactoring_20","title":"Code Refactoring","text":"
    • Add a format_attribute filter, preparing for cross-refs in attribute signatures (8f0ade2 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#152-2023-08-25","title":"1.5.2 - 2023-08-25","text":"

    Compare with 1.5.1

    "},{"location":"changelog/#bug-fixes_32","title":"Bug Fixes","text":"
    • Regression in children template: fix condition for when members are specified (beeebff by Timoth\u00e9e Mazzucotelli). Issue #100
    • Prevent whitespace removal before highlight filter (c6f36c0 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#code-refactoring_21","title":"Code Refactoring","text":"
    • Never show full object path in ToC entry (9aa758b by Timoth\u00e9e Mazzucotelli).
    • Sync templates with insiders, remove useless lines (38b317f by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#151-2023-08-24","title":"1.5.1 - 2023-08-24","text":"

    Compare with 1.5.0

    "},{"location":"changelog/#code-refactoring_22","title":"Code Refactoring","text":"
    • Never show full path in separate signature since it would appear in the heading already (9e02049 by Timoth\u00e9e Mazzucotelli).
    • Improve guessing whether an object is public (35eb811 by Timoth\u00e9e Mazzucotelli).
    • Always sort modules alphabetically as source order wouldn't make sense (70c81ce by Timoth\u00e9e Mazzucotelli).
    • Return anchors as a tuple, not a set, to preserve order (736a2b5 by Timoth\u00e9e Mazzucotelli). Related-to #mkdocstrings/crystal#6
    "},{"location":"changelog/#150-2023-08-20","title":"1.5.0 - 2023-08-20","text":"

    Compare with 1.4.0

    "},{"location":"changelog/#features_11","title":"Features","text":"
    • Add support for new Griffe docstring sections: modules, classes, and functions (methods) (d5337af by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#140-2023-08-18","title":"1.4.0 - 2023-08-18","text":"

    Compare with 1.3.0

    "},{"location":"changelog/#features_12","title":"Features","text":"
    • Support new Griffe expressions (in v0.33) (9b8e1b1 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#code-refactoring_23","title":"Code Refactoring","text":"
    • Deprecate crossref and multi_crossref filters (4fe3d20 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#130-2023-08-06","title":"1.3.0 - 2023-08-06","text":"

    Compare with 1.2.1

    "},{"location":"changelog/#dependencies_2","title":"Dependencies","text":"
    • Set upper bound on Griffe (0.33) (ad8c2a3 by Timoth\u00e9e Mazzucotelli). See https://github.com/mkdocstrings/griffe/discussions/195.
    "},{"location":"changelog/#features_13","title":"Features","text":"
    • Show parameter default values within the \"list\" section style too (55f08f3 by Antoine Dechaume). PR #92, Co-authored-by: Timoth\u00e9e Mazzucotelli pawamoy@pm.me
    "},{"location":"changelog/#121-2023-07-20","title":"1.2.1 - 2023-07-20","text":"

    Compare with 1.2.0

    "},{"location":"changelog/#bug-fixes_33","title":"Bug Fixes","text":"
    • Fix members ordering when members are specified with a boolean (c69f9c3 by Timoth\u00e9e Mazzucotelli). Issue #89
    "},{"location":"changelog/#120-2023-07-14","title":"1.2.0 - 2023-07-14","text":"

    Compare with 1.1.2

    "},{"location":"changelog/#features_14","title":"Features","text":"
    • Add Jinja blocks to module, class, function and attribute templates (299fe48 by Timoth\u00e9e Mazzucotelli).
    • Setup infrastructure for I18N, add translations for simplified chinese and japanese (b053b29 by Nyuan Zhang). PR #77
    • Support inheritance (ae42356 by Timoth\u00e9e Mazzucotelli). Issue mkdocstrings#157, Discussion mkdocstrings#536
    "},{"location":"changelog/#bug-fixes_34","title":"Bug Fixes","text":"
    • Don't show None as return annotation of class signatures (3d8724e by Timoth\u00e9e Mazzucotelli). Issue #85
    • Show labels in deterministic order (02619a8 by Oleh Prypin).
    "},{"location":"changelog/#112-2023-06-04","title":"1.1.2 - 2023-06-04","text":"

    Compare with 1.1.1

    "},{"location":"changelog/#code-refactoring_24","title":"Code Refactoring","text":"
    • Keep headings style consistent (CSS) (92032e5 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#111-2023-06-04","title":"1.1.1 - 2023-06-04","text":"

    Compare with 1.1.0

    "},{"location":"changelog/#bug-fixes_35","title":"Bug Fixes","text":"
    • Fix mkdocs and readthedocs themes support (14f18b2 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#code-refactoring_25","title":"Code Refactoring","text":"
    • Improve display of paragraphs in docstring sections (439f5e6 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#110-2023-05-25","title":"1.1.0 - 2023-05-25","text":"

    Compare with 1.0.0

    "},{"location":"changelog/#features_15","title":"Features","text":"
    • Support custom templates through objects' extra data (8ff2b06 by Timoth\u00e9e Mazzucotelli). PR #70
    "},{"location":"changelog/#100-2023-05-11","title":"1.0.0 - 2023-05-11","text":"

    Compare with 0.10.1

    "},{"location":"changelog/#breaking-changes","title":"Breaking changes","text":"
    • The signature of the format_signature filter has changed. If you override templates in your project to customize the output, make sure to update the following templates so that they use the new filter signature:

      • class.html
      • expression.html
      • function.html
      • signature.html

      You can see how to use the filter in this commit's changes: f686f4e4.

    We take this as an opportunity to go out of beta and bump the version to 1.0.0. This will allow users to rely on semantic versioning.

    "},{"location":"changelog/#bug-fixes_36","title":"Bug Fixes","text":"
    • Bring compatibility with insiders signature crossrefs feature (f686f4e by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#0101-2023-05-07","title":"0.10.1 - 2023-05-07","text":"

    Compare with 0.10.0

    "},{"location":"changelog/#bug-fixes_37","title":"Bug Fixes","text":"
    • Format signatures with full-path names (685512d by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#0100-2023-05-07","title":"0.10.0 - 2023-05-07","text":"

    Compare with 0.9.0

    "},{"location":"changelog/#features_16","title":"Features","text":"
    • Add option to disallow inspection (40f2f26 by Nyuan Zhang). Issue #68, PR #69
    "},{"location":"changelog/#bug-fixes_38","title":"Bug Fixes","text":"
    • Make admonitions open by default (79cd153 by Timoth\u00e9e Mazzucotelli). Issue #22
    "},{"location":"changelog/#code-refactoring_26","title":"Code Refactoring","text":"
    • Match documented behavior for filtering (all members, list, none) (c7f70c3 by Timoth\u00e9e Mazzucotelli).
    • Switch to an info level log for when black's not installed (f593bb0 by Faster Speeding).
    • Return anchors as a set (e2b820c by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#090-2023-04-03","title":"0.9.0 - 2023-04-03","text":"

    Compare with 0.8.3

    "},{"location":"changelog/#features_17","title":"Features","text":"
    • Allow resolving alias to external modules (02052e2 by Gilad). PR #61, Follow-up of PR #60
    • Allow pre-loading modules (36002cb by Gilad). Issue mkdocstrings/mkdocstrings#503, PR #60
    • Add show options for docstrings (a6c55fb by Jeremy Goh). Issue mkdocstrings/mkdocstrings#466, PR #56
    • Allow custom list of domains for inventories (f5ea6fd by Sorin Sbarnea). Issue mkdocstrings/mkdocstrings#510, PR #49
    "},{"location":"changelog/#bug-fixes_39","title":"Bug Fixes","text":"
    • Prevent alias resolution error when searching for anchors (a190e2c by Timoth\u00e9e Mazzucotelli). Issue #64
    "},{"location":"changelog/#code-refactoring_27","title":"Code Refactoring","text":"
    • Support Griffe 0.26 (075735c by Timoth\u00e9e Mazzucotelli).
    • Log (debug) unresolved aliases (9164742 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#083-2023-01-04","title":"0.8.3 - 2023-01-04","text":"

    Compare with 0.8.2

    "},{"location":"changelog/#code-refactoring_28","title":"Code Refactoring","text":"
    • Change \"unresolved aliases\" log level to DEBUG (dccb818 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#082-2022-11-19","title":"0.8.2 - 2022-11-19","text":"

    Compare with 0.8.1

    "},{"location":"changelog/#bug-fixes_40","title":"Bug Fixes","text":"
    • Fix base directory used to expand globs (34cfa4b by Florian Hofer). PR #45
    "},{"location":"changelog/#081-2022-11-19","title":"0.8.1 - 2022-11-19","text":"

    Compare with 0.8.0

    "},{"location":"changelog/#bug-fixes_41","title":"Bug Fixes","text":"
    • Expand globs relative to configuration file path (0dc45ae by David Vegh). Issue #42, PR #43
    "},{"location":"changelog/#080-2022-11-13","title":"0.8.0 - 2022-11-13","text":"

    Compare with 0.7.1

    "},{"location":"changelog/#features_18","title":"Features","text":"
    • Add support for globs in paths configuration (29edd02 by Andrew Guenther). Issue #33, PR #34
    "},{"location":"changelog/#code-refactoring_29","title":"Code Refactoring","text":"
    • Support Griffe 0.24 (3b9f701 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#071-2022-06-12","title":"0.7.1 - 2022-06-12","text":"

    Compare with 0.7.0

    "},{"location":"changelog/#bug-fixes_42","title":"Bug Fixes","text":"
    • Fix rendering of / in signatures (3e927e4 by Timoth\u00e9e Mazzucotelli). Issue #25
    "},{"location":"changelog/#070-2022-05-28","title":"0.7.0 - 2022-05-28","text":"

    Compare with 0.6.6

    "},{"location":"changelog/#packaging-dependencies","title":"Packaging / Dependencies","text":"
    • Depend on mkdocstrings 0.19 (b6a9a47 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#features_19","title":"Features","text":"
    • Add config option for annotations paths verbosity (b6c9893 by Timoth\u00e9e Mazzucotelli).
    • Use sections titles in SpaCy-styled docstrings (fe16b54 by Timoth\u00e9e Mazzucotelli).
    • Wrap objects names in spans to allow custom styling (0822ff9 by Timoth\u00e9e Mazzucotelli). Issue mkdocstrings/mkdocstrings#240
    • Add Jinja blocks around docstring section styles (aaa79ee by Timoth\u00e9e Mazzucotelli).
    • Add members and filters options (24a6136 by Timoth\u00e9e Mazzucotelli).
    • Add paths option (dd41182 by Timoth\u00e9e Mazzucotelli). Issue mkdocstrings/mkdocstrings#311, PR #20
    "},{"location":"changelog/#bug-fixes_43","title":"Bug Fixes","text":"
    • Fix CSS class on labels (312a709 by Timoth\u00e9e Mazzucotelli).
    • Fix categories rendering (6407cf4 by Timoth\u00e9e Mazzucotelli). Issue #14
    "},{"location":"changelog/#code-refactoring_30","title":"Code Refactoring","text":"
    • Disable show_submodules by default (480d0c3 by Timoth\u00e9e Mazzucotelli).
    • Merge default configuration options in handler (347ce76 by Timoth\u00e9e Mazzucotelli).
    • Reduce number of template debug logs (8fed314 by Timoth\u00e9e Mazzucotelli).
    • Respect show_root_full_path for ToC entries (hidden headings) (8f4c853 by Timoth\u00e9e Mazzucotelli).
    • Bring consistency on headings style (59104c4 by Timoth\u00e9e Mazzucotelli).
    • Stop using deprecated base classes (d5ea1c5 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#066-2022-03-06","title":"0.6.6 - 2022-03-06","text":"

    Compare with 0.6.5

    "},{"location":"changelog/#code-refactoring_31","title":"Code Refactoring","text":"
    • Always hide self and cls parameters (7f579d1 by Timoth\u00e9e Mazzucotelli). Issue #7
    • Use pycon for examples code blocks (6545900 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#065-2022-02-24","title":"0.6.5 - 2022-02-24","text":"

    Compare with 0.6.4

    "},{"location":"changelog/#bug-fixes_44","title":"Bug Fixes","text":"
    • Don't escape signatures return annotations (ac54bfc by Timoth\u00e9e Mazzucotelli). Issue #6
    "},{"location":"changelog/#064-2022-02-22","title":"0.6.4 - 2022-02-22","text":"

    Compare with 0.6.3

    "},{"location":"changelog/#bug-fixes_45","title":"Bug Fixes","text":"
    • Fix rendering of signature return annotation (b92ba3b by Timoth\u00e9e Mazzucotelli). Issue #4
    "},{"location":"changelog/#063-2022-02-20","title":"0.6.3 - 2022-02-20","text":"

    Compare with 0.6.2

    "},{"location":"changelog/#bug-fixes_46","title":"Bug Fixes","text":"
    • Fix examples rendering (a06a7e3 by Timoth\u00e9e Mazzucotelli). Issue mkdocstrings/griffe#46
    "},{"location":"changelog/#062-2022-02-17","title":"0.6.2 - 2022-02-17","text":"

    Compare with 0.6.1

    "},{"location":"changelog/#bug-fixes_47","title":"Bug Fixes","text":"
    • Catch alias resolution errors (b734dd0 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#061-2022-02-17","title":"0.6.1 - 2022-02-17","text":"

    Compare with 0.6.0

    "},{"location":"changelog/#bug-fixes_48","title":"Bug Fixes","text":"
    • Don't pop from fallback config (bde32af by Timoth\u00e9e Mazzucotelli).
    • Fix rendering init method source when merged into class (4a20aea by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#060-2022-02-13","title":"0.6.0 - 2022-02-13","text":"

    Compare with 0.5.4

    "},{"location":"changelog/#features_20","title":"Features","text":"
    • Add option to merge __init__ methods' docstrings into their classes' docstrings (1b4d1c0 by Timoth\u00e9e Mazzucotelli).
    • Support separate attribute signature (e962b88 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#bug-fixes_49","title":"Bug Fixes","text":"
    • Restore full cross-refs paths on hover (ac11970 by Timoth\u00e9e Mazzucotelli).
    • Fix rendering of labels (52919c5 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#code-refactoring_32","title":"Code Refactoring","text":"
    • Don't add trailing parentheses in functions heading when separate signature (885696e by Timoth\u00e9e Mazzucotelli).
    • Use more explicit template debug messages (f2122d7 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#054-2022-02-13","title":"0.5.4 - 2022-02-13","text":"

    Compare with 0.5.3

    "},{"location":"changelog/#bug-fixes_50","title":"Bug Fixes","text":"
    • Don't load additional modules during fallback (69b8e25 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#053-2022-02-08","title":"0.5.3 - 2022-02-08","text":"

    Compare with 0.5.2

    "},{"location":"changelog/#bug-fixes_51","title":"Bug Fixes","text":"
    • Allow passing null as docstring style (f526816 by Timoth\u00e9e Mazzucotelli). Issue #2
    "},{"location":"changelog/#052-2022-02-05","title":"0.5.2 - 2022-02-05","text":"

    Compare with 0.5.1

    "},{"location":"changelog/#dependencies_3","title":"Dependencies","text":"
    • Require at least mkdocstrings 0.18 (7abdda4 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#051-2022-02-03","title":"0.5.1 - 2022-02-03","text":"

    Compare with 0.5.0

    "},{"location":"changelog/#dependencies_4","title":"Dependencies","text":"
    • Depend on Griffe >= 0.11.1 (1303557 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#code-refactoring_33","title":"Code Refactoring","text":"
    • Move handler into its own module (b787e78 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#050-2022-02-03","title":"0.5.0 - 2022-02-03","text":"

    Compare with 0.4.1

    "},{"location":"changelog/#features_21","title":"Features","text":"
    • Allow changing docstring style of an object (39240c1 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#bug-fixes_52","title":"Bug Fixes","text":"
    • Warn if Black is not installed when formatting signature (b848277 by Timoth\u00e9e Mazzucotelli).
    • Fix missing default for docstring_section_style option (774988e by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#code-refactoring_34","title":"Code Refactoring","text":"
    • Change to new way of stripping paragraphs (33d4594 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#041-2022-02-01","title":"0.4.1 - 2022-02-01","text":"

    Compare with 0.4.0

    "},{"location":"changelog/#bug-fixes_53","title":"Bug Fixes","text":"
    • Fix docstring admonitions rendering (a24ae2e by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#040-2022-02-01","title":"0.4.0 - 2022-02-01","text":"

    Compare with 0.3.0

    "},{"location":"changelog/#code-refactoring_35","title":"Code Refactoring","text":"
    • Use the new mkdocstrings_handlers namespace (23c9023 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#030-2022-01-14","title":"0.3.0 - 2022-01-14","text":"

    Compare with 0.2.0

    "},{"location":"changelog/#features_22","title":"Features","text":"
    • Support griffe 0.10 (28061de by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#dependencies_5","title":"Dependencies","text":"
    • Require griffe 0.10 (cfbd7bb by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#code-refactoring_36","title":"Code Refactoring","text":"
    • Use new logger patching utility (4cdb292 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#020-2021-12-28","title":"0.2.0 - 2021-12-28","text":"

    Compare with 0.1.0

    "},{"location":"changelog/#dependencies_6","title":"Dependencies","text":"
    • Depend on griffe >= 0.7.1 (34f7ebd by Timoth\u00e9e Mazzucotelli).
    • Upgrade griffe, no upper bound (8f0aa42 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#features_23","title":"Features","text":"
    • Add show_signature rendering option (0f07c2e by Will Da Silva).
    "},{"location":"changelog/#bug-fixes_54","title":"Bug Fixes","text":"
    • Fix templates for named docstring elements (47868a1 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#010-2021-12-19","title":"0.1.0 - 2021-12-19","text":"

    Compare with first commit

    "},{"location":"changelog/#features_24","title":"Features","text":"
    • Implement handler and add templates (dbb580a by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#bug-fixes_55","title":"Bug Fixes","text":"
    • Fix separate signature feature (da6e81c by Timoth\u00e9e Mazzucotelli).
    • Fix signature template (parameters annotations) (b34ead0 by Timoth\u00e9e Mazzucotelli).
    • Only show source when present (c270d68 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#code-refactoring_37","title":"Code Refactoring","text":"
    • Return all known anchors (9bbfe14 by Timoth\u00e9e Mazzucotelli).
    • Update for griffe 0.4.0 (831aabb by Timoth\u00e9e Mazzucotelli).
    "},{"location":"code_of_conduct/","title":"Contributor Covenant Code of Conduct","text":""},{"location":"code_of_conduct/#our-pledge","title":"Our Pledge","text":"

    We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation.

    We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.

    "},{"location":"code_of_conduct/#our-standards","title":"Our Standards","text":"

    Examples of behavior that contributes to a positive environment for our community include:

    • Demonstrating empathy and kindness toward other people
    • Being respectful of differing opinions, viewpoints, and experiences
    • Giving and gracefully accepting constructive feedback
    • Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
    • Focusing on what is best not just for us as individuals, but for the overall community

    Examples of unacceptable behavior include:

    • The use of sexualized language or imagery, and sexual attention or advances of any kind
    • Trolling, insulting or derogatory comments, and personal or political attacks
    • Public or private harassment
    • Publishing others' private information, such as a physical or email address, without their explicit permission
    • Other conduct which could reasonably be considered inappropriate in a professional setting
    "},{"location":"code_of_conduct/#enforcement-responsibilities","title":"Enforcement Responsibilities","text":"

    Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.

    Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.

    "},{"location":"code_of_conduct/#scope","title":"Scope","text":"

    This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.

    "},{"location":"code_of_conduct/#enforcement","title":"Enforcement","text":"

    Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at dev@pawamoy.fr. All complaints will be reviewed and investigated promptly and fairly.

    All community leaders are obligated to respect the privacy and security of the reporter of any incident.

    "},{"location":"code_of_conduct/#enforcement-guidelines","title":"Enforcement Guidelines","text":"

    Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:

    "},{"location":"code_of_conduct/#1-correction","title":"1. Correction","text":"

    Community Impact: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.

    Consequence: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.

    "},{"location":"code_of_conduct/#2-warning","title":"2. Warning","text":"

    Community Impact: A violation through a single incident or series of actions.

    Consequence: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.

    "},{"location":"code_of_conduct/#3-temporary-ban","title":"3. Temporary Ban","text":"

    Community Impact: A serious violation of community standards, including sustained inappropriate behavior.

    Consequence: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.

    "},{"location":"code_of_conduct/#4-permanent-ban","title":"4. Permanent Ban","text":"

    Community Impact: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.

    Consequence: A permanent ban from any sort of public interaction within the community.

    "},{"location":"code_of_conduct/#attribution","title":"Attribution","text":"

    This Code of Conduct is adapted from the Contributor Covenant, version 2.1, available at https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.

    Community Impact Guidelines were inspired by Mozilla's code of conduct enforcement ladder.

    For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

    "},{"location":"contributing/","title":"Contributing","text":"

    Contributions are welcome, and they are greatly appreciated! Every little bit helps, and credit will always be given.

    "},{"location":"contributing/#environment-setup","title":"Environment setup","text":"

    Nothing easier!

    Fork and clone the repository, then:

    cd python\nmake setup\n

    Note

    If it fails for some reason, you'll need to install uv manually.

    You can install it with:

    curl -LsSf https://astral.sh/uv/install.sh | sh\n

    Now you can try running make setup again, or simply uv sync.

    You now have the dependencies installed.

    Run make help to see all the available actions!

    "},{"location":"contributing/#tasks","title":"Tasks","text":"

    The entry-point to run commands and tasks is the make Python script, located in the scripts directory. Try running make to show the available commands and tasks. The commands do not need the Python dependencies to be installed, while the tasks do. The cross-platform tasks are written in Python, thanks to duty.

    If you work in VSCode, we provide an action to configure VSCode for the project.

    "},{"location":"contributing/#development","title":"Development","text":"

    As usual:

    1. create a new branch: git switch -c feature-or-bugfix-name
    2. edit the code and/or the documentation

    Before committing:

    1. run make format to auto-format the code
    2. run make check to check everything (fix any warning)
    3. run make test to run the tests (fix any issue)
    4. if you updated the documentation or the project dependencies:
      1. run make docs
      2. go to http://localhost:8000 and check that everything looks good
    5. follow our commit message convention

    If you are unsure about how to fix or ignore a warning, just let the continuous integration fail, and we will help you during review.

    Don't bother updating the changelog, we will take care of this.

    "},{"location":"contributing/#commit-message-convention","title":"Commit message convention","text":"

    Commit messages must follow our convention based on the Angular style or the Karma convention:

    <type>[(scope)]: Subject\n\n[Body]\n

    Subject and body must be valid Markdown. Subject must have proper casing (uppercase for first letter if it makes sense), but no dot at the end, and no punctuation in general.

    Scope and body are optional. Type can be:

    • build: About packaging, building wheels, etc.
    • chore: About packaging or repo/files management.
    • ci: About Continuous Integration.
    • deps: Dependencies update.
    • docs: About documentation.
    • feat: New feature.
    • fix: Bug fix.
    • perf: About performance.
    • refactor: Changes that are not features or bug fixes.
    • style: A change in code style/format.
    • tests: About tests.

    If you write a body, please add trailers at the end (for example issues and PR references, or co-authors), without relying on GitHub's flavored Markdown:

    Body.\n\nIssue #10: https://github.com/namespace/project/issues/10\nRelated to PR namespace/other-project#15: https://github.com/namespace/other-project/pull/15\n

    These \"trailers\" must appear at the end of the body, without any blank lines between them. The trailer title can contain any character except colons :. We expect a full URI for each trailer, not just GitHub autolinks (for example, full GitHub URLs for commits and issues, not the hash or the #issue-number).

    We do not enforce a line length on commit messages summary and body, but please avoid very long summaries, and very long lines in the body, unless they are part of code blocks that must not be wrapped.

    "},{"location":"contributing/#pull-requests-guidelines","title":"Pull requests guidelines","text":"

    Link to any related issue in the Pull Request message.

    During the review, we recommend using fixups:

    # SHA is the SHA of the commit you want to fix\ngit commit --fixup=SHA\n

    Once all the changes are approved, you can squash your commits:

    git rebase -i --autosquash main\n

    And force-push:

    git push -f\n

    If this seems all too complicated, you can push or force-push each new commit, and we will squash them ourselves if needed, before merging.

    "},{"location":"credits/","title":"Credits","text":""},{"location":"credits/#exec-1--credits","title":"Credits","text":"

    These projects were used to build mkdocstrings-python. Thank you!

    Python | uv | copier-uv

    "},{"location":"credits/#exec-1--runtime-dependencies","title":"Runtime dependencies","text":"Project Summary Version (accepted) Version (last resolved) License click Composable command line interface toolkit >=8.0.0, >=7.0 8.1.8 BSD License colorama Cross-platform colored terminal text. >=0.4 0.4.6 BSD License ghp-import Copy your docs directly to the gh-pages branch. >=1.0 2.1.0 Apache Software License griffe Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API. >=1.6.2 1.7.3.1.3.1 ISC Jinja2 A very fast and expressive template engine. >=2.11.1, >=2.10 3.1.6 BSD License Markdown Python implementation of John Gruber's Markdown. >=3.3.3, >=3.3 3.7 BSD License MarkupSafe Safely add untrusted strings to HTML/XML markup. >=2.0.1, >=2.0 3.0.2 BSD License mergedeep A deep merge function for \ud83d\udc0d. ~=1.3, >=1.3.4 1.3.4 MIT License mkdocs Project documentation with Markdown. >=1.6, >=1.1 1.6.1 BSD-2-Clause mkdocs-autorefs Automatically link across pages in MkDocs. >=1.4 1.4.1 ISC mkdocs-get-deps MkDocs extension that lists all dependencies according to a mkdocs.yml file >=0.2.0 0.2.0 MIT mkdocstrings Automatic documentation from sources, for MkDocs. >=0.29, >=0.28.3 0.29.0 ISC packaging Core utilities for Python packages >=22.0, >=20.5 24.2 Apache Software License + BSD License pathspec Utility library for gitignore style pattern matching of file paths. >=0.9.0, >=0.11.1 0.12.1 Mozilla Public License 2.0 (MPL 2.0) platformdirs A small Python package for determining appropriate platform-specific dirs, e.g. a user data dir. >=2.2.0, >=2 4.3.6 MIT pymdown-extensions Extension pack for Python Markdown. >=9, >=6.3 10.14.3 MIT python-dateutil Extensions to the standard Python datetime module >=2.8.1 2.9.0.post0 BSD License + Apache Software License PyYAML YAML parser and emitter for Python >=5.1 6.0.2 MIT pyyaml_env_tag A custom YAML tag for referencing environment variables in YAML files. >=0.1 0.1 MIT License six Python 2 and 3 compatibility utilities >=1.5, >=1.15, <2 1.17.0 MIT typing_extensions Backported and Experimental Type Hints for Python 3.8+ >=4.0.1, >=4.0 4.12.2 Python Software Foundation License watchdog Filesystem events monitoring >=2.0 6.0.0 Apache-2.0"},{"location":"credits/#exec-1--development-dependencies","title":"Development dependencies","text":"Project Summary Version (accepted) Version (last resolved) License annotated-types Reusable constraint types to use with typing.Annotated >=0.6.0 0.7.0 MIT License ansimarkup Produce colored terminal text with an xml-like markup ~=1.4 1.5.0 Revised BSD License appdirs A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\". >=1.4 1.4.4 MIT asttokens Annotate AST trees with source code positions >=2.0.5 3.0.0 Apache 2.0 babel Internationalization utilities >=2.7.0 2.17.0 BSD-3-Clause backrefs A wrapper around re and regex that adds additional back references. ~=5.7.post1 5.8 MIT beautifulsoup4 Screen-scraping library >=4.12.3 4.13.3 MIT License black The uncompromising code formatter. >=25.1 25.1.0 MIT build A simple, correct Python build frontend >=1.2 1.2.2.post1 MIT License cappa Declarative CLI argument parser. >=0.22 0.26.6 ? certifi Python package for providing Mozilla's CA Bundle. >=2017.4.17 2025.1.31 MPL-2.0 cffi Foreign Function Interface for Python calling C code. >=1.12 1.17.1 MIT charset-normalizer The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. >=2, <4 3.4.1 MIT click Composable command line interface toolkit >=8.0.0, >=7.0 8.1.8 BSD License colorama Cross-platform colored terminal text. >=0.4 0.4.6 BSD License coverage Code coverage measurement for Python >=7.5 7.7.0 Apache-2.0 cryptography cryptography is a package which provides cryptographic recipes and primitives to Python developers. >=2.0 44.0.2 Apache-2.0 OR BSD-3-Clause csscompressor A python port of YUI CSS Compressor >=0.9.5 0.9.5 BSD docutils Docutils -- Python Documentation Utilities >=0.21.2 0.21.2 Public Domain + Python Software Foundation License + BSD License + GNU General Public License (GPL) duty A simple task runner. >=1.6 1.6.0 ISC execnet execnet: rapid multi-Python deployment >=2.1 2.1.1 MIT executing Get the currently executing AST node of a frame, and other information >=2.2.0 2.2.0 MIT failprint Run a command, print its output only if it fails. >=0.11, !=1.0.0 1.0.3 ISC ghp-import Copy your docs directly to the gh-pages branch. >=1.0 2.1.0 Apache Software License git-changelog Automatic Changelog generator using Jinja2 templates. >=2.5 2.5.3 ISC gitdb Git Object Database >=4.0.1, <5 4.0.12 BSD License GitPython GitPython is a Python library used to interact with Git repositories >=3.1.44 3.1.44 BSD-3-Clause htmlmin2 An HTML Minifier >=0.1.13 0.1.13 BSD humanize Python humanize utilities >=4.9 4.12.1 MIT id A tool for generating OIDC identities 1.5.0 Apache Software License idna Internationalized Domain Names in Applications (IDNA) >=2.5, <4 3.10 BSD License iniconfig brain-dead simple config-ini parsing 2.0.0 MIT inline-snapshot golden master/snapshot/approval testing library which puts the values right into your source code >=0.18 0.20.7 MIT License jaraco.classes Utility functions for Python class constructs 3.4.0 MIT License jaraco.context Useful decorators and context managers 6.0.1 MIT License jaraco.functools Functools like those found in stdlib 4.1.0 MIT License jeepney Low-level, pure Python DBus protocol wrapper. >=0.4.2 0.9.0 MIT Jinja2 A very fast and expressive template engine. >=2.11.1, >=2.10 3.1.6 BSD License jsmin JavaScript minifier. >=3.0.1 3.0.1 MIT License keyring Store and access your passwords safely. >=15.1 25.6.0 MIT License Markdown Python implementation of John Gruber's Markdown. >=3.3.3, >=3.3 3.7 BSD License markdown-callouts Markdown extension: a classier syntax for admonitions >=0.4 0.4.0 MIT markdown-exec Utilities to execute code blocks in Markdown files. >=1.8 1.10.3.1.1.0 ISC markdown-it-py Python port of markdown-it. Markdown parsing, done right! >=2.2.0 3.0.0 MIT License markdownify Convert HTML to markdown. >=0.14 1.1.0 MIT License MarkupSafe Safely add untrusted strings to HTML/XML markup. >=2.0.1, >=2.0 3.0.2 BSD License mdformat CommonMark compliant Markdown formatter >=0.7.21 0.7.22 MIT License mdurl Markdown URL utilities ~=0.1 0.1.2 MIT License mergedeep A deep merge function for \ud83d\udc0d. ~=1.3, >=1.3.4 1.3.4 MIT License mkdocs Project documentation with Markdown. >=1.6, >=1.1 1.6.1 BSD-2-Clause mkdocs-autorefs Automatically link across pages in MkDocs. >=1.4 1.4.1 ISC mkdocs-coverage MkDocs plugin to integrate your coverage HTML report into your site. >=1.0 1.1.0 ISC mkdocs-get-deps MkDocs extension that lists all dependencies according to a mkdocs.yml file >=0.2.0 0.2.0 MIT mkdocs-git-revision-date-localized-plugin Mkdocs plugin that enables displaying the localized date of the last git modification of a markdown file. >=1.2 1.4.5 MIT mkdocs-llmstxt MkDocs plugin to generate an /llms.txt file. >=0.2 0.2.0 ISC mkdocs-material Documentation that simply works >=9.5 9.6.14+insiders.4.53.16 MIT mkdocs-material-extensions Extension pack for Python Markdown and MkDocs Material. ~=1.3 1.3.1 MIT mkdocs-minify-plugin An MkDocs plugin to minify HTML, JS or CSS files prior to being written to disk >=0.8 0.8.0 MIT mkdocs-redirects A MkDocs plugin for dynamic page redirects to prevent broken links >=1.2 1.2.2 MIT mkdocs-section-index MkDocs plugin to allow clickable sections that lead to an index page >=0.3 0.3.9 MIT mkdocstrings Automatic documentation from sources, for MkDocs. >=0.29, >=0.28.3 0.29.0 ISC more-itertools More routines for operating on iterables, beyond itertools 10.6.0 MIT License mypy Optional static typing for Python >=1.10 1.15.0 MIT mypy-extensions Type system extensions for programs checked with the mypy type checker. >=0.4.3 1.0.0 MIT License nh3 Python binding to Ammonia HTML sanitizer Rust crate >=0.2.14 0.2.21 MIT packaging Core utilities for Python packages >=22.0, >=20.5 24.2 Apache Software License + BSD License paginate Divides large result sets into pages for easier browsing ~=0.5 0.5.7 MIT pathspec Utility library for gitignore style pattern matching of file paths. >=0.9.0, >=0.11.1 0.12.1 Mozilla Public License 2.0 (MPL 2.0) platformdirs A small Python package for determining appropriate platform-specific dirs, e.g. a user data dir. >=2.2.0, >=2 4.3.6 MIT pluggy plugin and hook calling mechanisms for python >=1.5, <2 1.5.0 MIT ptyprocess Run a subprocess in a pseudo terminal ~=0.6 0.7.0 ISC License (ISCL) pycparser C parser in Python 2.22 BSD-3-Clause pydantic Data validation using Python type hints >=2.10 2.10.6 MIT pydantic_core Core functionality for Pydantic validation and serialization ==2.27.2 2.27.2 MIT Pygments Pygments is a syntax highlighting package written in Python. >=2.5.1 2.19.1 BSD-2-Clause pymdown-extensions Extension pack for Python Markdown. >=9, >=6.3 10.14.3 MIT pyproject_hooks Wrappers to call pyproject.toml-based build backend hooks. 1.2.0 MIT License pytest pytest: simple powerful testing with Python >=8.2 8.3.5 MIT pytest-cov Pytest plugin for measuring coverage. >=5.0 6.0.0 MIT pytest-randomly Pytest plugin to randomly order tests and control random.seed. >=3.15 3.16.0 MIT License pytest-xdist pytest xdist plugin for distributed testing, most importantly across multiple CPUs >=3.6 3.6.1 MIT License python-dateutil Extensions to the standard Python datetime module >=2.8.1 2.9.0.post0 BSD License + Apache Software License pytz World timezone definitions, modern and historical >=2025.1 2025.1 MIT PyYAML YAML parser and emitter for Python >=5.1 6.0.2 MIT pyyaml_env_tag A custom YAML tag for referencing environment variables in YAML files. >=0.1 0.1 MIT License readme_renderer readme_renderer is a library for rendering readme descriptions for Warehouse >=35.0 44.0 Apache License, Version 2.0 requests Python HTTP for Humans. >=2.20 2.32.3 Apache-2.0 requests-toolbelt A utility belt for advanced users of python-requests >=0.8.0, !=0.9.0 1.0.0 Apache 2.0 rfc3986 Validating URI References per RFC 3986 >=1.4.0 2.0.0 Apache 2.0 rich Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal >=12.0.0 13.9.4 MIT ruff An extremely fast Python linter and code formatter, written in Rust. >=0.4 0.11.0 MIT SecretStorage Python bindings to FreeDesktop.org Secret Service API >=3.2 3.3.3 BSD 3-Clause License semver Python helper for Semantic Versioning (https://semver.org) >=2.13 3.0.4 BSD License six Python 2 and 3 compatibility utilities >=1.5, >=1.15, <2 1.17.0 MIT smmap A pure Python implementation of a sliding window memory map manager >=3.0.1, <6 5.0.2 BSD-3-Clause soupsieve A modern CSS selector implementation for Beautiful Soup. >1.2 2.6 MIT twine Collection of utilities for publishing packages on PyPI >=5.1 6.1.0 Apache Software License type-lens type-lens is a Python template project designed to simplify the setup of a new project. >=0.2.3 0.2.3 MIT types-Markdown Typing stubs for Markdown >=3.6 3.7.0.20241204 Apache-2.0 types-PyYAML Typing stubs for PyYAML >=6.0 6.0.12.20241230 Apache-2.0 typing_extensions Backported and Experimental Type Hints for Python 3.8+ >=4.0.1, >=4.0 4.12.2 Python Software Foundation License urllib3 HTTP library with thread-safe connection pooling, file post, and more. >=1.26.0 2.3.0 MIT License watchdog Filesystem events monitoring >=2.0 6.0.0 Apache-2.0 yore Manage legacy code with comments. >=0.3.3 0.3.4 ISC

    More credits from the author

    "},{"location":"license/","title":"License","text":"
    ISC License\n\nCopyright (c) 2021, Timoth\u00e9e Mazzucotelli\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\nOR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n
    "},{"location":"insiders/","title":"Insiders","text":"

    mkdocstrings-python follows the sponsorware release strategy, which means that new features are first exclusively released to sponsors as part of Insiders. Read on to learn what sponsorships achieve, how to become a sponsor to get access to Insiders, and what's in it for you!

    "},{"location":"insiders/#what-is-insiders","title":"What is Insiders?","text":"

    mkdocstrings-python Insiders is a private fork of mkdocstrings-python, hosted as a private GitHub repository. Almost1 all new features are developed as part of this fork, which means that they are immediately available to all eligible sponsors, as they are granted access to this private repository.

    Every feature is tied to a funding goal in monthly subscriptions. When a funding goal is hit, the features that are tied to it are merged back into mkdocstrings-python and released for general availability, making them available to all users. Bugfixes are always released in tandem.

    Sponsorships start as low as $10 a month.2

    "},{"location":"insiders/#what-sponsorships-achieve","title":"What sponsorships achieve","text":"

    Sponsorships make this project sustainable, as they buy the maintainers of this project time \u2013 a very scarce resource \u2013 which is spent on the development of new features, bug fixing, stability improvement, issue triage and general support. The biggest bottleneck in Open Source is time.3

    If you're unsure if you should sponsor this project, check out the list of completed funding goals to learn whether you're already using features that were developed with the help of sponsorships. You're most likely using at least a handful of them, thanks to our awesome sponsors!

    "},{"location":"insiders/#whats-in-it-for-me","title":"What's in it for me?","text":"

    The moment you become a sponsor, you'll get immediate access to 15 additional features that you can start using right away, and which are currently exclusively available to sponsors:

    • Visually-lighter source code blocks
    • Ordering method: __all__
    • Filtering method: public
    • Backlinks
    • Relative cross-references
    • Scoped cross-references
    • Class inheritance diagrams with Mermaid
    • Annotations modernization
    • Parameter headings
    • Automatic cross-references to parameters
    • Automatic cross-references for default parameter values in signatures
    • Automatic rendering of function signature overloads
    • Auto-summary of object members
    • griffe-warnings-deprecated \u2014 [Project] Griffe extension for @warnings.deprecated (PEP 702)
    • griffe-pydantic \u2014 [Project] Griffe extension for Pydantic

    These are just the features related to this project. See the complete feature list on the author's main Insiders page.

    Additionally, your sponsorship will give more weight to your upvotes on issues, helping us prioritize work items in our backlog. For more information on how we prioritize work, see this page: Backlog management.

    "},{"location":"insiders/#how-to-become-a-sponsor","title":"How to become a sponsor","text":"

    Thanks for your interest in sponsoring! In order to become an eligible sponsor with your GitHub account, visit pawamoy's sponsor profile, and complete a sponsorship of $10 a month or more. You can use your individual or organization GitHub account for sponsoring.

    Sponsorships lower than $10 a month are also very much appreciated, and useful. They won't grant you access to Insiders, but they will be counted towards reaching sponsorship goals. Every sponsorship helps us implementing new features and releasing them to the public.

    Important: By default, when you're sponsoring @pawamoy through a GitHub organization, all the publicly visible members of the organization will be invited to join our private repositories. If you wish to only grant access to a subset of users, please send a short email to insiders@pawamoy.fr with the name of your organization and the GitHub accounts of the users that should be granted access.

    Tip: to ensure that access is not tied to a particular individual GitHub account, you can create a bot account (i.e. a GitHub account that is not tied to a specific individual), and use this account for the sponsoring. After being granted access to our private repositories, the bot account can create private forks of our private repositories into your own organization, which all members of your organization will have access to.

    You can cancel your sponsorship anytime.4

    \u00a0 Join our awesome sponsors

    If you sponsor publicly, you're automatically added here with a link to your profile and avatar to show your support for mkdocstrings-python. Alternatively, if you wish to keep your sponsorship private, you'll be a silent +1. You can select visibility during checkout and change it afterwards.

    "},{"location":"insiders/#funding","title":"Funding","text":""},{"location":"insiders/#goals","title":"Goals","text":"

    The following section lists all funding goals. Each goal contains a list of features prefixed with a checkmark symbol, denoting whether a feature is already available or planned, but not yet implemented. When the funding goal is hit, the features are released for general availability.

    "},{"location":"insiders/#1000-gravifridge-fluid-renewal","title":"$ 1,000 \u2014 GraviFridge Fluid Renewal","text":"
    • Auto-summary of object members
    • Automatic rendering of function signature overloads
    • Parameter headings
    • Automatic cross-references to parameters
    • Automatic cross-references for default parameter values in signatures
    • griffe-pydantic \u2014 [Project] Griffe extension for Pydantic
    • griffe-warnings-deprecated \u2014 [Project] Griffe extension for @warnings.deprecated (PEP 702)
    "},{"location":"insiders/#1500-hyperlamp-navigation-tips","title":"$ 1,500 \u2014 HyperLamp Navigation Tips","text":"
    • Class inheritance diagrams with Mermaid
    • Annotations modernization
    "},{"location":"insiders/#2000-fusiondrive-ejection-configuration","title":"$ 2,000 \u2014 FusionDrive Ejection Configuration","text":"
    • Relative cross-references
    • Scoped cross-references
    • Backlinks
    • Filtering method: public
    • Ordering method: __all__
    • Visually-lighter source code blocks
    "},{"location":"insiders/#goals-completed","title":"Goals completed","text":"

    This section lists all funding goals that were previously completed, which means that those features were part of Insiders, but are now generally available and can be used by all users.

    "},{"location":"insiders/#500-plasmavac-user-guide","title":"$ 500 \u2014 PlasmaVac User Guide","text":"
    • Cross-references for type annotations in signatures
    • Symbol types in headings and table of contents
    • griffe-inherited-docstrings \u2014 [Project] Griffe extension for inheriting docstrings
    "},{"location":"insiders/#frequently-asked-questions","title":"Frequently asked questions","text":""},{"location":"insiders/#compatibility","title":"Compatibility","text":"

    We're building an open source project and want to allow outside collaborators to use mkdocstrings-python locally without having access to Insiders. Is this still possible?

    Yes. Insiders is compatible with mkdocstrings-python. Almost all new features and configuration options are either backward-compatible or implemented behind feature flags. Most Insiders features enhance the overall experience, though while these features add value for the users of your project, they shouldn't be necessary for previewing when making changes to content.

    "},{"location":"insiders/#payment","title":"Payment","text":"

    We don't want to pay for sponsorship every month. Are there any other options?

    Yes. You can sponsor on a yearly basis by switching your GitHub account to a yearly billing cycle. If for some reason you cannot do that, you could also create a dedicated GitHub account with a yearly billing cycle, which you only use for sponsoring (some sponsors already do that).

    If you have any problems or further questions, please reach out to insiders@pawamoy.fr.

    "},{"location":"insiders/#terms","title":"Terms","text":"

    Are we allowed to use Insiders under the same terms and conditions as mkdocstrings-python?

    Yes. Whether you're an individual or a company, you may use mkdocstrings-python Insiders precisely under the same terms as mkdocstrings-python, which are given by the ISC license. However, we kindly ask you to respect our fair use policy:

    • Please don't distribute the source code of Insiders. You may freely use it for public, private or commercial projects, privately fork or mirror it, but please don't make the source code public, as it would counteract the sponsorware strategy.
    • If you cancel your subscription, your access to the private repository is revoked, and you will miss out on all future updates of Insiders. However, you may use the latest version that's available to you as long as you like. Just remember that GitHub deletes private forks.
    1. In general, every new feature is first exclusively released to sponsors, but sometimes upstream dependencies enhance existing features that must be supported by mkdocstrings-python.\u00a0\u21a9

    2. Note that $10 a month is the minimum amount to become eligible for Insiders. While GitHub Sponsors also allows to sponsor lower amounts or one-time amounts, those can't be granted access to Insiders due to technical reasons. Such contributions are still very much welcome as they help ensuring the project's sustainability.\u00a0\u21a9

    3. Making an Open Source project sustainable is exceptionally hard: maintainers burn out, projects are abandoned. That's not great and very unpredictable. The sponsorware model ensures that if you decide to use mkdocstrings-python, you can be sure that bugs are fixed quickly and new features are added regularly.\u00a0\u21a9

    4. If you cancel your sponsorship, GitHub schedules a cancellation request which will become effective at the end of the billing cycle. This means that even though you cancel your sponsorship, you will keep your access to Insiders as long as your cancellation isn't effective. All charges are processed by GitHub through Stripe. As we don't receive any information regarding your payment, and GitHub doesn't offer refunds, sponsorships are non-refundable.\u00a0\u21a9

    "},{"location":"insiders/changelog/","title":"Changelog","text":""},{"location":"insiders/changelog/#mkdocstrings-python-insiders","title":"mkdocstrings-python Insiders","text":""},{"location":"insiders/changelog/#1.12.1","title":"1.12.1 May 24, 2025","text":"
    • Visually-lighter admonitions for source code blocks
    "},{"location":"insiders/changelog/#1.12.0","title":"1.12.0 March 24, 2025","text":"
    • Ordering method: __all__
    "},{"location":"insiders/changelog/#1.11.0","title":"1.11.0 March 20, 2025","text":"
    • Filtering method: public
    "},{"location":"insiders/changelog/#1.10.0","title":"1.10.0 March 10, 2025","text":"
    • Backlinks
    "},{"location":"insiders/changelog/#1.9.1","title":"1.9.1 December 26, 2024","text":"
    • Re-add class template for RTD theme
    • Make inheritance diagrams rendering more robust
    "},{"location":"insiders/changelog/#1.9.0","title":"1.9.0 September 03, 2024","text":"
    • Relative cross-references
    • Scoped cross-references
    "},{"location":"insiders/changelog/#1.8.3","title":"1.8.3 June 19, 2024","text":"
    • Update code for Griffe 0.46+ to avoid deprecation warnings
    "},{"location":"insiders/changelog/#1.8.2","title":"1.8.2 May 09, 2024","text":"
    • Don't render cross-refs for default values when signatures aren't separated
    "},{"location":"insiders/changelog/#1.8.1","title":"1.8.1 April 19, 2024","text":"
    • Render enumeration instance name instead of just \"value\", allowing proper cross-reference
    "},{"location":"insiders/changelog/#1.8.0","title":"1.8.0 March 24, 2024","text":"
    • Annotations modernization
    "},{"location":"insiders/changelog/#1.7.0","title":"1.7.0 March 24, 2024","text":"
    • Class inheritance diagrams with Mermaid
    "},{"location":"insiders/changelog/#1.6.0","title":"1.6.0 January 30, 2024","text":"
    • Render cross-references to parameters documentation in signatures and attribute values.
    • Add parameter_headings option to render headings for parameters (enabling permalinks and ToC/inventory entries).
    • Render cross-references for default parameter values in signatures.
    "},{"location":"insiders/changelog/#1.5.1","title":"1.5.1 September 12, 2023","text":"
    • Prevent empty auto-summarized Methods section.
    "},{"location":"insiders/changelog/#1.5.0","title":"1.5.0 September 05, 2023","text":"
    • Render function signature overloads.
    "},{"location":"insiders/changelog/#1.4.0","title":"1.4.0 August 27, 2023","text":"
    • Render cross-references in attribute signatures.
    "},{"location":"insiders/changelog/#1.3.0","title":"1.3.0 August 24, 2023","text":"
    • Add \"method\" symbol type.
    "},{"location":"insiders/changelog/#1.2.0","title":"1.2.0 August 20, 2023","text":"
    • Add member auto-summaries.
    "},{"location":"insiders/changelog/#1.1.4","title":"1.1.4 July 17, 2023","text":"
    • Fix heading level increment for class members.
    "},{"location":"insiders/changelog/#1.1.3","title":"1.1.3 July 17, 2023","text":"
    • Fix heading level (avoid with clause preventing to decrease it).
    "},{"location":"insiders/changelog/#1.1.2","title":"1.1.2 July 15, 2023","text":"
    • Use non-breaking spaces after symbol types.
    "},{"location":"insiders/changelog/#1.1.1","title":"1.1.1 June 27, 2023","text":"
    • Correctly escape expressions in signatures and other rendered types.
    "},{"location":"insiders/changelog/#1.1.0","title":"1.1.0 June 4, 2023","text":"
    • Add Symbol types in headings and table of contents.
    "},{"location":"insiders/changelog/#1.0.0","title":"1.0.0 May 10, 2023","text":"
    • Add cross-references for type annotations in signatures. Make sure to update your local templates as the signature of the format_signature filter has changed. The templates that must be updated: class.html, expression.html, function.html and signature.html.
    "},{"location":"insiders/installation/","title":"Getting started with Insiders","text":"

    mkdocstrings-python Insiders is a compatible drop-in replacement for mkdocstrings-python, and can be installed similarly using pip or git. Note that in order to access the Insiders repository, you need to become an eligible sponsor of @pawamoy on GitHub.

    "},{"location":"insiders/installation/#installation","title":"Installation","text":""},{"location":"insiders/installation/#with-the-insiders-tool","title":"with the insiders tool","text":"

    insiders is a tool that helps you keep up-to-date versions of Insiders projects in the PyPI index of your choice (self-hosted, Google registry, Artifactory, etc.).

    We kindly ask that you do not upload the distributions to public registries, as it is against our Terms of use.

    "},{"location":"insiders/installation/#with-pip-sshhttps","title":"with pip (ssh/https)","text":"

    mkdocstrings-python Insiders can be installed with pip using SSH:

    pip install git+ssh://git@github.com/pawamoy-insiders/mkdocstrings-python.git\n

    Or using HTTPS:

    pip install git+https://${GH_TOKEN}@github.com/pawamoy-insiders/mkdocstrings-python.git\n
    How to get a GitHub personal access token?

    The GH_TOKEN environment variable is a GitHub token. It can be obtained by creating a personal access token for your GitHub account. It will give you access to the Insiders repository, programmatically, from the command line or GitHub Actions workflows:

    1. Go to https://github.com/settings/tokens
    2. Click on Generate a new token
    3. Enter a name and select the repo scope
    4. Generate the token and store it in a safe place

    Note that the personal access token must be kept secret at all times, as it allows the owner to access your private repositories.

    "},{"location":"insiders/installation/#with-git","title":"with Git","text":"

    Of course, you can use mkdocstrings-python Insiders directly using Git:

    git clone git@github.com:pawamoy-insiders/mkdocstrings-python\n

    When cloning with Git, the package must be installed:

    pip install -e mkdocstrings-python\n
    "},{"location":"insiders/installation/#upgrading","title":"Upgrading","text":"

    When upgrading Insiders, you should always check the version of mkdocstrings-python which makes up the first part of the version qualifier. For example, a version like 8.x.x.4.x.x means that Insiders 4.x.x is currently based on 8.x.x.

    If the major version increased, it's a good idea to consult the changelog and go through the steps to ensure your configuration is up to date and all necessary changes have been made.

    "},{"location":"reference/api/","title":"API reference","text":""},{"location":"reference/api/#mkdocstrings_handlers.python","title":"python","text":"

    Python handler for mkdocstrings.

    Modules:

    • config \u2013

      Deprecated. Import from mkdocstrings_handlers.python directly.

    • handler \u2013

      Deprecated. Import from mkdocstrings_handlers.python directly.

    • rendering \u2013

      Deprecated. Import from mkdocstrings_handlers.python directly.

    Classes:

    • AutoStyleOptions \u2013

      Auto style docstring options.

    • AutorefsHook \u2013

      Autorefs hook.

    • GoogleStyleOptions \u2013

      Google style docstring options.

    • Inventory \u2013

      An inventory.

    • NumpyStyleOptions \u2013

      Numpy style docstring options.

    • PerStyleOptions \u2013

      Per style options.

    • PythonConfig \u2013

      Python handler configuration.

    • PythonHandler \u2013

      The Python handler class.

    • PythonInputConfig \u2013

      Python handler configuration.

    • PythonInputOptions \u2013

      Accepted input options.

    • PythonOptions \u2013

      Final options passed as template context.

    • SphinxStyleOptions \u2013

      Sphinx style docstring options.

    • SummaryOption \u2013

      Summary option.

    Functions:

    • do_as_attributes_section \u2013

      Build an attributes section from a list of attributes.

    • do_as_classes_section \u2013

      Build a classes section from a list of classes.

    • do_as_functions_section \u2013

      Build a functions section from a list of functions.

    • do_as_modules_section \u2013

      Build a modules section from a list of modules.

    • do_backlink_tree \u2013

      Build a tree of backlinks.

    • do_crossref \u2013

      Deprecated. Filter to create cross-references.

    • do_filter_objects \u2013

      Filter a dictionary of objects based on their docstrings.

    • do_format_attribute \u2013

      Format an attribute.

    • do_format_code \u2013

      Format code.

    • do_format_signature \u2013

      Format a signature.

    • do_get_template \u2013

      Get the template name used to render an object.

    • do_multi_crossref \u2013

      Deprecated. Filter to create cross-references.

    • do_order_members \u2013

      Order members given an ordering method.

    • do_split_path \u2013

      Split object paths for building cross-references.

    • get_handler \u2013

      Return an instance of PythonHandler.

    Attributes:

    • Order \u2013

      Ordering methods.

    • Tree \u2013

      A tree type. Each node holds a tuple of items.

    • do_stash_crossref \u2013

      Filter to stash cross-references (and restore them after formatting and highlighting).

    "},{"location":"reference/api/#mkdocstrings_handlers.python.Order","title":"Order module-attribute","text":"
    Order = Literal['__all__', 'alphabetical', 'source']\n

    Ordering methods.

    • __all__: order members according to __all__ module attributes, if declared;
    • alphabetical: order members alphabetically;
    • source: order members as they appear in the source file.
    "},{"location":"reference/api/#mkdocstrings_handlers.python.Tree","title":"Tree module-attribute","text":"
    Tree = dict[tuple[_T, ...], 'Tree']\n

    A tree type. Each node holds a tuple of items.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_stash_crossref","title":"do_stash_crossref module-attribute","text":"
    do_stash_crossref = _StashCrossRefFilter()\n

    Filter to stash cross-references (and restore them after formatting and highlighting).

    "},{"location":"reference/api/#mkdocstrings_handlers.python.AutoStyleOptions","title":"AutoStyleOptions dataclass","text":"
    AutoStyleOptions(\n    method: Literal[\"heuristics\", \"max_sections\"] = \"heuristics\",\n    style_order: list[str] = lambda: [\"sphinx\", \"google\", \"numpy\"](),\n    default: str | None = None,\n    per_style_options: PerStyleOptions = PerStyleOptions(),\n)\n

    Auto style docstring options.

    Methods:

    • from_data \u2013

      Create an instance from a dictionary.

    Attributes:

    • default (str | None) \u2013

      The default docstring style to use if no other style is detected.

    • method (Literal['heuristics', 'max_sections']) \u2013

      The method to use to determine the docstring style.

    • per_style_options (PerStyleOptions) \u2013

      Per-style options.

    • style_order (list[str]) \u2013

      The order of the docstring styles to try.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.AutoStyleOptions.default","title":"default class-attribute instance-attribute","text":"
    default: str | None = None\n

    The default docstring style to use if no other style is detected.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.AutoStyleOptions.method","title":"method class-attribute instance-attribute","text":"
    method: Literal['heuristics', 'max_sections'] = 'heuristics'\n

    The method to use to determine the docstring style.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.AutoStyleOptions.per_style_options","title":"per_style_options class-attribute instance-attribute","text":"
    per_style_options: PerStyleOptions = field(default_factory=PerStyleOptions)\n

    Per-style options.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.AutoStyleOptions.style_order","title":"style_order class-attribute instance-attribute","text":"
    style_order: list[str] = field(default_factory=lambda: ['sphinx', 'google', 'numpy'])\n

    The order of the docstring styles to try.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.AutoStyleOptions.from_data","title":"from_data classmethod","text":"
    from_data(**data: Any) -> Self\n

    Create an instance from a dictionary.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.AutorefsHook","title":"AutorefsHook","text":"
    AutorefsHook(current_object: Object | Alias, config: dict[str, Any])\n
    \n              flowchart TD\n              mkdocstrings_handlers.python.AutorefsHook[AutorefsHook]\n\n              \n\n              click mkdocstrings_handlers.python.AutorefsHook href \"\" \"mkdocstrings_handlers.python.AutorefsHook\"\n            

    Autorefs hook.

    With this hook, we're able to add context to autorefs (cross-references), such as originating file path and line number, to improve error reporting.

    Parameters:

    Methods:

    • expand_identifier \u2013

      Expand an identifier.

    • get_context \u2013

      Get the context for the current object.

    Attributes:

    • config \u2013

      The configuration options.

    • current_object \u2013

      The current object being rendered.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.AutorefsHook(current_object)","title":"current_object","text":"(Object | Alias) \u2013

    The object being rendered.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.AutorefsHook(config)","title":"config","text":"(dict[str, Any]) \u2013

    The configuration dictionary.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.AutorefsHook.config","title":"config instance-attribute","text":"
    config = config\n

    The configuration options.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.AutorefsHook.current_object","title":"current_object instance-attribute","text":"
    current_object = current_object\n

    The current object being rendered.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.AutorefsHook.expand_identifier","title":"expand_identifier","text":"
    expand_identifier(identifier: str) -> str\n

    Expand an identifier.

    Parameters:

    Returns:

    • str \u2013

      The expanded identifier.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.AutorefsHook.expand_identifier(identifier)","title":"identifier","text":"(str) \u2013

    The identifier to expand.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.AutorefsHook.get_context","title":"get_context","text":"
    get_context() -> Context\n

    Get the context for the current object.

    Returns:

    • Context \u2013

      The context.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.GoogleStyleOptions","title":"GoogleStyleOptions dataclass","text":"
    GoogleStyleOptions(\n    ignore_init_summary: bool = False,\n    returns_multiple_items: bool = True,\n    returns_named_value: bool = True,\n    returns_type_in_property_summary: bool = False,\n    receives_multiple_items: bool = True,\n    receives_named_value: bool = True,\n    trim_doctest_flags: bool = True,\n    warn_unknown_params: bool = True,\n)\n

    Google style docstring options.

    Attributes:

    • ignore_init_summary (bool) \u2013

      Whether to ignore the summary in __init__ methods' docstrings.

    • receives_multiple_items (bool) \u2013

      Whether to parse multiple items in Receives sections.

    • receives_named_value (bool) \u2013

      Whether to parse Receives section items as name and description, rather than type and description.

    • returns_multiple_items (bool) \u2013

      Whether to parse multiple items in Yields and Returns sections.

    • returns_named_value (bool) \u2013

      Whether to parse Yields and Returns section items as name and description, rather than type and description.

    • returns_type_in_property_summary (bool) \u2013

      Whether to parse the return type of properties at the beginning of their summary: str: Summary of the property.

    • trim_doctest_flags (bool) \u2013

      Whether to remove doctest flags from Python example blocks.

    • warn_unknown_params (bool) \u2013

      Warn about documented parameters not appearing in the signature.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.GoogleStyleOptions.ignore_init_summary","title":"ignore_init_summary class-attribute instance-attribute","text":"
    ignore_init_summary: bool = False\n

    Whether to ignore the summary in __init__ methods' docstrings.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.GoogleStyleOptions.receives_multiple_items","title":"receives_multiple_items class-attribute instance-attribute","text":"
    receives_multiple_items: bool = True\n

    Whether to parse multiple items in Receives sections.

    When true, each item's continuation lines must be indented. When false (single item), no further indentation is required.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.GoogleStyleOptions.receives_named_value","title":"receives_named_value class-attribute instance-attribute","text":"
    receives_named_value: bool = True\n

    Whether to parse Receives section items as name and description, rather than type and description.

    When true, type must be wrapped in parentheses: (int): Description.. Names are optional: name (int): Description.. When false, parentheses are optional but the items cannot be named: int: Description.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.GoogleStyleOptions.returns_multiple_items","title":"returns_multiple_items class-attribute instance-attribute","text":"
    returns_multiple_items: bool = True\n

    Whether to parse multiple items in Yields and Returns sections.

    When true, each item's continuation lines must be indented. When false (single item), no further indentation is required.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.GoogleStyleOptions.returns_named_value","title":"returns_named_value class-attribute instance-attribute","text":"
    returns_named_value: bool = True\n

    Whether to parse Yields and Returns section items as name and description, rather than type and description.

    When true, type must be wrapped in parentheses: (int): Description.. Names are optional: name (int): Description.. When false, parentheses are optional but the items cannot be named: int: Description.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.GoogleStyleOptions.returns_type_in_property_summary","title":"returns_type_in_property_summary class-attribute instance-attribute","text":"
    returns_type_in_property_summary: bool = False\n

    Whether to parse the return type of properties at the beginning of their summary: str: Summary of the property.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.GoogleStyleOptions.trim_doctest_flags","title":"trim_doctest_flags class-attribute instance-attribute","text":"
    trim_doctest_flags: bool = True\n

    Whether to remove doctest flags from Python example blocks.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.GoogleStyleOptions.warn_unknown_params","title":"warn_unknown_params class-attribute instance-attribute","text":"
    warn_unknown_params: bool = True\n

    Warn about documented parameters not appearing in the signature.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.Inventory","title":"Inventory dataclass","text":"
    Inventory(url: str, base_url: str | None = None, domains: list[str] = lambda: ['py']())\n

    An inventory.

    Attributes:

    • base_url (str | None) \u2013

      The base URL of the inventory.

    • domains (list[str]) \u2013

      The domains to load from the inventory.

    • url (str) \u2013

      The URL of the inventory.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.Inventory.base_url","title":"base_url class-attribute instance-attribute","text":"
    base_url: str | None = None\n

    The base URL of the inventory.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.Inventory.domains","title":"domains class-attribute instance-attribute","text":"
    domains: list[str] = field(default_factory=lambda: ['py'])\n

    The domains to load from the inventory.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.Inventory.url","title":"url instance-attribute","text":"
    url: str\n

    The URL of the inventory.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.NumpyStyleOptions","title":"NumpyStyleOptions dataclass","text":"
    NumpyStyleOptions(\n    ignore_init_summary: bool = False,\n    trim_doctest_flags: bool = True,\n    warn_unknown_params: bool = True,\n)\n

    Numpy style docstring options.

    Attributes:

    • ignore_init_summary (bool) \u2013

      Whether to ignore the summary in __init__ methods' docstrings.

    • trim_doctest_flags (bool) \u2013

      Whether to remove doctest flags from Python example blocks.

    • warn_unknown_params (bool) \u2013

      Warn about documented parameters not appearing in the signature.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.NumpyStyleOptions.ignore_init_summary","title":"ignore_init_summary class-attribute instance-attribute","text":"
    ignore_init_summary: bool = False\n

    Whether to ignore the summary in __init__ methods' docstrings.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.NumpyStyleOptions.trim_doctest_flags","title":"trim_doctest_flags class-attribute instance-attribute","text":"
    trim_doctest_flags: bool = True\n

    Whether to remove doctest flags from Python example blocks.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.NumpyStyleOptions.warn_unknown_params","title":"warn_unknown_params class-attribute instance-attribute","text":"
    warn_unknown_params: bool = True\n

    Warn about documented parameters not appearing in the signature.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PerStyleOptions","title":"PerStyleOptions dataclass","text":"
    PerStyleOptions(\n    google: GoogleStyleOptions = GoogleStyleOptions(),\n    numpy: NumpyStyleOptions = NumpyStyleOptions(),\n    sphinx: SphinxStyleOptions = SphinxStyleOptions(),\n)\n

    Per style options.

    Methods:

    • from_data \u2013

      Create an instance from a dictionary.

    Attributes:

    • google (GoogleStyleOptions) \u2013

      Google-style options.

    • numpy (NumpyStyleOptions) \u2013

      Numpydoc-style options.

    • sphinx (SphinxStyleOptions) \u2013

      Sphinx-style options.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PerStyleOptions.google","title":"google class-attribute instance-attribute","text":"
    google: GoogleStyleOptions = field(default_factory=GoogleStyleOptions)\n

    Google-style options.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PerStyleOptions.numpy","title":"numpy class-attribute instance-attribute","text":"
    numpy: NumpyStyleOptions = field(default_factory=NumpyStyleOptions)\n

    Numpydoc-style options.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PerStyleOptions.sphinx","title":"sphinx class-attribute instance-attribute","text":"
    sphinx: SphinxStyleOptions = field(default_factory=SphinxStyleOptions)\n

    Sphinx-style options.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PerStyleOptions.from_data","title":"from_data classmethod","text":"
    from_data(**data: Any) -> Self\n

    Create an instance from a dictionary.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonConfig","title":"PythonConfig dataclass","text":"
    PythonConfig(\n    inventories: list[Inventory] = list(),\n    paths: list[str] = lambda: [\".\"](),\n    load_external_modules: bool | None = None,\n    options: dict[str, Any] = dict(),\n    locale: str | None = None,\n)\n
    \n              flowchart TD\n              mkdocstrings_handlers.python.PythonConfig[PythonConfig]\n              mkdocstrings_handlers.python._internal.config.PythonInputConfig[PythonInputConfig]\n\n                              mkdocstrings_handlers.python._internal.config.PythonInputConfig --> mkdocstrings_handlers.python.PythonConfig\n                \n\n\n              click mkdocstrings_handlers.python.PythonConfig href \"\" \"mkdocstrings_handlers.python.PythonConfig\"\n              click mkdocstrings_handlers.python._internal.config.PythonInputConfig href \"\" \"mkdocstrings_handlers.python._internal.config.PythonInputConfig\"\n            

    Python handler configuration.

    Used by:
    • \u00a0python \u00a0PythonHandler

    Methods:

    • coerce \u2013

      Coerce data.

    • from_data \u2013

      Create an instance from a dictionary.

    Attributes:

    • inventories (list[Inventory]) \u2013

      The object inventories to load.

    • load_external_modules (bool | None) \u2013

      Whether to always load external modules/packages.

    • locale (str | None) \u2013

      The locale to use when translating template strings.

    • options (dict[str, Any]) \u2013

      Configuration options for collecting and rendering objects.

    • paths (list[str]) \u2013

      The paths in which to search for Python packages.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonConfig.inventories","title":"inventories class-attribute instance-attribute","text":"
    inventories: list[Inventory] = field(default_factory=list)\n

    The object inventories to load.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonConfig.load_external_modules","title":"load_external_modules class-attribute instance-attribute","text":"
    load_external_modules: bool | None = None\n

    Whether to always load external modules/packages.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonConfig.locale","title":"locale class-attribute instance-attribute","text":"
    locale: str | None = None\n

    The locale to use when translating template strings.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonConfig.options","title":"options class-attribute instance-attribute","text":"
    options: dict[str, Any] = field(default_factory=dict)\n

    Configuration options for collecting and rendering objects.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonConfig.paths","title":"paths class-attribute instance-attribute","text":"
    paths: list[str] = field(default_factory=lambda: ['.'])\n

    The paths in which to search for Python packages.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonConfig.coerce","title":"coerce classmethod","text":"
    coerce(**data: Any) -> MutableMapping[str, Any]\n

    Coerce data.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonConfig.from_data","title":"from_data classmethod","text":"
    from_data(**data: Any) -> Self\n

    Create an instance from a dictionary.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler","title":"PythonHandler","text":"
    PythonHandler(config: PythonConfig, base_dir: Path, **kwargs: Any)\n
    \n              flowchart TD\n              mkdocstrings_handlers.python.PythonHandler[PythonHandler]\n              mkdocstrings._internal.handlers.base.BaseHandler[BaseHandler]\n\n                              mkdocstrings._internal.handlers.base.BaseHandler --> mkdocstrings_handlers.python.PythonHandler\n                \n\n\n              click mkdocstrings_handlers.python.PythonHandler href \"\" \"mkdocstrings_handlers.python.PythonHandler\"\n              click mkdocstrings._internal.handlers.base.BaseHandler href \"\" \"mkdocstrings._internal.handlers.base.BaseHandler\"\n            

    The Python handler class.

    Parameters:

    Returned by:
    • \u00a0python \u00a0get_handler

    Methods:

    • collect \u2013

      Collect the documentation for the given identifier.

    • do_convert_markdown \u2013

      Render Markdown text; for use inside templates.

    • do_heading \u2013

      Render an HTML heading and register it for the table of contents. For use inside templates.

    • get_aliases \u2013

      Get the aliases for the given identifier.

    • get_extended_templates_dirs \u2013

      Load template extensions for the given handler, return their templates directories.

    • get_headings \u2013

      Return and clear the headings gathered so far.

    • get_inventory_urls \u2013

      Return the URLs of the inventory files to download.

    • get_options \u2013

      Get combined default, global and local options.

    • get_templates_dir \u2013

      Return the path to the handler's templates directory.

    • load_inventory \u2013

      Yield items and their URLs from an inventory file streamed from in_file.

    • normalize_extension_paths \u2013

      Resolve extension paths relative to config file.

    • render \u2013

      Render the collected data.

    • render_backlinks \u2013

      Render the backlinks.

    • teardown \u2013

      Teardown the handler.

    • update_env \u2013

      Update the Jinja environment with custom filters and tests.

    Attributes:

    • base_dir \u2013

      The base directory of the project.

    • config \u2013

      The handler configuration.

    • custom_templates \u2013

      The path to custom templates.

    • domain (str) \u2013

      The cross-documentation domain/language for this handler.

    • enable_inventory (bool) \u2013

      Whether this handler is interested in enabling the creation of the objects.inv Sphinx inventory file.

    • env \u2013

      The Jinja environment.

    • extra_css (str) \u2013

      Extra CSS.

    • fallback_config (dict) \u2013

      Fallback configuration when searching anchors for identifiers.

    • fallback_theme (str) \u2013

      The fallback theme.

    • global_options \u2013

      The global configuration options (in mkdocs.yml).

    • md (Markdown) \u2013

      The Markdown instance.

    • mdx \u2013

      The Markdown extensions to use.

    • mdx_config \u2013

      The configuration for the Markdown extensions.

    • name (str) \u2013

      The handler's name.

    • outer_layer (bool) \u2013

      Whether we're in the outer Markdown conversion layer.

    • theme \u2013

      The selected theme.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler(config)","title":"config","text":"(PythonConfig) \u2013

    The handler configuration.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler(base_dir)","title":"base_dir","text":"(Path) \u2013

    The base directory of the project.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler(**kwargs)","title":"**kwargs","text":"(Any, default: {} ) \u2013

    Arguments passed to the parent constructor.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.base_dir","title":"base_dir instance-attribute","text":"
    base_dir = base_dir\n

    The base directory of the project.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.config","title":"config instance-attribute","text":"
    config = config\n

    The handler configuration.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.custom_templates","title":"custom_templates instance-attribute","text":"
    custom_templates = custom_templates\n

    The path to custom templates.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.domain","title":"domain class-attribute","text":"
    domain: str = 'py'\n

    The cross-documentation domain/language for this handler.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.enable_inventory","title":"enable_inventory class-attribute","text":"
    enable_inventory: bool = True\n

    Whether this handler is interested in enabling the creation of the objects.inv Sphinx inventory file.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.env","title":"env instance-attribute","text":"
    env = Environment(autoescape=True, loader=FileSystemLoader(paths), auto_reload=False)\n

    The Jinja environment.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.extra_css","title":"extra_css class-attribute instance-attribute","text":"
    extra_css: str = ''\n

    Extra CSS.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.fallback_config","title":"fallback_config class-attribute","text":"
    fallback_config: dict = {}\n

    Fallback configuration when searching anchors for identifiers.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.fallback_theme","title":"fallback_theme class-attribute","text":"
    fallback_theme: str = 'material'\n

    The fallback theme.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.global_options","title":"global_options instance-attribute","text":"
    global_options = global_options\n

    The global configuration options (in mkdocs.yml).

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.md","title":"md property","text":"
    md: Markdown\n

    The Markdown instance.

    Raises:

    • RuntimeError \u2013

      When the Markdown instance is not set yet.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.mdx","title":"mdx instance-attribute","text":"
    mdx = mdx\n

    The Markdown extensions to use.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.mdx_config","title":"mdx_config instance-attribute","text":"
    mdx_config = mdx_config\n

    The configuration for the Markdown extensions.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.name","title":"name class-attribute","text":"
    name: str = 'python'\n

    The handler's name.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.outer_layer","title":"outer_layer property","text":"
    outer_layer: bool\n

    Whether we're in the outer Markdown conversion layer.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.theme","title":"theme instance-attribute","text":"
    theme = theme\n

    The selected theme.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.collect","title":"collect","text":"
    collect(identifier: str, options: PythonOptions) -> CollectorItem\n

    Collect the documentation for the given identifier.

    Parameters:

    Returns:

    • CollectorItem \u2013

      The collected item.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.collect(identifier)","title":"identifier","text":"(str) \u2013

    The identifier of the object to collect.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.collect(options)","title":"options","text":"(PythonOptions) \u2013

    The options to use for the collection.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.do_convert_markdown","title":"do_convert_markdown","text":"
    do_convert_markdown(\n    text: str,\n    heading_level: int,\n    html_id: str = \"\",\n    *,\n    strip_paragraph: bool = False,\n    autoref_hook: AutorefsHookInterface | None = None\n) -> Markup\n

    Render Markdown text; for use inside templates.

    Parameters:

    Returns:

    • Markup \u2013

      An HTML string.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.do_convert_markdown(text)","title":"text","text":"(str) \u2013

    The text to convert.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.do_convert_markdown(heading_level)","title":"heading_level","text":"(int) \u2013

    The base heading level to start all Markdown headings from.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.do_convert_markdown(html_id)","title":"html_id","text":"(str, default: '' ) \u2013

    The HTML id of the element that's considered the parent of this element.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.do_convert_markdown(strip_paragraph)","title":"strip_paragraph","text":"(bool, default: False ) \u2013

    Whether to exclude the <p> tag from around the whole output.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.do_heading","title":"do_heading","text":"
    do_heading(\n    content: Markup,\n    heading_level: int,\n    *,\n    role: str | None = None,\n    hidden: bool = False,\n    toc_label: str | None = None,\n    **attributes: str\n) -> Markup\n

    Render an HTML heading and register it for the table of contents. For use inside templates.

    Parameters:

    Returns:

    • Markup \u2013

      An HTML string.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.do_heading(content)","title":"content","text":"(Markup) \u2013

    The HTML within the heading.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.do_heading(heading_level)","title":"heading_level","text":"(int) \u2013

    The level of heading (e.g. 3 -> h3).

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.do_heading(role)","title":"role","text":"(str | None, default: None ) \u2013

    An optional role for the object bound to this heading.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.do_heading(hidden)","title":"hidden","text":"(bool, default: False ) \u2013

    If True, only register it for the table of contents, don't render anything.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.do_heading(toc_label)","title":"toc_label","text":"(str | None, default: None ) \u2013

    The title to use in the table of contents ('data-toc-label' attribute).

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.do_heading(**attributes)","title":"**attributes","text":"(str, default: {} ) \u2013

    Any extra HTML attributes of the heading.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.get_aliases","title":"get_aliases","text":"
    get_aliases(identifier: str) -> tuple[str, ...]\n

    Get the aliases for the given identifier.

    Parameters:

    Returns:

    • tuple[str, ...] \u2013

      The aliases.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.get_aliases(identifier)","title":"identifier","text":"(str) \u2013

    The identifier to get the aliases for.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.get_extended_templates_dirs","title":"get_extended_templates_dirs","text":"
    get_extended_templates_dirs(handler: str) -> list[Path]\n

    Load template extensions for the given handler, return their templates directories.

    Parameters:

    Returns:

    • list[Path] \u2013

      The extensions templates directories.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.get_extended_templates_dirs(handler)","title":"handler","text":"(str) \u2013

    The name of the handler to get the extended templates directory of.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.get_headings","title":"get_headings","text":"
    get_headings() -> Sequence[Element]\n

    Return and clear the headings gathered so far.

    Returns:

    • Sequence[Element] \u2013

      A list of HTML elements.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.get_inventory_urls","title":"get_inventory_urls","text":"
    get_inventory_urls() -> list[tuple[str, dict[str, Any]]]\n

    Return the URLs of the inventory files to download.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.get_options","title":"get_options","text":"
    get_options(local_options: Mapping[str, Any]) -> HandlerOptions\n

    Get combined default, global and local options.

    Parameters:

    Returns:

    • HandlerOptions \u2013

      The combined options.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.get_options(local_options)","title":"local_options","text":"(Mapping[str, Any]) \u2013

    The local options.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.get_templates_dir","title":"get_templates_dir","text":"
    get_templates_dir(handler: str | None = None) -> Path\n

    Return the path to the handler's templates directory.

    Override to customize how the templates directory is found.

    Parameters:

    Raises:

    • ModuleNotFoundError \u2013

      When no such handler is installed.

    • FileNotFoundError \u2013

      When the templates directory cannot be found.

    Returns:

    • Path \u2013

      The templates directory path.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.get_templates_dir(handler)","title":"handler","text":"(str | None, default: None ) \u2013

    The name of the handler to get the templates directory of.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.load_inventory","title":"load_inventory staticmethod","text":"
    load_inventory(\n    in_file: BinaryIO,\n    url: str,\n    base_url: str | None = None,\n    domains: list[str] | None = None,\n    **kwargs: Any\n) -> Iterator[tuple[str, str]]\n

    Yield items and their URLs from an inventory file streamed from in_file.

    This implements mkdocstrings' load_inventory \"protocol\" (see mkdocstrings.plugin).

    Parameters:

    Yields:

    • tuple[str, str] \u2013

      Tuples of (item identifier, item URL).

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.load_inventory(in_file)","title":"in_file","text":"(BinaryIO) \u2013

    The binary file-like object to read the inventory from.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.load_inventory(url)","title":"url","text":"(str) \u2013

    The URL that this file is being streamed from (used to guess base_url).

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.load_inventory(base_url)","title":"base_url","text":"(str | None, default: None ) \u2013

    The URL that this inventory's sub-paths are relative to.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.load_inventory(domains)","title":"domains","text":"(list[str] | None, default: None ) \u2013

    A list of domain strings to filter the inventory by, when not passed, \"py\" will be used.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.load_inventory(**kwargs)","title":"**kwargs","text":"(Any, default: {} ) \u2013

    Ignore additional arguments passed from the config.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.normalize_extension_paths","title":"normalize_extension_paths","text":"
    normalize_extension_paths(extensions: Sequence) -> Sequence\n

    Resolve extension paths relative to config file.

    Parameters:

    Returns:

    • Sequence \u2013

      The normalized extensions.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.normalize_extension_paths(extensions)","title":"extensions","text":"(Sequence) \u2013

    The extensions (configuration) to normalize.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.render","title":"render","text":"
    render(data: CollectorItem, options: PythonOptions) -> str\n

    Render the collected data.

    Parameters:

    Returns:

    • str \u2013

      The rendered data (HTML).

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.render(data)","title":"data","text":"(CollectorItem) \u2013

    The collected data.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.render(options)","title":"options","text":"(PythonOptions) \u2013

    The options to use for rendering.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.render_backlinks","title":"render_backlinks","text":"
    render_backlinks(backlinks: Mapping[str, Iterable[Backlink]]) -> str\n

    Render the backlinks.

    Parameters:

    Returns:

    • str \u2013

      The rendered backlinks (HTML).

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.render_backlinks(backlinks)","title":"backlinks","text":"(Mapping[str, Iterable[Backlink]]) \u2013

    The backlinks to render.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.teardown","title":"teardown","text":"
    teardown() -> None\n

    Teardown the handler.

    This method should be implemented to, for example, terminate a subprocess that was started when creating the handler instance.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.update_env","title":"update_env","text":"
    update_env(config: Any) -> None\n

    Update the Jinja environment with custom filters and tests.

    Parameters:

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonHandler.update_env(config)","title":"config","text":"(Any) \u2013

    The SSG configuration.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputConfig","title":"PythonInputConfig dataclass","text":"
    PythonInputConfig(\n    inventories: list[str | Inventory] = list(),\n    paths: list[str] = lambda: [\".\"](),\n    load_external_modules: bool | None = None,\n    options: PythonInputOptions = PythonInputOptions(),\n    locale: str | None = None,\n)\n

    Python handler configuration.

    Methods:

    • coerce \u2013

      Coerce data.

    • from_data \u2013

      Create an instance from a dictionary.

    Attributes:

    • inventories (list[str | Inventory]) \u2013

      The inventories to load.

    • load_external_modules (bool | None) \u2013

      Whether to always load external modules/packages.

    • locale (str | None) \u2013

      The locale to use when translating template strings.

    • options (PythonInputOptions) \u2013

      Configuration options for collecting and rendering objects.

    • paths (list[str]) \u2013

      The paths in which to search for Python packages.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputConfig.inventories","title":"inventories class-attribute instance-attribute","text":"
    inventories: list[str | Inventory] = field(default_factory=list)\n

    The inventories to load.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputConfig.load_external_modules","title":"load_external_modules class-attribute instance-attribute","text":"
    load_external_modules: bool | None = None\n

    Whether to always load external modules/packages.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputConfig.locale","title":"locale class-attribute instance-attribute","text":"
    locale: str | None = None\n

    The locale to use when translating template strings.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputConfig.options","title":"options class-attribute instance-attribute","text":"
    options: PythonInputOptions = field(default_factory=PythonInputOptions)\n

    Configuration options for collecting and rendering objects.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputConfig.paths","title":"paths class-attribute instance-attribute","text":"
    paths: list[str] = field(default_factory=lambda: ['.'])\n

    The paths in which to search for Python packages.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputConfig.coerce","title":"coerce classmethod","text":"
    coerce(**data: Any) -> MutableMapping[str, Any]\n

    Coerce data.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputConfig.from_data","title":"from_data classmethod","text":"
    from_data(**data: Any) -> Self\n

    Create an instance from a dictionary.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions","title":"PythonInputOptions dataclass","text":"
    PythonInputOptions(\n    allow_inspection: bool = True,\n    force_inspection: bool = False,\n    annotations_path: Literal[\"brief\", \"source\", \"full\"] = \"brief\",\n    backlinks: Literal[\"flat\", \"tree\", False] = False,\n    docstring_options: (\n        GoogleStyleOptions\n        | NumpyStyleOptions\n        | SphinxStyleOptions\n        | AutoStyleOptions\n        | None\n    ) = None,\n    docstring_section_style: Literal[\"table\", \"list\", \"spacy\"] = \"table\",\n    docstring_style: Literal[\"auto\", \"google\", \"numpy\", \"sphinx\"] | None = \"google\",\n    extensions: list[str | dict[str, Any]] = list(),\n    filters: list[str] | Literal[\"public\"] = lambda: copy()(),\n    find_stubs_package: bool = False,\n    group_by_category: bool = True,\n    heading: str = \"\",\n    heading_level: int = 2,\n    inherited_members: bool | list[str] = False,\n    line_length: int = 60,\n    members: list[str] | bool | None = None,\n    members_order: Order | list[Order] = \"alphabetical\",\n    merge_init_into_class: bool = False,\n    modernize_annotations: bool = False,\n    parameter_headings: bool = False,\n    preload_modules: list[str] = list(),\n    relative_crossrefs: bool = False,\n    scoped_crossrefs: bool = False,\n    show_overloads: bool = True,\n    separate_signature: bool = False,\n    show_bases: bool = True,\n    show_category_heading: bool = False,\n    show_docstring_attributes: bool = True,\n    show_docstring_classes: bool = True,\n    show_docstring_description: bool = True,\n    show_docstring_examples: bool = True,\n    show_docstring_functions: bool = True,\n    show_docstring_modules: bool = True,\n    show_docstring_other_parameters: bool = True,\n    show_docstring_parameters: bool = True,\n    show_docstring_raises: bool = True,\n    show_docstring_receives: bool = True,\n    show_docstring_returns: bool = True,\n    show_docstring_warns: bool = True,\n    show_docstring_yields: bool = True,\n    show_if_no_docstring: bool = False,\n    show_inheritance_diagram: bool = False,\n    show_labels: bool = True,\n    show_object_full_path: bool = False,\n    show_root_full_path: bool = True,\n    show_root_heading: bool = False,\n    show_root_members_full_path: bool = False,\n    show_root_toc_entry: bool = True,\n    show_signature_annotations: bool = False,\n    show_signature: bool = True,\n    show_source: bool = True,\n    show_submodules: bool = False,\n    show_symbol_type_heading: bool = False,\n    show_symbol_type_toc: bool = False,\n    signature_crossrefs: bool = False,\n    summary: bool | SummaryOption = SummaryOption(),\n    toc_label: str = \"\",\n    unwrap_annotated: bool = False,\n    extra: dict[str, Any] = dict(),\n)\n

    Accepted input options.

    Methods:

    • coerce \u2013

      Coerce data.

    • from_data \u2013

      Create an instance from a dictionary.

    Attributes:

    • allow_inspection (bool) \u2013

      Whether to allow inspecting modules when visiting them is not possible.

    • annotations_path (Literal['brief', 'source', 'full']) \u2013

      The verbosity for annotations path: brief (recommended), source (as written in the source), or full.

    • backlinks (Literal['flat', 'tree', False]) \u2013

      Whether to render backlinks, and how.

    • docstring_options (GoogleStyleOptions | NumpyStyleOptions | SphinxStyleOptions | AutoStyleOptions | None) \u2013

      The options for the docstring parser.

    • docstring_section_style (Literal['table', 'list', 'spacy']) \u2013

      The style used to render docstring sections.

    • docstring_style (Literal['auto', 'google', 'numpy', 'sphinx'] | None) \u2013

      The docstring style to use: auto, google, numpy, sphinx, or None.

    • extensions (list[str | dict[str, Any]]) \u2013

      A list of Griffe extensions to load.

    • extra (dict[str, Any]) \u2013

      Extra options.

    • filters (list[str] | Literal['public']) \u2013

      A list of filters, or \"public\".

    • find_stubs_package (bool) \u2013

      Whether to load stubs package (package-stubs) when extracting docstrings.

    • force_inspection (bool) \u2013

      Whether to force using dynamic analysis when loading data.

    • group_by_category (bool) \u2013

      Group the object's children by categories: attributes, classes, functions, and modules.

    • heading (str) \u2013

      A custom string to override the autogenerated heading of the root object.

    • heading_level (int) \u2013

      The initial heading level to use.

    • inherited_members (bool | list[str]) \u2013

      A boolean, or an explicit list of inherited members to render.

    • line_length (int) \u2013

      Maximum line length when formatting code/signatures.

    • members (list[str] | bool | None) \u2013

      A boolean, or an explicit list of members to render.

    • members_order (Order | list[Order]) \u2013

      The members ordering to use.

    • merge_init_into_class (bool) \u2013

      Whether to merge the __init__ method into the class' signature and docstring.

    • modernize_annotations (bool) \u2013

      Whether to modernize annotations, for example Optional[str] into str | None.

    • parameter_headings (bool) \u2013

      Whether to render headings for parameters (therefore showing parameters in the ToC).

    • preload_modules (list[str]) \u2013

      Pre-load modules that are not specified directly in autodoc instructions (::: identifier).

    • relative_crossrefs (bool) \u2013

      Whether to enable the relative crossref syntax.

    • scoped_crossrefs (bool) \u2013

      Whether to enable the scoped crossref ability.

    • separate_signature (bool) \u2013

      Whether to put the whole signature in a code block below the heading.

    • show_bases (bool) \u2013

      Show the base classes of a class.

    • show_category_heading (bool) \u2013

      When grouped by categories, show a heading for each category.

    • show_docstring_attributes (bool) \u2013

      Whether to display the 'Attributes' section in the object's docstring.

    • show_docstring_classes (bool) \u2013

      Whether to display the 'Classes' section in the object's docstring.

    • show_docstring_description (bool) \u2013

      Whether to display the textual block (including admonitions) in the object's docstring.

    • show_docstring_examples (bool) \u2013

      Whether to display the 'Examples' section in the object's docstring.

    • show_docstring_functions (bool) \u2013

      Whether to display the 'Functions' or 'Methods' sections in the object's docstring.

    • show_docstring_modules (bool) \u2013

      Whether to display the 'Modules' section in the object's docstring.

    • show_docstring_other_parameters (bool) \u2013

      Whether to display the 'Other Parameters' section in the object's docstring.

    • show_docstring_parameters (bool) \u2013

      Whether to display the 'Parameters' section in the object's docstring.

    • show_docstring_raises (bool) \u2013

      Whether to display the 'Raises' section in the object's docstring.

    • show_docstring_receives (bool) \u2013

      Whether to display the 'Receives' section in the object's docstring.

    • show_docstring_returns (bool) \u2013

      Whether to display the 'Returns' section in the object's docstring.

    • show_docstring_warns (bool) \u2013

      Whether to display the 'Warns' section in the object's docstring.

    • show_docstring_yields (bool) \u2013

      Whether to display the 'Yields' section in the object's docstring.

    • show_if_no_docstring (bool) \u2013

      Show the object heading even if it has no docstring or children with docstrings.

    • show_inheritance_diagram (bool) \u2013

      Show the inheritance diagram of a class using Mermaid.

    • show_labels (bool) \u2013

      Whether to show labels of the members.

    • show_object_full_path (bool) \u2013

      Show the full Python path of every object.

    • show_overloads (bool) \u2013

      Show the overloads of a function or method.

    • show_root_full_path (bool) \u2013

      Show the full Python path for the root object heading.

    • show_root_heading (bool) \u2013

      Show the heading of the object at the root of the documentation tree.

    • show_root_members_full_path (bool) \u2013

      Show the full Python path of the root members.

    • show_root_toc_entry (bool) \u2013

      If the root heading is not shown, at least add a ToC entry for it.

    • show_signature (bool) \u2013

      Show methods and functions signatures.

    • show_signature_annotations (bool) \u2013

      Show the type annotations in methods and functions signatures.

    • show_source (bool) \u2013

      Show the source code of this object.

    • show_submodules (bool) \u2013

      When rendering a module, show its submodules recursively.

    • show_symbol_type_heading (bool) \u2013

      Show the symbol type in headings (e.g. mod, class, meth, func and attr).

    • show_symbol_type_toc (bool) \u2013

      Show the symbol type in the Table of Contents (e.g. mod, class, methd, func and attr).

    • signature_crossrefs (bool) \u2013

      Whether to render cross-references for type annotations in signatures.

    • summary (bool | SummaryOption) \u2013

      Whether to render summaries of modules, classes, functions (methods) and attributes.

    • toc_label (str) \u2013

      A custom string to override the autogenerated toc label of the root object.

    • unwrap_annotated (bool) \u2013

      Whether to unwrap Annotated types to show only the type without the annotations.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.allow_inspection","title":"allow_inspection class-attribute instance-attribute","text":"
    allow_inspection: bool = True\n

    Whether to allow inspecting modules when visiting them is not possible.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.annotations_path","title":"annotations_path class-attribute instance-attribute","text":"
    annotations_path: Literal['brief', 'source', 'full'] = 'brief'\n

    The verbosity for annotations path: brief (recommended), source (as written in the source), or full.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.backlinks","title":"backlinks class-attribute instance-attribute","text":"
    backlinks: Literal['flat', 'tree', False] = False\n

    Whether to render backlinks, and how.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.docstring_options","title":"docstring_options class-attribute instance-attribute","text":"
    docstring_options: (\n    GoogleStyleOptions\n    | NumpyStyleOptions\n    | SphinxStyleOptions\n    | AutoStyleOptions\n    | None\n) = None\n

    The options for the docstring parser.

    See docstring parsers and their options in Griffe docs.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.docstring_section_style","title":"docstring_section_style class-attribute instance-attribute","text":"
    docstring_section_style: Literal['table', 'list', 'spacy'] = 'table'\n

    The style used to render docstring sections.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.docstring_style","title":"docstring_style class-attribute instance-attribute","text":"
    docstring_style: Literal['auto', 'google', 'numpy', 'sphinx'] | None = 'google'\n

    The docstring style to use: auto, google, numpy, sphinx, or None.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.extensions","title":"extensions class-attribute instance-attribute","text":"
    extensions: list[str | dict[str, Any]] = field(default_factory=list)\n

    A list of Griffe extensions to load.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.extra","title":"extra class-attribute instance-attribute","text":"
    extra: dict[str, Any] = field(default_factory=dict)\n

    Extra options.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.filters","title":"filters class-attribute instance-attribute","text":"
    filters: list[str] | Literal['public'] = field(default_factory=lambda: copy())\n

    A list of filters, or \"public\".

    List of filters

    A filter starting with ! will exclude matching objects instead of including them. The members option takes precedence over filters (filters will still be applied recursively to lower members in the hierarchy).

    Filtering methods

    Sponsors only \u2014 Insiders 1.11.0

    The public method will include only public objects: those added to __all__ or not starting with an underscore (except for special methods/attributes).

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.find_stubs_package","title":"find_stubs_package class-attribute instance-attribute","text":"
    find_stubs_package: bool = False\n

    Whether to load stubs package (package-stubs) when extracting docstrings.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.force_inspection","title":"force_inspection class-attribute instance-attribute","text":"
    force_inspection: bool = False\n

    Whether to force using dynamic analysis when loading data.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.group_by_category","title":"group_by_category class-attribute instance-attribute","text":"
    group_by_category: bool = True\n

    Group the object's children by categories: attributes, classes, functions, and modules.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.heading","title":"heading class-attribute instance-attribute","text":"
    heading: str = ''\n

    A custom string to override the autogenerated heading of the root object.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.heading_level","title":"heading_level class-attribute instance-attribute","text":"
    heading_level: int = 2\n

    The initial heading level to use.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.inherited_members","title":"inherited_members class-attribute instance-attribute","text":"
    inherited_members: bool | list[str] = False\n

    A boolean, or an explicit list of inherited members to render.

    If true, select all inherited members, which can then be filtered with members. If false or empty list, do not select any inherited member.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.line_length","title":"line_length class-attribute instance-attribute","text":"
    line_length: int = 60\n

    Maximum line length when formatting code/signatures.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.members","title":"members class-attribute instance-attribute","text":"
    members: list[str] | bool | None = None\n

    A boolean, or an explicit list of members to render.

    If true, select all members without further filtering. If false or empty list, do not render members. If none, select all members and apply further filtering with filters and docstrings.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.members_order","title":"members_order class-attribute instance-attribute","text":"
    members_order: Order | list[Order] = 'alphabetical'\n

    The members ordering to use.

    • __all__: order members according to __all__ module attributes, if declared;
    • alphabetical: order members alphabetically;
    • source: order members as they appear in the source file.

    Since __all__ is a module-only attribute, it can't be used to sort class members, therefore the members_order option accepts a list of ordering methods, indicating ordering preferences.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.merge_init_into_class","title":"merge_init_into_class class-attribute instance-attribute","text":"
    merge_init_into_class: bool = False\n

    Whether to merge the __init__ method into the class' signature and docstring.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.modernize_annotations","title":"modernize_annotations class-attribute instance-attribute","text":"
    modernize_annotations: bool = False\n

    Whether to modernize annotations, for example Optional[str] into str | None.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.parameter_headings","title":"parameter_headings class-attribute instance-attribute","text":"
    parameter_headings: bool = False\n

    Whether to render headings for parameters (therefore showing parameters in the ToC).

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.preload_modules","title":"preload_modules class-attribute instance-attribute","text":"
    preload_modules: list[str] = field(default_factory=list)\n

    Pre-load modules that are not specified directly in autodoc instructions (::: identifier).

    It is useful when you want to render documentation for a particular member of an object, and this member is imported from another package than its parent.

    For an imported member to be rendered, you need to add it to the __all__ attribute of the importing module.

    The modules must be listed as an array of strings.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.relative_crossrefs","title":"relative_crossrefs class-attribute instance-attribute","text":"
    relative_crossrefs: bool = False\n

    Whether to enable the relative crossref syntax.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.scoped_crossrefs","title":"scoped_crossrefs class-attribute instance-attribute","text":"
    scoped_crossrefs: bool = False\n

    Whether to enable the scoped crossref ability.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.separate_signature","title":"separate_signature class-attribute instance-attribute","text":"
    separate_signature: bool = False\n

    Whether to put the whole signature in a code block below the heading.

    If Black or Ruff are installed, the signature is also formatted using them.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.show_bases","title":"show_bases class-attribute instance-attribute","text":"
    show_bases: bool = True\n

    Show the base classes of a class.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.show_category_heading","title":"show_category_heading class-attribute instance-attribute","text":"
    show_category_heading: bool = False\n

    When grouped by categories, show a heading for each category.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.show_docstring_attributes","title":"show_docstring_attributes class-attribute instance-attribute","text":"
    show_docstring_attributes: bool = True\n

    Whether to display the 'Attributes' section in the object's docstring.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.show_docstring_classes","title":"show_docstring_classes class-attribute instance-attribute","text":"
    show_docstring_classes: bool = True\n

    Whether to display the 'Classes' section in the object's docstring.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.show_docstring_description","title":"show_docstring_description class-attribute instance-attribute","text":"
    show_docstring_description: bool = True\n

    Whether to display the textual block (including admonitions) in the object's docstring.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.show_docstring_examples","title":"show_docstring_examples class-attribute instance-attribute","text":"
    show_docstring_examples: bool = True\n

    Whether to display the 'Examples' section in the object's docstring.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.show_docstring_functions","title":"show_docstring_functions class-attribute instance-attribute","text":"
    show_docstring_functions: bool = True\n

    Whether to display the 'Functions' or 'Methods' sections in the object's docstring.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.show_docstring_modules","title":"show_docstring_modules class-attribute instance-attribute","text":"
    show_docstring_modules: bool = True\n

    Whether to display the 'Modules' section in the object's docstring.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.show_docstring_other_parameters","title":"show_docstring_other_parameters class-attribute instance-attribute","text":"
    show_docstring_other_parameters: bool = True\n

    Whether to display the 'Other Parameters' section in the object's docstring.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.show_docstring_parameters","title":"show_docstring_parameters class-attribute instance-attribute","text":"
    show_docstring_parameters: bool = True\n

    Whether to display the 'Parameters' section in the object's docstring.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.show_docstring_raises","title":"show_docstring_raises class-attribute instance-attribute","text":"
    show_docstring_raises: bool = True\n

    Whether to display the 'Raises' section in the object's docstring.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.show_docstring_receives","title":"show_docstring_receives class-attribute instance-attribute","text":"
    show_docstring_receives: bool = True\n

    Whether to display the 'Receives' section in the object's docstring.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.show_docstring_returns","title":"show_docstring_returns class-attribute instance-attribute","text":"
    show_docstring_returns: bool = True\n

    Whether to display the 'Returns' section in the object's docstring.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.show_docstring_warns","title":"show_docstring_warns class-attribute instance-attribute","text":"
    show_docstring_warns: bool = True\n

    Whether to display the 'Warns' section in the object's docstring.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.show_docstring_yields","title":"show_docstring_yields class-attribute instance-attribute","text":"
    show_docstring_yields: bool = True\n

    Whether to display the 'Yields' section in the object's docstring.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.show_if_no_docstring","title":"show_if_no_docstring class-attribute instance-attribute","text":"
    show_if_no_docstring: bool = False\n

    Show the object heading even if it has no docstring or children with docstrings.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.show_inheritance_diagram","title":"show_inheritance_diagram class-attribute instance-attribute","text":"
    show_inheritance_diagram: bool = False\n

    Show the inheritance diagram of a class using Mermaid.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.show_labels","title":"show_labels class-attribute instance-attribute","text":"
    show_labels: bool = True\n

    Whether to show labels of the members.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.show_object_full_path","title":"show_object_full_path class-attribute instance-attribute","text":"
    show_object_full_path: bool = False\n

    Show the full Python path of every object.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.show_overloads","title":"show_overloads class-attribute instance-attribute","text":"
    show_overloads: bool = True\n

    Show the overloads of a function or method.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.show_root_full_path","title":"show_root_full_path class-attribute instance-attribute","text":"
    show_root_full_path: bool = True\n

    Show the full Python path for the root object heading.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.show_root_heading","title":"show_root_heading class-attribute instance-attribute","text":"
    show_root_heading: bool = False\n

    Show the heading of the object at the root of the documentation tree.

    The root object is the object referenced by the identifier after :::.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.show_root_members_full_path","title":"show_root_members_full_path class-attribute instance-attribute","text":"
    show_root_members_full_path: bool = False\n

    Show the full Python path of the root members.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.show_root_toc_entry","title":"show_root_toc_entry class-attribute instance-attribute","text":"
    show_root_toc_entry: bool = True\n

    If the root heading is not shown, at least add a ToC entry for it.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.show_signature","title":"show_signature class-attribute instance-attribute","text":"
    show_signature: bool = True\n

    Show methods and functions signatures.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.show_signature_annotations","title":"show_signature_annotations class-attribute instance-attribute","text":"
    show_signature_annotations: bool = False\n

    Show the type annotations in methods and functions signatures.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.show_source","title":"show_source class-attribute instance-attribute","text":"
    show_source: bool = True\n

    Show the source code of this object.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.show_submodules","title":"show_submodules class-attribute instance-attribute","text":"
    show_submodules: bool = False\n

    When rendering a module, show its submodules recursively.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.show_symbol_type_heading","title":"show_symbol_type_heading class-attribute instance-attribute","text":"
    show_symbol_type_heading: bool = False\n

    Show the symbol type in headings (e.g. mod, class, meth, func and attr).

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.show_symbol_type_toc","title":"show_symbol_type_toc class-attribute instance-attribute","text":"
    show_symbol_type_toc: bool = False\n

    Show the symbol type in the Table of Contents (e.g. mod, class, methd, func and attr).

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.signature_crossrefs","title":"signature_crossrefs class-attribute instance-attribute","text":"
    signature_crossrefs: bool = False\n

    Whether to render cross-references for type annotations in signatures.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.summary","title":"summary class-attribute instance-attribute","text":"
    summary: bool | SummaryOption = field(default_factory=SummaryOption)\n

    Whether to render summaries of modules, classes, functions (methods) and attributes.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.toc_label","title":"toc_label class-attribute instance-attribute","text":"
    toc_label: str = ''\n

    A custom string to override the autogenerated toc label of the root object.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.unwrap_annotated","title":"unwrap_annotated class-attribute instance-attribute","text":"
    unwrap_annotated: bool = False\n

    Whether to unwrap Annotated types to show only the type without the annotations.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.coerce","title":"coerce classmethod","text":"
    coerce(**data: Any) -> MutableMapping[str, Any]\n

    Coerce data.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonInputOptions.from_data","title":"from_data classmethod","text":"
    from_data(**data: Any) -> Self\n

    Create an instance from a dictionary.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions","title":"PythonOptions dataclass","text":"
    PythonOptions(\n    allow_inspection: bool = True,\n    force_inspection: bool = False,\n    annotations_path: Literal[\"brief\", \"source\", \"full\"] = \"brief\",\n    backlinks: Literal[\"flat\", \"tree\", False] = False,\n    docstring_options: (\n        GoogleStyleOptions\n        | NumpyStyleOptions\n        | SphinxStyleOptions\n        | AutoStyleOptions\n        | None\n    ) = None,\n    docstring_section_style: Literal[\"table\", \"list\", \"spacy\"] = \"table\",\n    docstring_style: Literal[\"auto\", \"google\", \"numpy\", \"sphinx\"] | None = \"google\",\n    extensions: list[str | dict[str, Any]] = list(),\n    filters: list[tuple[Pattern, bool]] | Literal[\"public\"] = lambda: [\n        (compile(removeprefix(\"!\")), startswith(\"!\")) for filtr in _DEFAULT_FILTERS\n    ](),\n    find_stubs_package: bool = False,\n    group_by_category: bool = True,\n    heading: str = \"\",\n    heading_level: int = 2,\n    inherited_members: bool | list[str] = False,\n    line_length: int = 60,\n    members: list[str] | bool | None = None,\n    members_order: Order | list[Order] = \"alphabetical\",\n    merge_init_into_class: bool = False,\n    modernize_annotations: bool = False,\n    parameter_headings: bool = False,\n    preload_modules: list[str] = list(),\n    relative_crossrefs: bool = False,\n    scoped_crossrefs: bool = False,\n    show_overloads: bool = True,\n    separate_signature: bool = False,\n    show_bases: bool = True,\n    show_category_heading: bool = False,\n    show_docstring_attributes: bool = True,\n    show_docstring_classes: bool = True,\n    show_docstring_description: bool = True,\n    show_docstring_examples: bool = True,\n    show_docstring_functions: bool = True,\n    show_docstring_modules: bool = True,\n    show_docstring_other_parameters: bool = True,\n    show_docstring_parameters: bool = True,\n    show_docstring_raises: bool = True,\n    show_docstring_receives: bool = True,\n    show_docstring_returns: bool = True,\n    show_docstring_warns: bool = True,\n    show_docstring_yields: bool = True,\n    show_if_no_docstring: bool = False,\n    show_inheritance_diagram: bool = False,\n    show_labels: bool = True,\n    show_object_full_path: bool = False,\n    show_root_full_path: bool = True,\n    show_root_heading: bool = False,\n    show_root_members_full_path: bool = False,\n    show_root_toc_entry: bool = True,\n    show_signature_annotations: bool = False,\n    show_signature: bool = True,\n    show_source: bool = True,\n    show_submodules: bool = False,\n    show_symbol_type_heading: bool = False,\n    show_symbol_type_toc: bool = False,\n    signature_crossrefs: bool = False,\n    summary: SummaryOption = SummaryOption(),\n    toc_label: str = \"\",\n    unwrap_annotated: bool = False,\n    extra: dict[str, Any] = dict(),\n)\n
    \n              flowchart TD\n              mkdocstrings_handlers.python.PythonOptions[PythonOptions]\n              mkdocstrings_handlers.python._internal.config.PythonInputOptions[PythonInputOptions]\n\n                              mkdocstrings_handlers.python._internal.config.PythonInputOptions --> mkdocstrings_handlers.python.PythonOptions\n                \n\n\n              click mkdocstrings_handlers.python.PythonOptions href \"\" \"mkdocstrings_handlers.python.PythonOptions\"\n              click mkdocstrings_handlers.python._internal.config.PythonInputOptions href \"\" \"mkdocstrings_handlers.python._internal.config.PythonInputOptions\"\n            

    Final options passed as template context.

    Used by:
    • \u00a0python \u00a0PythonHandler
      • \u00a0collect
      • \u00a0render

    Methods:

    • coerce \u2013

      Create an instance from a dictionary.

    • from_data \u2013

      Create an instance from a dictionary.

    Attributes:

    • allow_inspection (bool) \u2013

      Whether to allow inspecting modules when visiting them is not possible.

    • annotations_path (Literal['brief', 'source', 'full']) \u2013

      The verbosity for annotations path: brief (recommended), source (as written in the source), or full.

    • backlinks (Literal['flat', 'tree', False]) \u2013

      Whether to render backlinks, and how.

    • docstring_options (GoogleStyleOptions | NumpyStyleOptions | SphinxStyleOptions | AutoStyleOptions | None) \u2013

      The options for the docstring parser.

    • docstring_section_style (Literal['table', 'list', 'spacy']) \u2013

      The style used to render docstring sections.

    • docstring_style (Literal['auto', 'google', 'numpy', 'sphinx'] | None) \u2013

      The docstring style to use: auto, google, numpy, sphinx, or None.

    • extensions (list[str | dict[str, Any]]) \u2013

      A list of Griffe extensions to load.

    • extra (dict[str, Any]) \u2013

      Extra options.

    • filters (list[tuple[Pattern, bool]] | Literal['public']) \u2013

      A list of filters, or \"public\".

    • find_stubs_package (bool) \u2013

      Whether to load stubs package (package-stubs) when extracting docstrings.

    • force_inspection (bool) \u2013

      Whether to force using dynamic analysis when loading data.

    • group_by_category (bool) \u2013

      Group the object's children by categories: attributes, classes, functions, and modules.

    • heading (str) \u2013

      A custom string to override the autogenerated heading of the root object.

    • heading_level (int) \u2013

      The initial heading level to use.

    • inherited_members (bool | list[str]) \u2013

      A boolean, or an explicit list of inherited members to render.

    • line_length (int) \u2013

      Maximum line length when formatting code/signatures.

    • members (list[str] | bool | None) \u2013

      A boolean, or an explicit list of members to render.

    • members_order (Order | list[Order]) \u2013

      The members ordering to use.

    • merge_init_into_class (bool) \u2013

      Whether to merge the __init__ method into the class' signature and docstring.

    • modernize_annotations (bool) \u2013

      Whether to modernize annotations, for example Optional[str] into str | None.

    • parameter_headings (bool) \u2013

      Whether to render headings for parameters (therefore showing parameters in the ToC).

    • preload_modules (list[str]) \u2013

      Pre-load modules that are not specified directly in autodoc instructions (::: identifier).

    • relative_crossrefs (bool) \u2013

      Whether to enable the relative crossref syntax.

    • scoped_crossrefs (bool) \u2013

      Whether to enable the scoped crossref ability.

    • separate_signature (bool) \u2013

      Whether to put the whole signature in a code block below the heading.

    • show_bases (bool) \u2013

      Show the base classes of a class.

    • show_category_heading (bool) \u2013

      When grouped by categories, show a heading for each category.

    • show_docstring_attributes (bool) \u2013

      Whether to display the 'Attributes' section in the object's docstring.

    • show_docstring_classes (bool) \u2013

      Whether to display the 'Classes' section in the object's docstring.

    • show_docstring_description (bool) \u2013

      Whether to display the textual block (including admonitions) in the object's docstring.

    • show_docstring_examples (bool) \u2013

      Whether to display the 'Examples' section in the object's docstring.

    • show_docstring_functions (bool) \u2013

      Whether to display the 'Functions' or 'Methods' sections in the object's docstring.

    • show_docstring_modules (bool) \u2013

      Whether to display the 'Modules' section in the object's docstring.

    • show_docstring_other_parameters (bool) \u2013

      Whether to display the 'Other Parameters' section in the object's docstring.

    • show_docstring_parameters (bool) \u2013

      Whether to display the 'Parameters' section in the object's docstring.

    • show_docstring_raises (bool) \u2013

      Whether to display the 'Raises' section in the object's docstring.

    • show_docstring_receives (bool) \u2013

      Whether to display the 'Receives' section in the object's docstring.

    • show_docstring_returns (bool) \u2013

      Whether to display the 'Returns' section in the object's docstring.

    • show_docstring_warns (bool) \u2013

      Whether to display the 'Warns' section in the object's docstring.

    • show_docstring_yields (bool) \u2013

      Whether to display the 'Yields' section in the object's docstring.

    • show_if_no_docstring (bool) \u2013

      Show the object heading even if it has no docstring or children with docstrings.

    • show_inheritance_diagram (bool) \u2013

      Show the inheritance diagram of a class using Mermaid.

    • show_labels (bool) \u2013

      Whether to show labels of the members.

    • show_object_full_path (bool) \u2013

      Show the full Python path of every object.

    • show_overloads (bool) \u2013

      Show the overloads of a function or method.

    • show_root_full_path (bool) \u2013

      Show the full Python path for the root object heading.

    • show_root_heading (bool) \u2013

      Show the heading of the object at the root of the documentation tree.

    • show_root_members_full_path (bool) \u2013

      Show the full Python path of the root members.

    • show_root_toc_entry (bool) \u2013

      If the root heading is not shown, at least add a ToC entry for it.

    • show_signature (bool) \u2013

      Show methods and functions signatures.

    • show_signature_annotations (bool) \u2013

      Show the type annotations in methods and functions signatures.

    • show_source (bool) \u2013

      Show the source code of this object.

    • show_submodules (bool) \u2013

      When rendering a module, show its submodules recursively.

    • show_symbol_type_heading (bool) \u2013

      Show the symbol type in headings (e.g. mod, class, meth, func and attr).

    • show_symbol_type_toc (bool) \u2013

      Show the symbol type in the Table of Contents (e.g. mod, class, methd, func and attr).

    • signature_crossrefs (bool) \u2013

      Whether to render cross-references for type annotations in signatures.

    • summary (SummaryOption) \u2013

      Whether to render summaries of modules, classes, functions (methods) and attributes.

    • toc_label (str) \u2013

      A custom string to override the autogenerated toc label of the root object.

    • unwrap_annotated (bool) \u2013

      Whether to unwrap Annotated types to show only the type without the annotations.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.allow_inspection","title":"allow_inspection class-attribute instance-attribute","text":"
    allow_inspection: bool = True\n

    Whether to allow inspecting modules when visiting them is not possible.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.annotations_path","title":"annotations_path class-attribute instance-attribute","text":"
    annotations_path: Literal['brief', 'source', 'full'] = 'brief'\n

    The verbosity for annotations path: brief (recommended), source (as written in the source), or full.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.backlinks","title":"backlinks class-attribute instance-attribute","text":"
    backlinks: Literal['flat', 'tree', False] = False\n

    Whether to render backlinks, and how.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.docstring_options","title":"docstring_options class-attribute instance-attribute","text":"
    docstring_options: (\n    GoogleStyleOptions\n    | NumpyStyleOptions\n    | SphinxStyleOptions\n    | AutoStyleOptions\n    | None\n) = None\n

    The options for the docstring parser.

    See docstring parsers and their options in Griffe docs.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.docstring_section_style","title":"docstring_section_style class-attribute instance-attribute","text":"
    docstring_section_style: Literal['table', 'list', 'spacy'] = 'table'\n

    The style used to render docstring sections.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.docstring_style","title":"docstring_style class-attribute instance-attribute","text":"
    docstring_style: Literal['auto', 'google', 'numpy', 'sphinx'] | None = 'google'\n

    The docstring style to use: auto, google, numpy, sphinx, or None.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.extensions","title":"extensions class-attribute instance-attribute","text":"
    extensions: list[str | dict[str, Any]] = field(default_factory=list)\n

    A list of Griffe extensions to load.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.extra","title":"extra class-attribute instance-attribute","text":"
    extra: dict[str, Any] = field(default_factory=dict)\n

    Extra options.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.filters","title":"filters class-attribute instance-attribute","text":"
    filters: list[tuple[Pattern, bool]] | Literal[\"public\"] = field(\n    default_factory=lambda: [\n        (compile(removeprefix(\"!\")), startswith(\"!\")) for filtr in _DEFAULT_FILTERS\n    ]\n)\n

    A list of filters, or \"public\".

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.find_stubs_package","title":"find_stubs_package class-attribute instance-attribute","text":"
    find_stubs_package: bool = False\n

    Whether to load stubs package (package-stubs) when extracting docstrings.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.force_inspection","title":"force_inspection class-attribute instance-attribute","text":"
    force_inspection: bool = False\n

    Whether to force using dynamic analysis when loading data.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.group_by_category","title":"group_by_category class-attribute instance-attribute","text":"
    group_by_category: bool = True\n

    Group the object's children by categories: attributes, classes, functions, and modules.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.heading","title":"heading class-attribute instance-attribute","text":"
    heading: str = ''\n

    A custom string to override the autogenerated heading of the root object.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.heading_level","title":"heading_level class-attribute instance-attribute","text":"
    heading_level: int = 2\n

    The initial heading level to use.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.inherited_members","title":"inherited_members class-attribute instance-attribute","text":"
    inherited_members: bool | list[str] = False\n

    A boolean, or an explicit list of inherited members to render.

    If true, select all inherited members, which can then be filtered with members. If false or empty list, do not select any inherited member.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.line_length","title":"line_length class-attribute instance-attribute","text":"
    line_length: int = 60\n

    Maximum line length when formatting code/signatures.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.members","title":"members class-attribute instance-attribute","text":"
    members: list[str] | bool | None = None\n

    A boolean, or an explicit list of members to render.

    If true, select all members without further filtering. If false or empty list, do not render members. If none, select all members and apply further filtering with filters and docstrings.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.members_order","title":"members_order class-attribute instance-attribute","text":"
    members_order: Order | list[Order] = 'alphabetical'\n

    The members ordering to use.

    • __all__: order members according to __all__ module attributes, if declared;
    • alphabetical: order members alphabetically;
    • source: order members as they appear in the source file.

    Since __all__ is a module-only attribute, it can't be used to sort class members, therefore the members_order option accepts a list of ordering methods, indicating ordering preferences.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.merge_init_into_class","title":"merge_init_into_class class-attribute instance-attribute","text":"
    merge_init_into_class: bool = False\n

    Whether to merge the __init__ method into the class' signature and docstring.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.modernize_annotations","title":"modernize_annotations class-attribute instance-attribute","text":"
    modernize_annotations: bool = False\n

    Whether to modernize annotations, for example Optional[str] into str | None.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.parameter_headings","title":"parameter_headings class-attribute instance-attribute","text":"
    parameter_headings: bool = False\n

    Whether to render headings for parameters (therefore showing parameters in the ToC).

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.preload_modules","title":"preload_modules class-attribute instance-attribute","text":"
    preload_modules: list[str] = field(default_factory=list)\n

    Pre-load modules that are not specified directly in autodoc instructions (::: identifier).

    It is useful when you want to render documentation for a particular member of an object, and this member is imported from another package than its parent.

    For an imported member to be rendered, you need to add it to the __all__ attribute of the importing module.

    The modules must be listed as an array of strings.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.relative_crossrefs","title":"relative_crossrefs class-attribute instance-attribute","text":"
    relative_crossrefs: bool = False\n

    Whether to enable the relative crossref syntax.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.scoped_crossrefs","title":"scoped_crossrefs class-attribute instance-attribute","text":"
    scoped_crossrefs: bool = False\n

    Whether to enable the scoped crossref ability.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.separate_signature","title":"separate_signature class-attribute instance-attribute","text":"
    separate_signature: bool = False\n

    Whether to put the whole signature in a code block below the heading.

    If Black or Ruff are installed, the signature is also formatted using them.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.show_bases","title":"show_bases class-attribute instance-attribute","text":"
    show_bases: bool = True\n

    Show the base classes of a class.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.show_category_heading","title":"show_category_heading class-attribute instance-attribute","text":"
    show_category_heading: bool = False\n

    When grouped by categories, show a heading for each category.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.show_docstring_attributes","title":"show_docstring_attributes class-attribute instance-attribute","text":"
    show_docstring_attributes: bool = True\n

    Whether to display the 'Attributes' section in the object's docstring.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.show_docstring_classes","title":"show_docstring_classes class-attribute instance-attribute","text":"
    show_docstring_classes: bool = True\n

    Whether to display the 'Classes' section in the object's docstring.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.show_docstring_description","title":"show_docstring_description class-attribute instance-attribute","text":"
    show_docstring_description: bool = True\n

    Whether to display the textual block (including admonitions) in the object's docstring.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.show_docstring_examples","title":"show_docstring_examples class-attribute instance-attribute","text":"
    show_docstring_examples: bool = True\n

    Whether to display the 'Examples' section in the object's docstring.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.show_docstring_functions","title":"show_docstring_functions class-attribute instance-attribute","text":"
    show_docstring_functions: bool = True\n

    Whether to display the 'Functions' or 'Methods' sections in the object's docstring.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.show_docstring_modules","title":"show_docstring_modules class-attribute instance-attribute","text":"
    show_docstring_modules: bool = True\n

    Whether to display the 'Modules' section in the object's docstring.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.show_docstring_other_parameters","title":"show_docstring_other_parameters class-attribute instance-attribute","text":"
    show_docstring_other_parameters: bool = True\n

    Whether to display the 'Other Parameters' section in the object's docstring.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.show_docstring_parameters","title":"show_docstring_parameters class-attribute instance-attribute","text":"
    show_docstring_parameters: bool = True\n

    Whether to display the 'Parameters' section in the object's docstring.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.show_docstring_raises","title":"show_docstring_raises class-attribute instance-attribute","text":"
    show_docstring_raises: bool = True\n

    Whether to display the 'Raises' section in the object's docstring.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.show_docstring_receives","title":"show_docstring_receives class-attribute instance-attribute","text":"
    show_docstring_receives: bool = True\n

    Whether to display the 'Receives' section in the object's docstring.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.show_docstring_returns","title":"show_docstring_returns class-attribute instance-attribute","text":"
    show_docstring_returns: bool = True\n

    Whether to display the 'Returns' section in the object's docstring.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.show_docstring_warns","title":"show_docstring_warns class-attribute instance-attribute","text":"
    show_docstring_warns: bool = True\n

    Whether to display the 'Warns' section in the object's docstring.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.show_docstring_yields","title":"show_docstring_yields class-attribute instance-attribute","text":"
    show_docstring_yields: bool = True\n

    Whether to display the 'Yields' section in the object's docstring.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.show_if_no_docstring","title":"show_if_no_docstring class-attribute instance-attribute","text":"
    show_if_no_docstring: bool = False\n

    Show the object heading even if it has no docstring or children with docstrings.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.show_inheritance_diagram","title":"show_inheritance_diagram class-attribute instance-attribute","text":"
    show_inheritance_diagram: bool = False\n

    Show the inheritance diagram of a class using Mermaid.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.show_labels","title":"show_labels class-attribute instance-attribute","text":"
    show_labels: bool = True\n

    Whether to show labels of the members.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.show_object_full_path","title":"show_object_full_path class-attribute instance-attribute","text":"
    show_object_full_path: bool = False\n

    Show the full Python path of every object.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.show_overloads","title":"show_overloads class-attribute instance-attribute","text":"
    show_overloads: bool = True\n

    Show the overloads of a function or method.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.show_root_full_path","title":"show_root_full_path class-attribute instance-attribute","text":"
    show_root_full_path: bool = True\n

    Show the full Python path for the root object heading.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.show_root_heading","title":"show_root_heading class-attribute instance-attribute","text":"
    show_root_heading: bool = False\n

    Show the heading of the object at the root of the documentation tree.

    The root object is the object referenced by the identifier after :::.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.show_root_members_full_path","title":"show_root_members_full_path class-attribute instance-attribute","text":"
    show_root_members_full_path: bool = False\n

    Show the full Python path of the root members.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.show_root_toc_entry","title":"show_root_toc_entry class-attribute instance-attribute","text":"
    show_root_toc_entry: bool = True\n

    If the root heading is not shown, at least add a ToC entry for it.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.show_signature","title":"show_signature class-attribute instance-attribute","text":"
    show_signature: bool = True\n

    Show methods and functions signatures.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.show_signature_annotations","title":"show_signature_annotations class-attribute instance-attribute","text":"
    show_signature_annotations: bool = False\n

    Show the type annotations in methods and functions signatures.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.show_source","title":"show_source class-attribute instance-attribute","text":"
    show_source: bool = True\n

    Show the source code of this object.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.show_submodules","title":"show_submodules class-attribute instance-attribute","text":"
    show_submodules: bool = False\n

    When rendering a module, show its submodules recursively.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.show_symbol_type_heading","title":"show_symbol_type_heading class-attribute instance-attribute","text":"
    show_symbol_type_heading: bool = False\n

    Show the symbol type in headings (e.g. mod, class, meth, func and attr).

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.show_symbol_type_toc","title":"show_symbol_type_toc class-attribute instance-attribute","text":"
    show_symbol_type_toc: bool = False\n

    Show the symbol type in the Table of Contents (e.g. mod, class, methd, func and attr).

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.signature_crossrefs","title":"signature_crossrefs class-attribute instance-attribute","text":"
    signature_crossrefs: bool = False\n

    Whether to render cross-references for type annotations in signatures.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.summary","title":"summary class-attribute instance-attribute","text":"
    summary: SummaryOption = field(default_factory=SummaryOption)\n

    Whether to render summaries of modules, classes, functions (methods) and attributes.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.toc_label","title":"toc_label class-attribute instance-attribute","text":"
    toc_label: str = ''\n

    A custom string to override the autogenerated toc label of the root object.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.unwrap_annotated","title":"unwrap_annotated class-attribute instance-attribute","text":"
    unwrap_annotated: bool = False\n

    Whether to unwrap Annotated types to show only the type without the annotations.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.coerce","title":"coerce classmethod","text":"
    coerce(**data: Any) -> MutableMapping[str, Any]\n

    Create an instance from a dictionary.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.PythonOptions.from_data","title":"from_data classmethod","text":"
    from_data(**data: Any) -> Self\n

    Create an instance from a dictionary.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.SphinxStyleOptions","title":"SphinxStyleOptions dataclass","text":"
    SphinxStyleOptions()\n

    Sphinx style docstring options.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.SummaryOption","title":"SummaryOption dataclass","text":"
    SummaryOption(\n    attributes: bool = False,\n    functions: bool = False,\n    classes: bool = False,\n    modules: bool = False,\n)\n

    Summary option.

    Returned by:
    • \u00a0python \u00a0PythonOptions \u00a0summary
    Used by:
    • \u00a0python \u00a0PythonOptions

    Attributes:

    • attributes (bool) \u2013

      Whether to render summaries of attributes.

    • classes (bool) \u2013

      Whether to render summaries of classes.

    • functions (bool) \u2013

      Whether to render summaries of functions (methods).

    • modules (bool) \u2013

      Whether to render summaries of modules.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.SummaryOption.attributes","title":"attributes class-attribute instance-attribute","text":"
    attributes: bool = False\n

    Whether to render summaries of attributes.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.SummaryOption.classes","title":"classes class-attribute instance-attribute","text":"
    classes: bool = False\n

    Whether to render summaries of classes.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.SummaryOption.functions","title":"functions class-attribute instance-attribute","text":"
    functions: bool = False\n

    Whether to render summaries of functions (methods).

    "},{"location":"reference/api/#mkdocstrings_handlers.python.SummaryOption.modules","title":"modules class-attribute instance-attribute","text":"
    modules: bool = False\n

    Whether to render summaries of modules.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_as_attributes_section","title":"do_as_attributes_section","text":"
    do_as_attributes_section(\n    context: Context, attributes: Sequence[Attribute], *, check_public: bool = True\n) -> DocstringSectionAttributes\n

    Build an attributes section from a list of attributes.

    Parameters:

    Returns:

    • DocstringSectionAttributes \u2013

      An attributes docstring section.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_as_attributes_section(attributes)","title":"attributes","text":"(Sequence[Attribute]) \u2013

    The attributes to build the section from.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_as_attributes_section(check_public)","title":"check_public","text":"(bool, default: True ) \u2013

    Whether to check if the attribute is public.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_as_classes_section","title":"do_as_classes_section","text":"
    do_as_classes_section(\n    context: Context, classes: Sequence[Class], *, check_public: bool = True\n) -> DocstringSectionClasses\n

    Build a classes section from a list of classes.

    Parameters:

    Returns:

    • DocstringSectionClasses \u2013

      A classes docstring section.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_as_classes_section(classes)","title":"classes","text":"(Sequence[Class]) \u2013

    The classes to build the section from.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_as_classes_section(check_public)","title":"check_public","text":"(bool, default: True ) \u2013

    Whether to check if the class is public.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_as_functions_section","title":"do_as_functions_section","text":"
    do_as_functions_section(\n    context: Context, functions: Sequence[Function], *, check_public: bool = True\n) -> DocstringSectionFunctions\n

    Build a functions section from a list of functions.

    Parameters:

    Returns:

    • DocstringSectionFunctions \u2013

      A functions docstring section.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_as_functions_section(functions)","title":"functions","text":"(Sequence[Function]) \u2013

    The functions to build the section from.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_as_functions_section(check_public)","title":"check_public","text":"(bool, default: True ) \u2013

    Whether to check if the function is public.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_as_modules_section","title":"do_as_modules_section","text":"
    do_as_modules_section(\n    context: Context, modules: Sequence[Module], *, check_public: bool = True\n) -> DocstringSectionModules\n

    Build a modules section from a list of modules.

    Parameters:

    Returns:

    • DocstringSectionModules \u2013

      A modules docstring section.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_as_modules_section(modules)","title":"modules","text":"(Sequence[Module]) \u2013

    The modules to build the section from.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_as_modules_section(check_public)","title":"check_public","text":"(bool, default: True ) \u2013

    Whether to check if the module is public.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_backlink_tree","title":"do_backlink_tree","text":"
    do_backlink_tree(backlinks: list[Backlink]) -> Tree[BacklinkCrumb]\n

    Build a tree of backlinks.

    Parameters:

    Returns:

    • Tree[BacklinkCrumb] \u2013

      A tree of backlinks.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_backlink_tree(backlinks)","title":"backlinks","text":"(list[Backlink]) \u2013

    The list of backlinks.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_crossref","title":"do_crossref","text":"
    do_crossref(path: str, *, brief: bool = True) -> Markup\n

    Deprecated. Filter to create cross-references.

    Parameters:

    Returns:

    • Markup \u2013

      Markup text.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_crossref(path)","title":"path","text":"(str) \u2013

    The path to link to.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_crossref(brief)","title":"brief","text":"(bool, default: True ) \u2013

    Show only the last part of the path, add full path as hover.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_filter_objects","title":"do_filter_objects","text":"
    do_filter_objects(\n    objects_dictionary: dict[str, Object | Alias],\n    *,\n    filters: Sequence[tuple[Pattern, bool]] | Literal[\"public\"] | None = None,\n    members_list: bool | list[str] | None = None,\n    inherited_members: bool | list[str] = False,\n    keep_no_docstrings: bool = True\n) -> list[Object | Alias]\n

    Filter a dictionary of objects based on their docstrings.

    Parameters:

    Returns:

    • list[Object | Alias] \u2013

      A list of objects.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_filter_objects(objects_dictionary)","title":"objects_dictionary","text":"(dict[str, Object | Alias]) \u2013

    The dictionary of objects.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_filter_objects(filters)","title":"filters","text":"(Sequence[tuple[Pattern, bool]] | Literal['public'] | None, default: None ) \u2013

    Filters to apply, based on members' names, or \"public\". Each element is a tuple: a pattern, and a boolean indicating whether to reject the object if the pattern matches.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_filter_objects(members_list)","title":"members_list","text":"(bool | list[str] | None, default: None ) \u2013

    An optional, explicit list of members to keep. When given and empty, return an empty list. When given and not empty, ignore filters and docstrings presence/absence.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_filter_objects(inherited_members)","title":"inherited_members","text":"(bool | list[str], default: False ) \u2013

    Whether to keep inherited members or exclude them.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_filter_objects(keep_no_docstrings)","title":"keep_no_docstrings","text":"(bool, default: True ) \u2013

    Whether to keep objects with no/empty docstrings (recursive check).

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_format_attribute","title":"do_format_attribute","text":"
    do_format_attribute(\n    context: Context,\n    attribute_path: Markup,\n    attribute: Attribute,\n    line_length: int,\n    *,\n    crossrefs: bool = False\n) -> str\n

    Format an attribute.

    Parameters:

    Returns:

    • str \u2013

      The same code, formatted.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_format_attribute(context)","title":"context","text":"(Context) \u2013

    Jinja context, passed automatically.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_format_attribute(attribute_path)","title":"attribute_path","text":"(Markup) \u2013

    The path of the callable we render the signature of.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_format_attribute(attribute)","title":"attribute","text":"(Attribute) \u2013

    The attribute we render the signature of.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_format_attribute(line_length)","title":"line_length","text":"(int) \u2013

    The line length.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_format_attribute(crossrefs)","title":"crossrefs","text":"(bool, default: False ) \u2013

    Whether to cross-reference types in the signature.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_format_code","title":"do_format_code","text":"
    do_format_code(code: str, line_length: int) -> str\n

    Format code.

    Parameters:

    Returns:

    • str \u2013

      The same code, formatted.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_format_code(code)","title":"code","text":"(str) \u2013

    The code to format.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_format_code(line_length)","title":"line_length","text":"(int) \u2013

    The line length.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_format_signature","title":"do_format_signature","text":"
    do_format_signature(\n    context: Context,\n    callable_path: Markup,\n    function: Function,\n    line_length: int,\n    *,\n    annotations: bool | None = None,\n    crossrefs: bool = False\n) -> str\n

    Format a signature.

    Parameters:

    Returns:

    • str \u2013

      The same code, formatted.

    Referenced by:
    • Home Changelog 1.0.0 - 2023-05-11 Breaking changes
    • Insiders Getting started Changelog mkdocstrings-python Insiders 1.0.0 May 10, 2023
    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_format_signature(context)","title":"context","text":"(Context) \u2013

    Jinja context, passed automatically.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_format_signature(callable_path)","title":"callable_path","text":"(Markup) \u2013

    The path of the callable we render the signature of.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_format_signature(function)","title":"function","text":"(Function) \u2013

    The function we render the signature of.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_format_signature(line_length)","title":"line_length","text":"(int) \u2013

    The line length.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_format_signature(annotations)","title":"annotations","text":"(bool | None, default: None ) \u2013

    Whether to show type annotations.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_format_signature(crossrefs)","title":"crossrefs","text":"(bool, default: False ) \u2013

    Whether to cross-reference types in the signature.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_get_template","title":"do_get_template","text":"
    do_get_template(env: Environment, obj: str | Object) -> str\n

    Get the template name used to render an object.

    Parameters:

    Returns:

    • str \u2013

      A template name.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_get_template(env)","title":"env","text":"(Environment) \u2013

    The Jinja environment, passed automatically.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_get_template(obj)","title":"obj","text":"(str | Object) \u2013

    A Griffe object, or a template name.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_multi_crossref","title":"do_multi_crossref","text":"
    do_multi_crossref(text: str, *, code: bool = True) -> Markup\n

    Deprecated. Filter to create cross-references.

    Parameters:

    Returns:

    • Markup \u2013

      Markup text.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_multi_crossref(text)","title":"text","text":"(str) \u2013

    The text to scan.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_multi_crossref(code)","title":"code","text":"(bool, default: True ) \u2013

    Whether to wrap the result in a code tag.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_order_members","title":"do_order_members","text":"
    do_order_members(\n    members: Sequence[Object | Alias],\n    order: Order | list[Order],\n    members_list: bool | list[str] | None,\n) -> Sequence[Object | Alias]\n

    Order members given an ordering method.

    Parameters:

    Returns:

    • Sequence[Object | Alias] \u2013

      The same members, ordered.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_order_members(members)","title":"members","text":"(Sequence[Object | Alias]) \u2013

    The members to order.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_order_members(order)","title":"order","text":"(Order | list[Order]) \u2013

    The ordering method.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_order_members(members_list)","title":"members_list","text":"(bool | list[str] | None) \u2013

    An optional member list (manual ordering).

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_split_path","title":"do_split_path","text":"
    do_split_path(path: str, full_path: str) -> Iterator[tuple[str, str, str, str]]\n

    Split object paths for building cross-references.

    Parameters:

    Yields:

    • tuple[str, str, str, str] \u2013

      4-tuples: prefix, word, full path, suffix.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_split_path(path)","title":"path","text":"(str) \u2013

    The path to split.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.do_split_path(full_path)","title":"full_path","text":"(str) \u2013

    The full path, used to compute correct paths for each part of the path.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.get_handler","title":"get_handler","text":"
    get_handler(\n    handler_config: MutableMapping[str, Any], tool_config: MkDocsConfig, **kwargs: Any\n) -> PythonHandler\n

    Return an instance of PythonHandler.

    Parameters:

    Returns:

    • PythonHandler \u2013

      An instance of PythonHandler.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.get_handler(handler_config)","title":"handler_config","text":"(MutableMapping[str, Any]) \u2013

    The handler configuration.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.get_handler(tool_config)","title":"tool_config","text":"(MkDocsConfig) \u2013

    The tool (SSG) configuration.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.config","title":"config","text":"

    Deprecated. Import from mkdocstrings_handlers.python directly.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.handler","title":"handler","text":"

    Deprecated. Import from mkdocstrings_handlers.python directly.

    "},{"location":"reference/api/#mkdocstrings_handlers.python.rendering","title":"rendering","text":"

    Deprecated. Import from mkdocstrings_handlers.python directly.

    "},{"location":"usage/","title":"Usage","text":"

    This is the documentation for the NEW Python handler.

    To read the documentation for the LEGACY handler, go to the legacy handler documentation.

    "},{"location":"usage/#installation","title":"Installation","text":"

    You can install this handler as a mkdocstrings extra:

    pyproject.toml
    # PEP 621 dependencies declaration\n# adapt to your dependencies manager\n[project]\ndependencies = [\n    \"mkdocstrings[python]>=0.18\",\n]\n

    You can also explicitly depend on the handler:

    pyproject.toml
    # PEP 621 dependencies declaration\n# adapt to your dependencies manager\n[project]\ndependencies = [\n    \"mkdocstrings-python\",\n]\n

    The Python handler is the default mkdocstrings handler. You can change the default handler, or explicitely set the Python handler as default by defining the default_handler configuration option of mkdocstrings in mkdocs.yml:

    mkdocs.yml
    plugins:\n- mkdocstrings:\n    default_handler: python\n
    "},{"location":"usage/#injecting-documentation","title":"Injecting documentation","text":"

    With the Python handler installed and configured as default handler, you can inject documentation for a module, class, function, or any other Python object with mkdocstrings' autodoc syntax, in your Markdown pages:

    ::: path.to.object\n

    If another handler was defined as default handler, you can explicitely ask for the Python handler to be used when injecting documentation with the handler option:

    ::: path.to.object\n    handler: python\n
    "},{"location":"usage/#configuration","title":"Configuration","text":"

    When installed, the Python handler becomes the default mkdocstrings handler. You can configure it in mkdocs.yml:

    mkdocs.yml
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        ...  # the Python handler configuration\n
    "},{"location":"usage/#global-only-options","title":"Global-only options","text":"

    Some options are global only, and go directly under the handler's name.

    "},{"location":"usage/#inventories","title":"inventories","text":"

    This option is used to load Sphinx-compatible objects inventories from other documentation sites. For example, you can load the standard library objects inventory like this:

    mkdocs.yml
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        inventories:\n        - https://docs.python.org/3/objects.inv\n

    When loading an inventory, you enable automatic cross-references to other documentation sites like the standard library docs or any third-party package docs. Typically, you want to load the inventories of your project's dependencies, at least those that are used in the public API.

    See mkdocstrings' documentation on inventories for more details.

    Additionally, the Python handler accepts a domains option in the inventory options, which allows to select the inventory domains to load. By default the Python handler only selects the py domain (for Python objects). You might find useful to also enable the std domain:

    mkdocs.yml
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        inventories:\n        - url: https://docs.python-requests.org/en/master/objects.inv\n          domains: [std, py]\n

    "},{"location":"usage/#load_external_modules","title":"load_external_modules","text":"

    This option allows resolving aliases (imports) to any external module. Modules are considered external when they are not part of the package your are injecting documentation for. Setting this option to True will tell the handler to resolve aliases recursively when they are made public through the __all__ variable. By default, the handler will only resolve aliases when they point at a private sibling of the source package, for example aliases going from ast to _ast. Set load_external_modules to False to prevent even that.

    Use with caution

    This can load a lot of modules through Griffe, slowing down your build or triggering errors that Griffe does not yet handle. We recommend using the preload_modules option instead, which acts as an include-list rather than as include-all.

    Example:

    mkdocs.yml
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        load_external_modules: true\n

    "},{"location":"usage/#locale","title":"locale","text":"

    The locale to use when translating template strings. The translation system is not fully ready yet, so we don't recommend setting the option for now.

    "},{"location":"usage/#paths","title":"paths","text":"

    This option is used to provide filesystem paths in which to search for Python modules. Non-absolute paths are computed as relative to MkDocs configuration file. Example:

    mkdocs.yml
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        paths: [src]  # search packages in the src folder\n

    More details at Finding modules.

    "},{"location":"usage/#globallocal-options","title":"Global/local options","text":"

    The other options can be used both globally and locally, under the options key. For example, globally:

    mkdocs.yml
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          do_something: true\n

    ...and locally, overriding the global configuration:

    docs/some_page.md
    ::: package.module.class\n    options:\n      do_something: false\n

    These options affect how the documentation is collected from sources and rendered. See the following tables summarizing the options, and get more details for each option in the following pages:

    • General options: various options that do not fit in the other categories
    • Headings options: options related to headings and the table of contents (or sidebar, depending on the theme used)
    • Members options: options related to filtering or ordering members in the generated documentation
    • Docstrings options: options related to docstrings (parsing and rendering)
    • Signature options: options related to signatures and type annotations
    "},{"location":"usage/#finding-modules","title":"Finding modules","text":"

    There are multiple ways to tell the handler where to find your packages/modules.

    The recommended method is to use the paths option, as it's the only one that works with the -f option of MkDocs, allowing to build the documentation from any location on the file system. Indeed, the paths provided with the paths option are computed as relative to the configuration file (mkdocs.yml), so that the current working directory has no impact on the build process: you can build the docs from any location on your filesystem.

    "},{"location":"usage/#using-the-paths-option","title":"Using the paths option","text":"

    This is the recommended method.

    1. mkdocs.yml in root, package in root

      \ud83d\udcc1 root/\n\u251c\u2500\u2500  mkdocs.yml\n\u2514\u2500\u2500 \ud83d\udcc1 package/\n

      mkdocs.yml
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        paths: [.]  # actually not needed, default\n
    2. mkdocs.yml in root, package in subfolder

      \ud83d\udcc1 root/\n\u251c\u2500\u2500  mkdocs.yml\n\u2514\u2500\u2500 \ud83d\udcc1 src/\n    \u2514\u2500\u2500 \ud83d\udcc1 package/\n

      mkdocs.yml
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        paths: [src]\n
    3. mkdocs.yml in subfolder, package in root

      \ud83d\udcc1 root/\n\u251c\u2500\u2500 \ud83d\udcc1 docs/\n\u2502   \u2514\u2500\u2500  mkdocs.yml\n\u2514\u2500\u2500 \ud83d\udcc1 package/\n

      mkdocs.yml
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        paths: [..]\n
    4. mkdocs.yml in subfolder, package in subfolder

      \ud83d\udcc1 root/\n\u251c\u2500\u2500 \ud83d\udcc1 docs/\n\u2502   \u2514\u2500\u2500  mkdocs.yml\n\u2514\u2500\u2500 \ud83d\udcc1 src/\n    \u2514\u2500\u2500 \ud83d\udcc1 package/\n

      mkdocs.yml
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        paths: [../src]\n

    Except for case 1, which is supported by default, we strongly recommend setting the path to your packages using this option, even if it works without it (for example because your project manager automatically adds src to PYTHONPATH), to make sure anyone can build your docs from any location on their filesystem.

    "},{"location":"usage/#using-the-pythonpath-environment-variable","title":"Using the PYTHONPATH environment variable","text":"

    This method has limitations.

    This method might work for you, with your current setup, but not for others trying your build your docs with their own setup/environment. We recommend using the paths method instead.

    You can take advantage of the usual Python loading mechanisms. In Bash and other shells, you can run your command like this (note the prepended PYTHONPATH=...):

    1. mkdocs.yml in root, package in root

      \ud83d\udcc1 root/\n\u251c\u2500\u2500  mkdocs.yml\n\u2514\u2500\u2500 \ud83d\udcc1 package/\n

      PYTHONPATH=. mkdocs build  # actually not needed, default\n
    2. mkdocs.yml in root, package in subfolder

      \ud83d\udcc1 root/\n\u251c\u2500\u2500  mkdocs.yml\n\u2514\u2500\u2500 \ud83d\udcc1 src/\n    \u2514\u2500\u2500 \ud83d\udcc1 package/\n

      PYTHONPATH=src mkdocs build\n
    3. mkdocs.yml in subfolder, package in root

      \ud83d\udcc1 root/\n\u251c\u2500\u2500 \ud83d\udcc1 docs/\n\u2502   \u2514\u2500\u2500  mkdocs.yml\n\u2514\u2500\u2500 \ud83d\udcc1 package/\n

      PYTHONPATH=. mkdocs build -f docs/mkdocs.yml\n
    4. mkdocs.yml in subfolder, package in subfolder

      \ud83d\udcc1 root/\n\u251c\u2500\u2500 \ud83d\udcc1 docs/\n\u2502   \u2514\u2500\u2500  mkdocs.yml\n\u2514\u2500\u2500 \ud83d\udcc1 src/\n    \u2514\u2500\u2500 \ud83d\udcc1 package/\n

      PYTHONPATH=src mkdocs build -f docs/mkdocs.yml\n
    "},{"location":"usage/#installing-your-package-in-the-current-python-environment","title":"Installing your package in the current Python environment","text":"

    This method has limitations.

    This method might work for you, with your current setup, but not for others trying your build your docs with their own setup/environment. We recommend using the paths method instead.

    Install your package in the current environment, and run MkDocs:

    pipPDMPoetry
    . venv/bin/activate\npip install -e .\nmkdocs build\n
    pdm install\npdm run mkdocs build\n
    poetry install\npoetry run mkdocs build\n
    "},{"location":"usage/customization/","title":"Customization","text":"

    It is possible to customize the output of the generated documentation with CSS and/or by overriding templates.

    "},{"location":"usage/customization/#css-classes","title":"CSS classes","text":"

    Our templates add CSS classes to many HTML elements to make it possible for users to customize the resulting look and feel.

    To add CSS rules and style mkdocstrings' output, put them in a CSS file in your docs folder, for example in docs/css/mkdocstrings.css, and reference this file in MkDocs' extra_css configuration option:

    mkdocs.yml
    extra_css:\n- css/mkdocstrings.css\n

    Example:

    docs/css/mkdocstrings.css
    .doc-section-title {\n  font-weight: bold;\n}\n

    The following CSS classes are used in the generated HTML:

    • doc: on all the following elements
    • doc-children: on divs containing the children of an object
    • doc-object: on divs containing an object
      • doc-attribute: on divs containing an attribute
      • doc-class: on divs containing a class
      • doc-function: on divs containing a function
      • doc-module: on divs containing a module
    • doc-heading: on objects headings
      • doc-object-name: on spans wrapping objects names/paths in the heading
        • doc-KIND-name: as above, specific to the kind of object (module, class, function, attribute)
    • doc-contents: on divs wrapping the docstring then the children (if any)
      • first: same, but only on the root object's contents div
    • doc-labels: on spans wrapping the object's labels
      • doc-label: on small elements containing a label
        • doc-label-LABEL: same, where LABEL is replaced by the actual label
    • doc-section-title: on section titles (depend on the selected style for section rendering)
    • doc-section-item: on section items (depend on the selected style for section rendering)
    • doc-md-description: on divs containing HTML descriptions converted from Markdown docstrings
    • doc-symbol: on code tags of symbol types
      • doc-symbol-heading: on symbol types in headings
      • doc-symbol-toc: on symbol types in the ToC
      • doc-symbol-KIND: specific to the kind of object (module, class, function, method, attribute)

    Example with colorful labels

    CSSResult
    .doc-label { border-radius: 15px; padding: 2px 8px; font-weight: bold; }\n.doc-label-special { background-color: #3330E4; color: white; }\n.doc-label-private { background-color: #F637EC; color: white; }\n.doc-label-property { background-color: #FBB454; color: black; }\n.doc-label-read-only { background-color: #FAEA48; color: black; }\n

    special private property read-only

    "},{"location":"usage/customization/#symbol-types","title":"Symbol types","text":""},{"location":"usage/customization/#colors","title":"Colors","text":"

    You can customize the colors of the symbol types (see show_symbol_type_heading and show_symbol_type_toc) by overriding the values of our CSS variables, for example:

    docs/css/mkdocstrings.css
    [data-md-color-scheme=\"default\"] {\n  --doc-symbol-parameter-fg-color: #df50af;\n  --doc-symbol-attribute-fg-color: #0079ff;\n  --doc-symbol-function-fg-color: #00dfa2;\n  --doc-symbol-method-fg-color: #00dfa2;\n  --doc-symbol-class-fg-color: #d1b619;\n  --doc-symbol-module-fg-color: #ff0060;\n\n  --doc-symbol-parameter-bg-color: #df50af1a;\n  --doc-symbol-attribute-bg-color: #0079ff1a;\n  --doc-symbol-function-bg-color: #00dfa21a;\n  --doc-symbol-method-bg-color: #00dfa21a;\n  --doc-symbol-class-bg-color: #d1b6191a;\n  --doc-symbol-module-bg-color: #ff00601a;\n}\n\n[data-md-color-scheme=\"slate\"] {\n  --doc-symbol-parameter-fg-color: #ffa8cc;\n  --doc-symbol-attribute-fg-color: #963fb8;\n  --doc-symbol-function-fg-color: #6d67e4;\n  --doc-symbol-method-fg-color: #6d67e4;\n  --doc-symbol-class-fg-color: #46c2cb;\n  --doc-symbol-module-fg-color: #f2f7a1;\n\n  --doc-symbol-parameter-bg-color: #ffa8cc1a;\n  --doc-symbol-attribute-bg-color: #963fb81a;\n  --doc-symbol-function-bg-color: #6d67e41a;\n  --doc-symbol-method-bg-color: #6d67e41a;\n  --doc-symbol-class-bg-color: #46c2cb1a;\n  --doc-symbol-module-bg-color: #f2f7a11a;\n}\n

    The [data-md-color-scheme=\"*\"] selectors work with the Material for MkDocs theme. If you are using another theme, adapt the selectors to this theme if it supports light and dark themes, otherwise just override the variables at root level:

    docs/css/mkdocstrings.css
    :root {\n  --doc-symbol-parameter-fg-color: #df50af;\n  --doc-symbol-attribute-fg-color: #0079ff;\n  --doc-symbol-function-fg-color: #00dfa2;\n  --doc-symbol-method-fg-color: #00dfa2;\n  --doc-symbol-class-fg-color: #d1b619;\n  --doc-symbol-module-fg-color: #ff0060;\n\n  --doc-symbol-parameter-bg-color: #df50af1a;\n  --doc-symbol-attribute-bg-color: #0079ff1a;\n  --doc-symbol-function-bg-color: #00dfa21a;\n  --doc-symbol-method-bg-color: #00dfa21a;\n  --doc-symbol-class-bg-color: #d1b6191a;\n  --doc-symbol-module-bg-color: #ff00601a;\n}\n

    Preview

    Try cycling through the themes to see the colors for each theme:

    "},{"location":"usage/customization/#names","title":"Names","text":"

    You can also change the actual symbol names. For example, to use single letters instead of truncated types:

    docs/css/mkdocstrings.css
    .doc-symbol-parameter::after {\n  content: \"P\";\n}\n\n.doc-symbol-attribute::after {\n  content: \"A\";\n}\n\n.doc-symbol-function::after {\n  content: \"F\";\n}\n\n.doc-symbol-method::after {\n  content: \"M\";\n}\n\n.doc-symbol-class::after {\n  content: \"C\";\n}\n\n.doc-symbol-module::after {\n  content: \"M\";\n}\n

    Preview

    • Parameter:
    • Attribute:
    • Function:
    • Method:
    • Class:
    • Module:
    "},{"location":"usage/customization/#templates","title":"Templates","text":"

    Templates are organized into the following tree:

    \ud83d\udcc1 theme/\n\u251c\u2500\u2500  attribute.html\n\u251c\u2500\u2500  attribute.html.jinja\n\u251c\u2500\u2500  backlinks.html.jinja\n\u251c\u2500\u2500  children.html\n\u251c\u2500\u2500  children.html.jinja\n\u251c\u2500\u2500  class.html\n\u251c\u2500\u2500  class.html.jinja\n\u251c\u2500\u2500 \ud83d\udcc1 docstring/\n\u2502   \u251c\u2500\u2500  admonition.html\n\u2502   \u251c\u2500\u2500  admonition.html.jinja\n\u2502   \u251c\u2500\u2500  attributes.html\n\u2502   \u251c\u2500\u2500  attributes.html.jinja\n\u2502   \u251c\u2500\u2500  classes.html\n\u2502   \u251c\u2500\u2500  classes.html.jinja\n\u2502   \u251c\u2500\u2500  examples.html\n\u2502   \u251c\u2500\u2500  examples.html.jinja\n\u2502   \u251c\u2500\u2500  functions.html\n\u2502   \u251c\u2500\u2500  functions.html.jinja\n\u2502   \u251c\u2500\u2500  modules.html\n\u2502   \u251c\u2500\u2500  modules.html.jinja\n\u2502   \u251c\u2500\u2500  other_parameters.html\n\u2502   \u251c\u2500\u2500  other_parameters.html.jinja\n\u2502   \u251c\u2500\u2500  parameters.html\n\u2502   \u251c\u2500\u2500  parameters.html.jinja\n\u2502   \u251c\u2500\u2500  raises.html\n\u2502   \u251c\u2500\u2500  raises.html.jinja\n\u2502   \u251c\u2500\u2500  receives.html\n\u2502   \u251c\u2500\u2500  receives.html.jinja\n\u2502   \u251c\u2500\u2500  returns.html\n\u2502   \u251c\u2500\u2500  returns.html.jinja\n\u2502   \u251c\u2500\u2500  warns.html\n\u2502   \u251c\u2500\u2500  warns.html.jinja\n\u2502   \u251c\u2500\u2500  yields.html\n\u2502   \u2514\u2500\u2500  yields.html.jinja\n\u251c\u2500\u2500  docstring.html\n\u251c\u2500\u2500  docstring.html.jinja\n\u251c\u2500\u2500  expression.html\n\u251c\u2500\u2500  expression.html.jinja\n\u251c\u2500\u2500  function.html\n\u251c\u2500\u2500  function.html.jinja\n\u251c\u2500\u2500  labels.html\n\u251c\u2500\u2500  labels.html.jinja\n\u251c\u2500\u2500  language.html\n\u251c\u2500\u2500  language.html.jinja\n\u251c\u2500\u2500 \ud83d\udcc1 languages/\n\u2502   \u251c\u2500\u2500  en.html\n\u2502   \u251c\u2500\u2500  en.html.jinja\n\u2502   \u251c\u2500\u2500  ja.html\n\u2502   \u251c\u2500\u2500  ja.html.jinja\n\u2502   \u251c\u2500\u2500  zh.html\n\u2502   \u2514\u2500\u2500  zh.html.jinja\n\u251c\u2500\u2500  module.html\n\u251c\u2500\u2500  module.html.jinja\n\u251c\u2500\u2500  signature.html\n\u251c\u2500\u2500  signature.html.jinja\n\u251c\u2500\u2500 \ud83d\udcc1 summary/\n\u2502   \u251c\u2500\u2500  attributes.html\n\u2502   \u251c\u2500\u2500  attributes.html.jinja\n\u2502   \u251c\u2500\u2500  classes.html\n\u2502   \u251c\u2500\u2500  classes.html.jinja\n\u2502   \u251c\u2500\u2500  functions.html\n\u2502   \u251c\u2500\u2500  functions.html.jinja\n\u2502   \u251c\u2500\u2500  modules.html\n\u2502   \u2514\u2500\u2500  modules.html.jinja\n\u251c\u2500\u2500  summary.html\n\u2514\u2500\u2500  summary.html.jinja\n

    See them in the repository. See the general mkdocstrings documentation to learn how to override them: https://mkdocstrings.github.io/theming/#templates.

    Each one of these templates extends a base version in theme/_base. Example:

    theme/class.html
    {% extends \"_base/class.html\" %}\n

    Some of these templates define Jinja blocks. allowing to customize only parts of a template without having to fully copy-paste it into your project:

    templates/theme/class.html
    {% extends \"_base/class.html\" %}\n{% block contents %}\n  {{ block.super }}\n  Additional contents\n{% endblock contents %}\n
    "},{"location":"usage/customization/#available-blocks","title":"Available blocks","text":"

    Only the templates for the Material for MkDocs provide Jinja blocks. The following tables show the block names, description, and the Jinja context available in their scope.

    "},{"location":"usage/customization/#modulehtml","title":"module.html","text":"
    • heading: The module heading.
    • labels: The module labels.
    • contents: The module contents: docstring and children blocks.
    • docstring: The module docstring.
    • summary: The automatic summaries of members.
    • children: The module children.

    Available context:

    • config: The handler configuration (dictionary).
    • module: The Module instance.
    "},{"location":"usage/customization/#classhtml","title":"class.html","text":"
    • heading: The class heading.
    • labels: The class labels.
    • signature: The class signature.
    • contents: The class contents: bases, docstring, source and children blocks.
    • bases: The class bases.
    • docstring: The class docstring.
    • summary: The automatic summaries of members.
    • source: The class source code.
    • children: The class children.

    Available context:

    • config: The handler configuration (dictionary).
    • class: The Class instance.
    "},{"location":"usage/customization/#functionhtml","title":"function.html","text":"
    • heading: The function heading.
    • labels: The function labels.
    • signature: The function signature.
    • contents: The function contents: docstring and source blocks.
    • docstring: The function docstring.
    • source: The function source code.

    Available context:

    • config: The handler configuration (dictionary).
    • function: The Function instance.
    "},{"location":"usage/customization/#attributehtml","title":"attribute.html","text":"
    • heading: The attribute heading.
    • labels: The attribute labels.
    • signature: The attribute signature.
    • contents: The attribute contents: docstring block.
    • docstring: The attribute docstring.

    Available context:

    • config: The handler configuration (dictionary).
    • attribute: The Attribute instance.
    "},{"location":"usage/customization/#docstring-sections","title":"Docstring sections","text":"

    In docstring/attributes.html, docstring/functions.html, docstring/classes.html, docstring/modules.html, docstring/other_parameters.html, docstring/parameters.html, docstring/raises.html, docstring/receives.html, docstring/returns.html, docstring/warns.html, and docstring/yields.html:

    • table_style: The section as a table.
    • list_style: The section as a list.
    • spacy_style: The section as a Spacy table.

    Available context:

    • section: The DocstringSection instance (see DocstringSection* subclasses).
    "},{"location":"usage/customization/#syntax-highlight-in-signatures","title":"Syntax highlight in signatures","text":"

    You can customize the colors in syntax highlighted signatures. If you are using the Material for MkDocs theme, here are some customization examples:

    /* Fancier color for operators such as * and |. */\n.doc-signature .o {\n  color: var(--md-code-hl-special-color);\n}\n\n/* Fancier color for constants such as None, True, and False. */\n.doc-signature .kc {\n  color: var(--md-code-hl-constant-color);\n}\n\n/* Fancier color for built-in types (only useful when cross-references are used). */\n.doc-signature .n > a[href^=\"https://docs.python.org/\"][href*=\"/functions.html#\"],\n.doc-signature .n > a[href^=\"https://docs.python.org/\"][href*=\"/stdtypes.html#\"] {\n  color: var(--md-code-hl-constant-color);\n}\n

    For other themes, use their own CSS variables, or use plain colors such as violet or #2987f2.

    "},{"location":"usage/customization/#style-recommendations","title":"Style recommendations","text":""},{"location":"usage/customization/#material","title":"Material","text":"

    Here are some CSS rules for the Material for MkDocs theme:

    /* Indentation. */\ndiv.doc-contents:not(.first) {\n  padding-left: 25px;\n  border-left: .05rem solid var(--md-typeset-table-color);\n}\n\n/* Mark external links as such. */\na.external::after,\na.autorefs-external::after {\n  /* https://primer.style/octicons/arrow-up-right-24 */\n  mask-image: url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M18.25 15.5a.75.75 0 00.75-.75v-9a.75.75 0 00-.75-.75h-9a.75.75 0 000 1.5h7.19L6.22 16.72a.75.75 0 101.06 1.06L17.5 7.56v7.19c0 .414.336.75.75.75z\"></path></svg>');\n  -webkit-mask-image: url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M18.25 15.5a.75.75 0 00.75-.75v-9a.75.75 0 00-.75-.75h-9a.75.75 0 000 1.5h7.19L6.22 16.72a.75.75 0 101.06 1.06L17.5 7.56v7.19c0 .414.336.75.75.75z\"></path></svg>');\n  content: ' ';\n\n  display: inline-block;\n  vertical-align: middle;\n  position: relative;\n\n  height: 1em;\n  width: 1em;\n  background-color: currentColor;\n}\n\na.external:hover::after,\na.autorefs-external:hover::after {\n  background-color: var(--md-accent-fg-color);\n}\n\n/* Tree-like output for backlinks. */\n.doc-backlink-list {\n  --tree-clr: var(--md-default-fg-color);\n  --tree-font-size: 1rem;\n  --tree-item-height: 1;\n  --tree-offset: 1rem;\n  --tree-thickness: 1px;\n  --tree-style: solid;\n  display: grid;\n  list-style: none !important;\n}\n\n.doc-backlink-list li > span:first-child {\n  text-indent: .3rem;\n}\n.doc-backlink-list li {\n  padding-inline-start: var(--tree-offset);\n  border-left: var(--tree-thickness) var(--tree-style) var(--tree-clr);\n  position: relative;\n  margin-left: 0 !important;\n\n  &:last-child {\n    border-color: transparent;\n  }\n  &::before{\n    content: '';\n    position: absolute;\n    top: calc(var(--tree-item-height) / 2 * -1 * var(--tree-font-size) + var(--tree-thickness));\n    left: calc(var(--tree-thickness) * -1);\n    width: calc(var(--tree-offset) + var(--tree-thickness) * 2);\n    height: calc(var(--tree-item-height)  * var(--tree-font-size));\n    border-left: var(--tree-thickness) var(--tree-style) var(--tree-clr);\n    border-bottom: var(--tree-thickness) var(--tree-style) var(--tree-clr);\n  }\n  &::after{\n    content: '';\n    position: absolute;\n    border-radius: 50%;\n    background-color: var(--tree-clr);\n    top: calc(var(--tree-item-height) / 2 * 1rem);\n    left: var(--tree-offset) ;\n    translate: calc(var(--tree-thickness) * -1) calc(var(--tree-thickness) * -1);\n  }\n}\n

    "},{"location":"usage/customization/#readthedocs","title":"ReadTheDocs","text":"

    Here are some CSS rules for the built-in ReadTheDocs theme:

    /* Indentation. */\ndiv.doc-contents:not(.first) {\n  padding-left: 25px;\n  border-left: .05rem solid rgba(200, 200, 200, 0.2);\n}\n
    "},{"location":"usage/extensions/","title":"Extensions","text":""},{"location":"usage/extensions/#work-in-progress","title":"Work in Progress!","text":"

    The Python handler supports extensions through mkdocstrings' handler extensions.

    Specifically, additional templates can be added to the handler, and Griffe extensions can instruct the handler to use a particular template for a particular object by setting a value in the Griffe object's extra dictionary:

    griffe_extension.py
    obj = ...  # get a reference to a Griffe object\nif \"mkdocstrings\" not in obj.extra:\n    obj.extra[\"mkdocstrings\"] = {}\nobj.extra[\"mkdocstrings\"][\"template\"] = \"template_name.html\"\n
    "},{"location":"usage/configuration/docstrings/","title":"Docstrings options","text":""},{"location":"usage/configuration/docstrings/#docstring_style","title":"docstring_style","text":"
    • Type str \"google\"

    The docstring style to expect when parsing docstrings.

    Possible values:

    • \"google\": see Google style.
    • \"numpy\": see Numpy style.
    • \"sphinx\": see Sphinx style.
    • None (null or ~ in YAML): no style at all, parse as regular text.
    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          docstring_style: google\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      docstring_style: numpy\n

    The style is applied to the specified object only, not its members.

    Local docstring_style options (in ::: instructions) will only be applied to the specified object, and not its members. Instead of changing the style when rendering, we strongly recommend to set the right style as early as possible, for example by using the auto-style (sponsors only), or with a custom Griffe extension

    Preview

    Every style gets rendered the same way. Here are some docstring examples.

    GoogleNumpySphinx
    def greet(name: str) -> str:\n    \"\"\"Greet someone.\n\n    Parameters:\n        name: The name of the person to greet.\n\n    Returns:\n        A greeting message.\n    \"\"\"\n    return f\"Hello {name}!\"\n
    def greet(name: str) -> str:\n    \"\"\"Greet someone.\n\n    Parameters\n    ----------\n    name\n        The name of the person to greet.\n\n    Returns\n    -------\n    A greeting message.\n    \"\"\"\n    return f\"Hello {name}!\"\n
    def greet(name: str) -> str:\n    \"\"\"Greet someone.\n\n    :param name: The name of the person to greet.\n    :return: A greeting message.\n    \"\"\"\n    return f\"Hello {name}!\"\n

    "},{"location":"usage/configuration/docstrings/#docstring_options","title":"docstring_optionsPrintOKPrintOK","text":"
    • Type dict {}

    The options for the docstring parser.

    • Google-style options
    • Numpydoc-style options

    The Sphinx style does not offer any option.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          docstring_options:\n            ignore_init_summary: false\n            trim_doctest_flags: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      docstring_options:\n        ignore_init_summary: true\n        trim_doctest_flags: false\n
    class PrintOK:\n    \"\"\"Class docstring.\"\"\"\n\n    def __init__(self):\n        \"\"\"Initialize the instance.\n\n        Examples:\n            >>> PrintOK()  # doctest: +NORMALIZE_WHITESPACE\n            ok\n        \"\"\"\n        print(\"ok\")\n

    Preview

    Ignore init summary, trim doctest flagsKeep init summary and doctest flags

    Class docstring.

    __init__

    Examples:

    >>> PrintOK()\nok\n

    Class docstring.

    __init__

    Initialize the instance.

    Examples:

    >>> PrintOK()  # doctest: +NORMALIZE_WHITESPACE\nok\n

    "},{"location":"usage/configuration/docstrings/#docstring_section_style","title":"docstring_section_style","text":"
    • Type str \"table\"

    The style used to render docstring sections.

    A section is a block of text that has a special meaning in a docstring. There are sections for documenting attributes of an object, parameters of a function, exceptions raised by a function, the return value of a function, etc.

    Sections are parsed as structured data and can therefore be rendered in different ways. Possible values:

    • \"table\": a simple table, usually with type, name and description columns
    • \"list\": a simple list, akin to what you get with the ReadTheDocs Sphinx theme
    • \"spacy\": a poor implementation of the amazing tables in Spacy's documentation
    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          docstring_section_style: table\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      docstring_section_style: list\n

    Preview

    TableListSpacy

    Tables work well when you have lots of items with short names, type annotations, descriptions, etc.. With longer strings, the columns risk getting squished horizontally. In that case, the Spacy tables can help.

    Parameters:

    Type Name Description Default int threshold Threshold for something. required bool flag Enable something. False

    Other Parameters:

    Type Name Description Default list[int | float] gravity_forces Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. required VacuumType | Literal[\"regular\"] vacuum_type Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. VacuumType.PLASMA

    Lists work well whatever the length of names, type annotations, descriptions, etc.

    Parameters:

    • threshold (int) \u2014 Threshold for something.
    • flag (bool) \u2014 Enable something.

    Other Parameters:

    • gravity_forces (list[int | float]) \u2014 Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
    • vacuum_type (VacuumType | Literal[\"regular\"]) \u2014 Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

    Spacy tables work better than regular tables with longer names, type annotations, descriptions, etc., by reserving more horizontal space on the second column.

    Parameters:

    Name Description threshold Threshold for something.TYPE: int DEFAULT: required flag Enable something.TYPE: bool DEFAULT: False

    Other Parameters:

    Name Description gravity_forces Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.TYPE: list[int | float] DEFAULT: required vacuum_type Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.TYPE:VacuumType | Literal[\"regular\"] DEFAULT: VacuumType.PLASMA

    "},{"location":"usage/configuration/docstrings/#merge_init_into_class","title":"merge_init_into_classThing(value=0)Thing","text":"
    • Type bool False

    Whether to merge the __init__ method into the class' signature and docstring.

    By default, only the class name is rendered in headings. When merging, the __init__ method parameters are added after the class name, like a signature, and the __init__ method docstring is appended to the class' docstring. This option is well used in combination with the ignore_init_summary docstring option, to discard the first line of the __init__ docstring which is not often useful.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          docstring_options:\n            ignore_init_summary: false\n          merge_init_into_class: false\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      docstring_options:\n        ignore_init_summary: true\n      merge_init_into_class: true\n
    class Thing:\n    \"\"\"A class for things.\"\"\"\n\n    def __init__(self, value: int = 0):\n        \"\"\"Initialize a thing.\n\n        Parameters:\n            value: The thing's value.\n        \"\"\"\n        self.value = value\n

    Preview

    Merged, summary discardedUnmerged, summary kept

    Class docstring.

    Parameters:

    Type Name Description Default int value The thing's value. 0

    Class docstring.

    __init__(value=0)

    Initialize a thing.

    Parameters:

    Type Name Description Default int value The thing's value. 0

    "},{"location":"usage/configuration/docstrings/#relative_crossrefs","title":"relative_crossrefs","text":"

    Sponsors only \u2014 Insiders 1.9.0

    • Type bool False

    Whether to enable the relative-crossref syntax.

    The relative-crossref syntax lets you reference the current object or its parent by prefixing a crossref identifier with dots. For example, to cross-reference the current object's name member, you can write [link to name attribute][.name]. The \"current object\" is the object containing the docstring being rendered.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          relative_crossrefs: false\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      relative_crossrefs: true\n

    Examples

    pkg/module.py
    \"\"\"Summary.\n\n- Link to [`module`][.].\n- Link to [`module_attribute`][.module_attribute].\n- Link to [`Class`][.Class].\n- Link to [`class_attribute`][.Class.class_attribute].\n- Link to [`instance_attribute`][.Class.instance_attribute].\n- Link to [`method`][.Class.method].\n\"\"\"\n\nmodule_attribute = 0\n\"\"\"Summary.\n\n- Link to [`module`][..].\n- Link to [`module_attribute`][.].\n- Link to [`Class`][..Class].\n- Link to [`class_attribute`][..Class.class_attribute].\n- Link to [`instance_attribute`][..Class.instance_attribute].\n- Link to [`method`][..Class.method].\n\"\"\"\n\nclass Class:\n    \"\"\"Summary.\n\n    - Link to [`module`][..].\n    - Link to [`module_attribute`][..module_attribute].\n    - Link to [`Class`][.].\n    - Link to [`class_attribute`][.class_attribute].\n    - Link to [`instance_attribute`][.instance_attribute].\n    - Link to [`method`][.method].\n    \"\"\"\n\n    class_attribute = 0\n    \"\"\"Summary.\n\n    - Link to [`module`][...].\n    - Link to [`module_attribute`][...module_attribute].\n    - Link to [`Class`][..].\n    - Link to [`class_attribute`][.].\n    - Link to [`instance_attribute`][..instance_attribute].\n    - Link to [`method`][..method].\n    \"\"\"\n\n    def __init__(self):\n        \"\"\"Summary.\n\n        - Link to [`module`][...].\n        - Link to [`module_attribute`][...module_attribute].\n        - Link to [`Class`][..].\n        - Link to [`class_attribute`][..class_attribute].\n        - Link to [`instance_attribute`][..instance_attribute].\n        - Link to [`method`][..method].\n        \"\"\"\n        self.instance_attribute = 0\n        \"\"\"Summary.\n\n        - Link to [`module`][...].\n        - Link to [`module_attribute`][...module_attribute].\n        - Link to [`Class`][..].\n        - Link to [`class_attribute`][..class_attribute].\n        - Link to [`instance_attribute`][.].\n        - Link to [`method`][..method].\n        \"\"\"\n\n    def method(self):\n        \"\"\"Summary.\n\n        - Link to [`module`][...].\n        - Link to [`module_attribute`][...module_attribute].\n        - Link to [`Class`][..].\n        - Link to [`class_attribute`][..class_attribute].\n        - Link to [`instance_attribute`][..instance_attribute].\n        - Link to [`method`][.].\n        \"\"\"\n

    There is an alternative, third-party Python handler that handles relative references: mkdocstrings-python-xref.

    "},{"location":"usage/configuration/docstrings/#scoped_crossrefs","title":"scoped_crossrefs","text":"

    Sponsors only \u2014 Insiders 1.9.0

    • Type bool False

    Whether to enable scoped cross-references.

    With scoped cross-references, you can write identifiers as if you wanted to access them from the current object's scope. The scoping rules do not exactly match Python's: you can reference members and siblings too, without prefixing with self. or cls..

    The following order is applied when resolving a name in a given scope:

    1. member of the current object
    2. parent class
    3. repeat 1-2 within parent's scope

    In practice, it means that the name is first looked up in members, then it is compared against the parent name (only if it's a class), then it is looked up in siblings. It continues climbing up the object tree until there's no parent, in which case it raises a name resolution error.

    Cross-referencing an imported object will directly link to this object if the objects inventory of the project it comes from was loaded. You won't be able to cross-reference it within your own documentation with scoped references, if you happen to be rendering this external object too. In that case, you can use an absolute reference or a relative one instead.

    Another limitation is that you won't be able to reference an external package if its name can be resolved in the current object's scope.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          scoped_crossrefs: false\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      scoped_crossrefs: true\n

    Examples

    pkg/module.py
    \"\"\"Summary.\n\n- Link to [`module_attribute`][module_attribute].\n- Link to [`Class`][Class].\n- Link to [`class_attribute`][Class.class_attribute].\n- Link to [`instance_attribute`][Class.instance_attribute].\n- Link to [`method`][Class.method].\n\"\"\"\n\nmodule_attribute = 0\n\"\"\"Summary.\n\n- Link to [`Class`][Class].\n- Link to [`class_attribute`][Class.class_attribute].\n- Link to [`instance_attribute`][Class.instance_attribute].\n- Link to [`method`][Class.method].\n\"\"\"\n\nclass Class:\n    \"\"\"Summary.\n\n    - Link to [`module_attribute`][module_attribute].\n    - Link to [`class_attribute`][class_attribute].\n    - Link to [`instance_attribute`][instance_attribute].\n    - Link to [`method`][method].\n    \"\"\"\n\n    class_attribute = 0\n    \"\"\"Summary.\n\n    - Link to [`module_attribute`][module_attribute].\n    - Link to [`Class`][Class].\n    - Link to [`instance_attribute`][instance_attribute].\n    - Link to [`method`][method].\n    \"\"\"\n\n    def __init__(self):\n        \"\"\"Summary.\n\n        - Link to [`module_attribute`][module_attribute].\n        - Link to [`Class`][Class].\n        - Link to [`class_attribute`][class_attribute].\n        - Link to [`instance_attribute`][instance_attribute].\n        - Link to [`method`][method].\n        \"\"\"\n        self.instance_attribute = 0\n        \"\"\"Summary.\n\n        - Link to [`module_attribute`][module_attribute].\n        - Link to [`Class`][Class].\n        - Link to [`class_attribute`][class_attribute].\n        - Link to [`method`][method].\n        \"\"\"\n\n    def method(self):\n        \"\"\"Summary.\n\n        - Link to [`module_attribute`][module_attribute].\n        - Link to [`Class`][Class].\n        - Link to [`class_attribute`][class_attribute].\n        - Link to [`instance_attribute`][instance_attribute].\n        \"\"\"\n

    "},{"location":"usage/configuration/docstrings/#show_if_no_docstring","title":"show_if_no_docstringfunction_without_docstringfunction_with_docstringClassWithoutDocstringfunction_with_docstringClassWithoutDocstring","text":"
    • Type bool False

    Show the object heading even if it has no docstring or children with docstrings.

    Without an explicit list of members, members are selected based on filters, and then filtered again to keep only those with docstrings. Checking if a member has a docstring is done recursively: if at least one of its direct or indirect members (lower in the tree) has a docstring, the member is rendered. If the member does not have a docstring, and none of its members have a docstring, it is excluded.

    With this option you can tell the Python handler to skip the docstring check.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_if_no_docstring: false\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      show_if_no_docstring: true\n
    def function_without_docstring():\n    ...\n\n\ndef function_with_docstring():\n    \"\"\"Hello.\"\"\"\n\n\nclass ClassWithoutDocstring:\n    def method_without_docstring(self):\n        ...\n\n    def method_with_docstring(self):\n        \"\"\"Hello.\"\"\"\n

    Preview

    ShowDon't show

    Hello.

    method_without_docstring method_with_docstring

    Hello.

    Hello.

    method_with_docstring

    Hello.

    "},{"location":"usage/configuration/docstrings/#show_docstring_attributes","title":"show_docstring_attributesClassClass","text":"
    • Type bool True

    Whether to render the \"Attributes\" sections of docstrings.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_attributes: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      show_docstring_attributes: false\n
    class Class:\n    \"\"\"Summary.\n\n    Attributes:\n        attr: Some attribute.\n    \"\"\"\n\n    attr: int = 1\n

    Preview

    With attributesWithout attributes

    Summary.

    Attributes:

    Type Name Description int attr Some attribute.

    Summary.

    "},{"location":"usage/configuration/docstrings/#show_docstring_functions","title":"show_docstring_functionsmodulemodule","text":"
    • Type bool True

    Whether to render the \"Functions\" or \"Methods\" sections of docstrings.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_functions: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      show_docstring_functions: false\n
    \"\"\"Summary.\n\nFunctions:\n    foo: Some function.\n\"\"\"\n\n\ndef foo():\n    ...\n\n\nclass Class:\n    \"\"\"Summary.\n\n    Methods:\n        bar: Some method.\n    \"\"\"\n\n    def bar(self):\n        ...\n

    Preview

    With functionsWithout functions

    Summary.

    Functions:

    Name Description foo Some function. Class

    Summary.

    Methods:

    Name Description bar Some method.

    Summary.

    Class

    Summary.

    "},{"location":"usage/configuration/docstrings/#show_docstring_classes","title":"show_docstring_classesmodulemodule","text":"
    • Type bool True

    Whether to render the \"Classes\" sections of docstrings.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_classes: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      show_docstring_classes: false\n
    \"\"\"Summary.\n\nClasses:\n    Class: Some class.\n\"\"\"\n\n\nclass Class:\n    \"\"\"Summary.\"\"\"\n

    Preview

    With classesWithout classes

    Summary.

    Classes:

    Name Description Class Some class. Class

    Summary.

    Summary.

    Class

    Summary.

    "},{"location":"usage/configuration/docstrings/#show_docstring_modules","title":"show_docstring_modulesmodulemodule","text":"
    • Type bool True

    Whether to render the \"Modules\" sections of docstrings.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_modules: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      show_docstring_modules: false\n
    \ud83d\udcc1 module/\n\u251c\u2500\u2500  __init__.py\n\u2514\u2500\u2500  submodule.py\n
    module/__init__.py
    \"\"\"Summary.\n\nModules:\n    submodule: Some module.\n\"\"\"\n

    Preview

    With modulesWithout modules

    Summary.

    Modules:

    Name Description submodule Some module.

    Summary.

    "},{"location":"usage/configuration/docstrings/#show_docstring_description","title":"show_docstring_descriptionClassClass","text":"
    • Type bool True

    Whether to render the textual blocks (including admonitions) of docstrings.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_description: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      show_docstring_description: false\n
    class Class:\n    \"\"\"Summary.\n\n    Long description.\n\n    Warning: Deprecated\n        Stop using this class.\n\n    Attributes:\n        attr: Some attribute.\n    \"\"\"\n\n    attr: int = 1\n

    Preview

    With description blocksWithout description blocks

    Summary.

    Long description.

    Deprecated

    Stop using this class.

    Attributes:

    Type Name Description int attr Some attribute.

    Attributes:

    Type Name Description int attr Some attribute.

    "},{"location":"usage/configuration/docstrings/#show_docstring_examples","title":"show_docstring_examplesprint_helloprint_hello","text":"
    • Type bool True

    Whether to render the \"Examples\" section of docstrings.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_examples: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      show_docstring_examples: false\n
    def print_hello():\n    \"\"\"Print hello.\n\n    Examples:\n        >>> print(\"hello\")\n        hello\n    \"\"\"\n    print(\"hello\")\n

    Preview

    With examplesWithout examples

    Print hello.

    Examples:

    >>> print(\"hello\")\nhello\n

    Print hello.

    "},{"location":"usage/configuration/docstrings/#show_docstring_other_parameters","title":"show_docstring_other_parametersdo_somethingdo_something","text":"
    • Type bool True

    Whether to render the \"Other Parameters\" section of docstrings.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_other_parameters: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      show_docstring_other_parameters: false\n
    def do_something(**kwargs):\n    \"\"\"Do something.\n\n    Other parameters:\n        whatever (int): Some integer.\n    \"\"\"\n

    Preview

    With other parametersWithout other parameters

    Do something.

    Other parameters:

    Type Name Description int whatever Some integer.

    Do something.

    "},{"location":"usage/configuration/docstrings/#show_docstring_parameters","title":"show_docstring_parametersdo_somethingdo_something","text":"
    • Type bool True

    Whether to render the \"Parameters\" section of docstrings.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_parameters: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      show_docstring_parameters: false\n
    def do_something(whatever: int = 0):\n    \"\"\"Do something.\n\n    Parameters:\n        whatever: Some integer.\n    \"\"\"\n

    Preview

    With parametersWithout parameters

    Do something.

    Parameters:

    Type Name Description Default int whatever Some integer. 0

    Do something.

    "},{"location":"usage/configuration/docstrings/#show_docstring_raises","title":"show_docstring_raisesraise_runtime_errorraise_runtime_error","text":"
    • Type bool True

    Whether to render the \"Raises\" section of docstrings.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_raises: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      show_docstring_raises: false\n
    def raise_runtime_error():\n    \"\"\"Raise a runtime error.\n\n    Raises:\n        RuntimeError: Not good.\n    \"\"\"\n    raise RuntimeError\n

    Preview

    With exceptionsWithout exceptions

    Raise a runtime error.

    Raises:

    Type Description RuntimeError Not good.

    Raise a runtime error.

    "},{"location":"usage/configuration/docstrings/#show_docstring_receives","title":"show_docstring_receivesiter_skipiter_skip","text":"
    • Type bool True

    Whether to render the \"Receives\" section of docstrings.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_receives: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      show_docstring_receives: false\n
    def iter_skip(\n    iterable: Iterable[T],\n    initial_skip: int = 0,\n) -> Generator[T, int, None]:\n    \"\"\"Iterate and skip elements.\n\n    Receives:\n        skip: Number of elements to skip.\n    \"\"\"\n    skip = initial_skip\n    for element in iterable:\n        if skip or 0 > 0:\n            skip -= 1\n        else:\n            skip = yield element\n

    Preview

    With received valuesWithout received values

    Iterate and skip elements.

    Receives:

    Type Description int Number of elements to skip.

    Iterate and skip elements.

    "},{"location":"usage/configuration/docstrings/#show_docstring_returns","title":"show_docstring_returnsrandrand","text":"
    • Type bool True

    Whether to render the \"Returns\" section of docstrings.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_returns: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      show_docstring_returns: false\n
    def rand() -> int:\n    \"\"\"Return a random number.\n\n    Returns:\n        A random number.\n    \"\"\"\n    return random.randint(0, 1000)\n

    Preview

    With return valueWithout return value

    Return a random number.

    Returns:

    Type Description int A random number.

    Return a random number.

    "},{"location":"usage/configuration/docstrings/#show_docstring_warns","title":"show_docstring_warnswarnwarn","text":"
    • Type bool True

    Whether to render the \"Warns\" section of docstrings.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_warns: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      show_docstring_warns: false\n
    def warn():\n    \"\"\"Warn user.\n\n    Warns:\n        UserWarning: When this is inappropriate.\n    \"\"\"\n    warnings.warn(UserWarning(\"This is inappropriate\"))\n

    Preview

    With warningsWithout warnings

    Warn user.

    Warns:

    Type Description UserWarning When this is inappropriate.

    Warn user.

    "},{"location":"usage/configuration/docstrings/#show_docstring_yields","title":"show_docstring_yieldsiter_skipiter_skip","text":"
    • Type bool True

    Whether to render the \"Yields\" section of docstrings.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_yields: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      show_docstring_yields: false\n
    def iter_skip(\n    iterable: Iterable[T],\n    initial_skip: int = 0,\n) -> Generator[T, int, None]:\n    \"\"\"Iterate and skip elements.\n\n    Yields:\n        Elements of the iterable.\n    \"\"\"\n    skip = initial_skip\n    for element in iterable:\n        if skip or 0 > 0:\n            skip -= 1\n        else:\n            skip = yield element\n

    Preview

    With yielded valuesWithout yielded values

    Iterate and skip elements.

    Yields:

    Type Description T Elements of the iterable.

    Iterate and skip elements.

    "},{"location":"usage/configuration/general/","title":"General options","text":""},{"location":"usage/configuration/general/#allow_inspection","title":"allow_inspectionSomeClassSomeClass","text":"
    • Type bool True

    Whether to allow inspecting modules (importing them) when it is not possible to visit them (parse their source code).

    When loading data for a given package, Griffe discovers every Python module, compiled or not, and inspects or visits them accordingly.

    If you have compiled modules but also provide stubs for them, you might want to disable the inspection of these modules, because inspection picks up many more members, and sometimes the collected data is inaccurate (depending on the tool that was used to compile the module) or too low-level/technical for API documentation.

    See also force_inspection.

    Packages are loaded only once.

    When mkdocstrings-python collects data from a Python package (thanks to Griffe), it collects the entire package and caches it. Next time an object from the same package is rendered, the package is retrieved from the cache and not collected again. The allow_inspection option will therefore only have an effect the first time a package is collected, and will do nothing for objects rendered afterwards.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          allow_inspection: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.object\n    options:\n      allow_inspection: false\n

    Preview

    With inspectionWithout inspection

    Docstring of the class.

    __eq__

    Method docstring.

    __weakref__

    Method docstring.

    documented_method

    Method docstring.

    Docstring of the class.

    documented_method

    Method docstring.

    "},{"location":"usage/configuration/general/#backlinks","title":"backlinks","text":"

    Sponsors only \u2014 Insiders 1.10.0

    • Type Literal[\"flat\", \"tree\", False] False

    The backlinks option enables rendering of backlinks within your API documentation.

    When an arbitrary section of your documentation links to an API symbol, this link will be collected as a backlink, and rendered below your API symbol. In short, the API symbol will link back to the section that links to it. Such backlinks will help your users navigate the documentation, as they will immediately which functions return a specific symbol, or where a specific symbol is accepted as parameter, etc..

    Each backlink is a list of breadcrumbs that represent the navigation, from the root page down to the given section.

    The available styles for rendering backlinks are flat and tree.

    • flat will render backlinks as a single-layer list. This can lead to repetition of breadcrumbs.
    • tree will combine backlinks into a tree, to remove repetition of breadcrumbs.

    Global-only option.

    For now, the option only works when set globally in mkdocs.yml.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          backlinks: tree\n

    Preview

    FlatTree

    "},{"location":"usage/configuration/general/#extensions","title":"extensions","text":"
    • Type list[str | dict[str, dict[str, Any]]] []

    The extensions option lets you enable Griffe extensions, which enhance or modify the data collected from Python sources (or compiled modules).

    Elements in the list can be strings or dictionaries.

    Strings denote the path to an extension module, like griffe_typingdoc, or to an extension class directly, like griffe_typingdoc.TypingDocExtension. When using a module path, all extensions within that module will be loaded and enabled. Strings can also be the path to a Python module, and a class name separated with :, like scripts/griffe_extensions.py or scripts/griffe_extensions.py:MyExtension.

    Dictionaries have a single key, which is the module/class path (as a dot-separated qualifier or file path and colon-separated class name, like above), and its value is another dictionary specifying options that will be passed when to class constructors when instantiating extensions.

    Packages are loaded only once.

    When mkdocstrings-python collects data from a Python package (thanks to Griffe), it collects the entire package and caches it. Next time an object from the same package is rendered, the package is retrieved from the cache and not collected again. Only the extensions specified the first time the package is loaded will be used. You cannot use a different set of extensions for specific objects rendered afterwards, and you cannot deactivate extensions for objects rendered afterwards either.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          extensions:\n          - griffe_sphinx\n          - griffe_pydantic: {schema: true}\n          - scripts/exts.py:DynamicDocstrings:\n              paths: [mypkg.mymod.myobj]\n
    or in docs/some_page.md (local configuration)
    ::: your_package.your_module.your_func\n    options:\n      extensions:\n      - griffe_typingdoc\n

    "},{"location":"usage/configuration/general/#extra","title":"extra","text":"
    • Type dict {}

    The extra option lets you inject additional variables into the Jinja context used when rendering templates. You can then use this extra context in your overridden templates.

    Local extra options will be merged into the global extra option:

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          extra:\n            hello: world\n
    in docs/some_page.md (local configuration)
    ::: your_package.your_module.your_func\n    options:\n      extra:\n        foo: bar\n

    ...will inject both hello and foo into the Jinja context when rendering your_package.your_module.your_func.

    Warning

    Previously, extra options were supported directly under the options key.

    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          hello: world\n

    Now that we introduced optional validation of options and automatic JSON schema generation thanks to Pydantic, we require extra options to be put under options.extra. Extra options directly under options are still supported, but deprecated, and will emit deprecation warnings. Support will be removed in a future version of mkdocstrings-python.

    "},{"location":"usage/configuration/general/#find_stubs_package","title":"find_stubs_packageyour_funcyour_func","text":"
    • Type bool False

    When looking for documentation specified in autodoc instructions (::: identifier), also look for the stubs package as defined in PEP 561 if it exists. This is useful when most of your documentation is separately provided by such a package and not inline in your main package.

    Packages are loaded only once.

    When mkdocstrings-python collects data from a Python package (thanks to Griffe), it collects the entire package and caches it. Next time an object from the same package is rendered, the package is retrieved from the cache and not collected again. The find_stubs_package option will therefore only have an effect the first time a package is collected, and will do nothing for objects rendered afterwards.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          find_stubs_package: true\n
    or in docs/some_page.md (local configuration)
    ::: your_package.your_module.your_func\n    options:\n      find_stubs_package: true\n
    your_package/your_module.py
    def your_func(a, b):\n    # Function code\n    ...\n\n# rest of your code\n
    your_package-stubs/your_module.pyi
    def your_func(a: int, b: str):\n    \"\"\"\n    <Function docstring>\n    \"\"\"\n    ...\n\n# rest of your code\n

    Preview

    With find_stubs_packageWithout find_stubs_package

    Function docstring

    "},{"location":"usage/configuration/general/#force_inspection","title":"force_inspection","text":"
    • Type bool False

    Whether to force inspecting modules (importing them) even if their source code is available.

    This option is useful when you know that dynamic analysis (inspection) yields better results than static analysis. Do not use this blindly: the recommended approach is to write a Griffe extension that will improve extracted API data. See How to selectively inspect objects.

    See also allow_inspection.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          force_inspection: false\n
    or in docs/some_page.md (local configuration)
    ::: path.to.object\n    options:\n      force_inspection: true\n

    Packages are loaded only once.

    When mkdocstrings-python collects data from a Python package (thanks to Griffe), it collects the entire package and caches it. Next time an object from the same package is rendered, the package is retrieved from the cache and not collected again. The force_inspection option will therefore only have an effect the first time a package is collected, and will do nothing for objects rendered afterwards.

    "},{"location":"usage/configuration/general/#preload_modules","title":"preload_modulesyour_moduleyour_module","text":"
    • Type list[str] | None None

    Pre-load modules that are not specified directly in autodoc instructions (::: identifier). It is useful when you want to render documentation for a particular member of an object, and this member is imported from another package than its parent.

    For an imported member to be rendered, you need to add it to the __all__ attribute of the importing module. The package from which the imported object originates must be accessible to the handler (see Finding modules).

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          preload_modules:\n          - their_package\n
    or in docs/some_page.md (local configuration)
    ::: your_package.your_module\n    options:\n      preload_modules:\n      - their_package\n
    your_package/your_module.py
    from their_package.their_module import their_object\n\n__all__ = [\"their_object\"]\n\n# rest of your code\n

    Preview

    With preloaded modulesWithout preloaded modules

    Docstring of your module.

    their_object

    Docstring of their object.

    Docstring of your module.

    "},{"location":"usage/configuration/general/#show_bases","title":"show_basesSomeClass()SomeClass()","text":"
    • Type bool True

    Show the base classes of a class.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_bases: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.object\n    options:\n      show_bases: false\n

    Preview

    With basesWithout bases

    Bases: SomeBaseClass

    Docstring of the class.

    Docstring of the class.

    "},{"location":"usage/configuration/general/#show_inheritance_diagram","title":"show_inheritance_diagram","text":"

    Sponsors only \u2014 Insiders 1.7.0

    • Type bool False

    Show the inheritance diagram of a class using Mermaid.

    With this option enabled, an inheritance diagram (as a flowchart) will be displayed after a class signature. Each node will act as a cross-reference and will bring you to the relevant class' documentation when clicking on it.

    It should work out of the box with Material for MkDocs. For other themes, you must include Mermaid's Javascript code manually:

    mkdocs.yml
    extra_javascript:\n- https://unpkg.com/mermaid@10.9.0/dist/mermaid.min.js\n
    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_inheritance_diagram: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.object\n    options:\n      show_inheritance_diagram: false\n

    Preview

    With the following classes:

    class SuperAbstract:\n    \"\"\"Super abstract class.\"\"\"\nclass Mixin1:\n    \"\"\"Mixin 1.\"\"\"\nclass Abstract(SuperAbstract, Mixin1):\n    \"\"\"Abstract class.\"\"\"\nclass Mixin2A:\n    \"\"\"Mixin 2A.\"\"\"\nclass Mixin2B(Mixin2A):\n    \"\"\"Mixin 2B.\"\"\"\nclass Concrete(Abstract, Mixin2B):\n    \"\"\"Concrete class.\"\"\"\nclass SuperConcrete(Concrete):\n    \"\"\"Super concrete class.\"\"\"\n

    The diagram for SuperConcrete will look like this:

    flowchart TD\nSuperConcrete[SuperConcrete]\nConcrete[Concrete]\nAbstract[Abstract]\nSuperAbstract[SuperAbstract]\nMixin1[Mixin1]\nMixin2B[Mixin2B]\nMixin2A[Mixin2A]\n\nConcrete --> SuperConcrete\nAbstract --> Concrete\nSuperAbstract --> Abstract\nMixin1 --> Abstract\nMixin2B --> Concrete\nMixin2A --> Mixin2B

    Nodes are not clickable in this example because these classes do not exist in our documentation.

    "},{"location":"usage/configuration/general/#show_source","title":"show_sourcesome_function()some_function()","text":"
    • Type bool True

    Show the source code of this object.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_source: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.object\n    options:\n      show_source: false\n

    Preview

    With sourceWithout source

    Docstring of the function.

    Source code in package/module.py
    def some_function():\n    ...\n

    Docstring of the function.

    "},{"location":"usage/configuration/headings/","title":"Headings options","text":""},{"location":"usage/configuration/headings/#heading","title":"heading","text":"
    • Type str \"\"

    A custom string to use as the heading of the root object (i.e. the object specified directly after the identifier :::). This will override the default heading generated by the plugin. See also the toc_label option.

    Not advised to be used as a global configuration option.

    This option is not advised to be used as a global configuration option, as it will override the default heading for all objects. It is recommended to use it only in specific cases where you want to override the heading for a specific object.

    in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      heading: \"My fancy module\"\n

    "},{"location":"usage/configuration/headings/#heading_level","title":"heading_level","text":"
    • Type int 2

    The initial heading level to use.

    When injecting documentation for an object, the object itself and its members are rendered. For each layer of objects, we increase the heading level by 1.

    The initial heading level will be used for the first layer. If you set it to 3, then headings will start with <h3>.

    If the heading for the root object is not shown, then the initial heading level is used for its members.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          heading_level: 2\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      heading_level: 3\n

    Preview

    With level 3 and root headingWith level 3, without root heading module (3)

    Docstring of the module.

    ClassA (4)

    Docstring of class A.

    ClassB (4)

    Docstring of class B.

    method_1 (5)

    Docstring of the method.

    Docstring of the module.

    ClassA (3)

    Docstring of class A.

    ClassB (3)

    Docstring of class B.

    method_1 (4)

    Docstring of the method.

    "},{"location":"usage/configuration/headings/#parameter_headings","title":"parameter_headings","text":"

    Insiders 1.6.0

    • Type bool False

    Whether to render headings for function/method parameters.

    With this option enabled, each function/method parameter (including parameters of __init__ methods merged in their parent class with the merge_init_into_class option) gets a permalink, an entry in the Table of Contents, and an entry in the generated objects inventory. The permalink and inventory entry allow cross-references from internal and external pages.

    The identifier used in the permalink and inventory is of the following form: path.to.function(param_name). To manually cross-reference a parameter, you can therefore use this Markdown syntax:

    - Class parameter: [`param`][package.module.Class(param)]\n- Method parameter: [`param`][package.module.Class.method(param)]\n- Function parameter: [`param`][package.module.function(param)]\n- Variadic positional parameters: [`*args`][package.module.function(*args)]\n- Variadic keyword parameters: [`**kwargs`][package.module.function(**kwargs)]\n

    Enabling this option along with signature_crossrefs will automatically render cross-references to parameters in class/function/method signatures and attributes values.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          parameter_headings: false\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      parameter_headings: true\n

    Preview: Cross-references

    Preview: Parameter sections

    Table styleList styleSpacy style

    Parameters:

    Name Type Description Default str

    A distribution name.

    'mkdocstrings-python'

    Parameters:

    PARAMETER DESCRIPTION

    A distribution name.

    TYPE: str DEFAULT: 'mkdocstrings-python'

    Preview: Table of contents (with symbol types)

    get_version dist

    To customize symbols, see Customizing symbol types.

    "},{"location":"usage/configuration/headings/#package.get_version","title":"get_version","text":"
    get_version(dist: str = 'mkdocstrings-python') -> str\n

    Get version of the given distribution.

    Parameters:

    Returns:

    • str \u2013

      A version number.

    "},{"location":"usage/configuration/headings/#package.get_version(dist)","title":"dist","text":"(str, default: 'mkdocstrings-python' ) \u2013

    A distribution name.

    "},{"location":"usage/configuration/headings/#package.current_version","title":"current_version module-attribute","text":"
    current_version: str = get_version(dist='mkdocstrings-python')\n

    Current package version.

    "},{"location":"usage/configuration/headings/#package.get_version(dist)","title":"dist","text":""},{"location":"usage/configuration/headings/#package.get_version(dist)","title":"dist","text":"(str, default: 'mkdocstrings-python' ) \u2013

    A distribution name.

    "},{"location":"usage/configuration/headings/#package.get_version(dist)","title":"dist","text":""},{"location":"usage/configuration/headings/#show_root_heading","title":"show_root_headingClassA (2)ClassB (2)method_a1 (2)method_b1 (2)","text":"
    • Type bool False

    Show the heading of the object at the root of the documentation tree (i.e. the object referenced by the identifier after :::).

    It is pretty common to inject documentation for one module per page, especially when following our automatic reference pages recipe. Since each page already has a title, usually being the module's name, we can spare one heading level by not showing the heading for the module itself (heading levels are limited to 6 by the HTML specification).

    Sparing that extra level can be helpful when your objects tree is deeply nested (e.g. method in a class in a class in a module). If your objects tree is not deeply nested, and you are injecting documentation for many different objects on a single page, it might be preferable to render the heading of each object.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_root_heading: false\n
    or in docs/some_page.md (local configuration)
    ::: path.to.ClassA\n    options:\n      show_root_heading: true\n\n::: path.to.ClassB\n    options:\n      show_root_heading: true\n

    Preview

    With root headingWithout root heading

    Docstring of class A.

    method_a1 (3)

    Docstring of the method.

    Docstring of class B.

    method_b1 (3)

    Docstring of the method.

    Docstring of class A.

    Docstring of the method.

    Docstring of class B.

    Docstring of the method.

    "},{"location":"usage/configuration/headings/#show_root_toc_entry","title":"show_root_toc_entry","text":"
    • Type bool True

    If the root heading is not shown, at least add a ToC entry for it.

    If you inject documentation for an object in the middle of a page, after long paragraphs, and without showing the root heading, then you will not be able to link to this particular object as it won't have a permalink and will be \"lost\" in the middle of text. In that case, it is useful to add a hidden anchor to the document, which will also appear in the table of contents.

    In other cases, you might want to disable the entry to avoid polluting the ToC. It is not possible to show the root heading and hide the ToC entry.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_root_toc_entry: true\n
    or in docs/some_page.md (local configuration)
    ## Some heading\n\nLots of text.\n\n::: path.to.object\n    options:\n      show_root_toc_entry: false\n\n## Other heading.\n\nMore text.\n

    Preview

    With ToC entryWithout ToC entry

    Table of contents Some heading object Other heading

    Table of contents Some heading Other heading

    "},{"location":"usage/configuration/headings/#show_root_full_path","title":"show_root_full_pathpackage.module.Class.methodmethod","text":"
    • Type bool True

    Show the full Python path for the root object heading.

    The path of a Python object is the dot-separated list of names under which it is accessible, for example package.module.Class.method.

    With this option you can choose to show the full path of the object you inject documentation for, or just its name. This option impacts only the object you specify, not its members. For members, see the two other options show_root_members_full_path and show_object_full_path.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_root_full_path: true\n
    or in docs/some_page.md (local configuration)
    ::: package.module.Class.method\n    options:\n      show_root_full_path: false\n

    Preview

    With root full pathWithout root full path

    Docstring of the method.

    Docstring of the method.

    "},{"location":"usage/configuration/headings/#show_root_members_full_path","title":"show_root_members_full_pathpackage.module.ClassClass","text":"
    • Type bool False

    Show the full Python path of the root members.

    This option does the same thing as show_root_full_path, but for direct members of the root object instead of the root object itself.

    To show the full path for every member recursively, see show_object_full_path.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_root_members_full_path: true\n
    or in docs/some_page.md (local configuration)
    ::: package.module\n    options:\n      show_root_members_full_path: false\n

    Preview

    With members full pathWithout members full path

    Docstring of the module.

    Docstring of the class.

    method

    Docstring of the method.

    Docstring of the module.

    Docstring of the class.

    method

    Docstring of the method.

    "},{"location":"usage/configuration/headings/#show_object_full_path","title":"show_object_full_pathpackage.module.ClassClass","text":"
    • Type bool False

    Show the full Python path of every object.

    Same as for show_root_members_full_path, but for every member, recursively. This option takes precedence over show_root_members_full_path:

    show_root_members_full_path show_object_full_path Direct root members path False False Name only False True Full True False Full True True Full in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_object_full_path: true\n
    or in docs/some_page.md (local configuration)
    ::: package.module\n    options:\n      show_object_full_path: false\n

    Preview

    With objects full pathWithout objects full path

    Docstring of the module.

    Docstring of the class.

    package.module.Class.method

    Docstring of the method.

    Docstring of the module.

    Docstring of the class.

    method

    Docstring of the method.

    "},{"location":"usage/configuration/headings/#show_category_heading","title":"show_category_headingAttributes (2)Classes (2)module_attribute (2)Class (2)","text":"
    • Type bool False

    When grouped by categories, show a heading for each category. These category headings will appear in the table of contents, allowing you to link to them using their permalinks.

    Not recommended with deeply nested objects.

    When injecting documentation for deeply nested objects, you'll quickly run out of heading levels, and the objects at the bottom of the tree risk all getting documented using H6 headings, which might decrease the readability of your API docs.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          group_by_category: true\n          show_category_heading: true\n
    or in docs/some_page.md (local configuration)
    ::: package.module\n    options:\n      group_by_category: true\n      show_category_heading: false\n

    Preview

    With category headingsWithout category headings

    Docstring of the module.

    module_attribute (3)

    Docstring of the module attribute.

    Class (3)

    Docstring of the class.

    Attributes (4) class_attribute (5)

    Docstring of the class attribute.

    Methods (4) method (5)

    Docstring of the method.

    Docstring of the module.

    Docstring of the module attribute.

    Docstring of the class.

    class_attribute (3)

    Docstring of the class attribute.

    method (3)

    Docstring of the method.

    "},{"location":"usage/configuration/headings/#show_symbol_type_heading","title":"show_symbol_type_heading attribute function ClassattributefunctionClass","text":"

    Insiders 1.1.0

    • Type bool False

    Show the symbol type in headings.

    This option will prefix headings with , , , or types. See also show_symbol_type_toc.

    To customize symbols, see Customizing symbol types.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_symbol_type_heading: true\n
    or in docs/some_page.md (local configuration)
    ::: package.module\n    options:\n      show_symbol_type_heading: false\n

    Preview

    With symbol type in headingsWithout symbol type in headings module

    Docstring of the module.

    Docstring of the module attribute.

    Docstring of the function.

    Docstring of the class.

    method

    Docstring of the method.

    module

    Docstring of the module.

    Docstring of the module attribute.

    Docstring of the function.

    Docstring of the class.

    method

    Docstring of the method.

    "},{"location":"usage/configuration/headings/#show_symbol_type_toc","title":"show_symbol_type_toc","text":"

    Insiders 1.1.0

    • Type bool False

    Show the symbol type in the Table of Contents.

    This option will prefix items in the ToC with , , , or types. See also show_symbol_type_heading.

    To customize symbols, see Customizing symbol types.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_symbol_type_toc: true\n
    or in docs/some_page.md (local configuration)
    ::: package.module\n    options:\n      show_symbol_type_toc: false\n

    Preview

    With symbol type in ToCWithout symbol type in ToC
    • module
    • attribute
    • function
    • Class
      • method
    • module
    • attribute
    • function
    • Class
      • method

    "},{"location":"usage/configuration/headings/#toc_label","title":"toc_label","text":"
    • Type str \"\"

    A custom string to use as the label in the Table of Contents for the root object (i.e. the one specified directly after the identifier :::). This will override the default label generated by the plugin. See also the heading option.

    Not advised to be used as a global configuration option.

    This option is not advised to be used as a global configuration option, as it will override the default label for all objects. It is recommended to use it only in specific cases where you want to override the label for a specific object.

    Use with/without heading.

    If you use this option without specifying a custom heading, the default heading will be used in the page, but the label in the Table of Contents will be the one you specified. By providing both an option for heading and toc_label, we leave the customization entirely up to you.

    in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      heading: \"My fancy module\"\n      toc_label: \"My fancy module\"\n
    "},{"location":"usage/configuration/members/","title":"Members options","text":""},{"location":"usage/configuration/members/#members","title":"membersthis_functionThisClassthis_attributeThisClass","text":"
    • Type list[str] | bool | None None

    An explicit list of members to render.

    Only members declared in this list will be rendered. A member without a docstring will still be rendered, even if show_if_no_docstring is set to false.

    The members will be rendered in the specified order, regardless of the value of members_order. Note that members will still be grouped by category, according to the group_by_category option.

    Passing a falsy value (no, false in YAML) or an empty list ([]) will tell the Python handler not to render any member. Passing a truthy value (yes, true in YAML) will tell the Python handler to render every member.

    Any given value, except for an explicit None (null in YAML) will tell the handler to ignore filters for the object's members. Filters will still be applied to the next layers of members (grand-children).

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          members:\n          - hello  # (1)\n
    1. Most of the time it won't make sense to use this option at the global level.
    or in docs/some_page.md (local configuration)
    ::: package.module\n    options:\n      members:\n      - ThisClass\n      - this_function\n
    package/module.py
    \"\"\"Module docstring.\"\"\"\n\n\ndef this_function():\n    \"\"\"Function docstring.\"\"\"\n\n\nclass ThisClass:\n    \"\"\"Class docstring.\"\"\"\n\n    def method(self):\n        \"\"\"Method docstring.\"\"\"\n\n\nthis_attribute = 0\n\"\"\"Attribute docstring.\"\"\"\n

    Preview

    With members: trueWith members: false or members: []With members: [ThisClass]

    Module docstring.

    Function docstring.

    Class docstring.

    method

    Method docstring.

    Attribute docstring.

    Module docstring.

    Module docstring.

    Class docstring.

    method

    Method docstring.

    The default behavior (with unspecified members or members: null) is to use filters.

    "},{"location":"usage/configuration/members/#inherited_members","title":"inherited_membersBaseMainBaseMain","text":"
    • Type list[str] | bool False

    An explicit list of inherited members (for classes) to render.

    Inherited members are always fetched from classes that are in the same package as the currently rendered class. To fetch members inherited from base classes, themselves coming from external packages, use the preload_modules option. For example, if your class inherits from Pydantic's BaseModel, and you want to render BaseModel's methods in your class, use preload_modules: [pydantic]. The pydantic package must be available in the current environment.

    Passing a falsy value (no, false in YAML) or an empty list ([]) will tell the Python handler not to render any inherited member. Passing a truthy value (yes, true in YAML) will tell the Python handler to render every inherited member.

    When all inherited members are selected with inherited_members: true, it is possible to specify both members and inherited members in the members list:

    inherited_members: true\nmembers:\n- inherited_member_a\n- inherited_member_b\n- member_x\n- member_y\n

    The alternative is not supported:

    inherited_members:\n- inherited_member_a\n- inherited_member_b\nmembers:\n- member_x\n- member_y\n

    ...because it would make members ordering ambiguous/unspecified.

    You can render inherited members only by setting inherited_members: true (or a list of inherited members) and setting members: false:

    inherited_members: true\nmembers: false\n
    inherited_members:\n- inherited_member_a\n- inherited_member_b\nmembers: false\n

    You can render all declared members and all or specific inherited members by leaving members as null (default):

    inherited_members:\n- inherited_member_a\n- inherited_member_b\n# members: null  # (1)\n
    1. In this case, only declared members will be subject to further filtering with filters and docstrings.
    inherited_members: true  # (1)\n# members: null\n
    1. In this case, both declared and inherited members will be subject to further filtering with filters and docstrings.

    You can render all declared members and all or specific inherited members, avoiding further filtering with filters and docstrings by setting members: true:

    inherited_members: true\nmembers: true\n
    inherited_members:\n- inherited_member_a\n- inherited_member_b\nmembers: true\n

    The general rule is that declared or inherited members specified in lists are never filtered out.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          inherited_members: false\n
    or in docs/some_page.md (local configuration)
    ::: package.module\n    options:\n      inherited_members: true\n
    package/module.py
    \"\"\"Module docstring.\"\"\"\n\n\nclass Base:\n    \"\"\"Base class.\"\"\"\n\n    def base(self):\n        \"\"\"Base method.\"\"\"\n\n\nclass Main(Base):\n    \"\"\"Main class.\"\"\"\n\n    def main(self):\n        \"\"\"Main method.\"\"\"\n

    Preview

    With inherited membersWithout inherited members

    Module docstring.

    Base class.

    base

    Base method.

    Main class.

    base

    Base method.

    main

    Main method.

    Module docstring.

    Base class.

    base

    Base method.

    Main class.

    main

    Main method.

    "},{"location":"usage/configuration/members/#members_order","title":"members_orderfunction_afunction_bfunction_cfunction_bfunction_afunction_c","text":"
    • Type str | list[str] \"alphabetical\"

    The members ordering to use. Possible values:

    • __all__ ( Sponsors only \u2014 Insiders 1.12.0): Order according to __all__ attributes. Since classes do not define __all__ attributes, you can specify a second ordering method by using a list.
    • alphabetical: Order by the members names.
    • source: Order members as they appear in the source file.

    The order applies for all members, recursively. The order will be ignored for members that are explicitely sorted using the members option. Note that members will still be grouped by category, according to the group_by_category option.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          members_order: alphabetical\n
    or in docs/some_page.md (local configuration)
    ::: package.module\n    options:\n      members_order: source\n
    or in docs/some_page.md (local configuration)
    ::: package.module\n    options:\n      members_order: [__all__, source]\n
    package/module.py
    \"\"\"Module docstring.\"\"\"\n\n\ndef function_b():\n    \"\"\"Function a.\"\"\"\n\n\ndef function_a():\n    \"\"\"Function b.\"\"\"\n\n\ndef function_c():\n    \"\"\"Function c.\"\"\"\n

    Preview

    With alphabetical orderWith source order

    Module docstring.

    Function a.

    Function b.

    Function c.

    Module docstring.

    Function b.

    Function a.

    Function c.

    "},{"location":"usage/configuration/members/#filters","title":"filtershello_worldhello_world","text":"
    • Type list[str] | Literal[\"public\"] | None [\"!^_[^_]\"]

    A list of filters, or \"public\".

    Filtering methods

    Sponsors only \u2014 Insiders 1.11.0

    The public filtering method will include only public objects: those added to the __all__ attribute of modules, or not starting with a single underscore. Special methods and attributes (\"dunder\" methods/attributes, starting and ending with two underscores), like __init__, __call__, __mult__, etc., are always considered public.

    List of filters

    Filters are regular expressions. These regular expressions are evaluated by Python and so must match the syntax supported by the re module. A filter starting with ! (negative filter) will exclude matching objects instead of including them.

    The default value ([\"!^_[^_]\"]) means: render every object, except those starting with one underscore, unless they start with two underscores. It means that an object whose name is hello, __hello, or __hello__ will be rendered, but not one whose name is _hello.

    Each filter takes precedence over the previous one. This allows for fine-grain selection of objects by adding more specific filters. For example, you can start by unselecting objects that start with _, and add a second filter that re-select objects that start with __. The default filters can therefore be rewritten like this:

    filters:\n- \"!^_\"\n- \"^__\"\n

    If there are no negative filters, the handler considers that everything is unselected first, and then selects things based on your positive filters. If there is at least one negative filter, the handler considers that everything is selected first, and then re-selects/unselects things based on your other filters. In short, filters: [\"a\"] means \"keep nothing except names containing a\", while filters: [\"!a\"] means \"keep everything except names containing a\".

    An empty list of filters tells the Python handler to render every object. The members option takes precedence over filters (filters will still be applied recursively to lower members in the hierarchy).

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          filters:\n          - \"!^_[^_]\"\n
    or in docs/some_page.md (local configuration)
    ::: package.module\n    options:\n      filters: public\n
    package/module.py
    def hello():\n    ...\n\n\ndef _world():\n    ...\n

    Preview

    With filters: []With filters: [\"hello\"]With filters: [\"!hello\"]

    Module docstring.

    Function docstring.

    Function docstring.

    Module docstring.

    Function docstring.

    Module docstring.

    Function docstring.

    Common filters

    Here are some common filters that you might to want to use.

    • [\"!^_\"]: exclude all private/protected/special objects
    • [\"!^_\", \"^__init__$\"]: same as above, but keep __init__ methods
    • [\"!^_[^_]\"]: exclude all private/protected objects, keep special ones (default filters)

    "},{"location":"usage/configuration/members/#group_by_category","title":"group_by_categoryattribute_cClassBfunction_afunction_dfunction_aClassBattribute_cfunction_d","text":"
    • Type bool True

    Group the object members by categories: attributes, classes, functions, and modules.

    Members within a same category will be ordered according to the members_order option. You can use the show_category_heading option to also render a heading for each category.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          group_by_category: true\n
    or in docs/some_page.md (local configuration)
    ::: package.module\n    options:\n      group_by_category: false\n
    package/module.py
    def function_a():\n    ...\n\n\nclass ClassB:\n    ...\n\n\nattribute_C = 0\n\n\ndef function_d():\n    ...\n

    Preview

    With category groupingWithout category grouping

    Module docstring.

    Attribute docstring.

    Class docstring.

    Function docstring.

    Function docstring.

    Module docstring.

    Function docstring.

    Class docstring.

    Attribute docstring.

    Function docstring.

    "},{"location":"usage/configuration/members/#show_submodules","title":"show_submodulessubpackage_membersubmodulesubpackage_member","text":"
    • Type bool False

    When rendering a module, show its submodules recursively.

    This is false by default, because most of the time we render only one module per page, and when rendering a package (a tree of modules and their members) on a single page, we quickly run out of heading levels.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_submodules: true\n
    or in docs/some_page.md (local configuration)
    ::: package.subpackage\n    options:\n      show_submodules: false\n
    package
    \ud83d\udcc1 package\n\u251c\u2500\u2500  __init__.py\n\u2514\u2500\u2500 \ud83d\udcc1 subpackage\n    \u251c\u2500\u2500  __init__.py\n    \u2514\u2500\u2500  submodule.py\n

    Preview

    With submodulesWithout submodules

    Subpackage docstring.

    Member docstring.

    Submodule docstring.

    submodule_member

    Member docstring.

    Subpackage docstring.

    Member docstring.

    "},{"location":"usage/configuration/members/#summary","title":"summaryMyClassMyClass","text":"

    Insiders 1.2.0

    • Type bool | dict[str, bool] False

    Whether to render summaries of modules, classes, functions (methods) and attributes.

    This option accepts a boolean (yes, true, no, false in YAML) or a dictionary with one or more of the following keys: attributes, functions, classes, modules, with booleans as values. Class methods summary is (de)activated with the functions key. By default, summary is false, and by extension all values are false.

    Examples:

    summary: true\n
    summary: false\n
    summary:\n  attributes: false\n  functions: true\n  modules: false\n

    Summaries will be rendered as the corresponding docstring sections. For example, the summary for attributes will be rendered as an Attributes docstring section. The section will be rendered in accordance with the docstring_section_style option. If the objects appearing in the summary are also rendered on the page (or somewhere else on the site), their name will automatically link to their rendered documentation.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          summary: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      summary: false\n

    Preview

    With all summariesWith methods summary only
    ::: path.to.module.MyClass\n    options:\n      summary: true\n

    Class docstring.

    Methods:

    • my_method1: Summary of the method (first docstring line).
    • my_method2: Summary of the method (first docstring line).

    Attributes:

    • attr1: Summary of the attribute (first docstring line).
    • attr2: Summary of the attribute (first docstring line).
    ::: path.to.module.MyClass\n    options:\n      summary:\n        functions: true\n

    Class docstring.

    Methods:

    • my_method1: Summary of the method (first docstring line).
    • my_method2: Summary of the method (first docstring line).

    "},{"location":"usage/configuration/members/#show_labels","title":"show_labels","text":"
    • Type bool True

    Whether to show labels of the members.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_labels: true\n
    or in docs/some_page.md (local configuration)
    ::: package.module\n    options:\n      show_labels: false\n
    package/module.py
    class SomeClass:\n    some_attr: int\n

    Preview

    With labelsWithout labels

    some_attr: int instance-attribute

    some_attr: int

    "},{"location":"usage/configuration/signatures/","title":"Signatures options","text":""},{"location":"usage/configuration/signatures/#annotations_path","title":"annotations_pathconvert(text, md)convert(text, md)convert(text, md)","text":"
    • Type str \"brief\"

    The verbosity for annotations path.

    Possible values:

    • brief (recommended): render only the last component of each type path, not their full paths. For example, it will render Sequence[Path] and not typing.Sequence[pathlib.Path]. Brief annotations will cross-reference the right object anyway, and show the full path in a tooltip when hovering them.
    • source: render annotations as written in the source. For example if you imported typing as t, it will render typing.Sequence as t.Sequence. Each part will cross-reference the relevant object: t will link to the typing module and Sequence will link to the Sequence type.
    • full: render annotations with their full path (the opposite of brief). For example if you import Sequence and Pattern from typing and annoate something using Sequence[Pattern], it will render as typing.Sequence[typing.Pattern], with each part cross-referencing the corresponding object.
    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          annotations_path: brief\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      annotations_path: source\n

    Preview

    Brief annotationsSource annotationsFull annotations
    import markdown\nimport markupsafe\n\n\ndef convert(text: str, md: markdown.Markdown) -> markupsafe.Markup:\n    \"\"\"Convert text to Markdown.\n\n    Parameters:\n        text: The text to convert.\n        md: A Markdown instance.\n\n    Returns:\n        Converted markup.\n    \"\"\"\n    return markupsafe.Markup(md.convert(text))\n

    Convert text to Markdown.

    Parameters:

    Type Description Default str The text to convert. required Markdown A Markdown instance. required

    Returns:

    Type Name Description Markup text Converted markup.
    import markdown\nfrom markupsafe import Markup\n\n\ndef convert(text: str, md: markdown.Markdown) -> Markup:\n    \"\"\"Convert text to Markdown.\n\n    Parameters:\n        text: The text to convert.\n        md: A Markdown instance.\n\n    Returns:\n        Converted markup.\n    \"\"\"\n    return Markup(md.convert(text))\n

    Convert text to Markdown.

    Parameters:

    Type Description Default str The text to convert. required markdown.Markdown A Markdown instance. required

    Returns:

    Type Name Description Markup text Converted markup.
    from markdown import Markdown\nfrom markupsafe import Markup\n\n\ndef convert(text: str, md: Markdown) -> Markup:\n    \"\"\"Convert text to Markdown.\n\n    Parameters:\n        text: The text to convert.\n        md: A Markdown instance.\n\n    Returns:\n        Converted markup.\n    \"\"\"\n    return Markup(md.convert(text))\n

    Convert text to Markdown.

    Parameters:

    Type Description Default str The text to convert. required markdown.Markdown A Markdown instance. required

    Returns:

    Type Name Description markupsafe.Markup text Converted markup.

    "},{"location":"usage/configuration/signatures/#line_length","title":"line_lengthlong_function_namelong_function_name","text":"
    • Type int 60

    Maximum line length when formatting code/signatures.

    When separating signatures from headings with the separate_signature option, the Python handler will try to format the signatures using a formatter and the specified line length.

    The handler will automatically try to format using :

    1. Black
    2. Ruff

    If a formatter is not found, the handler issues an INFO log once.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          separate_signature: true\n          line_length: 60\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      separate_signature: true\n      line_length: 80\n

    Preview

    Line length 60Line length 80
    long_function_name(\n    long_parameter_1=\"hello\",\n    long_parameter_2=\"world\",\n)
    long_function_name(long_parameter_1=\"hello\", long_parameter_2=\"world\")

    "},{"location":"usage/configuration/signatures/#modernize_annotations","title":"modernize_annotations","text":"

    Sponsors only \u2014 Insiders 1.8.0 \u2014 This feature also requires Griffe Insiders to be installed.

    • Type bool False

    Modernize annotations with latest features and PEPs of the Python language.

    The Python language keeps evolving, and often library developers must continue to support a few minor versions of Python. Therefore they cannot use some features that were introduced in the latest versions.

    Yet this doesn't mean they can't enjoy latest features in their docs: Griffe allows to \"modernize\" expressions, for example by replacing typing.Union with PEP 604 type unions |. Thanks to this, mkdocstrings' Python handler can automatically transform type annotations into their modern equivalent. This improves consistency in your docs, and shows users how to use your code with the latest features of the language.

    Modernizations applied:

    • typing.Dict[A, B] becomes dict[A, B]
    • typing.List[A] becomes list[A]
    • typing.Set[A] becomes set[A]
    • typing.Tuple[A] becomes tuple[A]
    • typing.Union[A, B] becomes A | B
    • typing.Optional[A] becomes A | None
    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          modernize_annotations: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.object\n    options:\n      modernize_annotations: false\n

    Preview

    from typing import Optional, Union, List\n\nexample: Optional[Union[int, List[int]]] = None\n
    Unchanged annotationsModernized annotations

    "},{"location":"usage/configuration/signatures/#package.modern.example","title":"example","text":"
    example: Optional[Union[int, List[int]]] = None\n
    "},{"location":"usage/configuration/signatures/#package.modern.example","title":"example","text":"
    example: int | list[int] | None = None\n
    "},{"location":"usage/configuration/signatures/#show_signature","title":"show_signaturefunction(param1, param2=None)function","text":"
    • Type bool True

    Show methods and functions signatures.

    Without it, just the function/method name is rendered.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_signature: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      show_signature: false\n

    Preview

    With signatureWithout signature

    Function docstring.

    Function docstring.

    "},{"location":"usage/configuration/signatures/#show_signature_annotations","title":"show_signature_annotationsfunctionfunction","text":"
    • Type bool False

    Show the type annotations in methods and functions signatures.

    Since the heading can become quite long when annotations are rendered, it is usually best to separate the signature from the heading.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          separate_signature: true\n          show_signature_annotations: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      separate_signature: true\n      show_signature_annotations: false\n

    Preview

    With signature annotationsWithout signature annotations
    function(\n    param1: list[int | float],\n    param2: bool | None = None,\n) -> float\n

    Function docstring.

    function(param1, param2=None)\n

    Function docstring.

    "},{"location":"usage/configuration/signatures/#separate_signature","title":"separate_signaturefunctionfunction(param1, param2=None)","text":"
    • Type bool False

    Whether to put the whole signature in a code block below the heading.

    When separating signatures from headings, the Python handler will try to format the signatures using a formatter and the specified line length.

    The handler will automatically try to format using :

    1. Black
    2. Ruff

    If a formatter is not found, the handler issues an INFO log once.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          separate_signature: false\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      separate_signature: true\n

    Preview

    With separate signatureWithout separate signature
    function(param1, param2=None)\n

    Function docstring.

    Function docstring.

    "},{"location":"usage/configuration/signatures/#show_overloads","title":"show_overloadsfunctionfunction","text":"

    Whether to render function / method overloads.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_overloads: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      show_overloads: false\n

    Preview

    With overloadsWithout overloads

    @overload\nfunction(param1: int): ...\n\n@overload\nfunction(param1: str): ...\n\nfunction(param1: str | int)\n
    Function docstring.

    function(param1: str | int)\n
    Function docstring.

    "},{"location":"usage/configuration/signatures/#signature_crossrefs","title":"signature_crossrefsdo_format_codedo_format_code","text":"

    Insiders 1.0.0

    Whether to render cross-references for type annotations in signatures.

    When signatures are separated from headings with the separate_signature option and type annotations are shown with the show_signature_annotations option, this option will render a cross-reference (link) for each type annotation in the signature.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          separate_signature: true\n          show_signature_annotations: true\n          signature_crossrefs: false\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      separate_signature: true\n      show_signature_annotations: true\n      signature_crossrefs: true\n

    Preview

    With signature cross-referencesWithout signature cross-references
    do_format_code(code: str, line_length: int) -> str\n

    Function docstring.

    do_format_code(code: str, line_length: int) -> str\n

    Function docstring.

    "},{"location":"usage/configuration/signatures/#unwrap_annotated","title":"unwrap_annotated","text":"
    • Type bool False

    Whether to unwrap Annotated types to show only the type without the annotations.

    For example, unwrapping Annotated[int, Gt(10)] will render int.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          unwrap_annotated: false\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      unwrap_annotated: true\n
    "},{"location":"usage/docstrings/google/","title":"Google style","text":""},{"location":"usage/docstrings/google/#work-in-progress","title":"Work in Progress!","text":""},{"location":"usage/docstrings/google/#google-style-admonitions","title":"Google-style admonitions","text":"

    With Google-style docstrings, any section that is not recognized will be transformed into its admonition equivalent. For example:

    DocstringResult
    \"\"\"\nNote:\n    It looks like a section, but it will be rendered as an admonition.\n\nTip: You can even choose a title.\n    This admonition has a custom title!\n\"\"\"\n

    Note

    It looks like a section, but it will be rendered as an admonition.

    You can even choose a title.

    This admonition has a custom title!

    See Napoleon's documentation. See the supported docstring sections on Griffe's documentation.

    "},{"location":"usage/docstrings/numpy/","title":"Numpydoc style","text":""},{"location":"usage/docstrings/numpy/#work-in-progress","title":"Work in Progress!","text":"

    Note

    As Numpy-style is partially supported by the underlying parser, you may experience problems in the building process if your docstring has a Methods section in the class docstring (see #366).

    See Numpydoc's documentation. See the supported docstring sections on Griffe's documentation.

    "},{"location":"usage/docstrings/sphinx/","title":"Sphinx style","text":""},{"location":"usage/docstrings/sphinx/#work-in-progress","title":"Work in Progress!","text":"

    See Sphinx's documentation. See the supported docstring sections on Griffe's documentation.

    "}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 00000000..0b14bb69 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,87 @@ + + + + https://mkdocstrings.github.io/python/ + 2025-05-24 + + + https://mkdocstrings.github.io/python/changelog/ + 2025-05-24 + + + https://mkdocstrings.github.io/python/code_of_conduct/ + 2025-05-24 + + + https://mkdocstrings.github.io/python/contributing/ + 2025-05-24 + + + https://mkdocstrings.github.io/python/credits/ + 2025-05-24 + + + https://mkdocstrings.github.io/python/license/ + 2025-05-24 + + + https://mkdocstrings.github.io/python/insiders/ + 2025-05-24 + + + https://mkdocstrings.github.io/python/insiders/changelog/ + 2025-05-24 + + + https://mkdocstrings.github.io/python/insiders/installation/ + 2025-05-24 + + + https://mkdocstrings.github.io/python/reference/api/ + 2025-05-24 + + + https://mkdocstrings.github.io/python/usage/ + 2025-05-24 + + + https://mkdocstrings.github.io/python/usage/customization/ + 2025-05-24 + + + https://mkdocstrings.github.io/python/usage/extensions/ + 2025-05-24 + + + https://mkdocstrings.github.io/python/usage/configuration/docstrings/ + 2025-05-24 + + + https://mkdocstrings.github.io/python/usage/configuration/general/ + 2025-05-24 + + + https://mkdocstrings.github.io/python/usage/configuration/headings/ + 2025-05-24 + + + https://mkdocstrings.github.io/python/usage/configuration/members/ + 2025-05-24 + + + https://mkdocstrings.github.io/python/usage/configuration/signatures/ + 2025-05-24 + + + https://mkdocstrings.github.io/python/usage/docstrings/google/ + 2025-05-24 + + + https://mkdocstrings.github.io/python/usage/docstrings/numpy/ + 2025-05-24 + + + https://mkdocstrings.github.io/python/usage/docstrings/sphinx/ + 2025-05-24 + + \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz new file mode 100644 index 00000000..f3ba91da Binary files /dev/null and b/sitemap.xml.gz differ diff --git a/docs/snippets/package/__init__.py b/snippets/package/__init__.py similarity index 100% rename from docs/snippets/package/__init__.py rename to snippets/package/__init__.py diff --git a/docs/snippets/package/modern.py b/snippets/package/modern.py similarity index 100% rename from docs/snippets/package/modern.py rename to snippets/package/modern.py diff --git a/src/mkdocstrings_handlers/python/__init__.py b/src/mkdocstrings_handlers/python/__init__.py deleted file mode 100644 index faa9b9f4..00000000 --- a/src/mkdocstrings_handlers/python/__init__.py +++ /dev/null @@ -1,70 +0,0 @@ -"""Python handler for mkdocstrings.""" - -from mkdocstrings_handlers.python._internal.config import ( - AutoStyleOptions, - GoogleStyleOptions, - Inventory, - NumpyStyleOptions, - PerStyleOptions, - PythonConfig, - PythonInputConfig, - PythonInputOptions, - PythonOptions, - SphinxStyleOptions, - SummaryOption, -) -from mkdocstrings_handlers.python._internal.handler import PythonHandler, get_handler -from mkdocstrings_handlers.python._internal.rendering import ( - AutorefsHook, - Order, - Tree, - do_as_attributes_section, - do_as_classes_section, - do_as_functions_section, - do_as_modules_section, - do_backlink_tree, - do_crossref, - do_filter_objects, - do_format_attribute, - do_format_code, - do_format_signature, - do_get_template, - do_multi_crossref, - do_order_members, - do_split_path, - do_stash_crossref, -) - -__all__ = [ - "AutoStyleOptions", - "AutorefsHook", - "GoogleStyleOptions", - "Inventory", - "NumpyStyleOptions", - "Order", - "PerStyleOptions", - "PythonConfig", - "PythonHandler", - "PythonInputConfig", - "PythonInputOptions", - "PythonOptions", - "SphinxStyleOptions", - "SummaryOption", - "Tree", - "do_as_attributes_section", - "do_as_classes_section", - "do_as_functions_section", - "do_as_modules_section", - "do_backlink_tree", - "do_crossref", - "do_filter_objects", - "do_format_attribute", - "do_format_code", - "do_format_signature", - "do_get_template", - "do_multi_crossref", - "do_order_members", - "do_split_path", - "do_stash_crossref", - "get_handler", -] diff --git a/src/mkdocstrings_handlers/python/_internal/config.py b/src/mkdocstrings_handlers/python/_internal/config.py deleted file mode 100644 index 210f8fe2..00000000 --- a/src/mkdocstrings_handlers/python/_internal/config.py +++ /dev/null @@ -1,1058 +0,0 @@ -# Configuration and options dataclasses. - -from __future__ import annotations - -import re -import sys -from dataclasses import field, fields -from typing import TYPE_CHECKING, Annotated, Any, Literal - -from mkdocstrings import get_logger - -from mkdocstrings_handlers.python._internal.rendering import Order # noqa: TC001 - -# YORE: EOL 3.10: Replace block with line 2. -if sys.version_info >= (3, 11): - from typing import Self -else: - from typing_extensions import Self - - -_logger = get_logger(__name__) - -_DEFAULT_FILTERS = ["!^_[^_]"] - -try: - # When Pydantic is available, use it to validate options (done automatically). - # Users can therefore opt into validation by installing Pydantic in development/CI. - # When building the docs to deploy them, Pydantic is not required anymore. - - # When building our own docs, Pydantic is always installed (see `docs` group in `pyproject.toml`) - # to allow automatic generation of a JSON Schema. The JSON Schema is then referenced by mkdocstrings, - # which is itself referenced by mkdocs-material's schema system. For example in VSCode: - # - # "yaml.schemas": { - # "https://squidfunk.github.io/mkdocs-material/schema.json": "mkdocs.yml" - # } - import pydantic - - if getattr(pydantic, "__version__", "1.").startswith("1."): - raise ImportError # noqa: TRY301 - - # YORE: EOL 3.9: Remove block. - if sys.version_info < (3, 10): - try: - import eval_type_backport # noqa: F401 - except ImportError: - _logger.debug( - "Pydantic needs the `eval-type-backport` package to be installed " - "for modern type syntax to work on Python 3.9. " - "Deactivating Pydantic validation for Python handler options.", - ) - raise - - from inspect import cleandoc - - from pydantic import Field as BaseField - from pydantic.dataclasses import dataclass - - _base_url = "https://mkdocstrings.github.io/python/usage" - - def _Field( # noqa: N802 - *args: Any, - description: str, - group: Literal["general", "headings", "members", "docstrings", "signatures"] | None = None, - parent: str | None = None, - **kwargs: Any, - ) -> None: - def _add_markdown_description(schema: dict[str, Any]) -> None: - url = f"{_base_url}/{f'configuration/{group}/' if group else ''}#{parent or schema['title']}" - schema["markdownDescription"] = f"[DOCUMENTATION]({url})\n\n{schema['description']}" - - return BaseField( - *args, - description=cleandoc(description), - field_title_generator=lambda name, _: name, - json_schema_extra=_add_markdown_description, - **kwargs, - ) -except ImportError: - from dataclasses import dataclass # type: ignore[no-redef] - - def _Field(*args: Any, **kwargs: Any) -> None: # type: ignore[misc] # noqa: N802 - pass - - -if TYPE_CHECKING: - from collections.abc import MutableMapping - - -# YORE: EOL 3.9: Remove block. -_dataclass_options = {"frozen": True} -if sys.version_info >= (3, 10): - _dataclass_options["kw_only"] = True - - -# YORE: EOL 3.9: Replace `**_dataclass_options` with `frozen=True, kw_only=True` within line. -@dataclass(**_dataclass_options) # type: ignore[call-overload] -class GoogleStyleOptions: - """Google style docstring options.""" - - ignore_init_summary: Annotated[ - bool, - _Field( - group="docstrings", - parent="docstring_options", - description="Whether to ignore the summary in `__init__` methods' docstrings.", - ), - ] = False - - returns_multiple_items: Annotated[ - bool, - _Field( - group="docstrings", - parent="docstring_options", - description="""Whether to parse multiple items in `Yields` and `Returns` sections. - - When true, each item's continuation lines must be indented. - When false (single item), no further indentation is required. - """, - ), - ] = True - - returns_named_value: Annotated[ - bool, - _Field( - group="docstrings", - parent="docstring_options", - description="""Whether to parse `Yields` and `Returns` section items as name and description, rather than type and description. - - When true, type must be wrapped in parentheses: `(int): Description.`. Names are optional: `name (int): Description.`. - When false, parentheses are optional but the items cannot be named: `int: Description`. - """, - ), - ] = True - - returns_type_in_property_summary: Annotated[ - bool, - _Field( - group="docstrings", - parent="docstring_options", - description="Whether to parse the return type of properties at the beginning of their summary: `str: Summary of the property`.", - ), - ] = False - - receives_multiple_items: Annotated[ - bool, - _Field( - group="docstrings", - parent="docstring_options", - description="""Whether to parse multiple items in `Receives` sections. - - When true, each item's continuation lines must be indented. - When false (single item), no further indentation is required. - """, - ), - ] = True - - receives_named_value: Annotated[ - bool, - _Field( - group="docstrings", - parent="docstring_options", - description="""Whether to parse `Receives` section items as name and description, rather than type and description. - - When true, type must be wrapped in parentheses: `(int): Description.`. Names are optional: `name (int): Description.`. - When false, parentheses are optional but the items cannot be named: `int: Description`. - """, - ), - ] = True - - trim_doctest_flags: Annotated[ - bool, - _Field( - group="docstrings", - parent="docstring_options", - description="Whether to remove doctest flags from Python example blocks.", - ), - ] = True - - warn_unknown_params: Annotated[ - bool, - _Field( - group="docstrings", - parent="docstring_options", - description="Warn about documented parameters not appearing in the signature.", - ), - ] = True - - -# YORE: EOL 3.9: Replace `**_dataclass_options` with `frozen=True, kw_only=True` within line. -@dataclass(**_dataclass_options) # type: ignore[call-overload] -class NumpyStyleOptions: - """Numpy style docstring options.""" - - ignore_init_summary: Annotated[ - bool, - _Field( - group="docstrings", - parent="docstring_options", - description="Whether to ignore the summary in `__init__` methods' docstrings.", - ), - ] = False - - trim_doctest_flags: Annotated[ - bool, - _Field( - group="docstrings", - parent="docstring_options", - description="Whether to remove doctest flags from Python example blocks.", - ), - ] = True - - warn_unknown_params: Annotated[ - bool, - _Field( - group="docstrings", - parent="docstring_options", - description="Warn about documented parameters not appearing in the signature.", - ), - ] = True - - -# YORE: EOL 3.9: Replace `**_dataclass_options` with `frozen=True, kw_only=True` within line. -@dataclass(**_dataclass_options) # type: ignore[call-overload] -class SphinxStyleOptions: - """Sphinx style docstring options.""" - - -# YORE: EOL 3.9: Replace `**_dataclass_options` with `frozen=True, kw_only=True` within line. -@dataclass(**_dataclass_options) # type: ignore[call-overload] -class PerStyleOptions: - """Per style options.""" - - google: Annotated[ - GoogleStyleOptions, - _Field( - group="docstrings", - parent="docstring_options", - description="Google-style options.", - ), - ] = field(default_factory=GoogleStyleOptions) - - numpy: Annotated[ - NumpyStyleOptions, - _Field( - group="docstrings", - parent="docstring_options", - description="Numpydoc-style options.", - ), - ] = field(default_factory=NumpyStyleOptions) - - sphinx: Annotated[ - SphinxStyleOptions, - _Field( - group="docstrings", - parent="docstring_options", - description="Sphinx-style options.", - ), - ] = field(default_factory=SphinxStyleOptions) - - @classmethod - def from_data(cls, **data: Any) -> Self: - """Create an instance from a dictionary.""" - if "google" in data: - data["google"] = GoogleStyleOptions(**data["google"]) - if "numpy" in data: - data["numpy"] = NumpyStyleOptions(**data["numpy"]) - if "sphinx" in data: - data["sphinx"] = SphinxStyleOptions(**data["sphinx"]) - return cls(**data) - - -# YORE: EOL 3.9: Replace `**_dataclass_options` with `frozen=True, kw_only=True` within line. -@dataclass(**_dataclass_options) # type: ignore[call-overload] -class AutoStyleOptions: - """Auto style docstring options.""" - - method: Annotated[ - Literal["heuristics", "max_sections"], - _Field( - group="docstrings", - parent="docstring_options", - description="The method to use to determine the docstring style.", - ), - ] = "heuristics" - - style_order: Annotated[ - list[str], - _Field( - group="docstrings", - parent="docstring_options", - description="The order of the docstring styles to try.", - ), - ] = field(default_factory=lambda: ["sphinx", "google", "numpy"]) - - default: Annotated[ - str | None, - _Field( - group="docstrings", - parent="docstring_options", - description="The default docstring style to use if no other style is detected.", - ), - ] = None - - per_style_options: Annotated[ - PerStyleOptions, - _Field( - group="docstrings", - parent="docstring_options", - description="Per-style options.", - ), - ] = field(default_factory=PerStyleOptions) - - @classmethod - def from_data(cls, **data: Any) -> Self: - """Create an instance from a dictionary.""" - if "per_style_options" in data: - data["per_style_options"] = PerStyleOptions.from_data(**data["per_style_options"]) - return cls(**data) - - -# YORE: EOL 3.9: Replace `**_dataclass_options` with `frozen=True, kw_only=True` within line. -@dataclass(**_dataclass_options) # type: ignore[call-overload] -class SummaryOption: - """Summary option.""" - - attributes: Annotated[ - bool, - _Field( - group="members", - parent="summary", - description="Whether to render summaries of attributes.", - ), - ] = False - - functions: Annotated[ - bool, - _Field( - group="members", - parent="summary", - description="Whether to render summaries of functions (methods).", - ), - ] = False - - classes: Annotated[ - bool, - _Field( - group="members", - parent="summary", - description="Whether to render summaries of classes.", - ), - ] = False - - modules: Annotated[ - bool, - _Field( - group="members", - parent="summary", - description="Whether to render summaries of modules.", - ), - ] = False - - -# YORE: EOL 3.9: Replace `**_dataclass_options` with `frozen=True, kw_only=True` within line. -@dataclass(**_dataclass_options) # type: ignore[call-overload] -class PythonInputOptions: - """Accepted input options.""" - - allow_inspection: Annotated[ - bool, - _Field( - group="general", - description="Whether to allow inspecting modules when visiting them is not possible.", - ), - ] = True - - force_inspection: Annotated[ - bool, - _Field( - group="general", - description="Whether to force using dynamic analysis when loading data.", - ), - ] = False - - annotations_path: Annotated[ - Literal["brief", "source", "full"], - _Field( - group="signatures", - description="The verbosity for annotations path: `brief` (recommended), `source` (as written in the source), or `full`.", - ), - ] = "brief" - - backlinks: Annotated[ - Literal["flat", "tree", False], - _Field( - group="general", - description="Whether to render backlinks, and how.", - ), - ] = False - - docstring_options: Annotated[ - GoogleStyleOptions | NumpyStyleOptions | SphinxStyleOptions | AutoStyleOptions | None, - _Field( - group="docstrings", - description="""The options for the docstring parser. - - See [docstring parsers](https://mkdocstrings.github.io/griffe/reference/docstrings/) and their options in Griffe docs. - """, - ), - ] = None - - docstring_section_style: Annotated[ - Literal["table", "list", "spacy"], - _Field( - group="docstrings", - description="The style used to render docstring sections.", - ), - ] = "table" - - docstring_style: Annotated[ - Literal["auto", "google", "numpy", "sphinx"] | None, - _Field( - group="docstrings", - description="The docstring style to use: `auto`, `google`, `numpy`, `sphinx`, or `None`.", - ), - ] = "google" - - extensions: Annotated[ - list[str | dict[str, Any]], - _Field( - group="general", - description="A list of Griffe extensions to load.", - ), - ] = field(default_factory=list) - - filters: Annotated[ - list[str] | Literal["public"], - _Field( - group="members", - description="""A list of filters, or `"public"`. - - **List of filters** - - A filter starting with `!` will exclude matching objects instead of including them. - The `members` option takes precedence over `filters` (filters will still be applied recursively - to lower members in the hierarchy). - - **Filtering methods** - - [:octicons-heart-fill-24:{ .pulse } Sponsors only](../insiders/index.md){ .insiders } — - [:octicons-tag-24: Insiders 1.11.0](../insiders/changelog.md#1.11.0) - - The `public` method will include only public objects: - those added to `__all__` or not starting with an underscore (except for special methods/attributes). - """, - ), - ] = field(default_factory=lambda: _DEFAULT_FILTERS.copy()) - - find_stubs_package: Annotated[ - bool, - _Field( - group="general", - description="Whether to load stubs package (package-stubs) when extracting docstrings.", - ), - ] = False - - group_by_category: Annotated[ - bool, - _Field( - group="members", - description="Group the object's children by categories: attributes, classes, functions, and modules.", - ), - ] = True - - heading: Annotated[ - str, - _Field( - group="headings", - description="A custom string to override the autogenerated heading of the root object.", - ), - ] = "" - - heading_level: Annotated[ - int, - _Field( - group="headings", - description="The initial heading level to use.", - ), - ] = 2 - - inherited_members: Annotated[ - bool | list[str], - _Field( - group="members", - description="""A boolean, or an explicit list of inherited members to render. - - If true, select all inherited members, which can then be filtered with `members`. - If false or empty list, do not select any inherited member. - """, - ), - ] = False - - line_length: Annotated[ - int, - _Field( - group="signatures", - description="Maximum line length when formatting code/signatures.", - ), - ] = 60 - - members: Annotated[ - list[str] | bool | None, - _Field( - group="members", - description="""A boolean, or an explicit list of members to render. - - If true, select all members without further filtering. - If false or empty list, do not render members. - If none, select all members and apply further filtering with filters and docstrings. - """, - ), - ] = None - - members_order: Annotated[ - Order | list[Order], - _Field( - group="members", - description="""The members ordering to use. - - - `__all__`: order members according to `__all__` module attributes, if declared; - - `alphabetical`: order members alphabetically; - - `source`: order members as they appear in the source file. - - Since `__all__` is a module-only attribute, it can't be used to sort class members, - therefore the `members_order` option accepts a list of ordering methods, - indicating ordering preferences. - """, - ), - ] = "alphabetical" - - merge_init_into_class: Annotated[ - bool, - _Field( - group="docstrings", - description="Whether to merge the `__init__` method into the class' signature and docstring.", - ), - ] = False - - modernize_annotations: Annotated[ - bool, - _Field( - group="signatures", - description="Whether to modernize annotations, for example `Optional[str]` into `str | None`.", - ), - ] = False - - parameter_headings: Annotated[ - bool, - _Field( - group="headings", - description="Whether to render headings for parameters (therefore showing parameters in the ToC).", - ), - ] = False - - preload_modules: Annotated[ - list[str], - _Field( - group="general", - description="""Pre-load modules that are not specified directly in autodoc instructions (`::: identifier`). - - It is useful when you want to render documentation for a particular member of an object, - and this member is imported from another package than its parent. - - For an imported member to be rendered, you need to add it to the `__all__` attribute - of the importing module. - - The modules must be listed as an array of strings. - """, - ), - ] = field(default_factory=list) - - relative_crossrefs: Annotated[ - bool, - _Field( - group="docstrings", - description="Whether to enable the relative crossref syntax.", - ), - ] = False - - scoped_crossrefs: Annotated[ - bool, - _Field( - group="docstrings", - description="Whether to enable the scoped crossref ability.", - ), - ] = False - - show_overloads: Annotated[ - bool, - _Field( - group="signatures", - description="Show the overloads of a function or method.", - ), - ] = True - - separate_signature: Annotated[ - bool, - _Field( - group="signatures", - description="""Whether to put the whole signature in a code block below the heading. - - If Black or Ruff are installed, the signature is also formatted using them. - """, - ), - ] = False - - show_bases: Annotated[ - bool, - _Field( - group="general", - description="Show the base classes of a class.", - ), - ] = True - - show_category_heading: Annotated[ - bool, - _Field( - group="headings", - description="When grouped by categories, show a heading for each category.", - ), - ] = False - - show_docstring_attributes: Annotated[ - bool, - _Field( - group="docstrings", - description="Whether to display the 'Attributes' section in the object's docstring.", - ), - ] = True - - show_docstring_classes: Annotated[ - bool, - _Field( - group="docstrings", - description="Whether to display the 'Classes' section in the object's docstring.", - ), - ] = True - - show_docstring_description: Annotated[ - bool, - _Field( - group="docstrings", - description="Whether to display the textual block (including admonitions) in the object's docstring.", - ), - ] = True - - show_docstring_examples: Annotated[ - bool, - _Field( - group="docstrings", - description="Whether to display the 'Examples' section in the object's docstring.", - ), - ] = True - - show_docstring_functions: Annotated[ - bool, - _Field( - group="docstrings", - description="Whether to display the 'Functions' or 'Methods' sections in the object's docstring.", - ), - ] = True - - show_docstring_modules: Annotated[ - bool, - _Field( - group="docstrings", - description="Whether to display the 'Modules' section in the object's docstring.", - ), - ] = True - - show_docstring_other_parameters: Annotated[ - bool, - _Field( - group="docstrings", - description="Whether to display the 'Other Parameters' section in the object's docstring.", - ), - ] = True - - show_docstring_parameters: Annotated[ - bool, - _Field( - group="docstrings", - description="Whether to display the 'Parameters' section in the object's docstring.", - ), - ] = True - - show_docstring_raises: Annotated[ - bool, - _Field( - group="docstrings", - description="Whether to display the 'Raises' section in the object's docstring.", - ), - ] = True - - show_docstring_receives: Annotated[ - bool, - _Field( - group="docstrings", - description="Whether to display the 'Receives' section in the object's docstring.", - ), - ] = True - - show_docstring_returns: Annotated[ - bool, - _Field( - group="docstrings", - description="Whether to display the 'Returns' section in the object's docstring.", - ), - ] = True - - show_docstring_warns: Annotated[ - bool, - _Field( - group="docstrings", - description="Whether to display the 'Warns' section in the object's docstring.", - ), - ] = True - - show_docstring_yields: Annotated[ - bool, - _Field( - group="docstrings", - description="Whether to display the 'Yields' section in the object's docstring.", - ), - ] = True - - show_if_no_docstring: Annotated[ - bool, - _Field( - group="docstrings", - description="Show the object heading even if it has no docstring or children with docstrings.", - ), - ] = False - - show_inheritance_diagram: Annotated[ - bool, - _Field( - group="docstrings", - description="Show the inheritance diagram of a class using Mermaid.", - ), - ] = False - - show_labels: Annotated[ - bool, - _Field( - group="docstrings", - description="Whether to show labels of the members.", - ), - ] = True - - show_object_full_path: Annotated[ - bool, - _Field( - group="docstrings", - description="Show the full Python path of every object.", - ), - ] = False - - show_root_full_path: Annotated[ - bool, - _Field( - group="docstrings", - description="Show the full Python path for the root object heading.", - ), - ] = True - - show_root_heading: Annotated[ - bool, - _Field( - group="headings", - description="""Show the heading of the object at the root of the documentation tree. - - The root object is the object referenced by the identifier after `:::`. - """, - ), - ] = False - - show_root_members_full_path: Annotated[ - bool, - _Field( - group="headings", - description="Show the full Python path of the root members.", - ), - ] = False - - show_root_toc_entry: Annotated[ - bool, - _Field( - group="headings", - description="If the root heading is not shown, at least add a ToC entry for it.", - ), - ] = True - - show_signature_annotations: Annotated[ - bool, - _Field( - group="signatures", - description="Show the type annotations in methods and functions signatures.", - ), - ] = False - - show_signature: Annotated[ - bool, - _Field( - group="signatures", - description="Show methods and functions signatures.", - ), - ] = True - - show_source: Annotated[ - bool, - _Field( - group="general", - description="Show the source code of this object.", - ), - ] = True - - show_submodules: Annotated[ - bool, - _Field( - group="members", - description="When rendering a module, show its submodules recursively.", - ), - ] = False - - show_symbol_type_heading: Annotated[ - bool, - _Field( - group="headings", - description="Show the symbol type in headings (e.g. mod, class, meth, func and attr).", - ), - ] = False - - show_symbol_type_toc: Annotated[ - bool, - _Field( - group="headings", - description="Show the symbol type in the Table of Contents (e.g. mod, class, methd, func and attr).", - ), - ] = False - - signature_crossrefs: Annotated[ - bool, - _Field( - group="signatures", - description="Whether to render cross-references for type annotations in signatures.", - ), - ] = False - - summary: Annotated[ - bool | SummaryOption, - _Field( - group="members", - description="Whether to render summaries of modules, classes, functions (methods) and attributes.", - ), - ] = field(default_factory=SummaryOption) - - toc_label: Annotated[ - str, - _Field( - group="headings", - description="A custom string to override the autogenerated toc label of the root object.", - ), - ] = "" - - unwrap_annotated: Annotated[ - bool, - _Field( - group="signatures", - description="Whether to unwrap `Annotated` types to show only the type without the annotations.", - ), - ] = False - - extra: Annotated[ - dict[str, Any], - _Field( - group="general", - description="Extra options.", - ), - ] = field(default_factory=dict) - - @classmethod - def _extract_extra(cls, data: dict[str, Any]) -> tuple[dict[str, Any], dict[str, Any]]: - field_names = {field.name for field in fields(cls)} - copy = data.copy() - return {name: copy.pop(name) for name in data if name not in field_names}, copy - - @classmethod - def coerce(cls, **data: Any) -> MutableMapping[str, Any]: - """Coerce data.""" - if "docstring_options" in data: - docstring_style = data.get("docstring_style", "google") - docstring_options = data["docstring_options"] - if docstring_options is not None: - if docstring_style == "auto": - docstring_options = AutoStyleOptions.from_data(**docstring_options) - elif docstring_style == "google": - docstring_options = GoogleStyleOptions(**docstring_options) - elif docstring_style == "numpy": - docstring_options = NumpyStyleOptions(**docstring_options) - elif docstring_style == "sphinx": - docstring_options = SphinxStyleOptions(**docstring_options) - data["docstring_options"] = docstring_options - if "summary" in data: - summary = data["summary"] - if summary is True: - summary = SummaryOption(attributes=True, functions=True, classes=True, modules=True) - elif summary is False: - summary = SummaryOption(attributes=False, functions=False, classes=False, modules=False) - else: - summary = SummaryOption(**summary) - data["summary"] = summary - return data - - @classmethod - def from_data(cls, **data: Any) -> Self: - """Create an instance from a dictionary.""" - return cls(**cls.coerce(**data)) - - -# YORE: EOL 3.9: Replace `**_dataclass_options` with `frozen=True, kw_only=True` within line. -@dataclass(**_dataclass_options) # type: ignore[call-overload] -class PythonOptions(PythonInputOptions): # type: ignore[override,unused-ignore] - """Final options passed as template context.""" - - filters: list[tuple[re.Pattern, bool]] | Literal["public"] = field( # type: ignore[assignment] - default_factory=lambda: [ - (re.compile(filtr.removeprefix("!")), filtr.startswith("!")) for filtr in _DEFAULT_FILTERS - ], - ) - """A list of filters, or `"public"`.""" - - summary: SummaryOption = field(default_factory=SummaryOption) - """Whether to render summaries of modules, classes, functions (methods) and attributes.""" - - @classmethod - def coerce(cls, **data: Any) -> MutableMapping[str, Any]: - """Create an instance from a dictionary.""" - if "filters" in data: - # Non-insiders: transform back to default filters. - # Next: `if "filters" in data and not isinstance(data["filters"], str):`. - if data["filters"] == "public": - data["filters"] = _DEFAULT_FILTERS - # Filters are `None` or a sequence of strings (tests use tuples). - data["filters"] = [ - (re.compile(filtr.removeprefix("!")), filtr.startswith("!")) for filtr in data["filters"] or () - ] - return super().coerce(**data) - - -# YORE: EOL 3.9: Replace `**_dataclass_options` with `frozen=True, kw_only=True` within line. -@dataclass(**_dataclass_options) # type: ignore[call-overload] -class Inventory: - """An inventory.""" - - url: Annotated[ - str, - _Field( - parent="inventories", - description="The URL of the inventory.", - ), - ] - - base_url: Annotated[ - str | None, - _Field( - parent="inventories", - description="The base URL of the inventory.", - ), - ] = None - - domains: Annotated[ - list[str], - _Field( - parent="inventories", - description="The domains to load from the inventory.", - ), - ] = field(default_factory=lambda: ["py"]) - - @property - def _config(self) -> dict[str, Any]: - return {"base_url": self.base_url, "domains": self.domains} - - -# YORE: EOL 3.9: Replace `**_dataclass_options` with `frozen=True, kw_only=True` within line. -@dataclass(**_dataclass_options) # type: ignore[call-overload] -class PythonInputConfig: - """Python handler configuration.""" - - inventories: Annotated[ - list[str | Inventory], - _Field(description="The inventories to load."), - ] = field(default_factory=list) - - paths: Annotated[ - list[str], - _Field(description="The paths in which to search for Python packages."), - ] = field(default_factory=lambda: ["."]) - - load_external_modules: Annotated[ - bool | None, - _Field(description="Whether to always load external modules/packages."), - ] = None - - options: Annotated[ - PythonInputOptions, - _Field(description="Configuration options for collecting and rendering objects."), - ] = field(default_factory=PythonInputOptions) - - locale: Annotated[ - str | None, - _Field(description="The locale to use when translating template strings."), - ] = None - - @classmethod - def coerce(cls, **data: Any) -> MutableMapping[str, Any]: - """Coerce data.""" - return data - - @classmethod - def from_data(cls, **data: Any) -> Self: - """Create an instance from a dictionary.""" - return cls(**cls.coerce(**data)) - - -# YORE: EOL 3.9: Replace `**_dataclass_options` with `frozen=True, kw_only=True` within line. -@dataclass(**_dataclass_options) # type: ignore[call-overload] -class PythonConfig(PythonInputConfig): # type: ignore[override,unused-ignore] - """Python handler configuration.""" - - inventories: Annotated[ - list[Inventory], - _Field(description="The object inventories to load."), - ] = field(default_factory=list) # type: ignore[assignment] - - options: Annotated[ - dict[str, Any], - _Field(description="Configuration options for collecting and rendering objects."), - ] = field(default_factory=dict) # type: ignore[assignment] - - @classmethod - def coerce(cls, **data: Any) -> MutableMapping[str, Any]: - """Coerce data.""" - if "inventories" in data: - data["inventories"] = [ - Inventory(url=inv) if isinstance(inv, str) else Inventory(**inv) for inv in data["inventories"] - ] - return data diff --git a/src/mkdocstrings_handlers/python/_internal/debug.py b/src/mkdocstrings_handlers/python/_internal/debug.py deleted file mode 100644 index 5fff669f..00000000 --- a/src/mkdocstrings_handlers/python/_internal/debug.py +++ /dev/null @@ -1,107 +0,0 @@ -from __future__ import annotations - -import os -import platform -import sys -from dataclasses import dataclass -from importlib import metadata - - -@dataclass -class _Variable: - """Dataclass describing an environment variable.""" - - name: str - """Variable name.""" - value: str - """Variable value.""" - - -@dataclass -class _Package: - """Dataclass describing a Python package.""" - - name: str - """Package name.""" - version: str - """Package version.""" - - -@dataclass -class _Environment: - """Dataclass to store environment information.""" - - interpreter_name: str - """Python interpreter name.""" - interpreter_version: str - """Python interpreter version.""" - interpreter_path: str - """Path to Python executable.""" - platform: str - """Operating System.""" - packages: list[_Package] - """Installed packages.""" - variables: list[_Variable] - """Environment variables.""" - - -def _interpreter_name_version() -> tuple[str, str]: - if hasattr(sys, "implementation"): - impl = sys.implementation.version - version = f"{impl.major}.{impl.minor}.{impl.micro}" - kind = impl.releaselevel - if kind != "final": - version += kind[0] + str(impl.serial) - return sys.implementation.name, version - return "", "0.0.0" - - -def _get_version(dist: str = "mkdocstrings-python") -> str: - """Get version of the given distribution. - - Parameters: - dist: A distribution name. - - Returns: - A version number. - """ - try: - return metadata.version(dist) - except metadata.PackageNotFoundError: - return "0.0.0" - - -def _get_debug_info() -> _Environment: - """Get debug/environment information. - - Returns: - Environment information. - """ - py_name, py_version = _interpreter_name_version() - packages = ["mkdocstrings-python"] - variables = ["PYTHONPATH", *[var for var in os.environ if var.startswith("MKDOCSTRINGS_PYTHON")]] - return _Environment( - interpreter_name=py_name, - interpreter_version=py_version, - interpreter_path=sys.executable, - platform=platform.platform(), - variables=[_Variable(var, val) for var in variables if (val := os.getenv(var))], - packages=[_Package(pkg, _get_version(pkg)) for pkg in packages], - ) - - -def _print_debug_info() -> None: - """Print debug/environment information.""" - info = _get_debug_info() - print(f"- __System__: {info.platform}") - print(f"- __Python__: {info.interpreter_name} {info.interpreter_version} ({info.interpreter_path})") - print("- __Environment variables__:") - for var in info.variables: - print(f" - `{var.name}`: `{var.value}`") - print("- __Installed packages__:") - for pkg in info.packages: - print(f" - `{pkg.name}` v{pkg.version}") - - -if __name__ == "__main__": - _print_debug_info() diff --git a/src/mkdocstrings_handlers/python/_internal/handler.py b/src/mkdocstrings_handlers/python/_internal/handler.py deleted file mode 100644 index 896a70e3..00000000 --- a/src/mkdocstrings_handlers/python/_internal/handler.py +++ /dev/null @@ -1,416 +0,0 @@ -# This module implements a handler for the Python language. - -from __future__ import annotations - -import glob -import os -import posixpath -import sys -from contextlib import suppress -from dataclasses import asdict -from pathlib import Path -from typing import TYPE_CHECKING, Any, BinaryIO, ClassVar -from warnings import warn - -from griffe import ( - AliasResolutionError, - GriffeLoader, - LinesCollection, - ModulesCollection, - Parser, - load_extensions, - patch_loggers, -) -from mkdocs.exceptions import PluginError -from mkdocstrings import BaseHandler, CollectionError, CollectorItem, HandlerOptions, Inventory, get_logger - -from mkdocstrings_handlers.python._internal import rendering -from mkdocstrings_handlers.python._internal.config import PythonConfig, PythonOptions - -if TYPE_CHECKING: - from collections.abc import Iterator, Mapping, MutableMapping, Sequence - - from mkdocs.config.defaults import MkDocsConfig - - -# YORE: EOL 3.10: Replace block with line 2. -if sys.version_info >= (3, 11): - from contextlib import chdir -else: - from contextlib import contextmanager - - @contextmanager - def chdir(path: str) -> Iterator[None]: - old_wd = os.getcwd() - os.chdir(path) - try: - yield - finally: - os.chdir(old_wd) - - -_logger = get_logger(__name__) - -patch_loggers(get_logger) - - -# YORE: Bump 2: Remove block. -def _warn_extra_options(names: Sequence[str]) -> None: - warn( - "Passing extra options directly under `options` is deprecated. " - "Instead, pass them under `options.extra`, and update your templates. " - f"Current extra (unrecognized) options: {', '.join(sorted(names))}", - DeprecationWarning, - stacklevel=3, - ) - - -class PythonHandler(BaseHandler): - """The Python handler class.""" - - name: ClassVar[str] = "python" - """The handler's name.""" - - domain: ClassVar[str] = "py" - """The cross-documentation domain/language for this handler.""" - - enable_inventory: ClassVar[bool] = True - """Whether this handler is interested in enabling the creation of the `objects.inv` Sphinx inventory file.""" - - fallback_theme: ClassVar[str] = "material" - """The fallback theme.""" - - def __init__(self, config: PythonConfig, base_dir: Path, **kwargs: Any) -> None: - """Initialize the handler. - - Parameters: - config: The handler configuration. - base_dir: The base directory of the project. - **kwargs: Arguments passed to the parent constructor. - """ - super().__init__(**kwargs) - - self.config = config - """The handler configuration.""" - self.base_dir = base_dir - """The base directory of the project.""" - - # YORE: Bump 2: Remove block. - global_extra, global_options = PythonOptions._extract_extra(config.options) - if global_extra: - _warn_extra_options(global_extra.keys()) # type: ignore[arg-type] - self._global_extra = global_extra - self.global_options = global_options - """The global configuration options (in `mkdocs.yml`).""" - - # YORE: Bump 2: Replace `# ` with `` within block. - # self.global_options = config.options - # """The global configuration options (in `mkdocs.yml`).""" - - # Warn if user overrides base templates. - if self.custom_templates: - for theme_dir in base_dir.joinpath(self.custom_templates, "python").iterdir(): - if theme_dir.joinpath("_base").is_dir(): - _logger.warning( - f"Overriding base template '{theme_dir.name}/_base/