WML has no horizontal rule element -- its entire %layout entity is
`<br>` -- so a thematic break was being rendered as `<p>------------</p>`,
a hardcoded twelve-dash guess at screen width that wraps into nonsense on
a narrow device and is short on a wide one. It was the one construct
where the renderer invented a width out of nothing.
A `---` already looks like a divider and reads as one in every Markdown
document ever written, so it now is one: it starts a new card, by
default. Rules are never drawn, whether or not they divide.
Thematic breaks and `{.card Title}` markers are now a single mechanism --
an explicit divider, optionally carrying a title -- and compose freely in
one document. Both still win over --split-level. A section takes its
title from its own first heading when the divider does not supply one, so
the common shape needs no titles at all:
Intro on the menu.
---
## Weather
Cold and clear.
`--no-split-on-rule` / `split_on_rule: false` opts out of the splitting;
it does not bring the dashes back.
Three edges this opened, each fixed here rather than left to bite:
- Setext headings. `Heading` over `---` is an H2 in Markdown, but the
parser was ATX-only, so it produced a paragraph plus a rule. Once a
rule divides cards, a setext document would have split at every heading
and stranded each heading as body copy on the card before it. Setext
headings are now parsed, so such a document keeps its structure.
- Empty sections. A trailing `---`, or two in a row, produced an empty
"Untitled" card and a menu entry leading to it. Sections with no
renderable content are dropped.
- The multi-card threshold was two sections, so a document with a single
divider collapsed back into one card. Any explicit divider now makes a
multi-card deck: `A --- B` asks for two screens.
Also fixes a latent frontmatter bug this made far more likely: a document
opening with `---` and no `key: value` lines had its opening swallowed as
if the break were a frontmatter fence. A fenced block with no keys in it
is not frontmatter.
222 tests. Rendering examples/trail.md still matches md2txt's committed
output byte for byte; no golden file contains an ASCII rule any more.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
32 lines
1.4 KiB
Python
32 lines
1.4 KiB
Python
"""The set of (source, options) -> golden file cases.
|
|
|
|
Shared by `test_golden.py` and `regenerate_golden.py` so the suite and the
|
|
regeneration script can never disagree about what should exist.
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
from typing import Any, Dict, Tuple
|
|
|
|
|
|
# name -> (example filename, renderer options)
|
|
CASES: Dict[str, Tuple[str, Dict[str, Any]]] = {
|
|
"trail": ("trail.md", {}),
|
|
"trail-split": ("trail.md", {"split_level": 2}),
|
|
"trail-linear": ("trail.md", {"split_level": 2, "menu": False}),
|
|
"trail-manual": ("trail-manual.md", {}),
|
|
"trail-select": ("trail-manual.md", {"menu_style": "select"}),
|
|
"trail-home": ("trail-manual.md", {"home_label": "Home"}),
|
|
"trail-no-template": ("trail-manual.md", {"template_nav": False}),
|
|
"trail-paginated": ("trail-manual.md", {"max_card_bytes": 120}),
|
|
"trail-images-alt": ("trail-manual.md", {"images": "alt"}),
|
|
"trail-head": ("trail-manual.md", {"cache_control": 0, "access_domain": "example.com"}),
|
|
"trail-rules": ("trail-rules.md", {}),
|
|
"trail-rules-linear": ("trail-rules.md", {"menu": False}),
|
|
"trail-rules-kept": ("trail-rules.md", {"split_on_rule": False}),
|
|
"kitchen-sink": ("kitchen-sink.md", {}),
|
|
}
|
|
|
|
# Cases that produce several files; each is written to its own directory.
|
|
MULTI_CASES: Dict[str, Tuple[str, Dict[str, Any]]] = {
|
|
"trail-decks": ("trail-manual.md", {"deck_per_card": True, "home_label": "Home"}),
|
|
}
|