diff --git a/CHANGELOG b/CHANGELOG index 1872aec72..105734268 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,12 @@ +mkdocs-material-7.3.0+insiders-3.1.1 (2021-09-26) + + * Fixed ordering bug in search exclusion logic + +mkdocs-material-7.3.0+insiders-3.1.0 (2021-09-26) + + * Added support for excluding pages, sections, and elements from search + * Fixed #2803: Code block annotations not visible when printing + mkdocs-material-7.3.0 (2021-09-23) * Added support for sticky navigation tabs diff --git a/docs/blog/2021/excluding-content-from-search.md b/docs/blog/2021/excluding-content-from-search.md new file mode 100644 index 000000000..54ab48246 --- /dev/null +++ b/docs/blog/2021/excluding-content-from-search.md @@ -0,0 +1,216 @@ +--- +template: overrides/main.html +description: > + How we rebuilt client-side search, delivering a better user experience while + making it faster and smaller at the same time +disqus: mkdocs-material +search: + exclude: true +--- + +# Excluding content from search + +__The latest Insiders release brings three new simple ways to exclude +dedicated parts of a document from the search index, allowing for more +fine-grained control.__ + + + + [1]: https://avatars.githubusercontent.com/u/932156 + +--- + +Two weeks ago, Material for MkDocs Insiders shipped a [brand new search +plugin][2], yielding [massive improvements in usability][3], but also in [speed +and size][4] of the search index. Interestingly, as discussed in the previous +blog article, we only scratched the surface of what's now possible. This +release brings some useful features that enhance the writing experience, +allowing for more fine-grained control of what pages, sections and blocks of a +Markdown file should be indexed by the built-in search functionality. + +_The following section discusses existing solutions for excluding pages and +sections from the search index. If you immediately want to learn what's new, +skip to the [section just after that][5]._ + + [2]: search-better-faster-smaller.md + [3]: search-better-faster-smaller.md#whats-new + [4]: search-better-faster-smaller.md#benchmarks + [5]: #whats-new + +## Prior art + +MkDocs has a rich and thriving ecosystem of [plugins][6], and it comes as no +surprise that there's already a fantastic plugin by @chrieke to exclude specific +sections of a Markdown file – the [mkdocs-exclude-search][7] plugin. It can be +installed with: + +``` +pip install mkdocs-exclude-search +``` + +__How it works__: the plugin post-processes the `search_index.json` file that +is generated by the built-in search plugin, giving the author the ability to +exclude certain pages and sections by adding a few lines of configuration to +`mkdocs.yml`. An example: + +``` yaml +plugins: + - search + - exclude-search: + exclude: + - page.md + - page.md#section + - directory/* + - /*/page.md +``` + +It's easy to see that the plugin follows a configuration-centric approach, which +adds support for advanced filtering techniques like infix- and suffix-filtering +using wildcards. While this is a very powerful idea, it comes with some +downsides: + +1. __Exclusion patterns and content are not co-located__: exclusion patterns + need to be defined in `mkdocs.yml`, and not as part of the respective + document or section to be excluded. This might result in stale exclusion + patterns, leading to unintended behavior: + + - When a headline is changed, its slug (permalink) also changes, which might + suddenly match (or unmatch) a pattern, e.g., when an author fixes a typo + in a headline. + + - As exclusion patterns support the use of wildcards, different authors + might overwrite each other's patterns without any immediate feedback since + the plugin does only report the number of excluded documents – not _what_ + has been excluded.[^1] + + [^1]: + When the log level is set to `DEBUG`, the plugin will report exactly which + pages and sections have been excluded from the search index, but MkDocs will + now flood the terminal with debug output from its core and other plugins. + +2. __Exclusion control might be too coarse__: The [mkdocs-exclude-search][7] + plugin only allows for the exclusion of pages and sections. It's not possible + to exclude parts of a section, e.g., content that is irrelevant to search but + must be included as part of the documentation. + + [6]: https://github.com/mkdocs/mkdocs/wiki/MkDocs-Plugins + [7]: https://github.com/chrieke/mkdocs-exclude-search + +## What's new? + +The latest Insiders release brings fine-grained control for [__excluding pages, +sections, and blocks__][8] from the search index, implemented through front +matter, as well as the [Attribute List][9] extension. Note that it doesn't +replace the [mkdocs-exclude-search][7] plugin but _complements_ it. + + [8]: ../../setup/setting-up-site-search.md#search-exclusion + [9]: https://python-markdown.github.io/extensions/attr_list/ + +### Excluding pages + +An entire page can be excluded from the search index by adding a simple +directive to the front matter of the respective Markdown file. The good thing +is that the author now only has to check the top of the document to learn +whether it is excluded or not: + +``` bash +--- +search: + exclude: true +--- + +# Document title +... +``` + +### Excluding sections + +If a section should be excluded, the author can use the [Attribute List][9] +extension to add a __pragma__ called `{ data-search-exclude }` at the end of a +heading. The pragma is not included in the final HTML, as search pragmas are +filtered by the search plugin before the page is rendered: + +=== "`docs/page.md`" + + ``` markdown + # Document title + + ## Section 1 + + The content of this section is included + + ## Section 2 { data-search-exclude } + + The content of this section is excluded + ``` + +=== "`search_index.json`" + + ``` json + { + ... + "docs": [ + { + "location":"page/", + "text":"", + "title":"Document title" + }, + { + "location":"page/#section-1", + "text":"
The content of this section is included
", + "title":"Section 1" + } + ] + } + ``` + +### Excluding blocks + +If even more fine-grained control is desired, the __pragma__ can be added to +any [block-level element][10] or [inline-level element][11] that is officially +supported by the [Attribute List][9] extension: + +=== "`docs/page.md`" + + ``` markdown + # Document title + + The content of this block is included + + The content of this block is excluded + { data-search-exclude } + ``` + +=== "`search_index.json`" + + ``` json + { + ... + "docs": [ + { + "location":"page/", + "text":"The content of this block is included
", + "title":"Document title" + }, + ] + } + ``` + + [10]: https://python-markdown.github.io/extensions/attr_list/#block-level + [11]: https://python-markdown.github.io/extensions/attr_list/#inline-level + +## Conclusion + +The latest release brings three simple ways to control more precisely what goes +into the search index and what doesn't. It complements the already very powerful +[mkdocs-exclude-search][7] plugin, allowing for new methods of shaping the +structure, size and content of the search index. diff --git a/docs/blog/2021/search-better-faster-smaller.md b/docs/blog/2021/search-better-faster-smaller.md index 50b473517..bb4f36fbb 100644 --- a/docs/blog/2021/search-better-faster-smaller.md +++ b/docs/blog/2021/search-better-faster-smaller.md @@ -20,7 +20,8 @@ smaller at the same time.__ __Martin Donath__ · @squidfunk :octicons-calendar-24: September 13, 2021 · -:octicons-clock-24: 15 min read +:octicons-clock-24: 15 min read · +[:octicons-tag-24: 7.2.6+insiders-3.0.0](../../insiders/changelog.md#300-_-september-13-2021) diff --git a/docs/blog/index.md b/docs/blog/index.md index 5ff813ee6..cc629ce30 100644 --- a/docs/blog/index.md +++ b/docs/blog/index.md @@ -6,6 +6,25 @@ search: # Blog +The content of this section is included
", + "title":"Section 1" + } + ] + } + ``` + + [22]: ../reference/images.md#attribute-list + +#### Excluding blocks + +If even more fine-grained control is needed, content blocks can be excluded +from search sections with a `{ data-search-exclude }` pragma, so they will not +be included in the search index: + +=== "`docs/page.md`" + + ``` markdown + # Document title + + The content of this block is included + + The content of this block is excluded + { data-search-exclude } + ``` + +=== "`search_index.json`" + + ``` json + { + ... + "docs": [ + { + "location":"page/", + "text":"The content of this block is included
", + "title":"Document title" + } + ] + } + ``` ## Customization @@ -273,12 +369,12 @@ your needs. ### Query transformation -[:octicons-file-code-24: Source][22] · +[:octicons-file-code-24: Source][23] · :octicons-mortar-board-24: Difficulty: _easy_ When a user enters a query into the search box, the query is pre-processed before it is submitted to the search index. Material for MkDocs will apply the -following transformations, which can be customized by [extending the theme][23]: +following transformations, which can be customized by [extending the theme][24]: ``` ts export function defaultTransform(query: string): string { @@ -311,7 +407,7 @@ export function defaultTransform(query: string): string { If you want to switch to the default behavior of the `mkdocs` and `readthedocs` themes, both of which don't transform the query prior to submission, or customize the `transform` function, you can do this by [overriding the -`config` block][24]: +`config` block][25]: ``` html {% extends "base.html" %} @@ -331,19 +427,19 @@ customize the `transform` function, you can do this by [overriding the The `transform` function will receive the query string as entered by the user and must return the processed query string to be submitted to the search index. - [22]: https://github.com/squidfunk/mkdocs-material/blob/master/src/assets/javascripts/integrations/search/transform/index.ts - [23]: ../customization.md#extending-the-theme - [24]: ../customization.md#overriding-blocks-recommended + [23]: https://github.com/squidfunk/mkdocs-material/blob/master/src/assets/javascripts/integrations/search/transform/index.ts + [24]: ../customization.md#extending-the-theme + [25]: ../customization.md#overriding-blocks-recommended ### Custom search -[:octicons-file-code-24: Source][25] · +[:octicons-file-code-24: Source][26] · :octicons-mortar-board-24: Difficulty: _challenging_ -Material for MkDocs implements search as part of a [web worker][26]. If you +Material for MkDocs implements search as part of a [web worker][27]. If you want to switch the web worker with your own implementation, e.g. to submit search to an external service, you can add a custom JavaScript file to the -`docs` directory and [override the `config` block][23]: +`docs` directory and [override the `config` block][24]: ``` html {% block config %} @@ -361,8 +457,8 @@ format using _discriminated unions_, i.e. through the `type` property of the message. See the following interface definitions to learn about the message formats: -- [:octicons-file-code-24: `SearchMessage`][27] -- [:octicons-file-code-24: `SearchIndex` and `SearchResult`][28] +- [:octicons-file-code-24: `SearchMessage`][28] +- [:octicons-file-code-24: `SearchIndex` and `SearchResult`][29] The sequence and direction of messages is rather intuitive: @@ -371,7 +467,7 @@ The sequence and direction of messages is rather intuitive: - :octicons-arrow-right-24: `SearchQueryMessage` - :octicons-arrow-left-24: `SearchResultMessage` - [25]: https://github.com/squidfunk/mkdocs-material/blob/master/src/assets/javascripts/integrations/search/worker - [26]: https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers - [27]: https://github.com/squidfunk/mkdocs-material/blob/master/src/assets/javascripts/integrations/search/worker/message/index.ts - [28]: https://github.com/squidfunk/mkdocs-material/blob/master/src/assets/javascripts/integrations/search/_/index.ts + [26]: https://github.com/squidfunk/mkdocs-material/blob/master/src/assets/javascripts/integrations/search/worker + [27]: https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers + [28]: https://github.com/squidfunk/mkdocs-material/blob/master/src/assets/javascripts/integrations/search/worker/message/index.ts + [29]: https://github.com/squidfunk/mkdocs-material/blob/master/src/assets/javascripts/integrations/search/_/index.ts diff --git a/mkdocs.yml b/mkdocs.yml index e1e257564..417f9eebc 100755 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -219,4 +219,5 @@ nav: - Blog: - blog/index.md - 2021: + - blog/2021/excluding-content-from-search.md - blog/2021/search-better-faster-smaller.md