(presets)=
# Presets
```{rst-class} lead
Choose a ready-made rule set for CommonMark-style Markdown, GitHub-flavored
Markdown, or streaming output.
```
---
Presets are lists of rules. Pass one to `Wenmode` or `Parser` to select a
Markdown dialect.
```python
from wenmode import Wenmode
from wenmode.presets import github
wenmode = Wenmode(github)
```
## Choosing a preset
| Preset | Use it when | Includes | Main tradeoff |
| --- | --- | --- | --- |
| `commonmark` | You want the default Markdown behavior for articles, comments, or docs. | Core Markdown, reference links and images, inline HTML parsing. | No GFM tables, task list markers, footnotes, or bare URL autolinks. |
| `github` | You want GitHub-flavored Markdown output. | `commonmark`-style behavior plus tables, task list items, strikethrough, extended autolinks, footnotes, and GFM disallowed HTML tag handling. | Requires full-document parsing, so it is not compatible with streaming output. |
| `streaming` | You need to emit HTML chunks as input arrives. | Most CommonMark-style rules, with direct links and images. | Reference-style links, reference-style images, footnotes, and other deferred transforms are disabled. |
| Custom rule list | You are building a specific Markdown dialect or want to disable syntax. | Only the rules you pass. | You own the feature set and rule interactions. |
## CommonMark
`commonmark` is the default preset used by `Wenmode()`.
```python
from wenmode import Wenmode
from wenmode.presets import commonmark
wenmode = Wenmode(commonmark)
```
It enables the core Markdown features expected from a CommonMark-oriented
parser: thematic breaks, fenced and indented code, HTML blocks, lists, ATX and
setext headings, block quotes, hard breaks, autolinks, raw HTML, backslash
escapes, character references, images, links, inline code, and emphasis.
Reference-style links and images are enabled in this preset.
## GitHub
`github` extends the CommonMark-oriented behavior with GitHub-flavored Markdown
features.
```python
from wenmode import Wenmode
from wenmode.presets import github
wenmode = Wenmode(github)
```
It adds tables, strikethrough, task list items, extended autolinks, and
footnotes. It also configures HTML block and inline HTML handling with the GFM
disallowed HTML tag list.
## Streaming
`streaming` is built for incremental HTML output.
```python
from wenmode import Wenmode
from wenmode.presets import streaming
wenmode = Wenmode(streaming)
text = '''
# Title
A [link](/url).
'''
html = ''.join(wenmode.stream(text))
```
It is close to the CommonMark-oriented rule set, but disables reference-style
link and image transforms by using `Image(references=False)` and
`Link(references=False)`. Direct links and images still work, while definitions
and shortcut/reference links stay as text.
This tradeoff lets Wenmode emit blocks before the end of the document. Rules
that need document-wide deferred inline transforms, such as reference links or
footnotes, are not compatible with streaming output.
## Custom preset
A preset is just a reusable rule list. Keep custom dialects in one module so
the editor preview, API renderer, background jobs, and tests all use the same
Markdown behavior.
```python
from wenmode import Wenmode
from wenmode.presets import commonmark
from wenmode.rules import HtmlBlock, Image, Link, RawHtml
product_preset = [
rule
for rule in commonmark
if rule not in {HtmlBlock, Image, Link, RawHtml}
]
product_preset.extend([
Image(references=False),
Link(references=False),
])
product_markdown = Wenmode(product_preset)
text = '''
plain
A [direct](/url) and [reference][id].
'''
html = product_markdown.render(text)
assert '<span>plain</span>' in html
assert 'direct' in html
assert '[reference][id]' in html
```
This example starts from `commonmark`, removes raw HTML parsing, and replaces
reference-style image and link rules with direct-only variants. Export
`product_preset` from your own package when multiple services need the same
syntax rules.