Merge branch 'master' into update-to-mermaid-10.6.0

This commit is contained in:
Martin Donath 2023-11-26 12:55:43 +01:00 committed by GitHub
commit b5cf38f3d9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
111 changed files with 3199 additions and 6091 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View File

@ -1,3 +1,46 @@
mkdocs-material-9.4.12+insiders-4.45.0 (2023-11-24)
* Added support for sorting blog categories by post count or custom function
* Improved tags plugin to generate Unicode-aware slugs by default
* Fixed non-deterministic order of multiple authors in blog plugin
mkdocs-material-9.4.12 (2023-11-24)
* Improved blog plugin to generate Unicode-aware slugs by default
* Fixed non-deterministic order of categories in blog plugin
mkdocs-material-9.4.11+insiders-4.44.0 (2023-11-23)
* Added pagination settings for archive pages in blog plugin
* Added pagination settings for category pages in blog plugin
mkdocs-material-9.4.11 (2023-11-23)
* Fixed #6364: Search plugin crashing when enabling theme while serving
* Fixed blog plugin crashing when disabling pagination
mkdocs-material-9.4.10+insiders-4.43.1 (2023-11-19)
* Added third-party theme support in projects plugin, improving editing
* Fixed #6360: Projects plugin crashes when theme is not Material for MkDocs
* Fixed #6306: Projects plugin not reloading nested project configuration
mkdocs-material-9.4.10 (2023-11-19)
* Fixed #6356: Version selector can't be disabled via mike's configuration
* Fixed #6281: Navigation not rendering due to Safari bug (9.4.2 regression)
* Fixed #6261: Navigation expansion animates on first load (9.4.2 regression)
mkdocs-material-9.4.9 (2023-11-17)
* Fixed #6344: Long entries cutoff in table of contents
* Fixed #6336: Custom template for glob archive not working with pagination
* Fixed #6328: Blog plugin crashes for locales with dashes, e.g. pt-BR
* Fixed #6327: Copy-to-clipboard button doesn't trim trailing line feed
* Fixed #6302: Version strings not matched when using mike, only aliases
* Fixed instant navigation progress indicator for gzipped content in Chrome
* Fixed rendering bug on details marker rotation in Firefox
mkdocs-material-9.4.8+insiders-4.43.0 (2023-11-05)
* Added support for GitLab committers (document contributors)

View File

@ -58,6 +58,9 @@
<a href="https://fastapi.tiangolo.com/" target=_blank><img
src="https://raw.githubusercontent.com/squidfunk/mkdocs-material/master/.github/assets/sponsors/sponsor-fastapi.png" height="120"
/></a>
<a href="https://www.trendpop.com/" target=_blank><img
src="https://raw.githubusercontent.com/squidfunk/mkdocs-material/master/.github/assets/sponsors/sponsor-trendpop.png" height="120"
/></a>
</p>
<p>&nbsp;</p>
<p align="center"><strong>Bronze sponsors</strong></p>

View File

@ -2,6 +2,32 @@
## Material for MkDocs
### 9.4.12 <small>November 24, 2023</small> { id="9.4.12" }
- Improved blog plugin to generate Unicode-aware slugs by default
- Fixed non-deterministic order of categories in blog plugin
### 9.4.11 <small>November 23, 2023</small> { id="9.4.11" }
- Fixed #6364: Search plugin crashing when enabling theme while serving
- Fixed blog plugin crashing when disabling pagination
### 9.4.10 <small>November 19, 2023</small> { id="9.4.10" }
- Fixed #6356: Version selector can't be disabled via mike's configuration
- Fixed #6281: Navigation not rendering due to Safari bug (9.4.2 regression)
- Fixed #6261: Navigation expansion animates on first load (9.4.2 regression)
### 9.4.9 <small>November 17, 2023</small> { id="9.4.9" }
- Fixed #6344: Long entries cutoff in table of contents
- Fixed #6336: Custom template for glob archive not working with pagination
- Fixed #6328: Blog plugin crashes for locales with dashes, e.g. `pt-BR`
- Fixed #6327: Copy-to-clipboard button doesn't trim trailing line feed
- Fixed #6302: Version strings not matched when using mike, only aliases
- Fixed instant navigation progress indicator for gzipped content in Chrome
- Fixed rendering bug on details marker rotation in Firefox
### 9.4.8 <small>November 5, 2023</small> { id="9.4.8" }
- Fixed invalid local address replacement when using instant loading

View File

@ -33,7 +33,7 @@ explicitly define them. The default value of the property is always included.
#### <!-- md:default computed --> Default value is computed { #default data-toc-label="is computed" }
Some default values are not set to static values but computed form other values,
Some default values are not set to static values but computed from other values,
like the site language, repository provider, or other settings.
#### <!-- md:default none --> Default value is empty { #default data-toc-label="is empty" }

View File

@ -66,6 +66,7 @@ theme:
"yaml.customTags": [ // (1)!
"!ENV scalar",
"!ENV sequence",
"!relative scalar",
"tag:yaml.org,2002:python/name:material.extensions.emoji.to_svg",
"tag:yaml.org,2002:python/name:material.extensions.emoji.twemoji",
"tag:yaml.org,2002:python/name:pymdownx.superfences.fence_code_format"

View File

@ -1,5 +1,32 @@
---
template: redirect.html
location: https://calendly.com/squidfunk/enterprise
status: new
---
# Enterprise Feedback
We highly value the insights of our enterprise users, and we're eager to hear
from you. Your feedback is immensely valuable to us. If you're utilizing
Material for MkDocs in an enterprise context and would like to share your
experiences with us, we'd love to connect and discuss:
- What you are building with it
- What aspects you like about it
- What challenges you are facing
- What could be improved
## Let's Connect
To schedule a convenient appointment, please reach out to us via email at
contact@squidfunk.com and provide us with the following details:
- Your company's name
- How you are using Material for MkDocs
- Any specific questions or topics you'd like to address
Once we have this information, we'll promptly get in touch with you to arrange
a 30-minute call. Please note that this call is exclusively intended for
enterprise users and is not meant for technical support. Instead, it's an
opportunity for us to engage in a casual conversation to better understand your
unique needs.
We look forward to our discussion!

View File

@ -2,6 +2,23 @@
## Material for MkDocs Insiders
### 4.45.0 <small>November 24, 2023</small> { id="4.45.0" }
- Added support for sorting blog categories by post count or custom function
- Improved tags plugin to generate Unicode-aware slugs by default
- Fixed non-deterministic order of multiple authors in blog plugin
### 4.44.0 <small>November 23, 2023</small> { id="4.44.0" }
- Added pagination settings for archive pages in blog plugin
- Added pagination settings for category pages in blog plugin
### 4.43.1 <small>November 19, 2023</small> { id="4.43.1" }
- Added third-party theme support in projects plugin, improving editing
- Fixed #6360: Projects plugin crashes when theme is not Material for MkDocs
- Fixed #6306: Projects plugin not reloading nested project configuration
### 4.43.0 <small>November 5, 2023</small> { id="4.43.0" }
- Added support for GitLab committers (document contributors)

View File

@ -0,0 +1,148 @@
---
title: Community Experts Program
status: new
---
# Calling for Community Experts
Interested in joining the Material for MkDocs team as a Community Expert?
We're on the lookout for individuals who are passionate about supporting our
awesome community. In return for your valuable contributions, time, and
insights, __you'll gain free access to the Insiders edition__.
## Why we need you
As our project and community continue to grow, so do the questions and needs of
our users on our discussion board. Our discussion board is a vital part of our
project, serving as a hub for our community to connect and a valuable knowledge
base to complement our documentation.
We're eager to keeping it well-maintained, organized, easy to search and address
all queries which is why we need extra hands to keep up with the demand.
That's why we're bulding a team of Community Experts!
## Your role
As a Community Expert, your role primarily involves active participation on
our [discussion board], where we'd expect you to be:
- Answering discussions to help users with their questions
- Providing guidance regarding implementations
- Sharing insights into customizations and workarounds
- Optimizing searchability by adjusting discussion titles with relevant keywords
## Your benefits
Here is a list of the benefits we offer to our Community Experts:
- __Free access to Material for MkDocs Insiders__ Exclusive Access to all of
our Material for MkDocs Insiders features for _non-commercial use_.[^1]
- __Close communication with the team__ Stay connected with us through various
channels, including calls and internal project management tools.
- __GitHub profile boost__ Enhance your GitHub profile's visibility and
credibility as your activity increases, earning you valuable badges that can
enhance your credibility.
[^1]:
Access to Insiders is granted to your primary account, i.e., the account
with which you're contributing to the project. It cannot be transferred to
another account. Additionally, it cannot be used for commercial purposes.
## Your knowledge & skills
To be a successful Community Expert, your skills should include the following:
- __Material and MkDocs allrounder__ You have an understanding of Material
for MkDocs and the MkDocs ecosystem, including many of its extensions and
plugins.
- __Great communicator__ You enjoy helping others in a productive,
constructive and friendly manner and use inclusive and welcoming language.
- __Independent worker__ You are self-motivated, stay up-to-date with
project developments, regularly check the discussion board, and respond to
notifications in reasonable time.
[discussion board]: https://github.com/squidfunk/mkdocs-material/discussions
[documentation]: https://squidfunk.github.io/mkdocs-material/
[contribution guides]: ../contributing/index.md
## Your time commitment
We don't require a fixed number of hours each week; instead, we ask for a
minimum of __five answered discussions per month[^2]__, which amounts to
slightly more than one per week. Your active interaction within the community is
highly valued.
To do this effectively, it's best to regularly check the discussion board to see
where you can offer help. The time you invest may vary depending on the
complexity of the topics and questions.
Upon joining, you'll receive access to the Insiders' edition for as long as you
continue to assist us. Access will be renewed every three months, allowing you
the flexibility to continue your contributions or take a break as needed.
[^2]:
An answered discussion is a collaborative interaction where knowledge and
expertise are shared, resulting in resolutions or clarifications that benefit
the user and our entire community. In essence, it embodies the spirit of
cooperation and support within our community, highlighting the power of
collective wisdom and the willingness to assist and uplift one another.
## Ready to get started?
Since we have a limited number of seats for these roles[^3], we would like to
get to know you before you become one of our Community Experts. Here's how to
get started:
[^3]:
Please note that we're currently limiting the number of seats on the
Community Experts program to three. We will update this page when we'll
expand the team, which is when we'll be accepting new applications.
### Step 1: Get in touch
Send us an email introducing yourself, sharing a bit about your background, and
include a link to your GitHub profile. Additionally, provide links to three
previous discussions you've answered on the discussion board, where you've
assisted another community member.
Please use the following email template to reach out to us at
community@squidfunk.com:
```
Subject: Community Expert
Intro: Tell us a bit about yourself.
- Name:
- Background:
- Profession:
- GitHub profile:
Answered discussions
- Link 1:
- Link 2:
- Link 3:
```
### Step 2: Evaluation
After receiving and reviewing your application, we will get in touch with you
to discuss everything you need to know to get started. If you get selected, we
will set you up as a collaborator and provide you immediate access to the
Insiders edition for three months.
### Step 3: Dive in
Let's get started! You can actively begin participating in five discussions per
month. We trust you to take the lead, and we won't do strict monitoring. Simply
ensure that you are consistently listed on the _Most Helpful_ list, located on
the discussion board's left side, under the categories.
---
__Ready to join us?__
Sounds good? Let's give it a try!

View File

@ -34,8 +34,8 @@ The Insiders edition includes more than 20 additional features. You can find an
overview of these features on our [Insiders page], which is updated when new
features are added and released.
[Insiders]: ../insiders/index.md
[Insiders page]: ../insiders/index.md#whats-in-it-for-me
[Insiders]: ../index.md
[Insiders page]: ../index.md#whats-in-it-for-me
[__How often is the Insiders edition updated?__](#insiders-updates){ #insiders-updates }
@ -229,7 +229,7 @@ features, becoming a sponsor is the way to go. If you have a feature in mind
that you would like to see on the list, we encourage you to
[initiate a new discussion] to evaluate it with others.
[overview of these sponsoring goals]: ../insiders/index.md#goals
[overview of these sponsoring goals]: ../index.md#goals
[initiate a new discussion]: https://github.com/squidfunk/mkdocs-material/discussions/new/chooses
[__What happens if I reach my sponsoring limit for my current tier?__](#insiders-limit){ #insiders-limit }
@ -373,7 +373,7 @@ No. Whether you're an individual or a company, you may use Material for
MkDocs Insiders precisely under the same terms as Material for MkDocs, which are
given by the [MIT license].
[MIT license]: ../license.md
[MIT license]: ../../license.md
[__Can outside collaborators build and run the documentation locally without access to Insiders?__](#insiders-outside-collaborators){ #insiders-outside-collaborators }
@ -396,8 +396,8 @@ overrides via [configuration inheritance].
See the [getting started guide] for more information.
[configuration inheritance]: https://www.mkdocs.org/user-guide/configuration/#configuration-inheritance
[getting started guide]: ../insiders/getting-started.md#caveats
[Card grids]: ../reference/grids.md?h=grids#using-card-grids
[getting started guide]: ../getting-started.md#caveats
[Card grids]: ../../reference/grids.md?h=grids#using-card-grids
## Support
@ -450,6 +450,19 @@ report it on our [issue tracker] in the public community repository. When
submitting the bug report, please ensure that you do not include any private
Insiders' source code, as we want to uphold our fair use policy.
[__How can I report an issue in my customizations?__](#customizations-issues){ #costumisations-issues }
Please note, that we do not offer support for customizations as they vary
widely and are specific to individual cases. Our support is primarily focused on
assisting with our core features. When reporting an issue, please remove all
customizations to ensure effective problem diagnosis with a minimal reproduction
[.zip file], as described in our bug reporting guide. Our [built-in info plugin],
which is essential when creating a reproduction, will not function correctly
with customizations in place. For questions and issues with customizations,
please use our [discussion board] to engage with the community.
[.zip file]: ../../guides/creating-a-reproduction.md
[built-in info plugin]: https://squidfunk.github.io/mkdocs-material/guides/creating-a-reproduction/#creating-a-zip-file
## Privacy
@ -459,6 +472,19 @@ Unfortunately, we cannot sign any NDA or vendor agreement form. As a small team
working on Material for MkDocs, we have limited resources and cannot review
and sign agreements.
[__Will you fill out our companys forms?__](#forms){ #forms }
To dedicate more time and resources to the development of our projects, we have
implemented measures to minimize administrative overhead for our small team. As
part of this approach, we have adopted GitHub Sponsors to efficiently handle all
transactions for us. Consequently, we have decided to introduce a setup fee for
any additional administrative tasks other than those handled by GitHub Sponsors
that require our attention and involve the completion of forms or adherence to
company processes when purchasing Material for MkDocs Insiders. If your purchase
departmenz requires additional time and effort from our team, please be aware
that the setup fee will apply. For detailed information and specific inquiries,
please reach out to us at sponsors@squidfunk.com.
[__Can I sponsor privately?__](#sponsorship-private){ #sponsorship-private }
Yes, you can. GitHub gives you the option to set your sponsorship to [private]

View File

@ -88,15 +88,16 @@ a handful of them, [thanks to our awesome sponsors]!
## What's in it for me?
The moment you [become a sponsor][how to become a sponsor], you'll get __immediate
access to 23 additional features__ that you can __start using now__, and
access to 24 additional features__ that you can __start using now__, and
which are currently exclusively available to sponsors:
<div class="mdx-columns" markdown>
- [x] [Blog plugin: advanced settings] :material-alert-decagram:{ .mdx-pulse title="Added on November 23, 2023" }
- [x] [Projects plugin] :material-alert-decagram:{ .mdx-pulse title="Added on July 29, 2023" }
- [x] [Instant prefetching] :material-alert-decagram:{ .mdx-pulse title="Added on June 15, 2023" }
- [x] [Social plugin: custom layouts] :material-alert-decagram:{ .mdx-pulse title="Added on May 8, 2023" }
- [x] [Social plugin: background images] :material-alert-decagram:{ .mdx-pulse title="Added on May 8, 2023" }
- [x] [Social plugin: custom layouts]
- [x] [Social plugin: background images]
- [x] [Code range selection]
- [x] [Code annotations: custom selectors]
- [x] [Privacy plugin: optimization support]
@ -166,6 +167,7 @@ You can cancel your sponsorship anytime.[^5]
**Silver sponsors**:
[![FastAPI]{ style="height: 120px" }](https://fastapi.tiangolo.com/){ target=_blank title="FastAPI" }
[![Trendpop]{ style="height: 120px" }](https://www.trendpop.com/){ target=_blank title="Trendpop" }
**Bronze sponsors**:
@ -206,6 +208,7 @@ You can cancel your sponsorship anytime.[^5]
</div>
[FastAPI]: https://raw.githubusercontent.com/squidfunk/mkdocs-material/master/.github/assets/sponsors/sponsor-fastapi.png
[Trendpop]: https://raw.githubusercontent.com/squidfunk/mkdocs-material/master/.github/assets/sponsors/sponsor-trendpop.png
[Cirrus CI]: https://raw.githubusercontent.com/squidfunk/mkdocs-material/master/.github/assets/sponsors/sponsor-cirrus-ci.png
[Basler]: https://raw.githubusercontent.com/squidfunk/mkdocs-material/master/.github/assets/sponsors/sponsor-basler.png
[KX]: https://raw.githubusercontent.com/squidfunk/mkdocs-material/master/.github/assets/sponsors/sponsor-kx.png
@ -322,13 +325,14 @@ are released for general availability.
- [x] [Social plugin: background images]
- [x] [Code range selection]
- [x] [Code annotations: custom selectors]
- [ ] Code line wrap button
- [x] [Blog plugin: advanced settings]
[Projects plugin]: ../plugins/projects.md
[Social plugin: custom layouts]: ../setup/setting-up-social-cards.md#customization
[Social plugin: background images]: ../setup/setting-up-social-cards.md#+social.cards_layout_params.background_image
[Code range selection]: ../reference/code-blocks.md#code-selection-button
[Code annotations: custom selectors]: ../reference/code-blocks.md#custom-selectors
[Blog plugin: advanced settings]: ../setup/setting-up-a-blog.md#advanced-settings
### Goals completed

View File

@ -406,35 +406,24 @@ If more than one category is given, they are joined with `/` after slugifying.
#### <!-- md:setting config.post_slugify -->
<!-- md:version 9.2.0 -->
<!-- md:default [`toc.slugify`][toc.slugify] -->
<!-- md:default [`pymdownx.slugs.slugify`][pymdownx.slugs.slugify] -->
Use this setting to change the function to use for generating URL-compatible
slugs from post titles. [Python Markdown Extensions] comes with a Unicode-aware
[`slugify`][pymdownx.slugs.slugify] function:
Use this setting to change the function for generating URL-compatible slugs
from post titles. By default, the [`slugify`][pymdownx.slugs.slugify] function
from [Python Markdown Extensions] is used as follows:
=== "Unicode"
``` yaml
plugins:
- blog:
post_slugify: !!python/object/apply:pymdownx.slugs.slugify
kwds:
case: lower
```
``` yaml
plugins:
- blog:
post_slugify: !!python/object/apply:pymdownx.slugs.slugify
kwds:
case: lower
```
The default configuration is Unicode-aware and should produce good slugs for all
languages. Of course, you can also provide a custom slugification function for
more granular control.
=== "Unicode, case-sensitive"
``` yaml
plugins:
- blog:
post_slugify: !!python/object/apply:pymdownx.slugs.slugify
```
When your project features non-European languages, it's advisable to use this
configuration. Of course, you can also provide a custom slugification function
for more granular control.
[toc.slugify]: https://github.com/Python-Markdown/markdown/blob/1337d0891757e192165668d2606db36cf08e65a9/markdown/extensions/toc.py#L26-L33
[pymdownx.slugs.slugify]: https://github.com/facelessuser/pymdown-extensions/blob/01c91ce79c91304c22b4e3d7a9261accc931d707/pymdownx/slugs.py#L59-L65
[Python Markdown Extensions]: https://facelessuser.github.io/pymdown-extensions/extras/slugs/
@ -731,6 +720,42 @@ The following placeholders are available:
---
#### <!-- md:setting config.archive_pagination -->
<!-- md:sponsors -->
<!-- md:version insiders-4.44.0 -->
<!-- md:default `true` -->
Use this setting to enable or disable pagination for archive pages. The value
of this setting is inherited from [`pagination`][config.pagination], unless it's
explicitly set. To disable pagination, use:
``` yaml
plugins:
- blog:
archive_pagination: false
```
---
#### <!-- md:setting config.archive_pagination_per_page -->
<!-- md:sponsors -->
<!-- md:version insiders-4.44.0 -->
<!-- md:default `10` -->
Use this setting to change the number of posts rendered per archive page. The
value of this setting is inherited from [`pagination_per_page`]
[config.pagination_per_page], unless it's explicitly set:
``` yaml
plugins:
- blog:
archive_pagination_per_page: 5
```
---
#### <!-- md:setting config.archive_toc -->
<!-- md:version 9.2.0 -->
@ -738,7 +763,7 @@ The following placeholders are available:
Use this setting to leverage the table of contents to display post titles on all
archive pages. The value of this setting is inherited from [`blog_toc`]
[config.blog_toc], unless its explicitly set:
[config.blog_toc], unless it's explicitly set:
``` yaml
plugins:
@ -820,31 +845,23 @@ The following placeholders are available:
#### <!-- md:setting config.categories_slugify -->
<!-- md:version 9.2.0 -->
<!-- md:default [`toc.slugify`][toc.slugify] -->
<!-- md:default [`pymdownx.slugs.slugify`][pymdownx.slugs.slugify] -->
Use this setting to change the function to use for generating URL-compatible
slugs from categories. [Python Markdown Extensions] comes with a Unicode-aware
[`slugify`][pymdownx.slugs.slugify] function:
Use this setting to change the function for generating URL-compatible slugs
from categories. By default, the [`slugify`][pymdownx.slugs.slugify] function
from [Python Markdown Extensions] is used as follows:
=== "Unicode"
``` yaml
plugins:
- blog:
post_slugify: !!python/object/apply:pymdownx.slugs.slugify
kwds:
case: lower
```
``` yaml
plugins:
- blog:
categories_slugify: !!python/object/apply:pymdownx.slugs.slugify
kwds:
case: lower
```
=== "Unicode, case-sensitive"
``` yaml
plugins:
- blog:
categories_slugify: !!python/object/apply:pymdownx.slugs.slugify
```
When your project features non-European languages, it's advisable to use this
configuration.
The default configuration is Unicode-aware and should produce good slugs for all
languages. Of course, you can also provide a custom slugification function for
more granular control.
---
@ -865,6 +882,46 @@ plugins:
---
#### <!-- md:setting config.categories_sort_by -->
<!-- md:sponsors -->
<!-- md:version insiders-4.45.0 -->
<!-- md:default `material.plugins.blog.view_name` -->
Use this setting to specify a custom function for sorting categories. For
example, if you want to sort categories by the number of posts they contain,
use the following configuration:
``` yaml
plugins:
- blog:
categories_sort_by: !!python/name:material.plugins.blog.view_post_count
```
Don't forget to enable [`categories_sort_reverse`][config.categories_sort_reverse].
You can define your own comparison function, which must return something
that can be compared while sorting, i.e., a string or number.
---
#### <!-- md:setting config.categories_sort_reverse -->
<!-- md:sponsors -->
<!-- md:version insiders-4.45.0 -->
<!-- md:default `false` -->
Use this setting to reverse the order in which categories are sorted. By
default, categories are sorted in ascending order, but you can reverse ordering
as follows:
``` yaml
plugins:
- blog:
categories_sort_reverse: true
```
---
#### <!-- md:setting config.categories_allowed -->
<!-- md:version 9.2.0 -->
@ -888,6 +945,42 @@ this list. Posts can be assigned to categories by using the [`categories`]
---
#### <!-- md:setting config.categories_pagination -->
<!-- md:sponsors -->
<!-- md:version insiders-4.44.0 -->
<!-- md:default `true` -->
Use this setting to enable or disable pagination for category pages. The value
of this setting is inherited from [`pagination`][config.pagination], unless it's
explicitly set. To disable pagination, use:
``` yaml
plugins:
- blog:
categories_pagination: false
```
---
#### <!-- md:setting config.categories_pagination_per_page -->
<!-- md:sponsors -->
<!-- md:version insiders-4.44.0 -->
<!-- md:default `10` -->
Use this setting to change the number of posts rendered per category page. The
value of this setting is inherited from [`pagination_per_page`]
[config.pagination_per_page], unless it's explicitly set:
``` yaml
plugins:
- blog:
categories_pagination_per_page: 5
```
---
#### <!-- md:setting config.categories_toc -->
<!-- md:version 9.2.0 -->
@ -895,7 +988,7 @@ this list. Posts can be assigned to categories by using the [`categories`]
Use this setting to leverage the table of contents to display post titles on all
category pages. The value of this setting is inherited from [`blog_toc`]
[config.blog_toc], unless its explicitly set:
[config.blog_toc], unless it's explicitly set:
``` yaml
plugins:

View File

@ -10,6 +10,13 @@ pages in a folder, i.e., a subsection of your project, which is particularly
useful to ensure that a certain subset of pages features specific tags, uses a
custom template, or is attributed to an author.
---
<!-- md:sponsors --> __Sponsors only__ this plugin is currently reserved to
[our awesome sponsors].
[our awesome sponsors]: ../insiders/index.md
## Objective
### How it works

View File

@ -10,7 +10,13 @@ The optimize plugin automatically identifies and optimizes all media files when
As a result, your site loads significantly faster and yields better rankings in
search engines.
---
<!-- md:sponsors --> __Sponsors only__ this plugin is currently reserved to
[our awesome sponsors].
[building your project]: ../creating-your-site.md#building-your-site
[our awesome sponsors]: ../insiders/index.md
## Objective

View File

@ -11,6 +11,13 @@ external assets. With just a single line of configuration, the plugin can
automatically identify and download external assets, making GDPR compliance
as effortless as it can possibly be.
---
<!-- md:sponsors --> __Sponsors only__ this plugin is currently reserved to
[our awesome sponsors].
[our awesome sponsors]: ../insiders/index.md
## Objective
### How it works

View File

@ -10,6 +10,13 @@ distinct projects, build them concurrently and preview them together as one.
This is particularly useful when creating a multi-language project, but can also
be used to split very large projects into smaller parts.
---
<!-- md:sponsors --> __Sponsors only__ this plugin is currently reserved to
[our awesome sponsors].
[our awesome sponsors]: ../insiders/index.md
## Objective
### How it works

View File

@ -176,35 +176,24 @@ The provided path is resolved from the [`docs` directory][mkdocs.docs_dir].
<!-- md:sponsors -->
<!-- md:version insiders-4.25.0 -->
<!-- md:default [`toc.slugify`][toc.slugify] -->
<!-- md:default [`pymdownx.slugs.slugify`][pymdownx.slugs.slugify] -->
Use this setting to change the function to use for generating URL-compatible
slugs from tags. [Python Markdown Extensions] comes with a Unicode-aware
[`slugify`][pymdownx.slugs.slugify] function:
Use this setting to change the function for generating URL-compatible slugs
from post titles. By default, the [`slugify`][pymdownx.slugs.slugify] function
from [Python Markdown Extensions] is used as follows:
=== "Unicode"
``` yaml
plugins:
- blog:
post_slugify: !!python/object/apply:pymdownx.slugs.slugify
kwds:
case: lower
```
``` yaml
plugins:
- tags:
tags_slugify: !!python/object/apply:pymdownx.slugs.slugify
kwds:
case: lower
```
The default configuration is Unicode-aware and should produce good slugs for all
languages. Of course, you can also provide a custom slugification function for
more granular control.
=== "Unicode, case-sensitive"
``` yaml
plugins:
- tags:
tags_slugify: !!python/object/apply:pymdownx.slugs.slugify
```
When your project features non-European languages, it's advisable to use this
configuration. Of course, you can also provide a custom slugification function
for more granular control.
[toc.slugify]: https://github.com/Python-Markdown/markdown/blob/1337d0891757e192165668d2606db36cf08e65a9/markdown/extensions/toc.py#L26-L33
[pymdownx.slugs.slugify]: https://github.com/facelessuser/pymdown-extensions/blob/01c91ce79c91304c22b4e3d7a9261accc931d707/pymdownx/slugs.py#L59-L65
[Python Markdown Extensions]: https://facelessuser.github.io/pymdown-extensions/extras/slugs/

View File

@ -10,6 +10,13 @@ headlines within the navigation and table of contents. This means that code
blocks, icons, emojis and any other inline formatting can be rendered exactly
as defined in the page's content.
---
<!-- md:sponsors --> __Sponsors only__ this plugin is currently reserved to
[our awesome sponsors].
[our awesome sponsors]: ../insiders/index.md
## Objective
### How it works

View File

@ -35,6 +35,10 @@ contents:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Configure Git Credentials
run: |
git config user.name github-actions[bot]
git config user.email 41898282+github-actions[bot]@users.noreply.github.com
- uses: actions/setup-python@v4
with:
python-version: 3.x
@ -90,6 +94,10 @@ contents:
if: github.event.repository.fork == false
steps:
- uses: actions/checkout@v4
- name: Configure Git Credentials
run: |
git config user.name github-actions[bot]
git config user.email 41898282+github-actions[bot]@users.noreply.github.com
- uses: actions/setup-python@v4
with:
python-version: 3.x

File diff suppressed because it is too large Load Diff

View File

@ -2029,6 +2029,7 @@
"fontawesome/solid/yen-sign",
"fontawesome/solid/yin-yang",
"fontawesome/solid/z",
"logo-monochrome",
"logo",
"material/ab-testing",
"material/abacus",
@ -10168,6 +10169,7 @@
"simple/apacheecharts",
"simple/apacheflink",
"simple/apachegroovy",
"simple/apacheguacamole",
"simple/apachehadoop",
"simple/apachehive",
"simple/apachejmeter",
@ -10324,6 +10326,7 @@
"simple/bitwarden",
"simple/bitwig",
"simple/blackberry",
"simple/blackmagicdesign",
"simple/blazemeter",
"simple/blazor",
"simple/blender",
@ -10616,6 +10619,7 @@
"simple/delonghi",
"simple/delphi",
"simple/delta",
"simple/deluge",
"simple/deno",
"simple/denon",
"simple/dependabot",
@ -10637,6 +10641,7 @@
"simple/digg",
"simple/digikeyelectronics",
"simple/digitalocean",
"simple/dinersclub",
"simple/dior",
"simple/directus",
"simple/discogs",
@ -10774,6 +10779,7 @@
"simple/facebooklive",
"simple/faceit",
"simple/facepunch",
"simple/fairphone",
"simple/falco",
"simple/falcon",
"simple/fampay",
@ -10862,6 +10868,7 @@
"simple/foxtel",
"simple/fozzy",
"simple/framer",
"simple/framework",
"simple/framework7",
"simple/franprix",
"simple/fraunhofergesellschaft",
@ -11067,6 +11074,7 @@
"simple/hibernate",
"simple/hibob",
"simple/hilton",
"simple/hiltonhotelsandresorts",
"simple/hitachi",
"simple/hive",
"simple/hive_blockchain",
@ -11150,6 +11158,7 @@
"simple/inkdrop",
"simple/inkscape",
"simple/insomnia",
"simple/insta360",
"simple/instacart",
"simple/instagram",
"simple/instapaper",
@ -11427,6 +11436,7 @@
"simple/mastodon",
"simple/materialdesign",
"simple/materialdesignicons",
"simple/materialformkdocs",
"simple/matillion",
"simple/matomo",
"simple/matrix",
@ -11458,6 +11468,7 @@
"simple/mercedes",
"simple/merck",
"simple/mercurial",
"simple/mermaid",
"simple/messenger",
"simple/meta",
"simple/metabase",
@ -11541,6 +11552,7 @@
"simple/moscowmetro",
"simple/motorola",
"simple/mozilla",
"simple/mpv",
"simple/mqtt",
"simple/msi",
"simple/msibusiness",
@ -11749,6 +11761,7 @@
"simple/paypal",
"simple/paytm",
"simple/pcgamingwiki",
"simple/pdm",
"simple/peakdesign",
"simple/pearson",
"simple/peerlist",
@ -11799,6 +11812,7 @@
"simple/planetscale",
"simple/plangrid",
"simple/platformdotsh",
"simple/platformio",
"simple/platzi",
"simple/plausibleanalytics",
"simple/playcanvas",
@ -11838,6 +11852,7 @@
"simple/popos",
"simple/porsche",
"simple/portainer",
"simple/portswigger",
"simple/postcss",
"simple/postgresql",
"simple/posthog",
@ -12063,6 +12078,7 @@
"simple/rust",
"simple/rxdb",
"simple/ryanair",
"simple/rye",
"simple/s7airlines",
"simple/sabanci",
"simple/safari",
@ -12082,6 +12098,7 @@
"simple/sap",
"simple/sass",
"simple/sat1",
"simple/satellite",
"simple/saturn",
"simple/saucelabs",
"simple/scala",
@ -12444,6 +12461,7 @@
"simple/trello",
"simple/trendmicro",
"simple/treyarch",
"simple/tricentis",
"simple/trilium",
"simple/triller",
"simple/trino",
@ -12612,6 +12630,7 @@
"simple/webauthn",
"simple/webcomponentsdotorg",
"simple/webdriverio",
"simple/webex",
"simple/webflow",
"simple/webgl",
"simple/webhint",
@ -12628,6 +12647,7 @@
"simple/weightsandbiases",
"simple/welcometothejungle",
"simple/wellfound",
"simple/wellsfargo",
"simple/wemo",
"simple/westerndigital",
"simple/wetransfer",
@ -12710,6 +12730,7 @@
"simple/youtube",
"simple/youtubegaming",
"simple/youtubemusic",
"simple/youtubeshorts",
"simple/youtubestudio",
"simple/youtubetv",
"simple/yubico",

View File

@ -4,15 +4,36 @@
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/",
"type": "array",
"items": {
"oneOf": [
"anyOf": [
{
"$ref": "extensions/markdown.json"
"$ref": "#/$defs/external"
},
{
"$ref": "extensions/pymdownx.json"
"$ref": "#/$defs/external-community"
}
]
},
"uniqueItems": true,
"minItems": 1
"minItems": 1,
"$defs": {
"external": {
"description": "External markdown extensions, schema provided by us",
"anyOf": [
{
"$ref": "extensions/markdown.json"
},
{
"$ref": "extensions/pymdownx.json"
}
]
},
"external-community": {
"description": "External markdown extensions, schema provided by our community",
"anyOf": [
{
"$ref": "https://raw.githubusercontent.com/Neoteroi/mkdocs-plugins/main/docs/extensions-schema.json"
}
]
}
}
}

View File

@ -59,6 +59,14 @@
"md_in_html"
]
},
{
"title": "Sane Lists Python Markdown",
"markdownDescription": "https://python-markdown.github.io/extensions/sane_lists/",
"enum": [
"markdown.extensions.sane_lists",
"sane_lists"
]
},
{
"title": "Tables Python Markdown",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#tables",

View File

@ -27,9 +27,7 @@
{
"title": "Arithmatex Python Markdown Extensions",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#arithmatex",
"enum": [
"pymdownx.arithmatex"
]
"const": "pymdownx.arithmatex"
}
]
},
@ -63,9 +61,7 @@
{
"title": "BetterEm Python Markdown Extensions",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#betterem",
"enum": [
"pymdownx.betterem"
]
"const": "pymdownx.betterem"
}
]
},
@ -74,9 +70,7 @@
{
"title": "Caret Python Markdown Extensions",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#caret-mark-tilde",
"enum": [
"pymdownx.caret"
]
"const": "pymdownx.caret"
},
{
"type": "object",
@ -114,9 +108,7 @@
{
"title": "Critic Python Markdown Extensions",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#critic",
"enum": [
"pymdownx.critic"
]
"const": "pymdownx.critic"
},
{
"type": "object",
@ -145,18 +137,14 @@
{
"title": "Details Python Markdown Extensions",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#details",
"enum": [
"pymdownx.details"
]
"const": "pymdownx.details"
},
{
"oneOf": [
{
"title": "Emoji Python Markdown Extensions",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#emoji",
"enum": [
"pymdownx.emoji"
]
"const": "pymdownx.emoji"
},
{
"type": "object",
@ -208,9 +196,7 @@
{
"title": "Highlight Python Markdown Extensions",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#highlight",
"enum": [
"pymdownx.highlight"
]
"const": "pymdownx.highlight"
},
{
"type": "object",
@ -267,18 +253,14 @@
{
"title": "InlineHilite Python Markdown Extensions",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#inlinehilite",
"enum": [
"pymdownx.inlinehilite"
]
"const": "pymdownx.inlinehilite"
},
{
"oneOf": [
{
"title": "Keys Python Markdown Extensions",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#keys",
"enum": [
"pymdownx.keys"
]
"const": "pymdownx.keys"
},
{
"type": "object",
@ -320,9 +302,7 @@
{
"title": "MagicLink Python Markdown Extensions",
"markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/magiclink/",
"enum": [
"pymdownx.magiclink"
]
"const": "pymdownx.magiclink"
},
{
"type": "object",
@ -410,9 +390,7 @@
{
"title": "Mark Python Markdown Extensions",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#caret-mark-tilde",
"enum": [
"pymdownx.mark"
]
"const": "pymdownx.mark"
},
{
"type": "object",
@ -440,9 +418,7 @@
{
"title": "SmartSymbols Python Markdown Extensions",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#smartsymbols",
"enum": [
"pymdownx.smartsymbols"
]
"const": "pymdownx.smartsymbols"
},
{
"type": "object",
@ -569,9 +545,7 @@
{
"title": "Snippets Python Markdown Extensions",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#snippets",
"enum": [
"pymdownx.snippets"
]
"const": "pymdownx.snippets"
}
]
},
@ -580,9 +554,7 @@
{
"title": "SuperFences Python Markdown Extensions",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#superfences",
"enum": [
"pymdownx.superfences"
]
"const": "pymdownx.superfences"
},
{
"type": "object",
@ -663,9 +635,7 @@
{
"title": "Tasklist Python Markdown Extensions",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#tasklist",
"enum": [
"pymdownx.tasklist"
]
"const": "pymdownx.tasklist"
},
{
"type": "object",
@ -697,9 +667,7 @@
{
"title": "Tilde Python Markdown Extensions",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#caret-mark-tilde",
"enum": [
"pymdownx.tilde"
]
"const": "pymdownx.tilde"
},
{
"type": "object",

View File

@ -13,99 +13,71 @@
"title": "Analytics provider",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#google-analytics",
"type": "object",
"properties": {
"provider": {
"title": "Analytics provider",
"anyOf": [
{
"title": "Google Analytics",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#google-analytics",
"enum": [
"google"
]
},
{
"type": "string"
}
]
},
"property": {
"anyOf": [
{
"title": "Google Analytics 4",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#google-analytics",
"pattern": "^G-\\w{10}$"
},
{
"title": "Universal Analytics",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#google-analytics",
"pattern": "^UA-\\w{9}-\\w$"
},
{
"title": "Unknown property",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#google-analytics",
"type": "string"
}
]
},
"feedback": {
"title": "Was this page helpful?",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#was-this-page-helpful",
"type": "object",
"properties": {
"title": {
"title": "Feedback widget title",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#was-this-page-helpful",
"type": "string",
"default": "Was this page helpful?"
},
"ratings": {
"title": "Feedback ratings",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#was-this-page-helpful",
"type": "array",
"items": {
"title": "Feedback rating",
"type": "object",
"properties": {
"icon": {
"$ref": "#/$defs/icon"
},
"name": {
"title": "Feedback rating name",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#+analytics.feedback.ratings.name",
"type": "string"
},
"data": {
"title": "Feedback rating data",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#+analytics.feedback.ratings.data",
"type": "number"
},
"note": {
"title": "Feedback rating data",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#+analytics.feedback.ratings.note",
"type": "string"
}
},
"additionalProperties": false,
"required": [
"icon",
"name",
"data",
"note"
]
"allOf": [
{
"if": {
"properties": {
"provider": {
"const": "google"
}
}
},
"additionalProperties": false,
"required": [
"title"
]
"then": {
"properties": {
"provider": {
"title": "Google Analytics",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#google-analytics",
"const": "google"
},
"property": {
"anyOf": [
{
"title": "Google Analytics 4",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#google-analytics",
"pattern": "^G-\\w{10}$"
},
{
"title": "Unknown property",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#google-analytics",
"type": "string"
}
]
},
"feedback": {
"$ref": "#/$defs/feedback"
}
},
"required": [
"provider",
"property"
],
"additionalProperties": false
}
},
{
"if": {
"properties": {
"provider": {
"type": "string"
}
}
},
"then": {
"properties": {
"provider": {
"title": "Custom analytics provider",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#custom-site-analytics",
"type": "string"
},
"feedback": {
"$ref": "#/$defs/feedback"
}
},
"required": [
"provider"
]
}
}
},
"additionalProperties": false,
"required": [
"provider",
"property"
],
"defaultSnippets": [
{
@ -213,21 +185,15 @@
"oneOf": [
{
"title": "Button to accept cookies",
"enum": [
"accept"
]
"const": "accept"
},
{
"title": "Button to reject cookies",
"enum": [
"reject"
]
"const": "reject"
},
{
"title": "Button to manage settings",
"enum": [
"manage"
]
"const": "manage"
}
]
},
@ -334,9 +300,7 @@
"provider": {
"title": "Versioning provider",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-versioning/#versioning",
"enum": [
"mike"
]
"const": "mike"
},
"default": {
"title": "Default version",
@ -406,6 +370,59 @@
"type": "string"
}
]
},
"feedback": {
"title": "Was this page helpful?",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#was-this-page-helpful",
"type": "object",
"properties": {
"title": {
"title": "Feedback widget title",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#was-this-page-helpful",
"type": "string",
"default": "Was this page helpful?"
},
"ratings": {
"title": "Feedback ratings",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#was-this-page-helpful",
"type": "array",
"items": {
"title": "Feedback rating",
"type": "object",
"properties": {
"icon": {
"$ref": "#/$defs/icon"
},
"name": {
"title": "Feedback rating name",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#+analytics.feedback.ratings.name",
"type": "string"
},
"data": {
"title": "Feedback rating data",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#+analytics.feedback.ratings.data",
"type": "number"
},
"note": {
"title": "Feedback rating data",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#+analytics.feedback.ratings.note",
"type": "string"
}
},
"additionalProperties": false,
"required": [
"icon",
"name",
"data",
"note"
]
}
}
},
"additionalProperties": false,
"required": [
"title"
]
}
},
"defaultSnippets": [
@ -414,7 +431,7 @@
"body": {
"analytics": {
"provider": "${1:google}",
"property": "${2:UA-XXXXXXXX-X}"
"property": "${2:G-XXXXXXXXXX}"
}
}
}

View File

@ -4,9 +4,7 @@
"oneOf": [
{
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/",
"enum": [
"blog"
]
"const": "blog"
},
{
"type": "object",
@ -114,15 +112,11 @@
"oneOf": [
{
"title": "Post excerpts are optional",
"enum": [
"optional"
]
"const": "optional"
},
{
"title": "Post excerpts are required, thus the build will fail",
"enum": [
"required"
]
"const": "required"
}
],
"default": "optional"
@ -215,6 +209,18 @@
}
]
},
"archive_pagination": {
"title": "Pagination for archive pages",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.archive_pagination",
"type": "boolean",
"default": true
},
"archive_pagination_per_page": {
"title": "Posts per page for archive pages",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.archive_pagination_per_page",
"type": "number",
"default": 10
},
"archive_toc": {
"title": "Archive table of contents",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.archive_toc",
@ -259,6 +265,27 @@
"type": "string",
"default": "\"-\""
},
"categories_sort_by": {
"title": "Sort categories by this function",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.categories_sort_by",
"default": "!!python/name:material.plugins.blog.view_name",
"oneOf": [
{
"type": "string"
},
{
"enum": [
"!!python/name:material.plugins.blog.view_name",
"!!python/name:material.plugins.blog.view_post_count"
]
}
]
},
"categories_sort_reverse": {
"title": "Soft categories in reverse",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.categories_sort_reverse",
"default": false
},
"categories_allowed": {
"title": "Categories allowed",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.categories_allowed",
@ -269,6 +296,18 @@
"uniqueItems": true,
"default": []
},
"categories_pagination": {
"title": "Pagination for categories",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.categories_pagination",
"type": "boolean",
"default": true
},
"categories_pagination_per_page": {
"title": "Posts per page for categories",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.categories_pagination_per_page",
"type": "number",
"default": 10
},
"categories_toc": {
"title": "Categories table of contents",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.categories_toc",

View File

@ -4,9 +4,7 @@
"oneOf": [
{
"markdownDescription": "https://github.com/oprypin/mkdocs-gen-files",
"enum": [
"git-authors"
]
"const": "git-authors"
},
{
"type": "object",

View File

@ -4,9 +4,7 @@
"oneOf": [
{
"markdownDescription": "https://timvink.github.io/mkdocs-git-authors-plugin/",
"enum": [
"git-authors"
]
"const": "git-authors"
},
{
"type": "object",

View File

@ -4,9 +4,7 @@
"oneOf": [
{
"markdownDescription": "https://github.com/ojacques/mkdocs-git-committers-plugin-2",
"enum": [
"git-committers"
]
"const": "git-committers"
},
{
"type": "object",

View File

@ -4,9 +4,7 @@
"oneOf": [
{
"markdownDescription": "https://github.com/zhaoterryy/mkdocs-git-revision-date-plugin",
"enum": [
"git-revision-date"
]
"const": "git-revision-date"
},
{
"type": "object",

View File

@ -4,9 +4,7 @@
"oneOf": [
{
"markdownDescription": "https://github.com/oprypin/mkdocs-literate-nav",
"enum": [
"literate-nav"
]
"const": "literate-nav"
},
{
"type": "object",

View File

@ -4,9 +4,7 @@
"oneOf": [
{
"markdownDescription": "https://github.com/fralau/mkdocs_macros_plugin",
"enum": [
"macros"
]
"const": "macros"
},
{
"type": "object",

View File

@ -4,9 +4,7 @@
"oneOf": [
{
"markdownDescription": "https://github.com/oprypin/mkdocs-section-index",
"enum": [
"section-index"
]
"const": "section-index"
},
{
"type": "object",

View File

@ -4,9 +4,7 @@
"oneOf": [
{
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/info/",
"enum": [
"info"
]
"const": "info"
},
{
"type": "object",

View File

@ -4,9 +4,7 @@
"oneOf": [
{
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/meta/",
"enum": [
"meta"
]
"const": "meta"
},
{
"type": "object",

View File

@ -4,9 +4,7 @@
"oneOf": [
{
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/offline/",
"enum": [
"offline"
]
"const": "offline"
},
{
"type": "object",

View File

@ -4,9 +4,7 @@
"oneOf": [
{
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/",
"enum": [
"optimize"
]
"const": "optimize"
},
{
"type": "object",

View File

@ -4,9 +4,7 @@
"oneOf": [
{
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/privacy/",
"enum": [
"privacy"
]
"const": "privacy"
},
{
"type": "object",

View File

@ -4,9 +4,7 @@
"oneOf": [
{
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/projects/",
"enum": [
"projects"
]
"const": "projects"
},
{
"type": "object",

View File

@ -4,9 +4,7 @@
"oneOf": [
{
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/search/",
"enum": [
"search"
]
"const": "search"
},
{
"type": "object",
@ -73,117 +71,79 @@
"oneOf": [
{
"title": "Site search language: Arabic",
"enum": [
"ar"
]
"const": "ar"
},
{
"title": "Site search language: Danish",
"enum": [
"da"
]
"const": "da"
},
{
"title": "Site search language: German",
"enum": [
"de"
]
"const": "de"
},
{
"title": "Site search language: Dutch",
"enum": [
"du"
]
"const": "du"
},
{
"title": "Site search language: English",
"enum": [
"en"
]
"const": "en"
},
{
"title": "Site search language: Spanish",
"enum": [
"es"
]
"const": "es"
},
{
"title": "Site search language: Finnish",
"enum": [
"fi"
]
"const": "fi"
},
{
"title": "Site search language: French",
"enum": [
"fr"
]
"const": "fr"
},
{
"title": "Site search language: Hungarian",
"enum": [
"hu"
]
"const": "hu"
},
{
"title": "Site search language: Italian",
"enum": [
"it"
]
"const": "it"
},
{
"title": "Site search language: Japanese",
"enum": [
"ja"
]
"const": "ja"
},
{
"title": "Site search language: Norwegian",
"enum": [
"no"
]
"const": "no"
},
{
"title": "Site search language: Portuguese",
"enum": [
"pt"
]
"const": "pt"
},
{
"title": "Site search language: Romanian",
"enum": [
"ro"
]
"const": "ro"
},
{
"title": "Site search language: Russian",
"enum": [
"ru"
]
"const": "ru"
},
{
"title": "Site search language: Swedish",
"enum": [
"sv"
]
"const": "sv"
},
{
"title": "Site search language: Thai",
"enum": [
"th"
]
"const": "th"
},
{
"title": "Site search language: Turkish",
"enum": [
"tr"
]
"const": "tr"
},
{
"title": "Site search language: Vietnamese",
"enum": [
"vi"
]
"const": "vi"
}
]
}

View File

@ -4,9 +4,7 @@
"oneOf": [
{
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/",
"enum": [
"social"
]
"const": "social"
},
{
"type": "object",

View File

@ -4,9 +4,7 @@
"oneOf": [
{
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/",
"enum": [
"tags"
]
"const": "tags"
},
{
"type": "object",

View File

@ -4,9 +4,7 @@
"oneOf": [
{
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/typeset/",
"enum": [
"typeset"
]
"const": "typeset"
},
{
"type": "object",

View File

@ -9,9 +9,7 @@
"markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#name",
"oneOf": [
{
"enum": [
"material"
]
"const": "material"
},
{
"type": "null"
@ -48,375 +46,251 @@
{
"title": "Site language: Custom",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-language/#custom-translations",
"enum": [
"custom"
]
"const": "custom"
},
{
"title": "Site language: Afrikaans",
"enum": [
"af"
]
"const": "af"
},
{
"title": "Site language: Arabic",
"enum": [
"ar"
]
"const": "ar"
},
{
"title": "Site language: Bulgarian",
"enum": [
"bg"
]
"const": "bg"
},
{
"title": "Site language: Bengali (Bangla)",
"enum": [
"bn"
]
"const": "bn"
},
{
"title": "Site language: Catalan",
"enum": [
"ca"
]
"const": "ca"
},
{
"title": "Site language: Czech",
"enum": [
"cs"
]
"const": "cs"
},
{
"title": "Site language: Danish",
"enum": [
"da"
]
"const": "da"
},
{
"title": "Site language: German",
"enum": [
"de"
]
"const": "de"
},
{
"title": "Site language: Greek",
"enum": [
"el"
]
"const": "el"
},
{
"title": "Site language: English",
"enum": [
"en"
]
"const": "en"
},
{
"title": "Site language: Esperanto",
"enum": [
"eo"
]
"const": "eo"
},
{
"title": "Site language: Spanish",
"enum": [
"es"
]
"const": "es"
},
{
"title": "Site language: Estonian",
"enum": [
"et"
]
"const": "et"
},
{
"title": "Site language: Persian (Farsi)",
"enum": [
"fa"
]
"const": "fa"
},
{
"title": "Site language: Finnish",
"enum": [
"fi"
]
"const": "fi"
},
{
"title": "Site language: French",
"enum": [
"fr"
]
"const": "fr"
},
{
"title": "Site language: Galician",
"enum": [
"gl"
]
"const": "gl"
},
{
"title": "Site language: Hebrew",
"enum": [
"he"
]
"const": "he"
},
{
"title": "Site language: Hindi",
"enum": [
"hi"
]
"const": "hi"
},
{
"title": "Site language: Croatian",
"enum": [
"hr"
]
"const": "hr"
},
{
"title": "Site language: Hungarian",
"enum": [
"hu"
]
"const": "hu"
},
{
"title": "Site language: Armenian",
"enum": [
"hy"
]
"const": "hy"
},
{
"title": "Site language: Indonesian",
"enum": [
"id"
]
"const": "id"
},
{
"title": "Site language: Icelandic",
"enum": [
"is"
]
"const": "is"
},
{
"title": "Site language: Italian",
"enum": [
"it"
]
"const": "it"
},
{
"title": "Site language: Japanese",
"enum": [
"ja"
]
"const": "ja"
},
{
"title": "Site language: Georgian",
"enum": [
"ka"
]
"const": "ka"
},
{
"title": "Site language: Kannada",
"enum": [
"kn"
]
"const": "kn"
},
{
"title": "Site language: Korean",
"enum": [
"ko"
]
"const": "ko"
},
{
"title": "Site language: Lithuanian",
"enum": [
"lt"
]
"const": "lt"
},
{
"title": "Site language: Latvian",
"enum": [
"lv"
]
"const": "lv"
},
{
"title": "Site language: Macedonian",
"enum": [
"mk"
]
"const": "mk"
},
{
"title": "Site language: Mongolian",
"enum": [
"mn"
]
"const": "mn"
},
{
"title": "Site language: Bahasa Malaysia",
"enum": [
"ms"
]
"const": "ms"
},
{
"title": "Site language: Burmese",
"enum": [
"my"
]
"const": "my"
},
{
"title": "Site language: Dutch",
"enum": [
"nl"
]
"const": "nl"
},
{
"title": "Site language: Norwegian (Bokmål)",
"enum": [
"nb"
]
"const": "nb"
},
{
"title": "Site language: Norwegian (Nynorsk)",
"enum": [
"nn"
]
"const": "nn"
},
{
"title": "Site language: Polish",
"enum": [
"pl"
]
"const": "pl"
},
{
"title": "Site language: Portuguese",
"enum": [
"pt"
]
"const": "pt"
},
{
"title": "Site language: Portuguese (Brasilian)",
"enum": [
"pt-BR"
]
"const": "pt-BR"
},
{
"title": "Site language: Romanian",
"enum": [
"ro"
]
"const": "ro"
},
{
"title": "Site language: Russian",
"enum": [
"ru"
]
"const": "ru"
},
{
"title": "Site language: Sanskrit",
"enum": [
"sa"
]
"const": "sa"
},
{
"title": "Site language: Serbo-Croatian",
"enum": [
"sh"
]
"const": "sh"
},
{
"title": "Site language: Sinhalese",
"enum": [
"si"
]
"const": "si"
},
{
"title": "Site language: Slovak",
"enum": [
"sk"
]
"const": "sk"
},
{
"title": "Site language: Slovenian",
"enum": [
"sl"
]
"const": "sl"
},
{
"title": "Site language: Serbian",
"enum": [
"sr"
]
"const": "sr"
},
{
"title": "Site language: Swedish",
"enum": [
"sv"
]
"const": "sv"
},
{
"title": "Site language: Telugu",
"enum": [
"te"
]
"const": "te"
},
{
"title": "Site language: Thai",
"enum": [
"th"
]
"const": "th"
},
{
"title": "Site language: Tagalog",
"enum": [
"tl"
]
"const": "tl"
},
{
"title": "Site language: Turkish",
"enum": [
"tr"
]
"const": "tr"
},
{
"title": "Site language: Ukrainian",
"enum": [
"uk"
]
"const": "uk"
},
{
"title": "Site language: Urdu",
"enum": [
"ur"
]
"const": "ur"
},
{
"title": "Site language: Uzbek",
"enum": [
"uz"
]
"const": "uz"
},
{
"title": "Site language: Vietnamese",
"enum": [
"vi"
]
"const": "vi"
},
{
"title": "Site language: Chinese (Simplified)",
"enum": [
"zh"
]
"const": "zh"
},
{
"title": "Site language: Chinese (Traditional)",
"enum": [
"zh-Hant"
]
"const": "zh-Hant"
},
{
"title": "Site language: Chinese (Taiwanese)",
"enum": [
"zh-TW"
]
"const": "zh-TW"
}
],
"default": "en"
@ -597,191 +471,137 @@
{
"title": "Mark as read",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-the-header/#mark-as-read",
"enum": [
"announce.dismiss"
]
"const": "announce.dismiss"
},
{
"title": "Edit this page",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/adding-a-git-repository/#code-actions",
"enum": [
"content.action.edit"
]
"const": "content.action.edit"
},
{
"title": "View source of this page",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/adding-a-git-repository/#code-actions",
"enum": [
"content.action.view"
]
"const": "content.action.view"
},
{
"title": "Code annotations",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/reference/code-blocks/#code-annotations",
"enum": [
"content.code.annotate"
]
"const": "content.code.annotate"
},
{
"title": "Code copy button",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/reference/code-blocks/#code-copy-button",
"enum": [
"content.code.copy"
]
"const": "content.code.copy"
},
{
"title": "Code selection button",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/reference/code-blocks/#code-selection-button",
"enum": [
"content.code.select"
]
"const": "content.code.select"
},
{
"title": "Linked content tabs",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/reference/content-tabs/#linked-content-tabs",
"enum": [
"content.tabs.link"
]
"const": "content.tabs.link"
},
{
"title": "Improved tooltips",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/reference/tooltips/#improved-tooltips",
"enum": [
"content.tooltips"
]
"const": "content.tooltips"
},
{
"title": "Header hides automatically when scrolling",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-the-header/#automatic-hiding",
"enum": [
"header.autohide"
]
"const": "header.autohide"
},
{
"title": "Navigation expansion",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#navigation-expansion",
"enum": [
"navigation.expand"
]
"const": "navigation.expand"
},
{
"title": "Navigation footer",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#navigation-footer",
"enum": [
"navigation.footer"
]
"const": "navigation.footer"
},
{
"title": "Section index pages",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#section-index-pages",
"enum": [
"navigation.indexes"
]
"const": "navigation.indexes"
},
{
"title": "Instant loading",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#instant-loading",
"enum": [
"navigation.instant"
]
"const": "navigation.instant"
},
{
"title": "Instant prefetching",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#instant-prefetching",
"enum": [
"navigation.instant.prefetch"
]
"const": "navigation.instant.prefetch"
},
{
"title": "Progress indicator",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#progress-indicator",
"enum": [
"navigation.instant.progress"
]
"const": "navigation.instant.progress"
},
{
"title": "Navigation path (Breadcrumbs)",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#navigation-path",
"enum": [
"navigation.path"
]
"const": "navigation.path"
},
{
"title": "Navigation pruning",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#navigation-pruning",
"enum": [
"navigation.prune"
]
"const": "navigation.prune"
},
{
"title": "Navigation sections",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#navigation-sections",
"enum": [
"navigation.sections"
]
"const": "navigation.sections"
},
{
"title": "Navigation tabs",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#navigation-tabs",
"enum": [
"navigation.tabs"
]
"const": "navigation.tabs"
},
{
"title": "Sticky navigation tabs",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#sticky-navigation-tabs",
"enum": [
"navigation.tabs.sticky"
]
"const": "navigation.tabs.sticky"
},
{
"title": "Back-to-top button",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#back-to-top-button",
"enum": [
"navigation.top"
]
"const": "navigation.top"
},
{
"title": "Anchor tracking",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#anchor-tracking",
"enum": [
"navigation.tracking"
]
"const": "navigation.tracking"
},
{
"title": "Search higlighting",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-search/#search-highlighting",
"enum": [
"search.highlight"
]
"const": "search.highlight"
},
{
"title": "Search sharing",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-search/#search-sharing",
"enum": [
"search.share"
]
"const": "search.share"
},
{
"title": "Search suggestions",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-search/#search-suggestions",
"enum": [
"search.suggest"
]
"const": "search.suggest"
},
{
"title": "Integrated table of contents",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#anchor-following",
"enum": [
"toc.follow"
]
"const": "toc.follow"
},
{
"title": "Integrated table of contents",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#navigation-integration",
"enum": [
"toc.integrate"
]
"const": "toc.integrate"
}
]
},
@ -885,6 +705,7 @@
{
"title": "Google Fonts",
"markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-fonts/",
"type": "object",
"properties": {
"text": {
"$ref": "assets/fonts.json"

View File

@ -67,7 +67,7 @@ theme:
while complying with the __General Data Protection Regulation__ (GDPR),
by automatically downloading and self-hosting the web font files.
[data privacy]: https://developers.google.com/fonts/faq#what_does_using_the_google_fonts_api_mean_for_the_privacy_of_my_users
[data privacy]: https://developers.google.com/fonts/faq/privacy
[built-in privacy plugin]:../plugins/privacy.md
## Customization

View File

@ -34,6 +34,24 @@ plugins:
For a list of all settings, please consult the [plugin documentation].
#### Advanced settings :material-alert-decagram:{ .mdx-pulse title="Added on November 23, 2023" }
<!-- md:sponsors -->
<!-- md:version insiders-4.44.0 -->
The following advanced settings are currently reserved to our [sponsors]
[Insiders]. They are entirely optional, and don't affect the functionality of
the blog, but can be helpful for customizations:
- [`archive_pagination`][config.archive_pagination]
- [`archive_pagination_per_page`][config.archive_pagination_per_page]
- [`categories_sort_by`][config.categories_sort_by]
- [`categories_sort_reverse`][config.categories_sort_reverse]
- [`categories_pagination`][config.categories_pagination]
- [`categories_pagination_per_page`][config.categories_pagination_per_page]
We'll add more settings here, as we discover new use cases.
[plugin documentation]: ../plugins/blog.md
[Insiders]: ../insiders/index.md
@ -42,6 +60,13 @@ For a list of all settings, please consult the [plugin documentation].
[docs_dir]: https://www.mkdocs.org/user-guide/configuration/#docs_dir
[start writing your first post]: #writing-your-first-post
[config.archive_pagination]: ../plugins/blog.md#config.archive_pagination
[config.archive_pagination_per_page]: ../plugins/blog.md#config.archive_pagination_per_page
[config.categories_sort_by]: ../plugins/blog.md#config.categories_sort_by
[config.categories_sort_reverse]: ../plugins/blog.md#config.categories_sort_reverse
[config.categories_pagination]: ../plugins/blog.md#config.categories_pagination
[config.categories_pagination_per_page]: ../plugins/blog.md#config.categories_pagination_per_page
### RSS
<!-- md:version 9.2.0 -->

View File

@ -1,7 +1,3 @@
---
status: new
---
# Setting up social cards
Material for MkDocs can automatically create beautiful social cards for your

View File

@ -18,4 +18,4 @@
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
# IN THE SOFTWARE.
__version__ = "9.4.8"
__version__ = "9.4.12"

File diff suppressed because one or more lines are too long

View File

@ -23,5 +23,5 @@
{% endblock %}
{% block scripts %}
{{ super() }}
<script src="{{ 'assets/javascripts/custom.9c11c319.min.js' | url }}"></script>
<script src="{{ 'assets/javascripts/custom.fe17d8dd.min.js' | url }}"></script>
{% endblock %}

View File

@ -19,9 +19,9 @@
# IN THE SOFTWARE.
from functools import partial
from markdown.extensions.toc import slugify
from mkdocs.config.config_options import Choice, Deprecated, Optional, Type
from mkdocs.config.base import Config
from pymdownx.slugs import slugify
# -----------------------------------------------------------------------------
# Classes
@ -41,7 +41,7 @@ class BlogConfig(Config):
post_url_date_format = Type(str, default = "yyyy/MM/dd")
post_url_format = Type(str, default = "{date}/{slug}")
post_url_max_categories = Type(int, default = 1)
post_slugify = Type((type(slugify), partial), default = slugify)
post_slugify = Type(partial, default = slugify(case = "lower"))
post_slugify_separator = Type(str, default = "-")
post_excerpt = Choice(["optional", "required"], default = "optional")
post_excerpt_max_authors = Type(int, default = 1)
@ -62,7 +62,7 @@ class BlogConfig(Config):
categories = Type(bool, default = True)
categories_name = Type(str, default = "blog.categories")
categories_url_format = Type(str, default = "category/{slug}")
categories_slugify = Type((type(slugify), partial), default = slugify)
categories_slugify = Type(partial, default = slugify(case = "lower"))
categories_slugify_separator = Type(str, default = "-")
categories_allowed = Type(list, default = [])
categories_toc = Optional(Type(bool))

View File

@ -27,6 +27,8 @@ import yaml
from babel.dates import format_date
from datetime import datetime
from jinja2 import pass_context
from jinja2.runtime import Context
from mkdocs.config.defaults import MkDocsConfig
from mkdocs.exceptions import PluginError
from mkdocs.plugins import BasePlugin, event_priority
@ -35,6 +37,7 @@ from mkdocs.structure.files import File, Files, InclusionLevel
from mkdocs.structure.nav import Navigation, Section
from mkdocs.structure.pages import Page
from mkdocs.utils import copy_file, get_relative_url
from mkdocs.utils.templates import url_filter
from paginate import Page as Pagination
from shutil import rmtree
from tempfile import mkdtemp
@ -44,7 +47,6 @@ from .author import Authors
from .config import BlogConfig
from .readtime import readtime
from .structure import Archive, Category, Excerpt, Post, View
from .templates import url_filter
# -----------------------------------------------------------------------------
# Classes
@ -136,19 +138,22 @@ class BlogPlugin(BasePlugin[BlogConfig]):
# Generate views for archive
if self.config.archive:
views = self._generate_archive(config, files)
self.blog.views.extend(views)
self.blog.views.extend(
self._generate_archive(config, files)
)
# Generate views for categories
if self.config.categories:
views = self._generate_categories(config, files)
self.blog.views.extend(views)
self.blog.views.extend(sorted(
self._generate_categories(config, files),
key = lambda view: view.name,
reverse = False
))
# Generate pages for views
if self.config.pagination:
for view in self._resolve_views(self.blog):
for page in self._generate_pages(view, config, files):
page.file.inclusion = InclusionLevel.EXCLUDED
view.pages.append(page)
# Ensure that entrypoint is always included in navigation
@ -180,6 +185,7 @@ class BlogPlugin(BasePlugin[BlogConfig]):
# Revert temporary exclusion of views from navigation
for view in self._resolve_views(self.blog):
view.file.inclusion = self.blog.file.inclusion
for page in view.pages:
page.file.inclusion = self.blog.file.inclusion
@ -298,9 +304,25 @@ class BlogPlugin(BasePlugin[BlogConfig]):
def date_filter(date: datetime):
return self._format_date_for_post(date, config)
# Patch URL template filter to add support for paginated views, i.e.,
# that paginated views never link to themselves but to the main view
@pass_context
def url_filter_with_pagination(context: Context, url: str | None):
page = context["page"]
# If the current page is a view, check if the URL links to the page
# itself, and replace it with the URL of the main view
if isinstance(page, View):
view = self._resolve_original(page)
if page.url == url:
url = view.url
# Forward to original template filter
return url_filter(context, url)
# Register custom template filters
env.filters["date"] = date_filter
env.filters["url"] = url_filter
env.filters["url"] = url_filter_with_pagination
# Prepare view for rendering (run latest) - views are rendered last, as we
# need to mutate the navigation to account for pagination. The main problem
@ -317,16 +339,6 @@ class BlogPlugin(BasePlugin[BlogConfig]):
if view not in self._resolve_views(self.blog):
return
# If the current view is paginated, replace and rewire it - the current
# view temporarily becomes the main view, and is reset after rendering
assert isinstance(view, View)
if view != page:
prev = view.pages[view.pages.index(page) - 1]
# Replace previous page with current page
items = self._resolve_siblings(view, nav)
items[items.index(prev)] = page
# Render excerpts and prepare pagination
posts, pagination = self._render(page)
@ -342,26 +354,6 @@ class BlogPlugin(BasePlugin[BlogConfig]):
context["posts"] = posts
context["pagination"] = pager if pagination else None
# After rendering a paginated view, replace the URL of the paginated view
# with the URL of the original view - since we need to replace the original
# view with a paginated view in `on_page_context` for correct resolution of
# the active state, we must fix the paginated view URLs after rendering
def on_post_page(self, output, *, page, config):
if not self.config.enabled:
return
# Skip if page is not a view managed by this instance - this plugin has
# support for multiple instances, which is why this check is necessary
view = self._resolve_original(page)
if view not in self._resolve_views(self.blog):
return
# If the current view is paginated, replace the URL of the paginated
# view with the URL of the original view - see https://t.ly/Yeh-P
assert isinstance(view, View)
if view != page:
page.file.url = view.file.url
# Remove temporary directory on shutdown
def on_shutdown(self):
rmtree(self.temp_dir)
@ -527,7 +519,7 @@ class BlogPlugin(BasePlugin[BlogConfig]):
# Resolve original page or view (e.g. for paginated views)
def _resolve_original(self, page: Page):
if isinstance(page, View):
if isinstance(page, View) and page.pages:
return page.pages[0]
else:
return page
@ -550,13 +542,14 @@ class BlogPlugin(BasePlugin[BlogConfig]):
file = self._path_to_file(path, config)
files.append(file)
# Create file in temporary directory
# Create file in temporary directory and temporarily remove
# from navigation, as we'll add it at a specific location
self._save_to_file(file.abs_src_path, f"# {name}")
file.inclusion = InclusionLevel.EXCLUDED
# Create and yield view - we don't explicitly set the title of
# the view, so authors can override them in the page's content
# Create and yield view
if not isinstance(file.page, Archive):
yield Archive(None, file, config)
yield Archive(name, file, config)
# Assign post to archive
assert isinstance(file.page, Archive)
@ -585,13 +578,14 @@ class BlogPlugin(BasePlugin[BlogConfig]):
file = self._path_to_file(path, config)
files.append(file)
# Create file in temporary directory
# Create file in temporary directory and temporarily remove
# from navigation, as we'll add it at a specific location
self._save_to_file(file.abs_src_path, f"# {name}")
file.inclusion = InclusionLevel.EXCLUDED
# Create and yield view - we don't explicitly set the title of
# the view, so authors can override them in the page's content
# Create and yield view
if not isinstance(file.page, Category):
yield Category(None, file, config)
yield Category(name, file, config)
# Assign post to category and vice versa
assert isinstance(file.page, Category)
@ -615,12 +609,14 @@ class BlogPlugin(BasePlugin[BlogConfig]):
file = self._path_to_file(path, config)
files.append(file)
# Copy file to temporary directory
# Copy file to temporary directory and temporarily remove
# from navigation, as we'll add it at a specific location
copy_file(view.file.abs_src_path, file.abs_src_path)
file.inclusion = InclusionLevel.EXCLUDED
# Create view and attach to previous page
# Create and yield view
if not isinstance(file.page, View):
yield View(None, file, config)
yield view.__class__(None, file, config)
# Assign pages and posts to view
assert isinstance(file.page, View)
@ -800,7 +796,7 @@ class BlogPlugin(BasePlugin[BlogConfig]):
# Format date
def _format_date(self, date: datetime, format: str, config: MkDocsConfig):
locale = config.theme["language"]
locale: str = config.theme["language"].replace("-", "_")
return format_date(date, format = format, locale = locale)
# Format date for post

View File

@ -212,10 +212,18 @@ class Excerpt(Page):
# View
class View(Page):
# Parent view
parent: View | Section
# Initialize view
def __init__(self, title: str | None, file: File, config: MkDocsConfig):
super().__init__(title, file, config)
self.parent: View | Section
def __init__(self, name: str | None, file: File, config: MkDocsConfig):
super().__init__(None, file, config)
# Initialize name of the view - note that views never pass a title to
# the parent constructor, so the author can always override the title
# that is used for rendering. However, for some purposes, like for
# example sorting, we need something to compare.
self.name = name
# Initialize posts and views
self.posts: list[Post] = []

View File

@ -1,42 +0,0 @@
# Copyright (c) 2016-2023 Martin Donath <martin.donath@squidfunk.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 NON-INFRINGEMENT. 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.
from jinja2 import pass_context
from jinja2.runtime import Context
from material.plugins.blog.structure import View
from mkdocs.utils.templates import url_filter as _url_filter
# -----------------------------------------------------------------------------
# Functions
# -----------------------------------------------------------------------------
# Filter for normalizing URLs with support for paginated views
@pass_context
def url_filter(context: Context, url: str):
page = context["page"]
# If the current page is a view, check if the URL links to the page
# itself, and replace it with the URL of the main view
if isinstance(page, View):
if page.url == url:
url = page.pages[0].url
# Forward to original template filter
return _url_filter(context, url)

View File

@ -47,6 +47,7 @@ class SearchPlugin(BasePlugin[SearchConfig]):
super().__init__(*args, **kwargs)
# Initialize incremental builds
self.is_dirty = False
self.is_dirtyreload = False
# Initialize search index cache

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path d="M17.029 18.772l.777 1.166-5.417 2.709L0 16.451V4.063l5.417-2.709 5.298 7.948 7.867-5.24L24 1.354V16.84l-5.417 2.709-1.554-.777zm2.023-13.827v13.253l3.949-1.975V2.97l-3.949 1.975zM5.076 2.642L1.458 4.45 12.73 21.358l3.618-1.809L5.076 2.642z" />
</svg>

After

Width:  |  Height:  |  Size: 323 B

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.96 12.648h4.08L12 7.74l-2.04 4.908zM12 0 .828 3.984l1.704 14.772L12 24l9.468-5.244 1.704-14.772L12 0zm6.972 18.312h-2.604l-1.404-3.504H9.036l-1.404 3.504H5.028L12 2.652l6.972 15.66z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M16.712 17.711H7.288l-1.204 2.916L12 24l5.916-3.373-1.204-2.916ZM14.692 0l7.832 16.855.814-12.856L14.692 0ZM9.308 0 .662 3.999l.814 12.856L9.308 0Zm-.405 13.93h6.198L12 6.396 8.903 13.93Z"/></svg>

Before

Width:  |  Height:  |  Size: 262 B

After

Width:  |  Height:  |  Size: 265 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M11.324 23.984c-.7-.055-1.581-.198-2.236-.363a11.942 11.942 0 0 1-7.814-6.303c-.61-1.239-.967-2.383-1.127-3.61a9.074 9.074 0 0 0-.102-.639c-.058-.25-.058-1.891 0-2.142.024-.103.07-.39.102-.638.16-1.228.517-2.372 1.127-3.611A11.799 11.799 0 0 1 6.68 1.272C7.919.663 9.063.305 10.29.145c.248-.032.536-.078.639-.102.25-.057 1.892-.057 2.142 0 .103.024.391.07.638.102 1.228.16 2.372.518 3.611 1.127a11.799 11.799 0 0 1 5.406 5.406c.61 1.239.967 2.383 1.127 3.611.032.248.078.535.102.638.026.113.043.541.043 1.071 0 .531-.017.958-.043 1.071-.024.103-.07.391-.102.639-.16 1.227-.517 2.371-1.127 3.61a11.799 11.799 0 0 1-5.406 5.406c-1.239.61-2.383.967-3.611 1.127-.247.033-.526.075-.619.094-.234.049-1.334.073-1.766.039Zm1.551-4.36a10.307 10.307 0 0 0 1.868-.248c2.176-.486 3.95-1.695 5.122-3.492.398-.61.405-.712.027-.416-1.135.891-3.013 1.632-4.999 1.973-1.082.186-1.423.211-2.837.211-1.058 0-1.464-.015-1.865-.065-.998-.127-2.116-.366-2.944-.631-1.252-.4-2.535-1.056-3.199-1.637-.212-.186-.314-.243-.314-.177 0 .048.269.554.426.801 1.435 2.269 3.908 3.516 7.295 3.679l.676.034c.042.003.377-.011.744-.032Zm.233-3.907c1.801-.132 3.472-.507 5.054-1.134 1.175-.466 2.374-1.167 2.867-1.675.167-.172.211-.316.345-1.119.05-.301.134-.672.187-.826.076-.219.105-.404.135-.871.058-.893.007-1.261-.237-1.694-.139-.247-.469-.607-.64-.7l-.129-.069-.221.161c-.317.229-.326.246-.243.41.133.261.2.572.199.923-.003.631-.222 1.091-.798 1.675-2.165 2.198-7.956 2.956-12.17 1.594-1.933-.625-3.219-1.592-3.559-2.676-.085-.27-.095-.358-.08-.676.02-.451.088-.613.511-1.239.166-.244.353-.576.418-.739.065-.163.142-.343.172-.402.086-.166.006-.167-.293-.002-.631.35-1.294.878-1.644 1.31-.469.579-.591 1.01-.547 1.934.027.562.087.854.225 1.094.066.116.096.24.113.476.042.551.138 1.102.215 1.228.1.164.616.593 1.066.886 2.328 1.516 5.915 2.36 9.054 2.131Zm-.056-3.569c1.745-.108 3.299-.463 4.478-1.023.594-.283.934-.515 1.331-.909.414-.413.573-.703.6-1.102.019-.282-.072-.621-.172-.638-.045-.008-.901.459-1.53.835-.067.039-.13.063-.142.051a1.993 1.993 0 0 1-.072-.336c-.071-.44-.135-.573-.345-.718-.324-.225-.391-.298-.523-.572-.116-.241-.149-.28-.288-.334-.26-.102-.557-.299-.557-.368 0-.072.239-.753.39-1.112a3.34 3.34 0 0 0 .099-.249c0-.036-.833-.632-.956-.683-.16-.067-.723-.128-1.205-.13a3.688 3.688 0 0 1-1.258-.206c-.631-.208-.665-.211-1.217-.13-.435.063-.514.087-.698.206-.49.315-.879.428-1.478.43a4.01 4.01 0 0 0-.654.059c-.511.106-.66.182-1.031.528-.469.439-.777.645-1.337.897-.589.265-.655.311-.741.515-.199.469-.293.645-.522.976-.367.53-.453.736-.424 1.016.072.69.818 1.448 1.947 1.981 1.638.772 4.02 1.156 6.305 1.016Zm6.174-4.675c.945-.578 1.504-1.038 1.672-1.377.087-.177.076-.241-.075-.425-.373-.452-1.844-1.32-2.491-1.47-.299-.069-.359-.045-.539.217-.277.403-.946 1.948-.946 2.183 0 .032.084.103.187.159.164.09.204.137.315.37.107.226.157.286.319.387.12.074.235.187.304.3.185.297.165.291.445.136.139-.077.503-.292.809-.48Z"/></svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10.385 0c-1.15 0-2.076.93-2.076 2.076V5.31c0 1.148.929 2.076 2.076 2.076h3.23c1.15 0 2.076-.93 2.076-2.076V2.076A2.074 2.074 0 0 0 13.615 0h-3.23zm0 .924h3.23c.638 0 1.155.514 1.155 1.152V5.31c0 .638-.516 1.152-1.155 1.152h-3.23A1.152 1.152 0 0 1 9.23 5.309V2.076c0-.638.516-1.152 1.155-1.152zm0 7.385c-1.15 0-2.076.929-2.076 2.076v3.23c0 1.15.929 2.076 2.076 2.076h3.23c1.15 0 2.076-.929 2.076-2.076v-3.23c0-1.15-.929-2.076-2.076-2.076h-3.23zm0 .921h3.23c.638 0 1.155.516 1.155 1.155v3.23c0 .638-.516 1.155-1.155 1.155h-3.23a1.154 1.154 0 0 1-1.155-1.155v-3.23c0-.638.516-1.155 1.155-1.155zm0 7.385c-1.15 0-2.076.93-2.076 2.076v3.233c0 1.149.929 2.076 2.076 2.076h3.23c1.15 0 2.076-.93 2.076-2.076V18.69a2.075 2.075 0 0 0-2.076-2.076h-3.23zm0 .924h3.23c.638 0 1.155.514 1.155 1.152v3.233c0 .638-.516 1.152-1.155 1.152h-3.23a1.152 1.152 0 0 1-1.155-1.152V18.69c0-.638.516-1.152 1.155-1.152Z"/></svg>

After

Width:  |  Height:  |  Size: 969 B

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12.53 7.326v16.649C12.328 24 12.227 24 12 24c-.227 0-.354 0-.556-.025V7.326h1.086zm-2.4 0V23.9a8.27 8.27 0 0 1-1.086-.278V7.326h1.087zm4.8 0v16.27c-.555.177-.783.252-1.086.303V7.326h1.086zm-7.2 7.73v8.16c-.227-.075-.328-.125-.555-.227-.177-.075-.303-.126-.53-.252v-7.68H7.73zm9.626 0v7.68c-.43.203-.733.355-1.112.48v-8.16h1.112zM12 0c6.644 0 12 5.381 12 12.05 0 2.653-.859 5.23-2.425 7.226-.708.935-1.39 1.54-2.93 2.703v-6.922h1.085v4.9c2.274-2.601 3.26-4.976 3.26-7.932C22.99 5.861 18.087.885 12 .885S.985 5.885.985 12.074c0 2.83.91 5.028 3.26 7.883v-4.901h1.11v6.922c-1.237-.733-2.4-1.92-3.41-3.41A11.49 11.49 0 0 1 0 12.125C0 5.381 5.33 0 12 0zm0 2.653 3.638 2.854-.632.733L12 3.89 8.994 6.24l-.632-.708L12 2.652z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M5.41 22.03c-1.72-1.24-2.63-2.15-3.49-3.46A12.185 12.185 0 0 1 0 12.03C0 5.38 5.36 0 12 0s12 5.38 12 12c0 2.73-.93 5.46-2.58 7.48-.68.86-1.26 1.36-2.83 2.55v-7.02h1.19v4.8c.88-1.04 1.31-1.67 1.74-2.43.88-1.57 1.36-3.51 1.36-5.38 0-6.06-4.88-10.99-10.89-10.99S1.11 5.94 1.11 12.08c0 2.8.99 5.28 3.08 7.73v-4.8H5.4v7.02Zm2.37 1.21c-.23-.05-.76-.3-1.19-.53V15h1.19v8.24Zm7.23-16.92L12 4 8.99 6.32l-.66-.86 3.66-2.86 3.66 2.86-.66.86Zm-4.83 17.56c-.43-.08-.45-.08-.61-.13-.13-.02-.18-.02-.58-.13V7.2h1.19v16.67Zm2.4.1c-.18.02-.23.02-.48.02-.38 0-.51 0-.71-.02V7.2h1.19v16.78Zm2.4-.38c-.38.13-.71.2-1.19.3V7.2h1.19v16.4Zm2.43-.88c-.38.18-.61.28-1.21.56v-8.27h1.21v7.71Z"/></svg>

Before

Width:  |  Height:  |  Size: 795 B

After

Width:  |  Height:  |  Size: 742 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18.766 10.341 12.006 0l-6.77 10.342c-1.945 2.97-2.191 6.432-.66 9.264C6.04 22.316 8.885 24 12.001 24c3.113 0 5.957-1.681 7.421-4.388 1.532-2.832 1.287-6.297-.657-9.27zm-10.082 6.9c1.433 2.554 3.608 3.045 6.585 2.102-1.7 1.848-5.188 2.337-7.557-.302-1.63-1.817-1.773-4.351-.642-6.468 1.132-2.117 3.388-2.706 5.012-1.551-3.723.09-4.43 4.38-3.398 6.218zm8.72-6.009c.723 1.107 1.152 2.267 1.314 3.418-3.354 5.763-7.862 4.879-9.062 1.377-.554-1.618 1.19-5.08 4.514-3.725-1.296-2.838-4.238-4.017-6.911-1.809a5.099 5.099 0 0 0-.609.66l5.355-8.179 5.398 8.258z"/></svg>

After

Width:  |  Height:  |  Size: 631 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M16.506 11.982a6.026 6.026 0 0 0-3.866-5.618V17.6a6.025 6.025 0 0 0 3.866-5.618zM8.33 17.598V6.365a6.03 6.03 0 0 0-3.863 5.617 6.028 6.028 0 0 0 3.863 5.616zm2.156-15.113A9.497 9.497 0 0 0 .99 11.982a9.495 9.495 0 0 0 9.495 9.494 9.495 9.495 0 0 0 9.496-9.494 9.499 9.499 0 0 0-9.496-9.497Zm-.023 19.888C4.723 22.4 0 17.75 0 12.09 0 5.905 4.723 1.626 10.463 1.627h2.69C18.822 1.627 24 5.903 24 12.09c0 5.658-5.176 10.283-10.848 10.283"/></svg>

After

Width:  |  Height:  |  Size: 512 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.25 12.358c.124-.306.25-.612.38-.918.058.306.12.613.185.918H3.25zm.129-1.943a46.426 46.426 0 0 0-1.396 3.151h.649a.234.234 0 0 0 .216-.154c.05-.137.102-.273.155-.41h.957l.103.411a.2.2 0 0 0 .195.155h.667a38.402 38.402 0 0 1-.752-3.152l-.794-.001zm1.935 3.152h.784c.062-1.044.17-2.089.321-3.134h-.783a36.666 36.666 0 0 0-.322 3.134m3.23-2.018c-.029.25-.201.407-.467.407h-.388c.028-.273.06-.546.094-.819h.384c.262 0 .41.134.378.402v.009m.793-.04c0-.008.002-.016.003-.023.037-.318-.026-.56-.172-.734-.17-.206-.461-.318-.871-.318H6.882a27.6 27.6 0 0 0-.096.703h.218c-.103.81-.178 1.62-.226 2.43h.78c.02-.323.043-.646.07-.97h.278c.128.285.26.57.394.856a.2.2 0 0 0 .183.115h.756a53.18 53.18 0 0 1-.542-1.137 1.11 1.11 0 0 0 .64-.922m2.093.062c-.031.264-.212.43-.487.43h-.274c.03-.293.062-.572.099-.865h.27c.283 0 .427.134.393.42l-.001.014m-.257-1.137H9.866c-.033.23-.066.473-.096.703h.217a36.478 36.478 0 0 0-.224 2.432h.78c.018-.303.04-.606.065-.909h.3c.669-.009 1.225-.367 1.31-1.12l.002-.017c.083-.703-.326-1.088-1.046-1.088m3.032 1.19h-.866c.044-.396.096-.793.154-1.19h-.784a36.105 36.105 0 0 0-.32 3.134h.784c.023-.403.053-.806.09-1.209h.867c-.037.403-.067.806-.09 1.21h.788a36.75 36.75 0 0 1 .321-3.135h-.789c-.058.397-.11.794-.154 1.19m6.068.386a52.412 52.412 0 0 1-.847-1.631l-.718.12a36.018 36.018 0 0 0-.312 3.07h.773c.031-.547.076-1.095.133-1.642.278.516.566 1.032.865 1.548a.188.188 0 0 0 .163.094h.59a36.75 36.75 0 0 1 .32-3.134h-.772a38.732 38.732 0 0 0-.196 1.576M.941 11.713c.02-.185.042-.37.066-.556h1.427c.031-.24.064-.482.1-.724H.104c-.036.242-.069.483-.1.725h.218A35.93 35.93 0 0 0 0 13.568h.784c.023-.386.052-.773.087-1.16h.845a.247.247 0 0 0 .236-.221c.016-.158.032-.315.05-.473H.94zm21.461 1.147c.015-.18.03-.359.047-.538h.859a.247.247 0 0 0 .237-.221c.014-.149.03-.297.047-.446h-1.075c.02-.172.04-.343.062-.515h1.324c.03-.235.063-.471.097-.707h-2.317a34.27 34.27 0 0 0-.097.707h.218a35.363 35.363 0 0 0-.225 2.427h2.119c.013-.236.03-.471.048-.707h-1.344zm-5.079-.795-.005.049c-.054.542-.293.782-.66.782-.36 0-.59-.332-.535-.874 0-.016.003-.033.005-.049.056-.542.349-.869.71-.869a.46.46 0 0 1 .408.225l-.11.106c.093.15.217.357.188.63m.414-1.202.108-.105c-.212-.243-.52-.383-.903-.383-.818 0-1.52.658-1.616 1.593l-.007.068c-.095.94.463 1.59 1.286 1.59.822 0 1.419-.572 1.513-1.508l.007-.067a1.545 1.545 0 0 0-.388-1.188"/></svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M23.186 9.07 21.41 8.019a2.78 2.78 0 0 1-1.344-2.391V3.523c0-.431-.19-.837-.516-1.108A11.965 11.965 0 0 0 16.317.493a1.356 1.356 0 0 0-1.193.091L13.347 1.64a2.622 2.622 0 0 1-2.688 0L8.882.584a1.348 1.348 0 0 0-1.194-.09 11.93 11.93 0 0 0-3.231 1.918 1.44 1.44 0 0 0-.516 1.108v2.104c0 .986-.51 1.897-1.344 2.392L.823 9.068c-.363.215-.61.588-.675 1.013A12.24 12.24 0 0 0 0 12.001c0 .651.048 1.292.145 1.916.065.425.312.801.675 1.016l1.774 1.052a2.78 2.78 0 0 1 1.344 2.392v2.104c0 .431.191.837.516 1.108.965.8 2.054 1.452 3.231 1.919.393.155.831.124 1.194-.091l1.777-1.055a2.622 2.622 0 0 1 2.688 0l1.777 1.055c.363.215.804.246 1.193.091a11.973 11.973 0 0 0 3.232-1.92 1.44 1.44 0 0 0 .516-1.107v-2.104a2.78 2.78 0 0 1 1.344-2.392l1.774-1.052c.363-.215.61-.588.675-1.016.094-.624.145-1.265.145-1.916 0-.652-.048-1.293-.145-1.917a1.41 1.41 0 0 0-.67-1.013zM12.003 19.41c-3.981 0-7.21-3.317-7.21-7.407s3.229-7.406 7.21-7.406c3.98 0 7.21 3.316 7.21 7.406s-3.23 7.407-7.21 7.407z"/></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M11.996 0a1.119 1.119 0 0 0-.057.003.9.9 0 0 0-.236.05.907.907 0 0 0-.165.079L1.936 5.675a.889.889 0 0 0-.445.77V17.556a.889.889 0 0 0 .47.784l9.598 5.541.054.029v.002a.857.857 0 0 0 .083.035l.012.004c.028.01.056.018.085.024.01.001.011.003.016.004a.93.93 0 0 0 .296.015.683.683 0 0 0 .086-.015c.01 0 .011-.002.016-.004a.94.94 0 0 0 .085-.024l.012-.004a.882.882 0 0 0 .083-.035v-.002a1.086 1.086 0 0 0 .054-.029l9.599-5.541a.889.889 0 0 0 .469-.784V6.48l-.001-.026v-.008a.889.889 0 0 0-.312-.676l-.029-.024c0-.002-.01-.005-.01-.007a.899.899 0 0 0-.107-.07L12.453.127A.887.887 0 0 0 11.99 0zm.01 2.253c.072 0 .144.019.209.056l6.537 3.774a.418.418 0 0 1 0 .724l-6.537 3.774a.418.418 0 0 1-.418 0L5.26 6.807a.418.418 0 0 1 0-.724l6.537-3.774a.42.42 0 0 1 .209-.056zm-8.08 6.458a.414.414 0 0 1 .215.057l6.524 3.766a.417.417 0 0 1 .208.361v7.533a.417.417 0 0 1-.626.361l-6.523-3.766a.417.417 0 0 1-.209-.362V9.13c0-.241.196-.414.41-.418zm16.16 0c.215.004.41.177.41.418v7.532c0 .15-.08.287-.208.362l-6.524 3.766a.417.417 0 0 1-.626-.361v-7.533c0-.149.08-.286.209-.36l6.523-3.767a.415.415 0 0 1 .216-.057z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m22.51 6.457.001-.013a.888.888 0 0 0-.271-.638l-.027-.024c-.019-.016-.037-.033-.057-.048-.02-.015-.04-.028-.06-.04l-.029-.02-9.61-5.547a.891.891 0 0 0-.922.004L1.933 5.674l-.03.02-.023.014-.02.015a.877.877 0 0 0-.147.134l-.003.003a.887.887 0 0 0-.221.584v.014l-.001.027v11.07c0 .328.18.63.469.784l9.599 5.542.023.011a.875.875 0 0 0 .166.07l.04.01a.88.88 0 0 0 .072.015c.012.002.023.005.035.006a.835.835 0 0 0 .216 0c.012-.001.023-.004.035-.006a.9.9 0 0 0 .072-.014l.04-.012a.895.895 0 0 0 .064-.022.913.913 0 0 0 .102-.047l.023-.011 9.599-5.542a.889.889 0 0 0 .469-.784V6.478l-.001-.021zM5.255 6.082l6.537-3.774a.418.418 0 0 1 .418 0l6.537 3.774a.418.418 0 0 1 0 .725l-6.537 3.774a.418.418 0 0 1-.418 0L5.254 6.807a.418.418 0 0 1 0-.725zm5.614 14.345a.417.417 0 0 1-.626.361l-6.524-3.766a.417.417 0 0 1-.209-.361V9.127a.417.417 0 0 1 .626-.361l6.524 3.766a.417.417 0 0 1 .209.362v7.532zm9.623-3.766a.417.417 0 0 1-.209.36l-6.524 3.767a.417.417 0 0 1-.626-.36v-7.533c0-.15.08-.287.209-.362l6.524-3.766a.417.417 0 0 1 .626.36v7.534z"/></svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M11.197 3.696C4.749 3.696 0 7.802 0 12.19c0 2.267 1.275 4.177 2.88 5.5l.122-.083C1.729 16.553.58 14.9.58 12.637.916 7.835 6.825 5.13 12.076 5.13c3.718 0 10.393.86 10.393 7.086 0 3.248-3.464 7.473-10.736 7.473-3.725 0-6.618-1.999-6.618-4.87 0-2.488 1.943-4.258 4.841-4.258.799 0 1.547.187 2.118.342-1.209-.218-3.085.093-4.056.857v4.205h3.561v-4.78a4.399 4.399 0 0 1 1.551.598v4.182h.928c-.73.82-2.088 1.319-3.264 1.135v.176c3.384.267 4.816-1.341 4.816-3.15 0-2.128-1.994-3.378-4.03-3.634V7.349H8.017v3.18c-2.305.465-4.56 1.837-4.56 4.11 0 3.498 4.88 5.665 9.125 5.665 6.452 0 11.417-3.125 11.417-7.51 0-5.31-7.168-9.098-12.803-9.098m4.908 10.552c0-1.545-1.055-2.784-2.975-3.382V7.35h3.557v8.616h-1.112c.391-.552.53-1.178.53-1.717"/></svg>

After

Width:  |  Height:  |  Size: 806 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M15.402 11.19c-.701.7-1.838.7-2.54 0a1.796 1.796 0 1 1 2.539 0m.998-3.614a6.17 6.17 0 0 0-4.39-1.818 6.17 6.17 0 0 0-4.392 1.818 6.217 6.217 0 0 0 0 8.782 6.169 6.169 0 0 0 4.39 1.819 6.169 6.169 0 0 0 4.392-1.82 6.217 6.217 0 0 0 0-8.78m1.554 10.33a8.353 8.353 0 0 1-5.945 2.462 8.353 8.353 0 0 1-5.944-2.46c-3.277-3.277-3.277-8.607 0-11.883a8.353 8.353 0 0 1 5.944-2.46 8.35 8.35 0 0 1 5.944 2.46c3.278 3.276 3.278 8.606 0 11.882m4.51-11.293a20.81 20.81 0 0 1-.137-.292 2.779 2.779 0 0 1 .485-3.007c.018-.014.08-.08.117-.118a.412.412 0 0 0 .053-.069.66.66 0 0 0-.097-.81.296.296 0 0 0-.026-.02 1.113 1.113 0 0 0-.18-.11l-.068-.034A19.08 19.08 0 0 0 9.71.443l-.016.022a11.708 11.708 0 0 0-6.012 3.218c-3.75 3.75-4.44 9.403-2.065 13.852.023.043.107.195.123.233a2.778 2.778 0 0 1-.556 2.919 4.39 4.39 0 0 0-.072.08.66.66 0 0 0 0 .934c.06.056.127.105.198.146l.01.006a19.08 19.08 0 0 0 13 1.677v.002a11.708 11.708 0 0 0 5.997-3.216c3.709-3.708 4.423-9.277 2.144-13.702"/></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m17.029 18.772.777 1.166-5.417 2.709L0 16.451V4.063l5.417-2.709 5.298 7.948 7.867-5.24L24 1.354V16.84l-5.417 2.709zm2.023-13.827v13.253l3.949-1.975V2.97zM5.076 2.642 1.458 4.45 12.73 21.358l3.618-1.809z"/></svg>

After

Width:  |  Height:  |  Size: 280 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M23.99 2.115A12.223 12.223 0 0 0 12 10.149 12.223 12.223 0 0 0 .01 2.115a12.23 12.23 0 0 0 5.32 10.604 6.562 6.562 0 0 1 2.845 5.423v3.754h7.65v-3.754a6.561 6.561 0 0 1 2.844-5.423 12.223 12.223 0 0 0 5.32-10.604Z"/></svg>

After

Width:  |  Height:  |  Size: 291 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0zm.312 22.775c-6.153 0-11.142-4.988-11.142-11.142S6.16.491 12.312.491c6.154 0 11.142 4.989 11.142 11.142s-4.988 11.142-11.142 11.142zm.643-20.464a8.587 8.587 0 1 0 0 17.174 8.587 8.587 0 0 0 0-17.174zm-1.113 15.257a5.517 5.517 0 1 1 0-11.034 5.517 5.517 0 0 1 0 11.034zm-1.399-7.995L14.4 11.97l-3.957 2.518V9.573z"/></svg>

After

Width:  |  Height:  |  Size: 461 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10.44.418a3.12 3.12 0 0 1 3.12 0l7.69 4.44a3.12 3.12 0 0 1 1.56 2.702v8.88a3.12 3.12 0 0 1-1.56 2.702l-7.69 4.44a3.12 3.12 0 0 1-3.12 0l-7.69-4.44a3.12 3.12 0 0 1-1.56-2.702V7.56a3.12 3.12 0 0 1 1.56-2.702Zm3.87 3.315L12.311 2.58a.624.624 0 0 0-.624 0l-7.69 4.44a.624.624 0 0 0-.312.54v3.774l10.623-6.133Zm2.496 13.643 1.255.725 1.941-1.12a.624.624 0 0 0 .312-.541V7.56a.624.624 0 0 0-.312-.54l-3.196-1.845Zm-2.497-1.441V8.083l-6.8 3.926ZM3.686 14.217v2.223c0 .223.119.429.312.54l7.69 4.44a.624.624 0 0 0 .624 0l3.252-1.878-10.55-6.091Z"/></svg>

After

Width:  |  Height:  |  Size: 615 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 23.992c1.25.211 7.051-3.743 9.113-8.217.253-.686.61-1.198.746-2.5.21-2.016-.41-3.912-1.59-5.419-.987-1.163-2.305-2.004-3.88-2.532l.683-2.583a1.371 1.371 0 1 0-.76-.189L15.64 5.1c-1.109-.288-2.328-.437-3.64-.444m5.978 11.667c-1.548 1.346-2.525 1.488-3.045 1.467-.274-.034-.75-.558-.919-1.104-.188-.612-.28-1.282-.273-2.2-.199-2.476 1.465-5.624 3.937-6.041 1.003-.186 2.39.493 2.889 2.088.506 1.422-.645 4.147-2.589 5.79zM12 4.656c-1.315.007-2.538.156-3.65.447l-.675-2.56A1.37 1.37 0 0 0 6.962 0a1.372 1.372 0 0 0-.044 2.742L7.6 5.328c-1.57.528-2.885 1.367-3.871 2.528-1.179 1.507-1.8 3.403-1.588 5.419.136 1.302.492 1.814.745 2.5 2.062 4.474 7.862 8.428 9.113 8.217m-1.507-9.507c.007.92-.086 1.589-.274 2.201-.167.546-.644 1.07-.918 1.104-.52.021-1.498-.121-3.045-1.467-1.944-1.643-3.095-4.368-2.589-5.79.5-1.595 1.886-2.274 2.889-2.088 2.471.417 4.136 3.565 3.937 6.04zm6.45-2.19a1.24 1.24 0 1 0 0 2.48 1.24 1.24 0 0 0 0-2.48zm.416 1.149a.325.325 0 1 1 0-.65.325.325 0 0 1 0 .65zM7.25 12.294a1.24 1.24 0 1 0 0 2.48 1.24 1.24 0 0 0 0-2.48zm-.418 1.15a.325.325 0 1 1 0-.65.325.325 0 0 1 0 .65z"/></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0 0v24h10.718v-3.805l3.496-4.272h-3.496v-5.205H4.427l6.291-7.767V0Zm13.282 0v3.884L9.786 8.155h3.496v5.205h6.291l-6.291 7.767V24H24V0Z"/></svg>

After

Width:  |  Height:  |  Size: 213 B

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.957 5.077a.787.787 0 1 0-.409 1.52L17.7 9.04a.787.787 0 1 0 .409-1.52l-9.15-2.444ZM6.97 9.434a.79.79 0 0 1 .967-.557l9.15 2.445a.787.787 0 1 1-.409 1.52l-9.15-2.444a.787.787 0 0 1-.558-.964Zm-.055 3.244a.787.787 0 1 0-.409 1.52l5.338 1.427a.787.787 0 1 0 .409-1.52l-5.338-1.427Zm13.945-9.31L8.658.107a3.159 3.159 0 0 0-3.867 2.226L.907 16.777a3.147 3.147 0 0 0 2.233 3.855l12.201 3.26a3.159 3.159 0 0 0 3.868-2.226l3.882-14.443a3.147 3.147 0 0 0-2.233-3.856ZM6.316 2.74a1.58 1.58 0 0 1 1.933-1.113l12.201 3.26a1.573 1.573 0 0 1 1.116 1.927L17.684 21.26a1.58 1.58 0 0 1-1.933 1.113L3.55 19.111a1.573 1.573 0 0 1-1.117-1.927L6.316 2.74Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20.831 3.367 8.67.108a3.148 3.148 0 0 0-3.856 2.226L.943 16.777a3.148 3.148 0 0 0 2.226 3.856l12.163 3.259a3.148 3.148 0 0 0 3.855-2.226l3.87-14.443a3.148 3.148 0 0 0-2.226-3.856ZM6.333 2.741a1.574 1.574 0 0 1 1.928-1.113l12.163 3.26a1.574 1.574 0 0 1 1.113 1.927l-3.87 14.444a1.574 1.574 0 0 1-1.928 1.113l-12.163-3.26a1.574 1.574 0 0 1-1.113-1.927L6.333 2.74Zm2.634 2.336a.787.787 0 1 0-.407 1.52l9.122 2.444a.787.787 0 1 0 .407-1.52L8.967 5.077ZM6.985 9.434a.787.787 0 0 1 .963-.557l9.123 2.445a.787.787 0 0 1-.408 1.52l-9.122-2.444a.787.787 0 0 1-.556-.964Zm-.055 3.244a.787.787 0 0 0-.407 1.52l5.32 1.427a.787.787 0 0 0 .408-1.52L6.93 12.677Z"/></svg>

Before

Width:  |  Height:  |  Size: 715 B

After

Width:  |  Height:  |  Size: 726 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 0C5.372 0 0 5.372 0 11.999c0 5.422 3.597 10.003 8.536 11.49.011-.186.028-.406.049-.669.026-.316-.142-.784-.382-.963-2.67-1.997-3.534-4.125-2.906-7.394a.197.197 0 0 1 .335-.101c.72.747 1.234 1.218 1.988 2.094 1.121 1.305 1.557 2.839 1.42 4.59.123-.531.3-1.057.358-1.596.242-2.222.775-4.326 2.426-5.958.425-.42.939-.823 1.488-1.033 1.448-.552 2.953-.965 3.931-2.339.08.049-.451 1.869-.541 2.263-.645 2.193-.42 2.3-1.186 4.45-.506 1.417-1.596 2.404-3.125 2.798-1.504.386-2.349 1.4-2.56 2.898-.077.558-.123.947-.149 1.246.75.147 1.525.225 2.318.225 6.628 0 12-5.372 12-11.999C24 5.374 18.629 0 12 0Zm-1.158 13.463a1.425 1.425 0 0 1-.306.689c-.578.658-1.105 1.844-1.418 3.425-.567-1.75-2.556-3.304-3.273-4.606-.247-.448-.051-1.963.281-3.223.607-1.782.637-2.096.981-3.594 1.689 1.365 2.041 2.267 2.954 3.879.456.804.957 1.904.782 3.43zm4.227-2.272c-1.586.647-2.565 1.018-3.576 1.82.252-1.354-.602-2.944-1.137-4.146-.079-.177.948-1.858 1.13-2.14 1.205-1.498 1.17-1.767 2.83-2.38 1.354-.5 2.719-.97 4.065-1.449-.24 3.291-.805 7.273-3.312 8.295z"/></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10.413 7.62c.042 0 .063.02.105.02.062 0 .148-.02.21-.061l.736-.415c.21-.124.273-.372.148-.559l-.946-1.635a.374.374 0 0 0-.253-.187c-.105-.02-.23-.02-.315.042l-.735.414c-.211.125-.274.373-.148.56l.946 1.635c.042.082.147.145.252.186zm3.699 4.06-.735.413c-.21.125-.274.374-.148.56l.946 1.635a.373.373 0 0 0 .253.187c.041 0 .062.02.104.02a.409.409 0 0 0 .211-.062l.735-.414c.21-.125.274-.373.148-.56l-.946-1.635a.375.375 0 0 0-.252-.187.558.558 0 0 0-.316.042ZM11.989 0C6.105 0 1.333 4.7 1.333 10.499c0 .953.127 1.884.379 2.795.147.56.735.87 1.282.725.567-.145.882-.725.736-1.263a8.098 8.098 0 0 1-.316-2.237C3.436 5.86 7.28 2.071 11.99 2.071s8.555 3.79 8.555 8.428c0 3.189-1.787 6.067-4.667 7.517a6.35 6.35 0 0 1-.861.372c-.126.041-.252.104-.4.145a1.046 1.046 0 0 0-.735.994c0 .498.084 1.056.274 1.657l-2.46-1.305c-.987-.517-1.955-1.056-2.753-1.822-.904-.87-1.198-1.429-1.282-2.444-.084-.931.147-1.594.904-2.505.4-.497.924-.85 1.344-1.097.4-.25.82-.477 1.262-.685a2.097 2.097 0 0 0 2.27.146 2.053 2.053 0 0 0 .798-2.816c-.567-.995-1.849-1.347-2.858-.788a2.021 2.021 0 0 0-1.051 1.575c-.525.249-1.05.538-1.534.849-.547.331-1.262.828-1.87 1.573-.758.932-1.514 2.133-1.367 3.976.126 1.532.631 2.527 1.892 3.748 1.009.974 2.101 1.595 3.258 2.196l3.95 2.05c.211.103.463.165.694.165.379 0 .736-.145 1.009-.394a1.41 1.41 0 0 0 .315-1.656 7.646 7.646 0 0 1-.588-1.677c.252-.104.505-.229.756-.332 3.595-1.801 5.823-5.384 5.823-9.36C22.645 4.701 17.875 0 11.989 0Z"/></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M23.73 10.23a10.274 10.274 0 0 0-1.331-3.411c-.18-.324-.417-.63-.619-.919-1.35-1.893-2.418-2.53-2.624-2.643a9.732 9.732 0 0 0-.562-.375c-1.743-1.087-2.868-1.237-2.868-1.237a9.806 9.806 0 0 0-2.174-.618c-1.256-.15-2.306-.131-3.224 0 .15-.263.281-.356.318-.375.024 0 .017 0 0 0-.45.037-.993.337-1.48.637.337-.656 1.05-1.03 1.143-1.087h.019C9.765.165 8.172.521 6.804 2.039 2.549 3.82 0 7.72 0 11.973c0 3.224 1.256 5.548 2.624 7.085 1.293 1.406 2.718 2.156 3.393 2.362.07.028.225.037.225.037.018-.056-.863-1.462-1.256-3.149.787.806 1.724 1.425 2.774 1.537.112.02-.375-.58-.9-1.368l.712.244 7.817 2.605c-.769.787-1.8 1.556-3.206 2.23 0 0 3.15-.262 4.705-2.005-.637 1.462-2.38 2.25-2.38 2.25 1.274-.188 4.648-1.182 6.785-3.862 2.437-3.036 3.168-5.885 2.437-9.71zm-6.223 7.104c-.244 1.18-.75 2.493-1.893 3.749L1.799 16.49c-.393-1.255-.58-2.717-.468-4.423.243.45.974.825 1.424.843-1.05-2.343-.637-3.955.15-5.023a635.68 635.68 0 0 1 1.031 1.518v-.112c.019-.15.038-.263.075-.375-.356-.525-.656-.975-.88-1.293A5.288 5.288 0 0 1 4.48 6.537c.018.207.056.394.112.619.075.319.094.787.056 1.162V8.3c0 .075-.018.15-.037.225-.019.075-.225.281-.281.825-.057.581.15.9.356 1.143.243-.225.693-.787 1.518-1.106.825-.337 1.368-.824 2.418-1.349.619-.319 1.275-.281 2.1-.244 1.48.263 3.43.788 5.248.881.412.975.58 2.38.58 2.418 0 .131.02.244.02.356-3.225 1.219-7.01 2.606-8.604 3.018-.131.038-1.518-1.968-2.812-3.88-.018.038-.056.056-.075.075-.037.038-.075.075-.093.113h-.113c1.387 2.043 2.868 4.16 3.018 4.16 1.406-.505 5.604-1.949 8.66-2.998-.02 2.305-.581 3.167-.581 3.167s.768-.3 1.555-1.087c0 .637-.168 2.287-1.5 3.88 0 0 .694-.187 1.481-.562Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.948 4.444h-.005c-1.92.788-2.126 2.55-1.817 3.499v.02C9.236 7.18 10.658 6.76 12 6.76c3.26 0 5.902 2.156 5.902 4.815 0 2.66-2.643 4.816-5.902 4.816l-.083-.002c-.155-.006-.354-.013-.435.118-.096.156.116.397.238.536 1.274 1.441 3.123 1.622 3.608 1.67l.076.008c-4.281.414-9.304-2.32-9.306-7.076 0-1.12.414-2.073 1.075-2.83l-.005-.002h-.003C7.31 6.38 6.376 3.47 4.629 2.898c-.124-.04-.246.054-.262.183-.23 1.924-.727 2.59-1.264 3.31-.805 1.08-1.39 2.328-1.365 3.698a10.99 10.99 0 0 1-.705-1.91c-.024-.09-.17-.365-.333-.272-.13.072-.227.274-.296.485A12.137 12.137 0 0 0 0 11.489c0 6.536 5.475 12 12 12 6.627 0 12-5.372 12-12 0-2.526-.781-4.87-2.115-6.805l.167-.002c.518 0 1.024.045 1.51.129-.734-.816-1.724-1.475-2.877-1.904a8.54 8.54 0 0 1 2.494-.495c-1.426-1.166-3.508-1.9-5.827-1.9-3.355 0-6.648 1.29-7.404 3.93zm.682 9.166c-.87-.905-3.473-3.91-3.473-3.91l.202.01 4.075 3.042c.305.223.74.22 1.043-.004l3.996-3.034.212-.018s-2.518 2.935-3.483 3.9c-.964.968-1.703.919-2.572.014zm2.774-10.083s.055.625-.576.824c-.722.227-1.042-.38-1.042-.38s.09-.417.676-.61c.626-.206.942.166.942.166z"/></svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14.271 10.42 6.86 3.006 9.833.034l4.438 4.438L18.742 0l2.974 2.974ZM9.825 24l-2.973-2.974 7.445-7.445 7.412 7.412-2.974 2.973-4.438-4.437zm-4.567-4.568-2.974-2.974 4.47-4.47-4.437-4.439 2.974-2.974 7.412 7.412Z"/></svg>

After

Width:  |  Height:  |  Size: 289 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21.78 7.376c.512 1.181.032 2.644-1.11 3.106-2.157.888-3-1.295-3-1.295-.236-.55-.727-1.496-1.335-1.496-.204 0-.503 0-.94.844-.229.443-.434 1.185-.616 1.84l-.09.32c-.373-1.587-.821-3.454-1.536-4.816-.195-.38-.42-.74-.673-1.08a5.135 5.135 0 0 1 1.743-1.337 4.891 4.891 0 0 1 2.112-.463c1.045 0 2.765.338 4.227 2.227.167.206.317.424.448.654.278.441.52.904.726 1.383l.043.113zM.02 8.4C-.15 7.105.8 5.845 1.953 5.755c1.794-.157 2.36 1.385 2.455 1.89l.022.137c.07.44.29 1.838.48 2.744.078.4.244 1.013.353 1.416l.006.022.026.092c.11.4.232.799.362 1.193.185.548.399 1.085.641 1.61.47.955.93 1.45 1.367 1.45.203 0 .512 0 .96-.878.283-.59.512-1.208.684-1.845.373 1.598.811 3.128 1.495 4.456.205.406.444.794.715 1.16a5.124 5.124 0 0 1-1.742 1.338 4.88 4.88 0 0 1-2.112.461c-1.548 0-3.727-.698-5.339-4.005a22.407 22.407 0 0 1-1.078-2.824 26.848 26.848 0 0 1-.693-2.656 48.56 48.56 0 0 1-.215-1.114A31.971 31.971 0 0 1 .02 8.4zm22.047-2.645-.202-.022h-.052c.222.392.421.797.597 1.215l.053.113a3.29 3.29 0 0 1 .068 2.391 3.079 3.079 0 0 1-1.552 1.749 2.93 2.93 0 0 1-1.228.28 3.115 3.115 0 0 1-.854-.135c-.299 1.182-.768 2.634-1.195 3.511-.427.877-.93 1.451-1.378 1.451-.192 0-.501 0-.95-.877a10.746 10.746 0 0 1-.683-1.845 38.722 38.722 0 0 1-.396-1.575 12.67 12.67 0 0 1-.136-.598l-.002-.01c-.406-1.778-.865-3.645-1.655-5.142A8.263 8.263 0 0 0 11.52 4.8a5.136 5.136 0 0 0-1.748-1.34A4.892 4.892 0 0 0 7.654 3C6.618 3 4.9 3.338 3.437 5.228c.466.223.867.562 1.164.984.305.433.499.933.565 1.458.076.563.256 1.654.47 2.688l.001.007c.021.11.042.221.073.342.126-.34.25-.642.38-.955l.112-.271.128-.293c.235-.55.726-1.496 1.324-1.496.213 0 .513 0 .95.844.296.606.532 1.239.706 1.89.138.507.276 1.047.394 1.587.04.148.07.296.101.444l.006.028c.427 1.879.875 3.69 1.644 5.187a7.82 7.82 0 0 0 1.025 1.531c1.27 1.45 2.733 1.8 3.843 1.8 1.548 0 3.738-.698 5.35-4.006.822-1.7 1.515-4.208 1.772-5.48.256-1.27.449-2.419.534-3.115a2.42 2.42 0 0 0-.433-1.743 2.247 2.247 0 0 0-.653-.607 2.143 2.143 0 0 0-.826-.296z"/></svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12.136 13.949c0 .392-.245.616-.719.616h-.628v-1.226h.628c.48 0 .72.212.72.61zM6.922 15.06h1.044l-.523-1.443-.521 1.443zm12.46-1.82c-.72 0-1.109.562-1.109 1.526 0 .97.384 1.526 1.108 1.526.725 0 1.108-.556 1.108-1.526 0-.964-.389-1.526-1.108-1.526zM23.73 0v24H.269V0h23.462zm-5.548 10.652c.484.245.948.354 1.571.354.895 0 1.481-.458 1.481-1.171 0-.6-.357-1.014-1.028-1.172l-.677-.158c-.394-.092-.559-.25-.559-.517 0-.322.25-.523.74-.523s.778.18.89.604l.048.186h.383v-.943a2.927 2.927 0 0 0-1.352-.338c-.911 0-1.497.447-1.497 1.166 0 .556.34.965.996 1.112l.676.152c.432.099.592.273.592.562 0 .354-.261.55-.784.55-.59 0-.894-.24-1.027-.697l-.07-.235h-.383v1.068zm-3.378.245h3.02V9.595h-.383l-.043.19c-.106.486-.255.638-.607.638h-.74V7.557h.506v-.474h-1.753v.474h.453v2.866h-.453v.474zm-3.355 0h3.02V9.595h-.384l-.042.19c-.107.486-.256.638-.608.638h-.74V7.557h.506v-.474H11.45v.474h.452v2.866h-.452v.474zm-8.758-3.34.938 3.34h.74l.778-2.768.756 2.768h.74l.932-3.34h.736v2.866h-.453v.474h3.201V9.595h-.383l-.043.19c-.106.486-.26.638-.607.638h-.922V9.241h1.071a.58.58 0 0 0 .059-.273.55.55 0 0 0-.059-.26h-1.07v-1.15h.884c.357 0 .48.157.596.615l.038.147h.383V7.083H6.49v.474h.522l-.613 2.305-.762-2.779h-.766l-.746 2.774-.624-2.3h.501v-.474H2.266v.474h.426zm1.412 7.002v-1.22h.947c.358 0 .48.158.597.615l.038.147h.383v-1.236H2.857v.474h.453v2.866h-.453v.474h1.78v-.474h-.533v-1.112H5.2a.58.58 0 0 0 .058-.272.551.551 0 0 0-.058-.262H4.104zm9.114 1.913a.461.461 0 0 0-.048-.224.663.663 0 0 1-.112.011c-.245 0-.309-.142-.34-.458l-.022-.201c-.048-.43-.245-.708-.73-.746v-.017c.48-.022.975-.349.975-.964 0-.621-.496-1.008-1.257-1.008H9.542v.474h.453v2.866H9.26l-1.332-3.34H7.22l-1.305 3.34h-.373v.474h1.412v-.474h-.448l.245-.682h1.385l.245.682h-.437v.474h3.35v-.474h-.505v-1.16h.293c.586 0 .761.212.826.762l.02.19c.06.507.31.725.826.725.15 0 .299-.01.416-.027a.46.46 0 0 0 .048-.223zm3.633-1.788h-1.417a.52.52 0 0 0-.059.256c0 .11.016.18.059.268h.634v.964a1.598 1.598 0 0 1-.629.125c-.767 0-1.166-.56-1.166-1.53s.4-1.532 1.124-1.532c.485 0 .767.245.932.67l.058.153h.384v-.976a3.063 3.063 0 0 0-1.412-.337c-1.172 0-1.96.8-1.96 2.027 0 1.231.767 2.016 1.96 2.016.474 0 .964-.136 1.492-.404v-1.7zm4.512.082c0-1.182-.831-2.021-1.982-2.021-1.145 0-1.981.839-1.981 2.021 0 1.188.83 2.022 1.981 2.022 1.156 0 1.982-.834 1.982-2.022z"/></svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m18.931 9.99-1.441-.601 1.717-.913a4.48 4.48 0 0 0 1.874-6.078 4.506 4.506 0 0 0-6.09-1.874L4.792 5.929a4.504 4.504 0 0 0-2.402 4.193 4.521 4.521 0 0 0 2.666 3.904c.036.012 1.442.6 1.442.6l-1.706.901a4.51 4.51 0 0 0-2.369 3.967A4.528 4.528 0 0 0 6.93 24c.725 0 1.437-.174 2.08-.508l10.21-5.406a4.494 4.494 0 0 0 2.39-4.192 4.525 4.525 0 0 0-2.678-3.904Zm-9.334 5.2V8.824l6.007 3.184z"/></svg>

After

Width:  |  Height:  |  Size: 461 B

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -32,7 +32,7 @@
<link rel="alternate" type="application/rss+xml" title="{{ lang.t('rss.updated') }}" href="{{ 'feed_rss_updated.xml' | url }}">
{% endif %}
<link rel="icon" href="{{ config.theme.favicon | url }}">
<meta name="generator" content="mkdocs-{{ mkdocs_version }}, mkdocs-material-9.4.8">
<meta name="generator" content="mkdocs-{{ mkdocs_version }}, mkdocs-material-9.4.12">
{% endblock %}
{% block htmltitle %}
{% if page.meta and page.meta.title %}
@ -44,7 +44,7 @@
{% endif %}
{% endblock %}
{% block styles %}
<link rel="stylesheet" href="{{ 'assets/stylesheets/main.78cf6014.min.css' | url }}">
<link rel="stylesheet" href="{{ 'assets/stylesheets/main.fad675c6.min.css' | url }}">
{% if config.theme.palette %}
{% set palette = config.theme.palette %}
<link rel="stylesheet" href="{{ 'assets/stylesheets/palette.356b1318.min.css' | url }}">
@ -224,7 +224,10 @@
"search": "assets/javascripts/workers/search.f886a092.min.js" | url
} -%}
{%- if config.extra.version -%}
{%- set _ = app.update({ "version": config.extra.version }) -%}
{%- set mike = config.plugins.get("mike") -%}
{%- if not mike or mike.config.version_selector -%}
{%- set _ = app.update({ "version": config.extra.version }) -%}
{%- endif -%}
{%- endif -%}
{%- if config.extra.tags -%}
{%- set _ = app.update({ "tags": config.extra.tags }) -%}

View File

@ -39,6 +39,11 @@
{% if nav_item.active %}
{% set class = class ~ " md-nav__item--active" %}
{% endif %}
{% if nav_item.pages %}
{% if page in nav_item.pages %}
{% set nav_item = page %}
{% endif %}
{% endif %}
{% if nav_item.children %}
{% set indexes = [] %}
{% if "navigation.indexes" in features %}

View File

@ -3,7 +3,9 @@
-#}
<li class="md-nav__item">
<a href="{{ toc_item.url }}" class="md-nav__link">
{{ toc_item.title }}
<span class="md-ellipsis">
{{ toc_item.title }}
</span>
</a>
{% if toc_item.children %}
<nav class="md-nav" aria-label="{{ toc_item.title | striptags }}">

View File

@ -192,8 +192,6 @@ nav:
- Asking a question: https://github.com/squidfunk/mkdocs-material/discussions
- Guides:
- Creating a reproduction: guides/creating-a-reproduction.md
- FAQ:
- Sponsoring: faq/sponsoring.md
- Setup:
- setup/index.md
- Changing the colors: setup/changing-the-colors.md
@ -255,8 +253,11 @@ nav:
- Insiders:
- insiders/index.md
- Getting started: insiders/getting-started.md
- FAQ: insiders/faq/sponsoring.md
- Changelog:
- insiders/changelog/index.md
- How to upgrade: insiders/upgrade.md
- Community Experts Program:
- insiders/community-experts-program/index.md
- Blog:
- blog/index.md

632
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{
"name": "mkdocs-material",
"version": "9.4.8",
"version": "9.4.12",
"description": "Documentation that simply works",
"keywords": [
"mkdocs",
@ -51,24 +51,24 @@
"@fortawesome/fontawesome-free": "^6.4.2",
"@mdi/svg": "^7.3.67",
"@primer/octicons": "^19.8.0",
"@types/css-modules": "^1.0.4",
"@types/escape-html": "^1.0.3",
"@types/fuzzaldrin-plus": "^0.6.4",
"@types/html-minifier": "^4.0.4",
"@types/lunr": "^2.3.6",
"@types/node": "^20.8.10",
"@types/resize-observer-browser": "^0.1.9",
"@types/css-modules": "^1.0.5",
"@types/escape-html": "^1.0.4",
"@types/fuzzaldrin-plus": "^0.6.5",
"@types/html-minifier": "^4.0.5",
"@types/lunr": "^2.3.7",
"@types/node": "^20.9.2",
"@types/resize-observer-browser": "^0.1.10",
"@types/sass": "^1.45.0",
"@typescript-eslint/eslint-plugin": "5.62.0",
"@typescript-eslint/parser": "5.62.0",
"autoprefixer": "^10.4.16",
"chokidar": "^3.5.3",
"cssnano": "5.1.0",
"esbuild": "^0.19.5",
"eslint": "^8.53.0",
"esbuild": "^0.19.6",
"eslint": "^8.54.0",
"eslint-plugin-eslint-comments": "^3.2.0",
"eslint-plugin-import": "^2.29.0",
"eslint-plugin-jsdoc": "^46.8.2",
"eslint-plugin-jsdoc": "^46.9.0",
"eslint-plugin-no-null": "^1.0.2",
"github-types": "^1.0.0",
"gitlab": "^14.2.2",
@ -76,22 +76,22 @@
"html-minifier": "^4.0.0",
"material-design-color": "^2.3.2",
"material-shadows": "^3.0.1",
"npm-check-updates": "^16.14.6",
"npm-check-updates": "^16.14.11",
"npm-run-all": "^4.1.5",
"postcss": "^8.4.31",
"postcss-dir-pseudo-class": "^8.0.0",
"postcss-inline-svg": "^6.0.0",
"postcss-logical": "5.0.4",
"postcss-pseudo-is": "^0.3.0",
"preact": "^10.18.2",
"preact": "^10.19.2",
"rimraf": "^5.0.5",
"sass": "^1.69.5",
"simple-icons": "^9.19.1",
"simple-icons": "^9.21.0",
"stylelint": "^15.11.0",
"stylelint-config-recess-order": "4.2.0",
"stylelint-config-recommended": "^13.0.0",
"stylelint-config-standard-scss": "^11.1.0",
"stylelint-scss": "^5.3.0",
"stylelint-scss": "^5.3.1",
"stylelint-stylistic": "^0.4.3",
"svgo": "3.0.0",
"tiny-glob": "^0.2.9",

View File

@ -19,9 +19,9 @@
# IN THE SOFTWARE.
from functools import partial
from markdown.extensions.toc import slugify
from mkdocs.config.config_options import Choice, Deprecated, Optional, Type
from mkdocs.config.base import Config
from pymdownx.slugs import slugify
# -----------------------------------------------------------------------------
# Classes
@ -41,7 +41,7 @@ class BlogConfig(Config):
post_url_date_format = Type(str, default = "yyyy/MM/dd")
post_url_format = Type(str, default = "{date}/{slug}")
post_url_max_categories = Type(int, default = 1)
post_slugify = Type((type(slugify), partial), default = slugify)
post_slugify = Type(partial, default = slugify(case = "lower"))
post_slugify_separator = Type(str, default = "-")
post_excerpt = Choice(["optional", "required"], default = "optional")
post_excerpt_max_authors = Type(int, default = 1)
@ -62,7 +62,7 @@ class BlogConfig(Config):
categories = Type(bool, default = True)
categories_name = Type(str, default = "blog.categories")
categories_url_format = Type(str, default = "category/{slug}")
categories_slugify = Type((type(slugify), partial), default = slugify)
categories_slugify = Type(partial, default = slugify(case = "lower"))
categories_slugify_separator = Type(str, default = "-")
categories_allowed = Type(list, default = [])
categories_toc = Optional(Type(bool))

View File

@ -27,6 +27,8 @@ import yaml
from babel.dates import format_date
from datetime import datetime
from jinja2 import pass_context
from jinja2.runtime import Context
from mkdocs.config.defaults import MkDocsConfig
from mkdocs.exceptions import PluginError
from mkdocs.plugins import BasePlugin, event_priority
@ -35,6 +37,7 @@ from mkdocs.structure.files import File, Files, InclusionLevel
from mkdocs.structure.nav import Navigation, Section
from mkdocs.structure.pages import Page
from mkdocs.utils import copy_file, get_relative_url
from mkdocs.utils.templates import url_filter
from paginate import Page as Pagination
from shutil import rmtree
from tempfile import mkdtemp
@ -44,7 +47,6 @@ from .author import Authors
from .config import BlogConfig
from .readtime import readtime
from .structure import Archive, Category, Excerpt, Post, View
from .templates import url_filter
# -----------------------------------------------------------------------------
# Classes
@ -136,19 +138,22 @@ class BlogPlugin(BasePlugin[BlogConfig]):
# Generate views for archive
if self.config.archive:
views = self._generate_archive(config, files)
self.blog.views.extend(views)
self.blog.views.extend(
self._generate_archive(config, files)
)
# Generate views for categories
if self.config.categories:
views = self._generate_categories(config, files)
self.blog.views.extend(views)
self.blog.views.extend(sorted(
self._generate_categories(config, files),
key = lambda view: view.name,
reverse = False
))
# Generate pages for views
if self.config.pagination:
for view in self._resolve_views(self.blog):
for page in self._generate_pages(view, config, files):
page.file.inclusion = InclusionLevel.EXCLUDED
view.pages.append(page)
# Ensure that entrypoint is always included in navigation
@ -180,6 +185,7 @@ class BlogPlugin(BasePlugin[BlogConfig]):
# Revert temporary exclusion of views from navigation
for view in self._resolve_views(self.blog):
view.file.inclusion = self.blog.file.inclusion
for page in view.pages:
page.file.inclusion = self.blog.file.inclusion
@ -298,9 +304,25 @@ class BlogPlugin(BasePlugin[BlogConfig]):
def date_filter(date: datetime):
return self._format_date_for_post(date, config)
# Patch URL template filter to add support for paginated views, i.e.,
# that paginated views never link to themselves but to the main view
@pass_context
def url_filter_with_pagination(context: Context, url: str | None):
page = context["page"]
# If the current page is a view, check if the URL links to the page
# itself, and replace it with the URL of the main view
if isinstance(page, View):
view = self._resolve_original(page)
if page.url == url:
url = view.url
# Forward to original template filter
return url_filter(context, url)
# Register custom template filters
env.filters["date"] = date_filter
env.filters["url"] = url_filter
env.filters["url"] = url_filter_with_pagination
# Prepare view for rendering (run latest) - views are rendered last, as we
# need to mutate the navigation to account for pagination. The main problem
@ -317,16 +339,6 @@ class BlogPlugin(BasePlugin[BlogConfig]):
if view not in self._resolve_views(self.blog):
return
# If the current view is paginated, replace and rewire it - the current
# view temporarily becomes the main view, and is reset after rendering
assert isinstance(view, View)
if view != page:
prev = view.pages[view.pages.index(page) - 1]
# Replace previous page with current page
items = self._resolve_siblings(view, nav)
items[items.index(prev)] = page
# Render excerpts and prepare pagination
posts, pagination = self._render(page)
@ -342,26 +354,6 @@ class BlogPlugin(BasePlugin[BlogConfig]):
context["posts"] = posts
context["pagination"] = pager if pagination else None
# After rendering a paginated view, replace the URL of the paginated view
# with the URL of the original view - since we need to replace the original
# view with a paginated view in `on_page_context` for correct resolution of
# the active state, we must fix the paginated view URLs after rendering
def on_post_page(self, output, *, page, config):
if not self.config.enabled:
return
# Skip if page is not a view managed by this instance - this plugin has
# support for multiple instances, which is why this check is necessary
view = self._resolve_original(page)
if view not in self._resolve_views(self.blog):
return
# If the current view is paginated, replace the URL of the paginated
# view with the URL of the original view - see https://t.ly/Yeh-P
assert isinstance(view, View)
if view != page:
page.file.url = view.file.url
# Remove temporary directory on shutdown
def on_shutdown(self):
rmtree(self.temp_dir)
@ -527,7 +519,7 @@ class BlogPlugin(BasePlugin[BlogConfig]):
# Resolve original page or view (e.g. for paginated views)
def _resolve_original(self, page: Page):
if isinstance(page, View):
if isinstance(page, View) and page.pages:
return page.pages[0]
else:
return page
@ -550,13 +542,14 @@ class BlogPlugin(BasePlugin[BlogConfig]):
file = self._path_to_file(path, config)
files.append(file)
# Create file in temporary directory
# Create file in temporary directory and temporarily remove
# from navigation, as we'll add it at a specific location
self._save_to_file(file.abs_src_path, f"# {name}")
file.inclusion = InclusionLevel.EXCLUDED
# Create and yield view - we don't explicitly set the title of
# the view, so authors can override them in the page's content
# Create and yield view
if not isinstance(file.page, Archive):
yield Archive(None, file, config)
yield Archive(name, file, config)
# Assign post to archive
assert isinstance(file.page, Archive)
@ -585,13 +578,14 @@ class BlogPlugin(BasePlugin[BlogConfig]):
file = self._path_to_file(path, config)
files.append(file)
# Create file in temporary directory
# Create file in temporary directory and temporarily remove
# from navigation, as we'll add it at a specific location
self._save_to_file(file.abs_src_path, f"# {name}")
file.inclusion = InclusionLevel.EXCLUDED
# Create and yield view - we don't explicitly set the title of
# the view, so authors can override them in the page's content
# Create and yield view
if not isinstance(file.page, Category):
yield Category(None, file, config)
yield Category(name, file, config)
# Assign post to category and vice versa
assert isinstance(file.page, Category)
@ -615,12 +609,14 @@ class BlogPlugin(BasePlugin[BlogConfig]):
file = self._path_to_file(path, config)
files.append(file)
# Copy file to temporary directory
# Copy file to temporary directory and temporarily remove
# from navigation, as we'll add it at a specific location
copy_file(view.file.abs_src_path, file.abs_src_path)
file.inclusion = InclusionLevel.EXCLUDED
# Create view and attach to previous page
# Create and yield view
if not isinstance(file.page, View):
yield View(None, file, config)
yield view.__class__(None, file, config)
# Assign pages and posts to view
assert isinstance(file.page, View)
@ -800,7 +796,7 @@ class BlogPlugin(BasePlugin[BlogConfig]):
# Format date
def _format_date(self, date: datetime, format: str, config: MkDocsConfig):
locale = config.theme["language"]
locale: str = config.theme["language"].replace("-", "_")
return format_date(date, format = format, locale = locale)
# Format date for post

View File

@ -212,10 +212,18 @@ class Excerpt(Page):
# View
class View(Page):
# Parent view
parent: View | Section
# Initialize view
def __init__(self, title: str | None, file: File, config: MkDocsConfig):
super().__init__(title, file, config)
self.parent: View | Section
def __init__(self, name: str | None, file: File, config: MkDocsConfig):
super().__init__(None, file, config)
# Initialize name of the view - note that views never pass a title to
# the parent constructor, so the author can always override the title
# that is used for rendering. However, for some purposes, like for
# example sorting, we need something to compare.
self.name = name
# Initialize posts and views
self.posts: list[Post] = []

View File

@ -1,42 +0,0 @@
# Copyright (c) 2016-2023 Martin Donath <martin.donath@squidfunk.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 NON-INFRINGEMENT. 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.
from jinja2 import pass_context
from jinja2.runtime import Context
from material.plugins.blog.structure import View
from mkdocs.utils.templates import url_filter as _url_filter
# -----------------------------------------------------------------------------
# Functions
# -----------------------------------------------------------------------------
# Filter for normalizing URLs with support for paginated views
@pass_context
def url_filter(context: Context, url: str):
page = context["page"]
# If the current page is a view, check if the URL links to the page
# itself, and replace it with the URL of the main view
if isinstance(page, View):
if page.url == url:
url = page.pages[0].url
# Forward to original template filter
return _url_filter(context, url)

Some files were not shown because too many files have changed in this diff Show More