xref: /dokuwiki/_test/tests/Parsing/Markdown/gfm-spec/skip.php (revision c4bcbc2e0c397783de26c1e3c211d82d1ac21bb4)
172b2703bSAndreas Gohr<?php
272b2703bSAndreas Gohr
372b2703bSAndreas Gohr/**
472b2703bSAndreas Gohr * GFM spec examples that GfmSpecTest should skip, keyed by example number
572b2703bSAndreas Gohr * (as numbered in spec.txt / the rendered spec).
672b2703bSAndreas Gohr *
772b2703bSAndreas Gohr * Add entries here ONLY for behavior DokuWiki has explicitly decided not to
872b2703bSAndreas Gohr * implement — not for features that are merely pending. Unimplemented
972b2703bSAndreas Gohr * features should show as real failures so they remain visible TODOs on
1072b2703bSAndreas Gohr * the branch.
1172b2703bSAndreas Gohr *
1272b2703bSAndreas Gohr * Each value is a short human-readable reason that will appear in phpunit's
1372b2703bSAndreas Gohr * skip output.
1472b2703bSAndreas Gohr */
1572b2703bSAndreas Gohr
1672b2703bSAndreas Gohrreturn [
1772b2703bSAndreas Gohr    // --------------------------------------------------------------------
183e6baeffSAndreas Gohr    // Thematic breaks (GfmHr) — strict-only HR is intentional. The
193e6baeffSAndreas Gohr    // delimiter run must be bare: no leading, trailing, or internal
203e6baeffSAndreas Gohr    // whitespace in either DW or GFM flavor. The list-precedence cases
213e6baeffSAndreas Gohr    // additionally need a GfmListblock guard that is out of scope.
223e6baeffSAndreas Gohr    // --------------------------------------------------------------------
233e6baeffSAndreas Gohr    17 => 'thematic break: 0-3 spaces of leading indent. Strict policy:'
243e6baeffSAndreas Gohr        . ' opener must be at column 0 in either flavor.',
253e6baeffSAndreas Gohr    21 => 'thematic break: spaces between delimiter chars (`- - -`).'
263e6baeffSAndreas Gohr        . ' Strict policy: bare run only.',
273e6baeffSAndreas Gohr    22 => 'thematic break: spaces between delimiter chars (`** * **`).'
283e6baeffSAndreas Gohr        . ' Strict policy: bare run only.',
293e6baeffSAndreas Gohr    23 => 'thematic break: spaces between delimiter chars (`-     -`).'
303e6baeffSAndreas Gohr        . ' Strict policy: bare run only.',
313e6baeffSAndreas Gohr    24 => 'thematic break: trailing spaces after the run. Strict policy:'
323e6baeffSAndreas Gohr        . ' bare run only.',
333e6baeffSAndreas Gohr    29 => 'thematic break: Setext heading underline `Foo\n---` should'
343e6baeffSAndreas Gohr        . ' render as `<h2>`. Setext headings are deliberately not'
353e6baeffSAndreas Gohr        . ' supported — `---` collides with DokuWiki HR and `===` would'
363e6baeffSAndreas Gohr        . ' collide with DokuWiki heading syntax.',
373e6baeffSAndreas Gohr    30 => 'thematic break vs. list-item precedence (`* * *` between list'
383e6baeffSAndreas Gohr        . ' items): requires internal-space HR support and a GfmListblock'
393e6baeffSAndreas Gohr        . ' guard so the list refuses to absorb the HR-shaped line. Both'
403e6baeffSAndreas Gohr        . ' out of scope; the line stays a list-item body.',
413e6baeffSAndreas Gohr    31 => 'thematic break inside list with different bullet (`- * * *`):'
423e6baeffSAndreas Gohr        . ' depends on internal-space HR support inside the sub-parsed'
433e6baeffSAndreas Gohr        . ' item body. See example 30.',
443e6baeffSAndreas Gohr
453e6baeffSAndreas Gohr    // --------------------------------------------------------------------
46b1c59bedSAndreas Gohr    // Fenced code blocks (GfmCode / GfmFile) — deliberate simplifications
47b1c59bedSAndreas Gohr    // versus strict GFM. All of these are consequences of lexer constraints
48b1c59bedSAndreas Gohr    // (no regex backreferences) or the deliberate column-0-only policy.
49b1c59bedSAndreas Gohr    // --------------------------------------------------------------------
50b1c59bedSAndreas Gohr    94  => 'fenced code: closing fence must be ≥ opening length — DokuWiki'
51b1c59bedSAndreas Gohr         . ' accepts any 3+ run as a closer (no regex backreferences for'
52b1c59bedSAndreas Gohr         . ' length pairing). Deliberate relaxation.',
53b1c59bedSAndreas Gohr    95  => 'fenced code (tilde variant): closing fence must be ≥ opening'
54b1c59bedSAndreas Gohr         . ' length — see example 94.',
55b1c59bedSAndreas Gohr    96  => 'fenced code: unclosed fence — DokuWiki convention requires a'
56b1c59bedSAndreas Gohr         . ' closer (matches DW <code> tag), so unclosed fences stay'
57b1c59bedSAndreas Gohr         . ' literal rather than consuming to EOF. GFM spec rule depends'
58b1c59bedSAndreas Gohr         . ' on CommonMark\'s two-pass block parser, which our single-pass'
59b1c59bedSAndreas Gohr         . ' lexer cannot implement fully anyway (see example 98).',
60b1c59bedSAndreas Gohr    97  => 'fenced code: unclosed fence with intervening short run — stays'
61b1c59bedSAndreas Gohr         . ' literal, see example 96.',
62b1c59bedSAndreas Gohr    101 => 'fenced code: opener indented 1 space — DokuWiki requires'
63b1c59bedSAndreas Gohr         . ' column-0 fences. Indent tolerance + per-line body dedent out'
64b1c59bedSAndreas Gohr         . ' of scope.',
65b1c59bedSAndreas Gohr    102 => 'fenced code: opener indented 2 spaces — see example 101.',
66b1c59bedSAndreas Gohr    103 => 'fenced code: opener indented 3 spaces — see example 101.',
67b1c59bedSAndreas Gohr    105 => 'fenced code: closer indented 2 spaces — column-0-only policy,'
68b1c59bedSAndreas Gohr         . ' see example 101.',
69b1c59bedSAndreas Gohr    106 => 'fenced code: indented opener with less-indented closer —'
70b1c59bedSAndreas Gohr         . ' column-0-only policy, see example 101.',
71b1c59bedSAndreas Gohr    107 => 'fenced code: 4-space-indented closer — with column-0-only'
72b1c59bedSAndreas Gohr         . ' policy there is no valid closer, so the fence stays literal'
73b1c59bedSAndreas Gohr         . ' (see example 96).',
74b1c59bedSAndreas Gohr    109 => 'fenced code: malformed closer `~~~ ~~` (space-broken run) —'
75b1c59bedSAndreas Gohr         . ' with no valid closer the fence stays literal (see example 96).',
76b1c59bedSAndreas Gohr    108 => 'fenced code: `` `` is not a valid fence; GFM falls back to an'
77b1c59bedSAndreas Gohr         . ' inline code span of length 3. Inline spans with n≥3 not'
78b1c59bedSAndreas Gohr         . ' implemented (GfmBacktickSingle/Double cover only n=1, n=2).',
79b1c59bedSAndreas Gohr    111 => 'fenced code interrupting Setext heading (`foo\n---`): Setext'
80685560ebSAndreas Gohr         . ' headings are deliberately not supported — the `---` underline'
81685560ebSAndreas Gohr         . ' collides with DokuWiki\'s horizontal rule and `===` would'
82685560ebSAndreas Gohr         . ' collide with DokuWiki heading syntax.',
83b1c59bedSAndreas Gohr    115 => 'fenced code: `` `` backtick-fence-with-backticks-in-info-string'
84b1c59bedSAndreas Gohr         . ' is invalid; GFM falls back to n=3 inline span — inline spans'
85b1c59bedSAndreas Gohr         . ' with n≥3 not implemented. See example 108.',
86b1c59bedSAndreas Gohr
87b1c59bedSAndreas Gohr    // --------------------------------------------------------------------
888ed75a23SAndreas Gohr    // Code-span edge cases that collide with project-wide decisions
898ed75a23SAndreas Gohr    // (no raw HTML, no GFM angle-bracket autolinks, typography on by
908ed75a23SAndreas Gohr    // default) or with the single-pass lexer's limits.
918ed75a23SAndreas Gohr    // --------------------------------------------------------------------
928ed75a23SAndreas Gohr    351 => 'code span vs. emphasis: cross-positional precedence would require'
938ed75a23SAndreas Gohr         . ' a pre-scan pass — the single-pass lexer matches leftmost-first'
948ed75a23SAndreas Gohr         . ' and cannot reject an earlier emphasis opener because a later'
958ed75a23SAndreas Gohr         . ' backtick span would consume its closer',
968ed75a23SAndreas Gohr    353 => 'code span: the trailing `"` outside the span is converted to a'
978ed75a23SAndreas Gohr         . ' curly quote by DokuWiki typography, diverging from the spec HTML',
988ed75a23SAndreas Gohr    354 => 'raw HTML tag pass-through: DokuWiki does not render raw HTML by'
998ed75a23SAndreas Gohr         . ' default; `<html>` blocks are the opt-in',
1008ed75a23SAndreas Gohr    356 => 'GFM angle-bracket autolink `<http://…>`: not implemented — we'
1018ed75a23SAndreas Gohr         . ' rely on DokuWiki\'s existing bare-URL detection, which does not'
1028ed75a23SAndreas Gohr         . ' parse `<URL>` form',
1038ed75a23SAndreas Gohr
1048ed75a23SAndreas Gohr    // --------------------------------------------------------------------
10572b2703bSAndreas Gohr    // CommonMark §6.2 flanking-delimiter analysis — deliberately not
10672b2703bSAndreas Gohr    // implemented. DokuWiki's regex lexer uses leftmost-match and cannot
10772b2703bSAndreas Gohr    // apply CommonMark's left/right-flanking rules that distinguish
10872b2703bSAndreas Gohr    // word-chars, whitespace, and punctuation for `*`/`_` delimiters, or
10972b2703bSAndreas Gohr    // the "multiple-of-3" rule for overlapping runs. These examples all
11072b2703bSAndreas Gohr    // rely on that machinery.
11172b2703bSAndreas Gohr    // --------------------------------------------------------------------
11272b2703bSAndreas Gohr
11372b2703bSAndreas Gohr    // Unicode whitespace in flanking context. Our `\s` is ASCII-only
11472b2703bSAndreas Gohr    // because the lexer doesn't set the PCRE `u` flag.
11572b2703bSAndreas Gohr    363 => 'Unicode whitespace (U+00A0) flanking — requires u-flag-aware regex',
11672b2703bSAndreas Gohr
11772b2703bSAndreas Gohr    // Punctuation-adjacent flanking for `*` / `_` / `**` / `__`
11872b2703bSAndreas Gohr    362 => 'flanking: punctuation-adjacent `*` (left-flanking vs. right-flanking)',
11972b2703bSAndreas Gohr    368 => 'flanking: punctuation-adjacent `_`',
12072b2703bSAndreas Gohr    372 => 'flanking: intraword `_` with punctuation inside',
12172b2703bSAndreas Gohr    377 => 'flanking: `*` followed by `(` requires punctuation-aware flanking',
12272b2703bSAndreas Gohr    378 => 'flanking: nested `*(*foo*)*` requires flanking + balanced-pair analysis',
12372b2703bSAndreas Gohr    382 => 'flanking: nested `_(_foo_)_` requires flanking + balanced-pair analysis',
12472b2703bSAndreas Gohr    389 => 'flanking: punctuation-adjacent `**`',
12572b2703bSAndreas Gohr    394 => 'flanking: punctuation-adjacent `__`',
12672b2703bSAndreas Gohr    401 => 'flanking: `**` followed by `(`',
12772b2703bSAndreas Gohr    404 => 'flanking: nested `*bar*` inside `**foo ... foo**` with punctuation',
12872b2703bSAndreas Gohr    407 => 'flanking: `__` followed by `(`',
12972b2703bSAndreas Gohr    470 => 'flanking: nested `*_foo_*` requires balanced-pair analysis',
13072b2703bSAndreas Gohr    472 => 'flanking: nested `_*foo*_` requires balanced-pair analysis',
13172b2703bSAndreas Gohr
13272b2703bSAndreas Gohr    // Intraword `__` strong (even multibyte) — flanking rule for `_` requires
13372b2703bSAndreas Gohr    // examining whether the delimiter run is word-boundary-flanking, which our
13472b2703bSAndreas Gohr    // simple lookbehind/lookahead approximation doesn't fully match.
13572b2703bSAndreas Gohr    395 => 'flanking: intraword `__` (`foo__bar__`) — left-flanking vs right-flanking',
13672b2703bSAndreas Gohr    396 => 'flanking: intraword `__` across digits (`5__6__78`)',
13772b2703bSAndreas Gohr    397 => 'flanking: intraword `__` with Cyrillic',
13872b2703bSAndreas Gohr    398 => 'flanking: `__foo, __bar__, baz__` — flanking + balanced pairing',
13972b2703bSAndreas Gohr    409 => 'flanking: `__foo__bar` — intraword close',
14072b2703bSAndreas Gohr    410 => 'flanking: intraword `__` with Cyrillic (leading)',
14172b2703bSAndreas Gohr    411 => 'flanking: `__foo__bar__baz__` — multiple `__` pairs with flanking',
14272b2703bSAndreas Gohr    412 => 'flanking: `__(bar)__.` — punctuation-adjacent',
14372b2703bSAndreas Gohr
14472b2703bSAndreas Gohr    // Overlapping / multiple-of-3 rule for runs
14572b2703bSAndreas Gohr    416 => 'CommonMark rule 9 (overlapping same-delimiter `_foo _bar_ baz_`)',
14672b2703bSAndreas Gohr    417 => 'CommonMark overlapping `_` / `__` with flanking',
14772b2703bSAndreas Gohr    418 => 'CommonMark overlapping `*foo *bar**` — multiple-of-3 rule',
14872b2703bSAndreas Gohr    419 => 'CommonMark nested `*foo **bar** baz*` — balanced-pair analysis',
14972b2703bSAndreas Gohr    421 => 'CommonMark overlapping `*foo**bar*` — multiple-of-3',
15072b2703bSAndreas Gohr    422 => 'CommonMark nested `***foo** bar*` — triple-delimiter analysis',
15172b2703bSAndreas Gohr    423 => 'CommonMark nested `*foo **bar***` — triple-delimiter analysis',
15272b2703bSAndreas Gohr    424 => 'CommonMark nested `*foo**bar***` — triple-delimiter analysis',
15372b2703bSAndreas Gohr    425 => 'CommonMark triple `foo***bar***baz` — triple-delimiter analysis',
15472b2703bSAndreas Gohr    426 => 'CommonMark long delimiter runs `foo******bar*********baz`',
15572b2703bSAndreas Gohr    427 => 'CommonMark deeply nested `*foo **bar *baz* bim** bop*`',
15672b2703bSAndreas Gohr    434 => 'CommonMark overlapping `__foo __bar__ baz__` — multiple-of-3',
15772b2703bSAndreas Gohr    435 => 'CommonMark `____foo__ bar__` — leading long delimiter run',
15872b2703bSAndreas Gohr    436 => 'CommonMark `**foo **bar****` — trailing long delimiter run',
15972b2703bSAndreas Gohr    439 => 'CommonMark nested `***foo* bar**` — triple-delimiter',
16072b2703bSAndreas Gohr    440 => 'CommonMark nested `**foo *bar***` — triple-delimiter',
16172b2703bSAndreas Gohr    441 => 'CommonMark deeply nested `**foo *bar **baz** bim* bop**`',
16272b2703bSAndreas Gohr
16372b2703bSAndreas Gohr    // `__foo_` / `_foo__` — mixing `_` and `__` requires flanking to decide
16472b2703bSAndreas Gohr    // which delimiter pairs open/close.
16572b2703bSAndreas Gohr    463 => 'flanking: `__foo_` — mixed `_`/`__` pairing',
16672b2703bSAndreas Gohr    464 => 'flanking: `_foo__` — mixed `_`/`__` pairing',
16772b2703bSAndreas Gohr    465 => 'flanking: `___foo__` — delimiter-run length analysis',
16872b2703bSAndreas Gohr    466 => 'flanking: `____foo_` — delimiter-run length analysis',
16972b2703bSAndreas Gohr    467 => 'flanking: `__foo___` — delimiter-run length analysis',
17072b2703bSAndreas Gohr    468 => 'flanking: `_foo____` — delimiter-run length analysis',
17172b2703bSAndreas Gohr
17272b2703bSAndreas Gohr    // Long delimiter runs require excess-drop logic (2 outer chars dropped
17372b2703bSAndreas Gohr    // from each side). Stack-based pairing needed — out of scope.
17472b2703bSAndreas Gohr    473 => 'CommonMark `****foo****` — excess-drop (4+4 → strong only)',
17572b2703bSAndreas Gohr    474 => 'CommonMark `____foo____` — excess-drop (4+4 → strong only)',
17672b2703bSAndreas Gohr    475 => 'CommonMark `******foo******` — excess-drop (6+6 → strong only)',
17772b2703bSAndreas Gohr    477 => 'CommonMark `_____foo_____` — excess-drop (5+5 → em+strong, 2 dropped each side)',
17872b2703bSAndreas Gohr
17972b2703bSAndreas Gohr    // Overlapping / crossing delimiters
18072b2703bSAndreas Gohr    478 => 'CommonMark `*foo _bar* baz_` — overlapping different delimiters',
18172b2703bSAndreas Gohr    479 => 'CommonMark `*foo __bar *baz bim__ bam*` — crossing delimiters',
18272b2703bSAndreas Gohr    480 => 'CommonMark `**foo **bar baz**` — overlapping same delimiter',
1838719732dSAndreas Gohr
1848719732dSAndreas Gohr    // --------------------------------------------------------------------
185e89aeebdSAndreas Gohr    // Inline link `[text](url)` — features GfmLink deliberately does not
186e89aeebdSAndreas Gohr    // implement. Either rarely-used syntax paid for with disproportionate
187e89aeebdSAndreas Gohr    // regex complexity, or single-pass-lexer limits that can't be worked
188e89aeebdSAndreas Gohr    // around inside one mode.
189e89aeebdSAndreas Gohr    // --------------------------------------------------------------------
190e89aeebdSAndreas Gohr
191e89aeebdSAndreas Gohr    // GFM link title attribute (`"title"` / `'title'` / `(title)` after
192e89aeebdSAndreas Gohr    // the URL). Parses cleanly but is discarded: DokuWiki's link handler
193e89aeebdSAndreas Gohr    // instructions have no title-attribute slot, and plumbing one through
194e89aeebdSAndreas Gohr    // every renderer is out of scope for GfmLink.
195e89aeebdSAndreas Gohr    493 => 'link title attribute: GfmLink parses but discards — DokuWiki link instructions have no title slot',
196e89aeebdSAndreas Gohr    513 => 'link title attribute (three quoting styles): discarded by GfmLink',
197e89aeebdSAndreas Gohr    515 => 'link title separated by non-breaking space: title slot not supported',
198e89aeebdSAndreas Gohr    516 => 'link title with nested balanced quotes: Markdown.pl quirk, not supported',
199e89aeebdSAndreas Gohr    517 => 'link title with different quote type for inner quotes: title slot not supported',
200e89aeebdSAndreas Gohr    518 => 'multi-line link title: title slot not supported',
201e89aeebdSAndreas Gohr
202e89aeebdSAndreas Gohr    // Pointy-bracket link destinations `<...>`. Rarely used; regex cost
203e89aeebdSAndreas Gohr    // and interaction with raw-HTML detection outweigh the benefit.
204e89aeebdSAndreas Gohr    496 => 'pointy-bracket link destination `<>`: not supported',
205e89aeebdSAndreas Gohr    498 => 'pointy-bracket destination with spaces `<...>`: not supported',
206e89aeebdSAndreas Gohr    500 => 'pointy-bracket destination with newline: not supported',
207e89aeebdSAndreas Gohr    501 => 'pointy-bracket destination containing `)`: not supported',
208e89aeebdSAndreas Gohr    502 => 'pointy-bracket destination with trailing backslash: not supported',
209e89aeebdSAndreas Gohr    503 => 'malformed pointy-bracket destinations: renderer output differs',
210e89aeebdSAndreas Gohr    507 => 'pointy-bracket destination wrapping unbalanced parens: not supported',
211e89aeebdSAndreas Gohr
212e89aeebdSAndreas Gohr    // Balanced-parens inside URL destinations.
213e89aeebdSAndreas Gohr    505 => 'balanced-parens in URL destination: not supported (regex single-level)',
214e89aeebdSAndreas Gohr
215e89aeebdSAndreas Gohr    // Other URL-level edges.
216e89aeebdSAndreas Gohr    495 => 'empty URL destination `[link]()`: pattern requires non-empty URL',
217e89aeebdSAndreas Gohr    510 => 'backslash in URL destination: URL-encoding differs from spec',
218e89aeebdSAndreas Gohr    511 => 'HTML entity / percent-encoding in URL: renderer normalization differs',
219e89aeebdSAndreas Gohr    512 => 'link destination that parses as a title: edge case not supported',
220e89aeebdSAndreas Gohr
221e89aeebdSAndreas Gohr    // Inherent single-pass-lexer limits for link text containing nested
222e89aeebdSAndreas Gohr    // structures. These cannot be resolved inside one mode.
223e89aeebdSAndreas Gohr    522 => 'nested bracket forms inner link, outer falls back to literal',
224e89aeebdSAndreas Gohr    526 => 'nested links: inner is a link, outer falls back to literal',
225e89aeebdSAndreas Gohr    527 => 'nested links inside emphasis: not supported',
226e89aeebdSAndreas Gohr    529 => 'link text grouping vs. emphasis: leftmost-match cannot override',
227e89aeebdSAndreas Gohr    530 => 'emphasis/bracket crossing: leftmost-match cannot override',
228e89aeebdSAndreas Gohr    532 => 'raw HTML inside link text: project-wide "no raw HTML" limit',
229e89aeebdSAndreas Gohr    533 => 'code span inside link text: requires pre-scan pass (see #351)',
230e89aeebdSAndreas Gohr    534 => 'autolink inside link text: raw `<URL>` autolinks not supported (see #356)',
231e89aeebdSAndreas Gohr
232e89aeebdSAndreas Gohr    // Reference links (`[text][id]`, `[text][]`, `[foo]` with matching
233e89aeebdSAndreas Gohr    // `[foo]: url` definition). Not implemented: resolving forward
234e89aeebdSAndreas Gohr    // references would require a two-pass parse, but DokuWiki's lexer is
235e89aeebdSAndreas Gohr    // single-pass. Inline links `[text](url)` are the only supported
236e89aeebdSAndreas Gohr    // form.
237e89aeebdSAndreas Gohr    535 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
238e89aeebdSAndreas Gohr    536 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
239e89aeebdSAndreas Gohr    537 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
240e89aeebdSAndreas Gohr    538 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
241e89aeebdSAndreas Gohr    539 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
242e89aeebdSAndreas Gohr    540 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
243e89aeebdSAndreas Gohr    541 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
244e89aeebdSAndreas Gohr    542 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
245e89aeebdSAndreas Gohr    543 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
246e89aeebdSAndreas Gohr    544 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
247e89aeebdSAndreas Gohr    545 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
248e89aeebdSAndreas Gohr    546 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
249e89aeebdSAndreas Gohr    547 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
250e89aeebdSAndreas Gohr    548 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
251e89aeebdSAndreas Gohr    549 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
252e89aeebdSAndreas Gohr    550 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
253e89aeebdSAndreas Gohr    551 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
254e89aeebdSAndreas Gohr    552 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
255e89aeebdSAndreas Gohr    553 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
256e89aeebdSAndreas Gohr    557 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
257e89aeebdSAndreas Gohr    558 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
258e89aeebdSAndreas Gohr    560 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
259e89aeebdSAndreas Gohr    561 => 'collapsed reference link: forward-reference definitions not supported (single-pass lexer)',
260e89aeebdSAndreas Gohr    562 => 'collapsed reference link: forward-reference definitions not supported (single-pass lexer)',
261e89aeebdSAndreas Gohr    563 => 'collapsed reference link: forward-reference definitions not supported (single-pass lexer)',
262e89aeebdSAndreas Gohr    564 => 'collapsed reference link: forward-reference definitions not supported (single-pass lexer)',
263e89aeebdSAndreas Gohr    565 => 'shortcut reference link: forward-reference definitions not supported (single-pass lexer)',
264e89aeebdSAndreas Gohr    566 => 'shortcut reference link: forward-reference definitions not supported (single-pass lexer)',
265e89aeebdSAndreas Gohr    567 => 'shortcut reference link: forward-reference definitions not supported (single-pass lexer)',
266e89aeebdSAndreas Gohr    568 => 'shortcut reference link: forward-reference definitions not supported (single-pass lexer)',
267e89aeebdSAndreas Gohr    569 => 'shortcut reference link: forward-reference definitions not supported (single-pass lexer)',
268e89aeebdSAndreas Gohr    570 => 'shortcut reference link: forward-reference definitions not supported (single-pass lexer)',
269e89aeebdSAndreas Gohr    571 => 'shortcut reference link with escape: forward-reference definitions not supported (single-pass lexer)',
270e89aeebdSAndreas Gohr    572 => 'shortcut reference link with emphasis: forward-reference definitions not supported (single-pass lexer)',
271e89aeebdSAndreas Gohr    573 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
272e89aeebdSAndreas Gohr    574 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
273e89aeebdSAndreas Gohr    575 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
274e89aeebdSAndreas Gohr    576 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
275e89aeebdSAndreas Gohr    577 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
276e89aeebdSAndreas Gohr    578 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
277e89aeebdSAndreas Gohr    579 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
278e89aeebdSAndreas Gohr
279e89aeebdSAndreas Gohr    // --------------------------------------------------------------------
2803440a8c0SAndreas Gohr    // Inline image `![alt](url)`. The XHTML renderer's default media
2813440a8c0SAndreas Gohr    // rendering diverges from GFM's bare <img> (it wraps in a details <a>
2823440a8c0SAndreas Gohr    // with fetch.php/detail.php proxy URLs) — GfmSpecTest uses
2833440a8c0SAndreas Gohr    // SpecCompatRenderer to emit spec-shape bare <img>, so only the
2843440a8c0SAndreas Gohr    // parser-level or feature-level gaps remain as skips: title attribute
2853440a8c0SAndreas Gohr    // (no DW slot), reference images, pointy-bracket destinations, nested
2863440a8c0SAndreas Gohr    // brackets, and escape-dependent cases.
2873440a8c0SAndreas Gohr    // --------------------------------------------------------------------
2883440a8c0SAndreas Gohr
2893440a8c0SAndreas Gohr    580 => 'image with title attribute: GfmMedia discards titles (no DW slot)',
2903440a8c0SAndreas Gohr    581 => 'reference-style image: forward-reference definitions not supported (single-pass lexer)',
2913440a8c0SAndreas Gohr    582 => 'nested image-in-image `![foo ![bar](x)](y)`: alt class forbids brackets;'
2923440a8c0SAndreas Gohr         . ' leftmost-match cannot reorder — outer falls back to literal (see #526)',
2933440a8c0SAndreas Gohr    583 => 'link-in-image alt `![foo [bar](x)](y)`: alt class forbids brackets;'
2943440a8c0SAndreas Gohr         . ' leftmost-match cannot reorder — outer falls back to literal (see #526)',
2953440a8c0SAndreas Gohr    584 => 'collapsed reference-style image: forward-reference definitions not supported',
2963440a8c0SAndreas Gohr    585 => 'full reference-style image: forward-reference definitions not supported',
2973440a8c0SAndreas Gohr    587 => 'image with title attribute: title discarded (no DW slot)',
2983440a8c0SAndreas Gohr    588 => 'pointy-bracket image destination `![alt](<url>)`: not supported (see GfmLink #496)',
2993440a8c0SAndreas Gohr    590 => 'reference-style image: forward-reference definitions not supported',
3003440a8c0SAndreas Gohr    591 => 'reference-style image (case-insensitive label): forward-reference definitions not supported',
3013440a8c0SAndreas Gohr    592 => 'collapsed reference-style image `![foo][]`: forward-reference definitions not supported',
3023440a8c0SAndreas Gohr    593 => 'collapsed reference-style image with emphasis in label: forward-reference definitions not supported',
3033440a8c0SAndreas Gohr    594 => 'collapsed reference-style image (case-insensitive): forward-reference definitions not supported',
3043440a8c0SAndreas Gohr    595 => 'reference-style image with intervening whitespace: forward-reference definitions not supported',
3053440a8c0SAndreas Gohr    596 => 'shortcut reference-style image `![foo]`: forward-reference definitions not supported',
3063440a8c0SAndreas Gohr    597 => 'shortcut reference-style image with emphasis: forward-reference definitions not supported',
3073440a8c0SAndreas Gohr    598 => 'image with unescaped nested brackets `![[foo]]`: literal-fallback behavior not supported',
3083440a8c0SAndreas Gohr    599 => 'shortcut reference-style image (case-insensitive): forward-reference definitions not supported',
3093440a8c0SAndreas Gohr
3103440a8c0SAndreas Gohr    // --------------------------------------------------------------------
3118719732dSAndreas Gohr    // ATX heading collisions with DokuWiki-specific behavior.
3128719732dSAndreas Gohr    // --------------------------------------------------------------------
3138719732dSAndreas Gohr    38 => 'ATX heading with leading spaces: GFM tolerates 0-3 spaces of'
3148719732dSAndreas Gohr        . ' indent before the opener; we require the `#` at column 0.'
3158719732dSAndreas Gohr        . ' Indent tolerance collides with DokuWiki\'s 2-space-indent'
3168719732dSAndreas Gohr        . ' preformatted block and isn\'t worth untangling',
3178719732dSAndreas Gohr    39 => 'indented code block: DokuWiki uses 2-space indent for'
3188719732dSAndreas Gohr        . ' preformatted; GFM 4-space indented code blocks are not'
3198719732dSAndreas Gohr        . ' implemented',
3208719732dSAndreas Gohr    40 => 'indented code block: 4-space indent after a paragraph is a'
3218719732dSAndreas Gohr        . ' continuation in GFM but preformatted in DokuWiki — not'
3228719732dSAndreas Gohr        . ' implemented',
3238719732dSAndreas Gohr    41 => 'ATX heading with leading spaces: second heading is indented'
3248719732dSAndreas Gohr        . ' by 2 spaces; we require the `#` at column 0',
3258719732dSAndreas Gohr    49 => 'empty ATX heading: DokuWiki\'s XHTML renderer deliberately'
3268719732dSAndreas Gohr        . ' skips blank headings (blank() guard in Doku_Renderer_xhtml::header)',
327685560ebSAndreas Gohr
328685560ebSAndreas Gohr    // --------------------------------------------------------------------
329685560ebSAndreas Gohr    // List items / Lists — list features GfmListblock deliberately does
330685560ebSAndreas Gohr    // not implement. The simplifications are by design: indentation uses
331685560ebSAndreas Gohr    // a fixed 2-space-multiple step starting at 0, lazy continuation is
332685560ebSAndreas Gohr    // not supported, and the rewriter groups items by 'u'/'o' type only.
333685560ebSAndreas Gohr    // The buckets are:
334685560ebSAndreas Gohr    //
335685560ebSAndreas Gohr    //  A. Extra spaces after the marker. CommonMark rolls them (up to
336685560ebSAndreas Gohr    //     4) into the content column; we dedent at `marker_width + 1`,
337685560ebSAndreas Gohr    //     collapsing the extras.
338685560ebSAndreas Gohr    //  B. 1- or 3-space indent for nesting (we round down to nearest 2).
339685560ebSAndreas Gohr    //  C. Lazy continuation (column-0 paragraph wrap inside an item).
340685560ebSAndreas Gohr    //  D. Strict CommonMark loose/tight classification (every blank line
341685560ebSAndreas Gohr    //     between items / inside items reclassifies; we use a simpler
342685560ebSAndreas Gohr    //     single-paragraph-tight, multi-paragraph-loose rule).
343685560ebSAndreas Gohr    //  E. Marker-character-change splits ordered lists ('.' vs ')') or
344685560ebSAndreas Gohr    //     unordered ('-' vs '+' vs '*'). Our rewriter groups by 'u' / 'o'
345685560ebSAndreas Gohr    //     type only, not by marker character.
346685560ebSAndreas Gohr    //  F. List interrupting a paragraph without a blank line — requires a
347685560ebSAndreas Gohr    //     multi-pass block parser to revisit prior text.
348685560ebSAndreas Gohr    //
349685560ebSAndreas Gohr    // Examples that depend on a pending mode (GfmQuote, GfmEscape, …) are
350685560ebSAndreas Gohr    // intentionally NOT skipped — they remain visible failing tests until
351685560ebSAndreas Gohr    // the mode lands.
352685560ebSAndreas Gohr    // --------------------------------------------------------------------
353309a0852SAndreas Gohr    // --------------------------------------------------------------------
354309a0852SAndreas Gohr    // Block quotes — deliberate scope reductions vs. strict GFM. The
355309a0852SAndreas Gohr    // unified GfmQuote mode (replacing DW Quote) covers `>` blockquotes
356309a0852SAndreas Gohr    // for both DW and MD pages, but several CommonMark blockquote rules
357309a0852SAndreas Gohr    // are out of scope:
358309a0852SAndreas Gohr    //
359309a0852SAndreas Gohr    // - 1-3 space indent before `>` (column-0-only policy, consistent
360309a0852SAndreas Gohr    //   with GfmCode / GfmFile / GfmHeader).
361309a0852SAndreas Gohr    // - Lazy continuation (paragraph text without `>` on continuation
362309a0852SAndreas Gohr    //   lines). Same policy as GfmListblock — markers required on
363309a0852SAndreas Gohr    //   every line.
364309a0852SAndreas Gohr    // - Headers inside quotes — sub-parser excludes BASEONLY so header
365309a0852SAndreas Gohr    //   instructions don't drive TOC/section-edit anchors that don't
366309a0852SAndreas Gohr    //   compose with `<blockquote>`. Same rationale as GfmListblock's
367309a0852SAndreas Gohr    //   header exclusion inside list items.
368309a0852SAndreas Gohr    // - Setext-style block constructs (the `---` underline collides
369309a0852SAndreas Gohr    //   with DW's HR rule).
370309a0852SAndreas Gohr    //
371309a0852SAndreas Gohr    // Examples that depend on still-pending modes (GfmHr) are
372309a0852SAndreas Gohr    // intentionally NOT skipped — they stay visible until those modes
373309a0852SAndreas Gohr    // land.
374309a0852SAndreas Gohr    // --------------------------------------------------------------------
375309a0852SAndreas Gohr    206 => 'block quotes: header inside quote — sub-parser excludes'
376309a0852SAndreas Gohr         . ' BASEONLY (TOC / section-edit anchors do not compose with'
377309a0852SAndreas Gohr         . ' `<blockquote>`). Same policy as GfmListblock for `<li>`.',
378309a0852SAndreas Gohr    207 => 'block quotes: header inside quote with no space after `>` —'
379309a0852SAndreas Gohr         . ' see #206 for the BASEONLY exclusion rationale.',
380309a0852SAndreas Gohr    208 => 'block quotes: leading-space `>` (1-3 spaces of indent) —'
381309a0852SAndreas Gohr         . ' column-0-only policy, consistent with GfmCode / GfmFile.',
382309a0852SAndreas Gohr    210 => 'block quotes: lazy continuation `> # Foo\n> bar\nbaz` —'
383309a0852SAndreas Gohr         . ' every quote line must begin with `>` at column 0. Same'
384309a0852SAndreas Gohr         . ' policy as GfmListblock.',
385309a0852SAndreas Gohr    211 => 'block quotes: lazy continuation `> bar\nbaz\n> foo` —'
386309a0852SAndreas Gohr         . ' see #210.',
387309a0852SAndreas Gohr    212 => 'block quotes: Setext heading underline `---` after `> foo`'
388309a0852SAndreas Gohr         . ' — no Setext headings (the `---` collides with DW HR syntax).',
389309a0852SAndreas Gohr    215 => 'block quotes: fenced code block split across blockquote'
390309a0852SAndreas Gohr         . ' boundary — fence inside quote followed by non-`>` lines'
391309a0852SAndreas Gohr         . ' depends on the same lazy-continuation rule we do not'
392309a0852SAndreas Gohr         . ' implement (see #210).',
393309a0852SAndreas Gohr    216 => 'block quotes: lazy continuation `> foo\n    - bar` — see #210.',
394309a0852SAndreas Gohr    225 => 'block quotes: lazy continuation `> bar\nbaz` — see #210.',
395309a0852SAndreas Gohr    227 => 'block quotes: lazy continuation `> bar\n>\nbaz` — see #210.',
396309a0852SAndreas Gohr    228 => 'block quotes: lazy continuation in nested quote'
397309a0852SAndreas Gohr         . ' `> > > foo\nbar` — see #210.',
398309a0852SAndreas Gohr    229 => 'block quotes: lazy continuation across nested levels'
399309a0852SAndreas Gohr         . ' `>>> foo\n> bar\n>>baz` — see #210.',
400309a0852SAndreas Gohr
401685560ebSAndreas Gohr    232 => 'list items: marker-width content-column alignment (A)',
402685560ebSAndreas Gohr    235 => 'list items: marker-width content-column alignment (A)',
403685560ebSAndreas Gohr    249 => 'list items: marker-width-driven content-column alignment for `10. foo` (A)',
404685560ebSAndreas Gohr    254 => 'list items: marker-width content-column alignment edge case (A)',
405685560ebSAndreas Gohr    258 => 'list items: marker-width content-column for `1.  foo` (A)',
406685560ebSAndreas Gohr    263 => 'list items: indent ambiguity at column 0/1/2 (B)',
407685560ebSAndreas Gohr    264 => 'list items: 1-space-indent variation (B)',
408685560ebSAndreas Gohr    265 => 'list items: marker-width with multi-line continuation (A)',
409685560ebSAndreas Gohr    266 => 'list items: marker-width with multi-line continuation (A)',
410685560ebSAndreas Gohr    267 => 'list items: lazy continuation (C)',
411685560ebSAndreas Gohr    268 => 'list items: lazy continuation (C)',
412685560ebSAndreas Gohr    270 => 'list items: lazy continuation across blank line (C+D)',
413685560ebSAndreas Gohr    273 => 'list items: list interrupting a paragraph without blank line (F)',
414685560ebSAndreas Gohr    275 => 'list items: 3-space indent rounds to 2 — sub-list under previous item (B)',
415685560ebSAndreas Gohr    276 => 'list items: marker-width content-column with mixed types (A+E)',
416685560ebSAndreas Gohr    277 => 'list items: nested markers on a single line (A)',
417685560ebSAndreas Gohr    278 => 'list items: marker-character switch splits the list (E)',
418685560ebSAndreas Gohr    281 => 'lists: marker-character change splits unordered list `-` -> `+` (E)',
419685560ebSAndreas Gohr    282 => 'lists: ordered delimiter switch splits list `.` -> `)` (E)',
420685560ebSAndreas Gohr    284 => 'lists: list interrupting paragraph without blank line (F)',
421685560ebSAndreas Gohr    286 => 'lists: marker-width content-column alignment for ordered list (A)',
422685560ebSAndreas Gohr    287 => 'lists: triple blank line + indented continuation in deeply nested item (D)',
423685560ebSAndreas Gohr    288 => 'lists: marker-character change at deeper level (E)',
424685560ebSAndreas Gohr    289 => 'lists: marker-character change with type switch (E)',
425685560ebSAndreas Gohr    290 => 'lists: 1-space-indent variations of items, all stay top-level (B)',
426685560ebSAndreas Gohr    291 => 'lists: 1-space-indent variations on ordered list (B)',
427685560ebSAndreas Gohr    292 => 'lists: marker-character change splits inside nested list (E)',
428685560ebSAndreas Gohr    293 => 'lists: marker-character change with mixed indent (E+B)',
429685560ebSAndreas Gohr    294 => 'lists: lazy continuation across types (C+E)',
430685560ebSAndreas Gohr    295 => 'lists: lazy continuation in nested list (C)',
431685560ebSAndreas Gohr    296 => 'lists: lazy continuation across blank line (C+D)',
432685560ebSAndreas Gohr    297 => 'lists: blank-line classification for loose/tight in nested list (D)',
433685560ebSAndreas Gohr    298 => 'lists: blank-line classification (D)',
434685560ebSAndreas Gohr    300 => 'lists: blank-line classification with marker change (D+E)',
435685560ebSAndreas Gohr    301 => 'lists: blank-line classification + marker-width alignment (D+A)',
436685560ebSAndreas Gohr    304 => 'lists: blank line between sub-list items affects loose/tight (D)',
437685560ebSAndreas Gohr    305 => 'lists: blank line between deeply nested items (D)',
438685560ebSAndreas Gohr    306 => 'lists: blank line at the end of a loose list affects classification (D)',
43974031e46SAndreas Gohr
44074031e46SAndreas Gohr    // --------------------------------------------------------------------
44174031e46SAndreas Gohr    // Backslash-escape examples (§6.1) that fail for reasons unrelated to
44274031e46SAndreas Gohr    // GfmEscape itself: renderer divergences, typography conversion, and
44374031e46SAndreas Gohr    // already-skipped GFM features (autolinks, raw HTML, reference links,
44474031e46SAndreas Gohr    // discarded link titles). The escape mechanic itself works.
44574031e46SAndreas Gohr    // --------------------------------------------------------------------
44674031e46SAndreas Gohr    308 => 'backslash escapes: apostrophe is rendered as `&#039;` by DW while'
44774031e46SAndreas Gohr         . ' the spec expects a literal `\'` — renderer policy difference,'
44874031e46SAndreas Gohr         . ' not an escape bug',
44974031e46SAndreas Gohr    310 => 'backslash escapes: DW typography converts straight `"..."` to curly'
45074031e46SAndreas Gohr         . ' quotes when $conf[typography] is on, diverging from spec output',
45174031e46SAndreas Gohr    316 => 'backslash escapes inside angle-bracket autolinks: GFM autolink'
45274031e46SAndreas Gohr         . ' `<URL>` form not implemented (see example 356)',
45374031e46SAndreas Gohr    317 => 'backslash escapes inside raw HTML: raw HTML pass-through is not'
45474031e46SAndreas Gohr         . ' supported by default (see example 354)',
45574031e46SAndreas Gohr    318 => 'backslash escapes in link title: title attribute is discarded — DW'
456309a0852SAndreas Gohr         . ' link instructions have no title slot',
45774031e46SAndreas Gohr    319 => 'backslash escapes in reference-link definition: link reference'
45874031e46SAndreas Gohr         . ' definitions not supported (single-pass lexer cannot resolve'
45974031e46SAndreas Gohr         . ' forward references)',
460*c4bcbc2eSAndreas Gohr
461*c4bcbc2eSAndreas Gohr    // --------------------------------------------------------------------
462*c4bcbc2eSAndreas Gohr    // Hard line breaks (GfmLinebreak) — both delimiter forms (two trailing
463*c4bcbc2eSAndreas Gohr    // spaces and `\` before newline) work in paragraphs, emphasis, and
464*c4bcbc2eSAndreas Gohr    // other inline containers. The skipped cases sit inside raw HTML tags,
465*c4bcbc2eSAndreas Gohr    // which DokuWiki does not pass through by default.
466*c4bcbc2eSAndreas Gohr    // --------------------------------------------------------------------
467*c4bcbc2eSAndreas Gohr    662 => 'hard line break inside a raw HTML tag (`<a href="foo  \nbar">`):'
468*c4bcbc2eSAndreas Gohr         . ' raw HTML pass-through is not supported by default — DokuWiki'
469*c4bcbc2eSAndreas Gohr         . ' has never allowed raw HTML, so the tag bytes are treated as'
470*c4bcbc2eSAndreas Gohr         . ' cdata and the break fires where the spec wants it literal.',
471*c4bcbc2eSAndreas Gohr    663 => 'hard line break (backslash form) inside a raw HTML tag — see'
472*c4bcbc2eSAndreas Gohr         . ' #662. Raw HTML out of scope.',
47372b2703bSAndreas Gohr];
474