mkdocs-material/docs/reference/code-blocks.md

456 lines
14 KiB
Markdown
Raw Normal View History

---
template: overrides/main.html
2021-12-16 19:08:57 +03:00
icon: material/code-tags
---
2020-07-20 16:18:09 +03:00
# Code blocks
Code blocks and examples are an essential part of technical project
documentation. Material for MkDocs provides different ways to set up syntax
2021-10-03 19:02:59 +03:00
highlighting for code blocks, either during build time using [Pygments] or
during runtime using a JavaScript syntax highlighter.
2021-10-03 19:02:59 +03:00
[Pygments]: https://pygments.org
## Configuration
2021-10-03 19:02:59 +03:00
This configuration enables syntax highlighting on code blocks and inline code
blocks, and allows to include source code directly from other files. Add the
2021-10-05 00:36:31 +03:00
following lines to `mkdocs.yml`:
``` yaml
markdown_extensions:
2021-12-10 15:31:08 +03:00
- pymdownx.highlight:
anchor_linenums: true
- pymdownx.inlinehilite
2021-10-03 19:02:59 +03:00
- pymdownx.snippets
2021-12-10 15:31:08 +03:00
- pymdownx.superfences
```
2021-10-30 14:16:05 +03:00
The following sections discuss how to use different syntax highlighting features
with [Pygments], the recommended highlighter, so they don't apply when using a
JavaScript syntax highlighter.
2021-10-03 19:02:59 +03:00
See additional configuration options:
2021-10-03 19:02:59 +03:00
- [Highlight]
- [InlineHilite]
- [SuperFences]
- [Snippets]
2021-10-03 19:02:59 +03:00
[Highlight]: ../setup/extensions/python-markdown-extensions.md#highlight
[InlineHilite]: ../setup/extensions/python-markdown-extensions.md#inlinehilite
[SuperFences]: ../setup/extensions/python-markdown-extensions.md#superfences
[Snippets]: ../setup/extensions/python-markdown-extensions.md#snippets
2021-10-03 19:02:59 +03:00
### Code annotations
2021-11-28 17:59:54 +03:00
[:octicons-tag-24: 8.0.0][Code annotations support] ·
:octicons-unlock-24: Feature flag ·
2021-10-10 18:39:53 +03:00
:octicons-beaker-24: Experimental
2021-10-03 19:02:59 +03:00
Code annotations offer a comfortable and friendly way to attach arbitrary
content to specific sections of code blocks by adding numeric markers in block
2021-10-05 00:36:31 +03:00
and inline comments in the language of the code block. Add the following to
2021-10-03 19:02:59 +03:00
`mkdocs.yml` to enable them globally:
``` yaml
2021-10-03 19:02:59 +03:00
theme:
features:
2021-12-11 16:30:07 +03:00
- content.code.annotate # (1)!
```
2021-10-03 19:02:59 +03:00
1. :man_raising_hand: I'm a code annotation! I can contain `code`, __formatted
2022-01-08 13:26:00 +03:00
text__, images, ... basically anything that can be written in Markdown.
2021-10-05 00:36:31 +03:00
??? info "Enabling code annotations for a specific code block"
2020-07-22 12:57:41 +03:00
2021-10-03 19:02:59 +03:00
If you don't want to enable code annotations globally, because you don't
like the automatic inlining behavior, you can enable them for a specific
code block by using a slightly different syntax based on the
2021-10-10 13:19:14 +03:00
[Attribute Lists] extension:
2020-07-22 12:57:41 +03:00
2021-10-03 19:02:59 +03:00
```` yaml
``` { .yaml .annotate }
# Code block content
```
````
Note that the language shortcode which has to come first must now also be
prefixed by a `.`.
2020-07-22 12:57:41 +03:00
2021-11-28 17:59:54 +03:00
[Code annotations support]: https://github.com/squidfunk/mkdocs-material/releases/tag/8.0.0
2021-10-10 13:19:14 +03:00
[Attribute Lists]: ../setup/extensions/python-markdown.md#attribute-lists
2020-07-22 12:57:41 +03:00
2021-12-10 12:12:07 +03:00
#### Anchor links
[:octicons-heart-fill-24:{ .mdx-heart } Insiders][Insiders]{ .mdx-insiders } ·
2021-12-10 13:05:38 +03:00
[:octicons-tag-24: insiders-4.4.0][Insiders] ·
2021-12-10 12:12:07 +03:00
:octicons-beaker-24: Experimental
In order to link to code annotations and share them more easily, [Insiders] adds
an anchor link to each annotation automatically, which you can copy via right
click or open in a new tab:
``` yaml
# (1)!
```
1. If you ++cmd++ :material-plus::material-cursor-default-outline: me, I'm
rendered open in a new tab. You can also right-click me to __copy link
address__ to share me with others.
[Insiders]: ../insiders/index.md
## Usage
Code blocks must be enclosed with two separate lines containing three backticks.
2021-10-03 19:02:59 +03:00
To add syntax highlighting to those blocks, add the language shortcode directly
after the opening block. See the [list of available lexers] to find the
shortcode for a given language.
_Example_:
```` markdown
``` py
import tensorflow as tf
```
````
_Result_:
``` py
import tensorflow as tf
```
2021-10-03 19:02:59 +03:00
[list of available lexers]: https://pygments.org/docs/lexers/
2021-10-30 14:16:05 +03:00
### Adding a title
[:octicons-tag-24: 7.3.6][Title support] ·
:octicons-beaker-24: Experimental
In order to provide additional context, a custom title can be added to a code
block by using the `title="<custom title>"` option directly after the shortcode,
e.g. to display the name of a file:
_Example_:
```` markdown
``` py title="bubble_sort.py"
def bubble_sort(items):
for i in range(len(items)):
for j in range(len(items) - 1 - i):
if items[j] > items[j + 1]:
items[j], items[j + 1] = items[j + 1], items[j]
```
````
_Result_:
``` py title="bubble_sort.py"
def bubble_sort(items):
for i in range(len(items)):
for j in range(len(items) - 1 - i):
if items[j] > items[j + 1]:
items[j], items[j + 1] = items[j + 1], items[j]
```
[Title support]: https://github.com/squidfunk/mkdocs-material/releases/tag/7.3.6
2021-02-28 16:23:11 +03:00
### Adding annotations
2021-10-03 19:02:59 +03:00
Code annotations can be placed anywhere in a code block where a comment for the
language of the block can be placed, e.g. for JavaScript in `#!js // ...` and
`#!js /* ... */`, for YAML in `#!yaml # ...`, etc.[^1]
2021-02-28 16:23:11 +03:00
2021-10-03 19:02:59 +03:00
[^1]:
Code annotations require syntax highlighting with [Pygments] they're
2021-11-07 20:23:01 +03:00
currently not compatible with JavaScript syntax highlighters, or languages
that do not have comments in their grammar. However, we're actively working
on supporting alternate ways of defining code annotations, allowing to
always place code annotations at the end of lines.
2021-02-28 16:23:11 +03:00
2021-10-03 19:02:59 +03:00
_Example_:
2021-07-18 18:57:45 +03:00
2021-10-03 19:02:59 +03:00
```` markdown
2021-07-18 18:57:45 +03:00
``` yaml
theme:
features:
2021-10-03 19:02:59 +03:00
- content.code.annotate # (1)
2021-02-28 16:23:11 +03:00
```
2021-10-03 19:02:59 +03:00
1. :man_raising_hand: I'm a code annotation! I can contain `code`, __formatted
2022-01-08 13:26:00 +03:00
text__, images, ... basically anything that can be written in Markdown.
2021-02-28 16:23:11 +03:00
````
_Result_:
2021-10-03 19:02:59 +03:00
``` yaml
theme:
features:
- content.code.annotate # (1)
```
2021-10-03 19:02:59 +03:00
1. :man_raising_hand: I'm a code annotation! I can contain `code`, __formatted
2022-01-08 13:26:00 +03:00
text__, images, ... basically anything that can be written in Markdown.
2021-02-28 16:23:11 +03:00
2021-12-10 12:12:07 +03:00
#### Stripping comments
[:octicons-heart-fill-24:{ .mdx-heart } Insiders][Insiders]{ .mdx-insiders } ·
2021-12-10 13:05:38 +03:00
[:octicons-tag-24: insiders-4.4.0][Insiders] ·
2021-12-10 12:12:07 +03:00
:octicons-beaker-24: Experimental
If you wish to strip the comment characters surrounding a code annotation,
[Insiders] adds a new syntax that allows for just that. Simply add an `!` after
the closing parens of the code annotation:
_Example_:
```` markdown
``` yaml
# (1)!
```
1. Look ma, less line noise!
````
_Result_:
``` yaml
# (1)!
```
1. Look ma, less line noise!
Note that this only allows for a single code annotation to be rendered per
comment. If you want to add multiple code annotations, comments cannot be
stripped for technical reasons.
### Adding line numbers
Line numbers can be added to a code block by using the `linenums="<start>"`
2021-10-03 19:02:59 +03:00
option directly after the shortcode, whereas `<start>` represents the starting
line number. A code block can start from a line number other than `1`, which
2021-10-03 19:02:59 +03:00
allows to split large code blocks for readability.
_Example_:
```` markdown
``` py linenums="1"
def bubble_sort(items):
for i in range(len(items)):
for j in range(len(items) - 1 - i):
if items[j] > items[j + 1]:
items[j], items[j + 1] = items[j + 1], items[j]
```
````
_Result_:
``` py linenums="1"
def bubble_sort(items):
for i in range(len(items)):
for j in range(len(items) - 1 - i):
if items[j] > items[j + 1]:
items[j], items[j + 1] = items[j + 1], items[j]
```
### Highlighting specific lines
Specific lines can be highlighted by passing the line numbers to the `hl_lines`
2021-10-03 19:02:59 +03:00
argument placed right after the language shortcode. Note that line counts start
at `1`, regardless of the starting line number specified as part of
[`linenums`][Adding line numbers].
2021-10-03 19:02:59 +03:00
=== "Line numbers"
2021-10-03 19:02:59 +03:00
_Example_:
2021-10-05 00:36:31 +03:00
```` markdown
``` py hl_lines="2 3"
2021-10-03 19:02:59 +03:00
def bubble_sort(items):
for i in range(len(items)):
for j in range(len(items) - 1 - i):
if items[j] > items[j + 1]:
items[j], items[j + 1] = items[j + 1], items[j]
```
````
2021-10-03 19:02:59 +03:00
_Result_:
``` py linenums="1" hl_lines="2 3"
2021-10-03 19:02:59 +03:00
def bubble_sort(items):
for i in range(len(items)):
for j in range(len(items) - 1 - i):
if items[j] > items[j + 1]:
items[j], items[j + 1] = items[j + 1], items[j]
```
=== "Line number ranges"
2021-10-03 19:02:59 +03:00
_Example_:
2021-10-03 19:02:59 +03:00
```` markdown
``` py hl_lines="2-5"
2021-10-03 19:02:59 +03:00
def bubble_sort(items):
for i in range(len(items)):
for j in range(len(items) - 1 - i):
if items[j] > items[j + 1]:
items[j], items[j + 1] = items[j + 1], items[j]
```
````
2021-10-03 19:02:59 +03:00
_Result_:
``` py linenums="1" hl_lines="2-5"
2021-10-03 19:02:59 +03:00
def bubble_sort(items):
for i in range(len(items)):
for j in range(len(items) - 1 - i):
if items[j] > items[j + 1]:
items[j], items[j + 1] = items[j + 1], items[j]
```
[Adding line numbers]: #adding-line-numbers
2020-07-22 12:57:41 +03:00
### Highlighting inline code blocks
2021-10-03 19:02:59 +03:00
When [InlineHilite] is enabled, syntax highlighting can be applied to inline
code blocks by prefixing them with a shebang, i.e. `#!`, directly followed by
the corresponding [language shortcode][list of available lexers].
_Example_:
2020-07-24 10:59:16 +03:00
``` markdown
The `#!python range()` function is used to generate a sequence of numbers.
```
_Result_:
The `#!python range()` function is used to generate a sequence of numbers.
### Embedding external files
2021-10-05 00:36:31 +03:00
When [Snippets] is enabled, content from other files (including source files)
can be embedded by using the [`--8<--` notation][Snippets notation] directly
from within a code block:
_Example_:
```` markdown
2021-10-30 14:16:05 +03:00
``` title=".browserslistrc"
--8<-- ".browserslistrc"
```
````
_Result_:
2021-10-30 14:16:05 +03:00
``` title=".browserslistrc"
last 4 years
```
2021-10-05 00:36:31 +03:00
[Snippets notation]: https://facelessuser.github.io/pymdown-extensions/extensions/snippets/#snippets-notation
## Customization
### Custom syntax theme
2021-10-03 19:02:59 +03:00
If [Pygments] is used, Material for MkDocs provides the [styles for code blocks]
2021-10-10 13:19:14 +03:00
[colors], which are built with a custom and well-balanced palette that works
2021-10-03 19:02:59 +03:00
equally well for both [color schemes]:
2020-07-24 15:30:03 +03:00
- :material-checkbox-blank-circle:{ style="color: var(--md-code-hl-number-color) " } `--md-code-hl-number-color`
- :material-checkbox-blank-circle:{ style="color: var(--md-code-hl-special-color) " } `--md-code-hl-special-color`
- :material-checkbox-blank-circle:{ style="color: var(--md-code-hl-function-color) " } `--md-code-hl-function-color`
- :material-checkbox-blank-circle:{ style="color: var(--md-code-hl-constant-color) " } `--md-code-hl-constant-color`
- :material-checkbox-blank-circle:{ style="color: var(--md-code-hl-keyword-color) " } `--md-code-hl-keyword-color`
- :material-checkbox-blank-circle:{ style="color: var(--md-code-hl-string-color) " } `--md-code-hl-string-color`
- :material-checkbox-blank-circle:{ style="color: var(--md-code-hl-name-color) " } `--md-code-hl-name-color`
- :material-checkbox-blank-circle:{ style="color: var(--md-code-hl-operator-color) " } `--md-code-hl-operator-color`
- :material-checkbox-blank-circle:{ style="color: var(--md-code-hl-punctuation-color) " } `--md-code-hl-punctuation-color`
- :material-checkbox-blank-circle:{ style="color: var(--md-code-hl-comment-color) " } `--md-code-hl-comment-color`
- :material-checkbox-blank-circle:{ style="color: var(--md-code-hl-generic-color) " } `--md-code-hl-generic-color`
- :material-checkbox-blank-circle:{ style="color: var(--md-code-hl-variable-color) " } `--md-code-hl-variable-color`
2020-07-24 15:30:03 +03:00
Code block foreground, background and line highlight colors are defined via:
- :material-checkbox-blank-circle:{ style="color: var(--md-code-fg-color) " } `--md-code-fg-color`
- :material-checkbox-blank-circle:{ style="color: var(--md-code-bg-color) " } `--md-code-bg-color`
- :material-checkbox-blank-circle:{ style="color: var(--md-code-hl-color) " } `--md-code-hl-color`
2020-07-24 15:30:03 +03:00
Let's say you want to change the color of `#!js "strings"`. While there are
2021-10-03 19:02:59 +03:00
several [types of string tokens], they use the same color. You can assign
2021-10-10 13:19:14 +03:00
a new color by using an [additional style sheet]:
2020-07-24 15:30:03 +03:00
2021-10-10 18:39:53 +03:00
=== ":octicons-file-code-16: docs/stylesheets/extra.css"
2021-10-10 13:19:14 +03:00
``` css
:root > * {
--md-code-hl-string-color: #0FF1CE;
}
```
=== ":octicons-file-code-16: mkdocs.yml"
``` yaml
extra_css:
2021-10-10 18:39:53 +03:00
- stylesheets/extra.css
2021-10-10 13:19:14 +03:00
```
2020-07-24 15:30:03 +03:00
2021-10-05 00:36:31 +03:00
If you want to tweak a specific type of string, e.g. ``#!js `backticks` ``, you
can lookup the specific CSS class name in the [syntax theme definition], and
2021-10-10 13:19:14 +03:00
override it as part of your [additional style sheet]:
2020-07-24 15:30:03 +03:00
2021-10-10 18:39:53 +03:00
=== ":octicons-file-code-16: docs/stylesheets/extra.css"
2021-10-10 13:19:14 +03:00
``` css
.highlight .sb {
color: #0FF1CE;
}
```
=== ":octicons-file-code-16: mkdocs.yml"
``` yaml
extra_css:
2021-10-10 18:39:53 +03:00
- stylesheets/extra.css
2021-10-10 13:19:14 +03:00
```
2021-10-10 13:19:14 +03:00
[colors]: https://github.com/squidfunk/mkdocs-material/blob/master/src/assets/stylesheets/main/_colors.scss
2021-10-03 19:02:59 +03:00
[color schemes]: ../setup/changing-the-colors.md#color-scheme
[types of string tokens]: https://pygments.org/docs/tokens/#literals
2021-10-10 13:19:14 +03:00
[additional style sheet]: ../customization.md#additional-css
2021-10-03 19:02:59 +03:00
[syntax theme definition]: https://github.com/squidfunk/mkdocs-material/blob/master/src/assets/stylesheets/main/extensions/pymdownx/_highlight.scss
2021-12-10 12:12:07 +03:00
### Annotations with numbers
Prior to [:octicons-tag-24: 8.1.0][code annotation markers], code annotations
were rendered with markers showing the original number as used by the author.
However, for technical reasons code annotation numbers restart each code block,
which might lead to confusion. For this reason, code annotations now render as
`+` signs which are rotated if they're open to denote that clicking them again
will close them.
If you wish to revert to the prior behavior and display code annotation numbers,
you can add an [additional style sheet] and copy and paste the following CSS:
=== ":octicons-file-code-16: docs/stylesheets/extra.css"
``` css
.md-typeset .md-annotation__index > ::before {
content: attr(data-md-annotation-id);
}
.md-typeset :focus-within > .md-annotation__index > ::before {
transform: none;
}
```
=== ":octicons-file-code-16: mkdocs.yml"
``` yaml
extra_css:
- stylesheets/extra.css
```
[code annotation markers]: https://github.com/squidfunk/mkdocs-material/releases/tag/8.1.0