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

370 lines
11 KiB
Markdown
Raw Normal View History

---
template: overrides/main.html
---
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-10-03 19:02:59 +03:00
- pymdownx.highlight
- pymdownx.inlinehilite
2021-10-03 19:02:59 +03:00
- pymdownx.superfences
- pymdownx.snippets
```
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-10-03 19:02:59 +03:00
[:octicons-heart-fill-24:{ .mdx-heart } Insiders][Insiders]{ .mdx-insiders } ·
2021-10-10 18:39:53 +03:00
[:octicons-tag-24: insiders-2.2.0][Insiders] ·
: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:
- 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
text__, images, ... basically anything that can be expressed 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-10-03 19:02:59 +03:00
[Insiders]: ../insiders/index.md
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
## 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
``` python
import tensorflow as tf
```
````
_Result_:
``` python
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
currently not compatible with JavaScript syntax highlighters. Support will
be added at a later point, 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
text__, images, ... basically anything that can be expressed 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
text__, images, ... basically anything that can be expressed in Markdown.
2021-02-28 16:23:11 +03:00
### 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
``` python 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_:
``` python 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
2021-10-03 19:02:59 +03:00
``` python hl_lines="2 3"
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_:
2021-10-05 00:36:31 +03:00
``` python 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
``` python hl_lines="2-5"
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_:
2021-10-05 00:36:31 +03:00
``` python 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