xref: /dokuwiki/_test/tests/Parsing/Markdown/gfm-spec/skip.php (revision 506762f46c22593263c96a0f689023ae89b32527)
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    // --------------------------------------------------------------------
18b37c6ef7SAndreas Gohr    // Tabs (§2.2) — DokuWiki's tab handling is binary: a leading tab
19b37c6ef7SAndreas Gohr    // (matching `\n\t` directly after the newline) is the indented-code
20b37c6ef7SAndreas Gohr    // trigger; otherwise tabs are ordinary characters. CommonMark
21b37c6ef7SAndreas Gohr    // instead advances each tab to the next 4-column stop and uses the
22b37c6ef7SAndreas Gohr    // resulting column count to drive list-continuation, list-nesting,
23b37c6ef7SAndreas Gohr    // blockquote-interior, and 4-column indented-code decisions. The
24b37c6ef7SAndreas Gohr    // column arithmetic is what's missing.
25b37c6ef7SAndreas Gohr    //
26b37c6ef7SAndreas Gohr    // Examples #1, #3, #8, #10 are not listed: they happen to render
27b37c6ef7SAndreas Gohr    // correctly because a leading tab matches `\n\t`, four leading
28b37c6ef7SAndreas Gohr    // spaces match the `md`-mode 4-space code trigger, and GfmHeader
29b37c6ef7SAndreas Gohr    // accepts a tab as the post-`#` separator.
30b37c6ef7SAndreas Gohr    // --------------------------------------------------------------------
31b37c6ef7SAndreas Gohr    2 => 'tab indented-code: 2 spaces then tab. The 4-space trigger needs'
32b37c6ef7SAndreas Gohr        . ' 4 spaces; the `\n\t` trigger needs the tab directly after the'
33b37c6ef7SAndreas Gohr        . ' newline. Neither fires. CommonMark counts the tab as advancing'
34b37c6ef7SAndreas Gohr        . ' to column 4 → code block; DokuWiki does no such arithmetic.',
35b37c6ef7SAndreas Gohr    4 => 'tab as 4-column lazy-continuation indent inside a list item.'
36b37c6ef7SAndreas Gohr        . ' DokuWiki treats a leading tab as the indented-code trigger,'
37b37c6ef7SAndreas Gohr        . ' not as list continuation. Resolving requires column arithmetic'
38b37c6ef7SAndreas Gohr        . ' against the list\'s content column.',
39b37c6ef7SAndreas Gohr    5 => 'two tabs (8 columns) inside a list item → code block inside list.'
40b37c6ef7SAndreas Gohr        . ' Requires column arithmetic to subtract the list\'s content'
41b37c6ef7SAndreas Gohr        . ' column from the indent and route the residue into a nested'
42b37c6ef7SAndreas Gohr        . ' code block.',
43b37c6ef7SAndreas Gohr    6 => 'tabs after blockquote marker → indented code inside blockquote.'
44b37c6ef7SAndreas Gohr        . ' Requires column arithmetic for the blockquote interior;'
45b37c6ef7SAndreas Gohr        . ' DokuWiki treats the tab as a top-level code trigger instead.',
46b37c6ef7SAndreas Gohr    7 => 'tabs after list marker → indented code inside list item.'
47b37c6ef7SAndreas Gohr        . ' Requires column arithmetic for the list interior; DokuWiki'
48b37c6ef7SAndreas Gohr        . ' treats the tab as a top-level code trigger instead.',
49b37c6ef7SAndreas Gohr    9 => 'tab as 4-column indent for list nesting. DokuWiki treats a'
50b37c6ef7SAndreas Gohr        . ' leading tab as the indented-code trigger, never as list'
51b37c6ef7SAndreas Gohr        . ' nesting indent.',
52b37c6ef7SAndreas Gohr    11 => '`*\t*\t*\t` thematic break with tab separators. Strict-bare-run'
53b37c6ef7SAndreas Gohr        . ' HR policy rejects internal whitespace (same family as #21-23);'
54b37c6ef7SAndreas Gohr        . ' the tab form is the same case.',
55b37c6ef7SAndreas Gohr
56b37c6ef7SAndreas Gohr    // --------------------------------------------------------------------
573e6baeffSAndreas Gohr    // Thematic breaks (GfmHr) — strict-only HR is intentional. The
583e6baeffSAndreas Gohr    // delimiter run must be bare: no leading, trailing, or internal
593e6baeffSAndreas Gohr    // whitespace in either DW or GFM flavor. The list-precedence cases
603e6baeffSAndreas Gohr    // additionally need a GfmListblock guard that is out of scope.
613e6baeffSAndreas Gohr    // --------------------------------------------------------------------
623e6baeffSAndreas Gohr    17 => 'thematic break: 0-3 spaces of leading indent. Strict policy:'
633e6baeffSAndreas Gohr        . ' opener must be at column 0 in either flavor.',
643e6baeffSAndreas Gohr    21 => 'thematic break: spaces between delimiter chars (`- - -`).'
653e6baeffSAndreas Gohr        . ' Strict policy: bare run only.',
663e6baeffSAndreas Gohr    22 => 'thematic break: spaces between delimiter chars (`** * **`).'
673e6baeffSAndreas Gohr        . ' Strict policy: bare run only.',
683e6baeffSAndreas Gohr    23 => 'thematic break: spaces between delimiter chars (`-     -`).'
693e6baeffSAndreas Gohr        . ' Strict policy: bare run only.',
703e6baeffSAndreas Gohr    24 => 'thematic break: trailing spaces after the run. Strict policy:'
713e6baeffSAndreas Gohr        . ' bare run only.',
723e6baeffSAndreas Gohr    29 => 'thematic break: Setext heading underline `Foo\n---` should'
733e6baeffSAndreas Gohr        . ' render as `<h2>`. Setext headings are deliberately not'
743e6baeffSAndreas Gohr        . ' supported — `---` collides with DokuWiki HR and `===` would'
753e6baeffSAndreas Gohr        . ' collide with DokuWiki heading syntax.',
763e6baeffSAndreas Gohr    30 => 'thematic break vs. list-item precedence (`* * *` between list'
773e6baeffSAndreas Gohr        . ' items): requires internal-space HR support and a GfmListblock'
783e6baeffSAndreas Gohr        . ' guard so the list refuses to absorb the HR-shaped line. Both'
793e6baeffSAndreas Gohr        . ' out of scope; the line stays a list-item body.',
803e6baeffSAndreas Gohr    31 => 'thematic break inside list with different bullet (`- * * *`):'
813e6baeffSAndreas Gohr        . ' depends on internal-space HR support inside the sub-parsed'
823e6baeffSAndreas Gohr        . ' item body. See example 30.',
833e6baeffSAndreas Gohr
843e6baeffSAndreas Gohr    // --------------------------------------------------------------------
85b414dba2SAndreas Gohr    // Setext headings (§4.3) — deliberately not supported across the
86b414dba2SAndreas Gohr    // whole section. The `---` underline collides with DokuWiki\'s HR
87b414dba2SAndreas Gohr    // syntax and `===` would collide with DokuWiki\'s heading delimiter.
88b414dba2SAndreas Gohr    // Same rationale as #29 (thematic break vs. Setext underline),
89b414dba2SAndreas Gohr    // #111 (fence after Setext), and #212 (Setext after blockquote).
90b414dba2SAndreas Gohr    //
91b414dba2SAndreas Gohr    // Examples #62, #64, #67, #68, #69, #71, #74 are NOT listed: those
92b414dba2SAndreas Gohr    // are cases where Setext is deliberately NOT triggered (blockquote /
93b414dba2SAndreas Gohr    // list / paragraph wins, or blank lines disambiguate), so the spec
94b414dba2SAndreas Gohr    // output matches DokuWiki\'s no-Setext rendering and they pass
95b414dba2SAndreas Gohr    // naturally.
96b414dba2SAndreas Gohr    //
97b414dba2SAndreas Gohr    // #58 and #75 also depend on DokuWiki\'s strict-bare-run HR rule
98b414dba2SAndreas Gohr    // (`--- -` and `* * *` need internal-space HR, see #21-23) — they
99b414dba2SAndreas Gohr    // sit in the Setext section because the spec uses them to
100b414dba2SAndreas Gohr    // illustrate Setext-underline edge cases.
101b414dba2SAndreas Gohr    // --------------------------------------------------------------------
102b414dba2SAndreas Gohr    50 => 'Setext heading (`Foo *bar*\n=====` / `\n-----`): Setext'
103b414dba2SAndreas Gohr        . ' headings deliberately not supported — `---`/`===` underlines'
104b414dba2SAndreas Gohr        . ' collide with DokuWiki HR / heading syntax.',
105b414dba2SAndreas Gohr    51 => 'Setext heading with multi-line content: Setext headings'
106b414dba2SAndreas Gohr        . ' deliberately not supported (see #50).',
107b414dba2SAndreas Gohr    52 => 'Setext heading with indented multi-line content: Setext'
108b414dba2SAndreas Gohr        . ' headings deliberately not supported (see #50).',
109b414dba2SAndreas Gohr    53 => 'Setext heading with any-length underline: Setext headings'
110b414dba2SAndreas Gohr        . ' deliberately not supported (see #50).',
111b414dba2SAndreas Gohr    54 => 'Setext heading with 3-space-indented content / underline:'
112b414dba2SAndreas Gohr        . ' Setext headings deliberately not supported (see #50).',
113b414dba2SAndreas Gohr    55 => 'Setext heading: 4-space-indented content forms code block,'
114b414dba2SAndreas Gohr        . ' then `---` HR. Setext headings deliberately not supported'
115b414dba2SAndreas Gohr        . ' (see #50).',
116b414dba2SAndreas Gohr    56 => 'Setext heading: underline indented up to 3 spaces with'
117b414dba2SAndreas Gohr        . ' trailing spaces. Setext headings deliberately not'
118b414dba2SAndreas Gohr        . ' supported (see #50).',
119b414dba2SAndreas Gohr    57 => 'Setext heading vs. 4-space-indented underline (paragraph'
120b414dba2SAndreas Gohr        . ' wins). Setext headings deliberately not supported (see #50).',
121b414dba2SAndreas Gohr    58 => 'Setext heading: underline cannot contain internal spaces'
122b414dba2SAndreas Gohr        . ' (`= =` / `--- -`). Setext headings deliberately not supported'
123b414dba2SAndreas Gohr        . ' (see #50); also depends on internal-space HR support DokuWiki'
124b414dba2SAndreas Gohr        . ' lacks (see #21-23).',
125b414dba2SAndreas Gohr    59 => 'Setext heading: trailing spaces in content do not cause a'
126b414dba2SAndreas Gohr        . ' line break. Setext headings deliberately not supported (see'
127b414dba2SAndreas Gohr        . ' #50).',
128b414dba2SAndreas Gohr    60 => 'Setext heading: trailing backslash in content. Setext'
129b414dba2SAndreas Gohr        . ' headings deliberately not supported (see #50).',
130b414dba2SAndreas Gohr    61 => 'Setext heading: block-structure precedence over inline.'
131b414dba2SAndreas Gohr        . ' Setext headings deliberately not supported (see #50).',
132b414dba2SAndreas Gohr    63 => 'Setext heading: underline cannot be a lazy continuation in'
133b414dba2SAndreas Gohr        . ' a blockquote. Setext headings deliberately not supported'
134b414dba2SAndreas Gohr        . ' (see #50).',
135b414dba2SAndreas Gohr    65 => 'Setext heading: preceding paragraph becomes part of heading'
136b414dba2SAndreas Gohr        . ' content. Setext headings deliberately not supported (see #50).',
137b414dba2SAndreas Gohr    66 => 'Setext heading: no blank line required before/after. Setext'
138b414dba2SAndreas Gohr        . ' headings deliberately not supported (see #50).',
139b414dba2SAndreas Gohr    70 => 'Setext heading: 4-space-indented content forms code block,'
140b414dba2SAndreas Gohr        . ' then `---` HR. Setext headings deliberately not supported'
141b414dba2SAndreas Gohr        . ' (see #50).',
142b414dba2SAndreas Gohr    72 => 'Setext heading with backslash-escaped marker `\\> foo`.'
143b414dba2SAndreas Gohr        . ' Setext headings deliberately not supported (see #50).',
144b414dba2SAndreas Gohr    73 => 'Setext heading: blank-line-separated paragraph + heading +'
145b414dba2SAndreas Gohr        . ' paragraph. Setext headings deliberately not supported (see'
146b414dba2SAndreas Gohr        . ' #50).',
147b414dba2SAndreas Gohr    75 => 'Setext heading boundary: `* * *` should be HR (cannot count'
148b414dba2SAndreas Gohr        . ' as Setext underline). Setext headings deliberately not'
149b414dba2SAndreas Gohr        . ' supported (see #50); also depends on internal-space HR'
150b414dba2SAndreas Gohr        . ' support DokuWiki lacks (see #21-23).',
151b414dba2SAndreas Gohr    76 => 'Setext heading: backslash-escaped underline `\\---` keeps'
152b414dba2SAndreas Gohr        . ' content as paragraph. Setext headings deliberately not'
153b414dba2SAndreas Gohr        . ' supported (see #50).',
154b414dba2SAndreas Gohr
155b414dba2SAndreas Gohr    // --------------------------------------------------------------------
156*506762f4SAndreas Gohr    // Indented code blocks (§4.4) vs. paragraph continuation — the
157*506762f4SAndreas Gohr    // single-pass lexer cannot carry paragraph-open state across modes,
158*506762f4SAndreas Gohr    // so DokuWiki\'s `Preformatted` triggers on every `\n    ` and exits
159*506762f4SAndreas Gohr    // on every `\n`. Two CommonMark rules consequently cannot be
160*506762f4SAndreas Gohr    // expressed:
161*506762f4SAndreas Gohr    //
162*506762f4SAndreas Gohr    //   - The 4-space indent must NOT open a code block on a
163*506762f4SAndreas Gohr    //     paragraph-continuation line — GFM treats it as lazy paragraph
164*506762f4SAndreas Gohr    //     text. We have no `paragraph-open` flag to consult.
165*506762f4SAndreas Gohr    //   - An indented code block MAY span blank lines as long as the
166*506762f4SAndreas Gohr    //     next non-blank line is still 4-space indented. Our exit-on-any-
167*506762f4SAndreas Gohr    //     blank-line behavior splits the block.
168*506762f4SAndreas Gohr    //
169*506762f4SAndreas Gohr    // List-interior indented code (#79, #80, #193) additionally needs the
170*506762f4SAndreas Gohr    // column arithmetic that the §2.2 tabs family already documents as
171*506762f4SAndreas Gohr    // out of scope (see #4-9).
172*506762f4SAndreas Gohr    // --------------------------------------------------------------------
173*506762f4SAndreas Gohr    19 => 'thematic break preceded by paragraph: `Foo\n    ***` should be'
174*506762f4SAndreas Gohr        . ' a paragraph continuation followed by an HR — DokuWiki\'s'
175*506762f4SAndreas Gohr        . ' `Preformatted` mode triggers on the 4-space indent regardless'
176*506762f4SAndreas Gohr        . ' of paragraph-open state. Single-pass lexer cannot carry block'
177*506762f4SAndreas Gohr        . ' context across modes.',
178*506762f4SAndreas Gohr    79 => 'list item containing indented code: requires column arithmetic'
179*506762f4SAndreas Gohr        . ' for list interior plus paragraph-context-aware indent trigger'
180*506762f4SAndreas Gohr        . ' (see #4-9 for the column-arithmetic rationale).',
181*506762f4SAndreas Gohr    80 => 'list item with indented code after content: same as #79 — list'
182*506762f4SAndreas Gohr        . ' interior column arithmetic plus paragraph-context-aware indent'
183*506762f4SAndreas Gohr        . ' trigger.',
184*506762f4SAndreas Gohr    81 => 'indented code block spanning blank lines: GFM keeps the run open'
185*506762f4SAndreas Gohr        . ' as long as the next non-blank line is also 4-space indented;'
186*506762f4SAndreas Gohr        . ' DokuWiki\'s `Preformatted` exits on any `\n`. Same single-pass'
187*506762f4SAndreas Gohr        . ' lexer limit as #19.',
188*506762f4SAndreas Gohr    83 => 'indented code trigger mid-paragraph: 4-space indent on a'
189*506762f4SAndreas Gohr        . ' paragraph-continuation line should be lazy paragraph text in'
190*506762f4SAndreas Gohr        . ' GFM, not a code block. Same root cause as #19.',
191*506762f4SAndreas Gohr    85 => 'indented code trigger mid-paragraph (variant): see #83 / #19.',
192*506762f4SAndreas Gohr    87 => 'indented code block spanning blank lines (variant): see #81.',
193*506762f4SAndreas Gohr    193 => 'list item with indented code: same family as #79 / #80 — list'
194*506762f4SAndreas Gohr         . ' interior column arithmetic plus paragraph-context-aware'
195*506762f4SAndreas Gohr         . ' indent trigger.',
196*506762f4SAndreas Gohr
197*506762f4SAndreas Gohr    // --------------------------------------------------------------------
198b1c59bedSAndreas Gohr    // Fenced code blocks (GfmCode / GfmFile) — deliberate simplifications
199b1c59bedSAndreas Gohr    // versus strict GFM. All of these are consequences of lexer constraints
200b1c59bedSAndreas Gohr    // (no regex backreferences) or the deliberate column-0-only policy.
201b1c59bedSAndreas Gohr    // --------------------------------------------------------------------
202b1c59bedSAndreas Gohr    94  => 'fenced code: closing fence must be ≥ opening length — DokuWiki'
203b1c59bedSAndreas Gohr         . ' accepts any 3+ run as a closer (no regex backreferences for'
204b1c59bedSAndreas Gohr         . ' length pairing). Deliberate relaxation.',
205b1c59bedSAndreas Gohr    95  => 'fenced code (tilde variant): closing fence must be ≥ opening'
206b1c59bedSAndreas Gohr         . ' length — see example 94.',
207b1c59bedSAndreas Gohr    96  => 'fenced code: unclosed fence — DokuWiki convention requires a'
208b1c59bedSAndreas Gohr         . ' closer (matches DW <code> tag), so unclosed fences stay'
209b414dba2SAndreas Gohr         . ' literal rather than consuming to EOF. GFM\'s "close at end"'
210b414dba2SAndreas Gohr         . ' rule is really "close at any container boundary" in'
211b414dba2SAndreas Gohr         . ' CommonMark\'s two-pass block parser, which our single-pass'
212b414dba2SAndreas Gohr         . ' lexer cannot implement.',
213b1c59bedSAndreas Gohr    97  => 'fenced code: unclosed fence with intervening short run — stays'
214b1c59bedSAndreas Gohr         . ' literal, see example 96.',
215b414dba2SAndreas Gohr    98  => 'fenced code inside blockquote: GFM closes the fence at the'
216b414dba2SAndreas Gohr         . ' blockquote\'s end, but DokuWiki requires an explicit closing'
217b414dba2SAndreas Gohr         . ' fence and the single-pass lexer has no notion of container'
218b414dba2SAndreas Gohr         . ' boundaries to close at. Same root cause as example 96 —'
219b414dba2SAndreas Gohr         . ' unclosed fences stay literal.',
220b1c59bedSAndreas Gohr    101 => 'fenced code: opener indented 1 space — DokuWiki requires'
221b1c59bedSAndreas Gohr         . ' column-0 fences. Indent tolerance + per-line body dedent out'
222b1c59bedSAndreas Gohr         . ' of scope.',
223b1c59bedSAndreas Gohr    102 => 'fenced code: opener indented 2 spaces — see example 101.',
224b1c59bedSAndreas Gohr    103 => 'fenced code: opener indented 3 spaces — see example 101.',
225b1c59bedSAndreas Gohr    105 => 'fenced code: closer indented 2 spaces — column-0-only policy,'
226b1c59bedSAndreas Gohr         . ' see example 101.',
227b1c59bedSAndreas Gohr    106 => 'fenced code: indented opener with less-indented closer —'
228b1c59bedSAndreas Gohr         . ' column-0-only policy, see example 101.',
229b1c59bedSAndreas Gohr    107 => 'fenced code: 4-space-indented closer — with column-0-only'
230b1c59bedSAndreas Gohr         . ' policy there is no valid closer, so the fence stays literal'
231b1c59bedSAndreas Gohr         . ' (see example 96).',
232b1c59bedSAndreas Gohr    109 => 'fenced code: malformed closer `~~~ ~~` (space-broken run) —'
233b1c59bedSAndreas Gohr         . ' with no valid closer the fence stays literal (see example 96).',
234b1c59bedSAndreas Gohr    108 => 'fenced code: `` `` is not a valid fence; GFM falls back to an'
235b1c59bedSAndreas Gohr         . ' inline code span of length 3. Inline spans with n≥3 not'
236b1c59bedSAndreas Gohr         . ' implemented (GfmBacktickSingle/Double cover only n=1, n=2).',
237b1c59bedSAndreas Gohr    111 => 'fenced code interrupting Setext heading (`foo\n---`): Setext'
238685560ebSAndreas Gohr         . ' headings are deliberately not supported — the `---` underline'
239685560ebSAndreas Gohr         . ' collides with DokuWiki\'s horizontal rule and `===` would'
240685560ebSAndreas Gohr         . ' collide with DokuWiki heading syntax.',
241b1c59bedSAndreas Gohr    115 => 'fenced code: `` `` backtick-fence-with-backticks-in-info-string'
242b1c59bedSAndreas Gohr         . ' is invalid; GFM falls back to n=3 inline span — inline spans'
243b1c59bedSAndreas Gohr         . ' with n≥3 not implemented. See example 108.',
244b1c59bedSAndreas Gohr
245b1c59bedSAndreas Gohr    // --------------------------------------------------------------------
246b414dba2SAndreas Gohr    // HTML blocks (§4.6) — raw HTML pass-through is not supported
247b414dba2SAndreas Gohr    // --------------------------------------------------------------------
248b414dba2SAndreas Gohr    118 => 'raw HTML block (script/pre/style/textarea group): raw HTML pass-through not supported — DokuWiki escapes `<` as `&lt;`',
249b414dba2SAndreas Gohr    119 => 'raw HTML block: raw HTML pass-through not supported',
250b414dba2SAndreas Gohr    120 => 'raw HTML block: raw HTML pass-through not supported',
251b414dba2SAndreas Gohr    121 => 'raw HTML block: raw HTML pass-through not supported',
252b414dba2SAndreas Gohr    122 => 'raw HTML block (comment): raw HTML pass-through not supported',
253b414dba2SAndreas Gohr    123 => 'raw HTML block (processing instruction): raw HTML pass-through not supported',
254b414dba2SAndreas Gohr    124 => 'raw HTML block (declaration): raw HTML pass-through not supported',
255b414dba2SAndreas Gohr    125 => 'raw HTML block (CDATA): raw HTML pass-through not supported',
256b414dba2SAndreas Gohr    126 => 'raw HTML block (block-level tag group): raw HTML pass-through not supported',
257b414dba2SAndreas Gohr    127 => 'raw HTML block: raw HTML pass-through not supported',
258b414dba2SAndreas Gohr    128 => 'raw HTML block: raw HTML pass-through not supported',
259b414dba2SAndreas Gohr    129 => 'raw HTML block: raw HTML pass-through not supported',
260b414dba2SAndreas Gohr    130 => 'raw HTML block: raw HTML pass-through not supported',
261b414dba2SAndreas Gohr    131 => 'raw HTML block: raw HTML pass-through not supported',
262b414dba2SAndreas Gohr    132 => 'raw HTML block: raw HTML pass-through not supported',
263b414dba2SAndreas Gohr    133 => 'raw HTML block: raw HTML pass-through not supported',
264b414dba2SAndreas Gohr    134 => 'raw HTML block: raw HTML pass-through not supported',
265b414dba2SAndreas Gohr    135 => 'raw HTML block: raw HTML pass-through not supported',
266b414dba2SAndreas Gohr    136 => 'raw HTML block (any-tag group): raw HTML pass-through not supported',
267b414dba2SAndreas Gohr    137 => 'raw HTML block: raw HTML pass-through not supported',
268b414dba2SAndreas Gohr    138 => 'raw HTML block: raw HTML pass-through not supported',
269b414dba2SAndreas Gohr    139 => 'raw HTML block: raw HTML pass-through not supported',
270b414dba2SAndreas Gohr    140 => 'raw HTML block: raw HTML pass-through not supported',
271b414dba2SAndreas Gohr    141 => 'raw HTML block: raw HTML pass-through not supported',
272b414dba2SAndreas Gohr    142 => 'raw HTML block: raw HTML pass-through not supported',
273b414dba2SAndreas Gohr    143 => 'raw HTML block: raw HTML pass-through not supported',
274b414dba2SAndreas Gohr    144 => 'raw HTML block: raw HTML pass-through not supported',
275b414dba2SAndreas Gohr    145 => 'raw HTML block: raw HTML pass-through not supported',
276b414dba2SAndreas Gohr    146 => 'raw HTML block: raw HTML pass-through not supported',
277b414dba2SAndreas Gohr    147 => 'raw HTML block: raw HTML pass-through not supported',
278b414dba2SAndreas Gohr    148 => 'raw HTML block: raw HTML pass-through not supported',
279b414dba2SAndreas Gohr    149 => 'raw HTML block: raw HTML pass-through not supported',
280b414dba2SAndreas Gohr    150 => 'raw HTML block: raw HTML pass-through not supported',
281b414dba2SAndreas Gohr    151 => 'raw HTML block: raw HTML pass-through not supported',
282b414dba2SAndreas Gohr    152 => 'raw HTML block: raw HTML pass-through not supported',
283b414dba2SAndreas Gohr    153 => 'raw HTML block: raw HTML pass-through not supported',
284b414dba2SAndreas Gohr    154 => 'raw HTML block: raw HTML pass-through not supported',
285b414dba2SAndreas Gohr    155 => 'raw HTML block: raw HTML pass-through not supported',
286b414dba2SAndreas Gohr    156 => 'raw HTML block: raw HTML pass-through not supported',
287b414dba2SAndreas Gohr    157 => 'raw HTML block: raw HTML pass-through not supported',
288b414dba2SAndreas Gohr    158 => 'raw HTML block: raw HTML pass-through not supported',
289b414dba2SAndreas Gohr    159 => 'raw HTML block: raw HTML pass-through not supported',
290b414dba2SAndreas Gohr    160 => 'raw HTML block: raw HTML pass-through not supported',
291b414dba2SAndreas Gohr
292b414dba2SAndreas Gohr    // --------------------------------------------------------------------
293b414dba2SAndreas Gohr    // Link reference definitions (§4.7) — single-pass lexer cannot resolve
294b414dba2SAndreas Gohr    // forward references, so the `[foo]: /url` definition lines are not
295b414dba2SAndreas Gohr    // recognised and the matching `[foo]` references stay literal. Same
296b414dba2SAndreas Gohr    // rationale as the reference-link entries at #535-579.
297b414dba2SAndreas Gohr    // Examples #168, #180-182 are NOT listed: their definitions are
298b414dba2SAndreas Gohr    // invalid (empty URL / inside indented code / inside fenced code /
299b414dba2SAndreas Gohr    // attached to a paragraph), so the spec also expects literal output
300b414dba2SAndreas Gohr    // for the `[foo]` reference, and DW agrees.
301b414dba2SAndreas Gohr    // --------------------------------------------------------------------
302b414dba2SAndreas Gohr    161 => 'link reference definition: forward-reference definitions not supported (single-pass lexer)',
303b414dba2SAndreas Gohr    162 => 'link reference definition: forward-reference definitions not supported (single-pass lexer)',
304b414dba2SAndreas Gohr    163 => 'link reference definition (multi-line title): forward-reference definitions not supported (single-pass lexer)',
305b414dba2SAndreas Gohr    164 => 'link reference definition (case-insensitive label): forward-reference definitions not supported (single-pass lexer)',
306b414dba2SAndreas Gohr    165 => 'link reference definition (Unicode case folding): forward-reference definitions not supported (single-pass lexer)',
307b414dba2SAndreas Gohr    166 => 'link reference definition (whitespace-collapsed label): forward-reference definitions not supported (single-pass lexer)',
308b414dba2SAndreas Gohr    167 => 'link reference definition (no link text used): forward-reference definitions not supported (single-pass lexer)',
309b414dba2SAndreas Gohr    169 => 'link reference definition (pointy-bracket destination): forward-reference definitions not supported (single-pass lexer)',
310b414dba2SAndreas Gohr    170 => 'link reference definition (no title, blank line in between): forward-reference definitions not supported (single-pass lexer)',
311b414dba2SAndreas Gohr    171 => 'link reference definition (title only, no destination): forward-reference definitions not supported (single-pass lexer)',
312b414dba2SAndreas Gohr    172 => 'link reference definition (multiple definitions): forward-reference definitions not supported (single-pass lexer)',
313b414dba2SAndreas Gohr    173 => 'link reference definition (first wins on duplicate label): forward-reference definitions not supported (single-pass lexer)',
314b414dba2SAndreas Gohr    174 => 'link reference definition (label case-insensitive): forward-reference definitions not supported (single-pass lexer)',
315b414dba2SAndreas Gohr    175 => 'link reference definition (used as paragraph delimiter): forward-reference definitions not supported (single-pass lexer)',
316b414dba2SAndreas Gohr    176 => 'link reference definition (no body following): forward-reference definitions not supported (single-pass lexer)',
317b414dba2SAndreas Gohr    177 => 'link reference definition (label with surrounding whitespace): forward-reference definitions not supported (single-pass lexer)',
318b414dba2SAndreas Gohr    178 => 'link reference definition (indented up to 3 spaces): forward-reference definitions not supported (single-pass lexer)',
319b414dba2SAndreas Gohr    179 => 'link reference definition (multi-line definition with title): forward-reference definitions not supported (single-pass lexer)',
320b414dba2SAndreas Gohr    183 => 'link reference definition (does not interrupt paragraph): forward-reference definitions not supported (single-pass lexer)',
321b414dba2SAndreas Gohr    184 => 'link reference definition (between blockquote and paragraph): forward-reference definitions not supported (single-pass lexer)',
322b414dba2SAndreas Gohr    185 => 'link reference definition (lone definition emits nothing): forward-reference definitions not supported (single-pass lexer)',
323b414dba2SAndreas Gohr    186 => 'link reference definition (definition then HR): forward-reference definitions not supported (single-pass lexer)',
324b414dba2SAndreas Gohr    187 => 'link reference definition (multiple defs in a row): forward-reference definitions not supported (single-pass lexer)',
325b414dba2SAndreas Gohr    188 => 'link reference definition (def inside blockquote): forward-reference definitions not supported (single-pass lexer)',
326b414dba2SAndreas Gohr    329 => 'reference link with entity-decoded URL in definition: depends on'
327b414dba2SAndreas Gohr         . ' link reference definitions, which forward-reference definitions'
328b414dba2SAndreas Gohr         . ' are not supported (single-pass lexer)',
329b414dba2SAndreas Gohr
330b414dba2SAndreas Gohr    // --------------------------------------------------------------------
3318ed75a23SAndreas Gohr    // Code-span edge cases that collide with project-wide decisions
3328ed75a23SAndreas Gohr    // (no raw HTML, no GFM angle-bracket autolinks, typography on by
3338ed75a23SAndreas Gohr    // default) or with the single-pass lexer's limits.
3348ed75a23SAndreas Gohr    // --------------------------------------------------------------------
3358ed75a23SAndreas Gohr    351 => 'code span vs. emphasis: cross-positional precedence would require'
3368ed75a23SAndreas Gohr         . ' a pre-scan pass — the single-pass lexer matches leftmost-first'
3378ed75a23SAndreas Gohr         . ' and cannot reject an earlier emphasis opener because a later'
3388ed75a23SAndreas Gohr         . ' backtick span would consume its closer',
339b414dba2SAndreas Gohr    352 => 'code span vs. link `[not a `link](/foo`)`: the link opener is'
340b414dba2SAndreas Gohr         . ' leftmost but a backtick span inside its label should consume'
341b414dba2SAndreas Gohr         . ' the closing `]` and `)` — single-pass lexer matches'
342b414dba2SAndreas Gohr         . ' leftmost-first and cannot reorder spans (see #351).',
343b414dba2SAndreas Gohr    327 => 'raw HTML tag with entity in attribute: raw HTML pass-through not supported',
344b414dba2SAndreas Gohr    354 => 'raw HTML tag pass-through: raw HTML pass-through not supported',
345f9d3b7bdSAndreas Gohr    605 => 'angle-bracket autolink with `MAILTO:` scheme: Externallink'
346f9d3b7bdSAndreas Gohr         . ' builds one regex per scheme listed in `conf/scheme.conf`, and'
347f9d3b7bdSAndreas Gohr         . ' `mailto` is not in the default allow-list. The brackets fall'
348f9d3b7bdSAndreas Gohr         . ' through to default escaping and the URL is emitted as literal'
349f9d3b7bdSAndreas Gohr         . ' text — same security policy as DokuWiki\'s bare-URL detection.',
350f9d3b7bdSAndreas Gohr    606 => 'angle-bracket autolink with `a+b+c` scheme: scheme is not in'
351f9d3b7bdSAndreas Gohr         . ' DokuWiki\'s `conf/scheme.conf` allow-list (see #605).',
352f9d3b7bdSAndreas Gohr    607 => 'angle-bracket autolink with `made-up-scheme`: scheme is not in'
353f9d3b7bdSAndreas Gohr         . ' DokuWiki\'s `conf/scheme.conf` allow-list (see #605).',
354f9d3b7bdSAndreas Gohr    609 => 'angle-bracket autolink with `localhost:5001/foo`: `localhost` is'
355f9d3b7bdSAndreas Gohr         . ' not in DokuWiki\'s `conf/scheme.conf` allow-list (see #605).',
3568ed75a23SAndreas Gohr
3578ed75a23SAndreas Gohr    // --------------------------------------------------------------------
35872b2703bSAndreas Gohr    // CommonMark §6.2 flanking-delimiter analysis — deliberately not
35972b2703bSAndreas Gohr    // implemented. DokuWiki's regex lexer uses leftmost-match and cannot
36072b2703bSAndreas Gohr    // apply CommonMark's left/right-flanking rules that distinguish
36172b2703bSAndreas Gohr    // word-chars, whitespace, and punctuation for `*`/`_` delimiters, or
36272b2703bSAndreas Gohr    // the "multiple-of-3" rule for overlapping runs. These examples all
36372b2703bSAndreas Gohr    // rely on that machinery.
36472b2703bSAndreas Gohr    // --------------------------------------------------------------------
36572b2703bSAndreas Gohr
36672b2703bSAndreas Gohr    // Unicode whitespace in flanking context. Our `\s` is ASCII-only
36772b2703bSAndreas Gohr    // because the lexer doesn't set the PCRE `u` flag.
36872b2703bSAndreas Gohr    363 => 'Unicode whitespace (U+00A0) flanking — requires u-flag-aware regex',
36972b2703bSAndreas Gohr
37072b2703bSAndreas Gohr    // Punctuation-adjacent flanking for `*` / `_` / `**` / `__`
37172b2703bSAndreas Gohr    362 => 'flanking: punctuation-adjacent `*` (left-flanking vs. right-flanking)',
37272b2703bSAndreas Gohr    368 => 'flanking: punctuation-adjacent `_`',
37372b2703bSAndreas Gohr    372 => 'flanking: intraword `_` with punctuation inside',
37472b2703bSAndreas Gohr    377 => 'flanking: `*` followed by `(` requires punctuation-aware flanking',
37572b2703bSAndreas Gohr    378 => 'flanking: nested `*(*foo*)*` requires flanking + balanced-pair analysis',
37672b2703bSAndreas Gohr    382 => 'flanking: nested `_(_foo_)_` requires flanking + balanced-pair analysis',
37772b2703bSAndreas Gohr    389 => 'flanking: punctuation-adjacent `**`',
37872b2703bSAndreas Gohr    394 => 'flanking: punctuation-adjacent `__`',
37972b2703bSAndreas Gohr    401 => 'flanking: `**` followed by `(`',
38072b2703bSAndreas Gohr    404 => 'flanking: nested `*bar*` inside `**foo ... foo**` with punctuation',
38172b2703bSAndreas Gohr    407 => 'flanking: `__` followed by `(`',
38272b2703bSAndreas Gohr    470 => 'flanking: nested `*_foo_*` requires balanced-pair analysis',
38372b2703bSAndreas Gohr    472 => 'flanking: nested `_*foo*_` requires balanced-pair analysis',
38472b2703bSAndreas Gohr
38572b2703bSAndreas Gohr    // Intraword `__` strong (even multibyte) — flanking rule for `_` requires
38672b2703bSAndreas Gohr    // examining whether the delimiter run is word-boundary-flanking, which our
38772b2703bSAndreas Gohr    // simple lookbehind/lookahead approximation doesn't fully match.
38872b2703bSAndreas Gohr    395 => 'flanking: intraword `__` (`foo__bar__`) — left-flanking vs right-flanking',
38972b2703bSAndreas Gohr    396 => 'flanking: intraword `__` across digits (`5__6__78`)',
39072b2703bSAndreas Gohr    397 => 'flanking: intraword `__` with Cyrillic',
39172b2703bSAndreas Gohr    398 => 'flanking: `__foo, __bar__, baz__` — flanking + balanced pairing',
39272b2703bSAndreas Gohr    409 => 'flanking: `__foo__bar` — intraword close',
39372b2703bSAndreas Gohr    410 => 'flanking: intraword `__` with Cyrillic (leading)',
39472b2703bSAndreas Gohr    411 => 'flanking: `__foo__bar__baz__` — multiple `__` pairs with flanking',
39572b2703bSAndreas Gohr    412 => 'flanking: `__(bar)__.` — punctuation-adjacent',
39672b2703bSAndreas Gohr
39772b2703bSAndreas Gohr    // Overlapping / multiple-of-3 rule for runs
39872b2703bSAndreas Gohr    416 => 'CommonMark rule 9 (overlapping same-delimiter `_foo _bar_ baz_`)',
39972b2703bSAndreas Gohr    417 => 'CommonMark overlapping `_` / `__` with flanking',
40072b2703bSAndreas Gohr    418 => 'CommonMark overlapping `*foo *bar**` — multiple-of-3 rule',
40172b2703bSAndreas Gohr    419 => 'CommonMark nested `*foo **bar** baz*` — balanced-pair analysis',
40272b2703bSAndreas Gohr    421 => 'CommonMark overlapping `*foo**bar*` — multiple-of-3',
40372b2703bSAndreas Gohr    422 => 'CommonMark nested `***foo** bar*` — triple-delimiter analysis',
40472b2703bSAndreas Gohr    423 => 'CommonMark nested `*foo **bar***` — triple-delimiter analysis',
40572b2703bSAndreas Gohr    424 => 'CommonMark nested `*foo**bar***` — triple-delimiter analysis',
40672b2703bSAndreas Gohr    425 => 'CommonMark triple `foo***bar***baz` — triple-delimiter analysis',
40772b2703bSAndreas Gohr    426 => 'CommonMark long delimiter runs `foo******bar*********baz`',
40872b2703bSAndreas Gohr    427 => 'CommonMark deeply nested `*foo **bar *baz* bim** bop*`',
40972b2703bSAndreas Gohr    434 => 'CommonMark overlapping `__foo __bar__ baz__` — multiple-of-3',
41072b2703bSAndreas Gohr    435 => 'CommonMark `____foo__ bar__` — leading long delimiter run',
41172b2703bSAndreas Gohr    436 => 'CommonMark `**foo **bar****` — trailing long delimiter run',
41272b2703bSAndreas Gohr    439 => 'CommonMark nested `***foo* bar**` — triple-delimiter',
41372b2703bSAndreas Gohr    440 => 'CommonMark nested `**foo *bar***` — triple-delimiter',
41472b2703bSAndreas Gohr    441 => 'CommonMark deeply nested `**foo *bar **baz** bim* bop**`',
41572b2703bSAndreas Gohr
41672b2703bSAndreas Gohr    // `__foo_` / `_foo__` — mixing `_` and `__` requires flanking to decide
41772b2703bSAndreas Gohr    // which delimiter pairs open/close.
41872b2703bSAndreas Gohr    463 => 'flanking: `__foo_` — mixed `_`/`__` pairing',
41972b2703bSAndreas Gohr    464 => 'flanking: `_foo__` — mixed `_`/`__` pairing',
42072b2703bSAndreas Gohr    465 => 'flanking: `___foo__` — delimiter-run length analysis',
42172b2703bSAndreas Gohr    466 => 'flanking: `____foo_` — delimiter-run length analysis',
42272b2703bSAndreas Gohr    467 => 'flanking: `__foo___` — delimiter-run length analysis',
42372b2703bSAndreas Gohr    468 => 'flanking: `_foo____` — delimiter-run length analysis',
42472b2703bSAndreas Gohr
42572b2703bSAndreas Gohr    // Long delimiter runs require excess-drop logic (2 outer chars dropped
42672b2703bSAndreas Gohr    // from each side). Stack-based pairing needed — out of scope.
42772b2703bSAndreas Gohr    473 => 'CommonMark `****foo****` — excess-drop (4+4 → strong only)',
42872b2703bSAndreas Gohr    474 => 'CommonMark `____foo____` — excess-drop (4+4 → strong only)',
42972b2703bSAndreas Gohr    475 => 'CommonMark `******foo******` — excess-drop (6+6 → strong only)',
43072b2703bSAndreas Gohr    477 => 'CommonMark `_____foo_____` — excess-drop (5+5 → em+strong, 2 dropped each side)',
43172b2703bSAndreas Gohr
43272b2703bSAndreas Gohr    // Overlapping / crossing delimiters
43372b2703bSAndreas Gohr    478 => 'CommonMark `*foo _bar* baz_` — overlapping different delimiters',
43472b2703bSAndreas Gohr    479 => 'CommonMark `*foo __bar *baz bim__ bam*` — crossing delimiters',
43572b2703bSAndreas Gohr    480 => 'CommonMark `**foo **bar baz**` — overlapping same delimiter',
4368719732dSAndreas Gohr
437b414dba2SAndreas Gohr    // Emphasis vs. angle-bracket autolink: same root cause as #351 (the
438b414dba2SAndreas Gohr    // single-pass lexer matches leftmost-first and cannot reject an
439b414dba2SAndreas Gohr    // earlier `**`/`__` opener because a later `<URL>` autolink would
440b414dba2SAndreas Gohr    // consume its closer).
441b414dba2SAndreas Gohr    489 => 'emphasis vs. angle-bracket autolink `**a<http://...?q=**>`:'
442b414dba2SAndreas Gohr         . ' leftmost-match cannot reorder spans — see #351 for the'
443b414dba2SAndreas Gohr         . ' single-pass-lexer rationale.',
444b414dba2SAndreas Gohr    490 => 'emphasis vs. angle-bracket autolink `__a<http://...?q=__>`:'
445b414dba2SAndreas Gohr         . ' leftmost-match cannot reorder spans — see #351.',
446b414dba2SAndreas Gohr
4478719732dSAndreas Gohr    // --------------------------------------------------------------------
448e89aeebdSAndreas Gohr    // Inline link `[text](url)` — features GfmLink deliberately does not
449e89aeebdSAndreas Gohr    // implement. Either rarely-used syntax paid for with disproportionate
450e89aeebdSAndreas Gohr    // regex complexity, or single-pass-lexer limits that can't be worked
451e89aeebdSAndreas Gohr    // around inside one mode.
452e89aeebdSAndreas Gohr    // --------------------------------------------------------------------
453e89aeebdSAndreas Gohr
454e89aeebdSAndreas Gohr    // GFM link title attribute (`"title"` / `'title'` / `(title)` after
455e89aeebdSAndreas Gohr    // the URL). Parses cleanly but is discarded: DokuWiki's link handler
456e89aeebdSAndreas Gohr    // instructions have no title-attribute slot, and plumbing one through
457e89aeebdSAndreas Gohr    // every renderer is out of scope for GfmLink.
458eb15e634SAndreas Gohr    328 => 'link with entity-decoded URL and title: URL side decodes correctly,'
459eb15e634SAndreas Gohr         . ' but the title attribute is discarded — DokuWiki link instructions'
460eb15e634SAndreas Gohr         . ' have no title slot.',
461e89aeebdSAndreas Gohr    493 => 'link title attribute: GfmLink parses but discards — DokuWiki link instructions have no title slot',
462e89aeebdSAndreas Gohr    513 => 'link title attribute (three quoting styles): discarded by GfmLink',
463b37c6ef7SAndreas Gohr    514 => 'link title with HTML-entity escape `"title \\"&quot;"`: title slot not supported (see #493)',
464e89aeebdSAndreas Gohr    515 => 'link title separated by non-breaking space: title slot not supported',
465e89aeebdSAndreas Gohr    516 => 'link title with nested balanced quotes: Markdown.pl quirk, not supported',
466e89aeebdSAndreas Gohr    517 => 'link title with different quote type for inner quotes: title slot not supported',
467e89aeebdSAndreas Gohr    518 => 'multi-line link title: title slot not supported',
468e89aeebdSAndreas Gohr
469e89aeebdSAndreas Gohr    // Pointy-bracket link destinations `<...>`. Rarely used; regex cost
470e89aeebdSAndreas Gohr    // and interaction with raw-HTML detection outweigh the benefit.
471e89aeebdSAndreas Gohr    496 => 'pointy-bracket link destination `<>`: not supported',
472e89aeebdSAndreas Gohr    498 => 'pointy-bracket destination with spaces `<...>`: not supported',
473e89aeebdSAndreas Gohr    500 => 'pointy-bracket destination with newline: not supported',
474e89aeebdSAndreas Gohr    501 => 'pointy-bracket destination containing `)`: not supported',
475e89aeebdSAndreas Gohr    502 => 'pointy-bracket destination with trailing backslash: not supported',
476e89aeebdSAndreas Gohr    503 => 'malformed pointy-bracket destinations: renderer output differs',
477e89aeebdSAndreas Gohr    507 => 'pointy-bracket destination wrapping unbalanced parens: not supported',
478e89aeebdSAndreas Gohr
479e89aeebdSAndreas Gohr    // Balanced-parens inside URL destinations.
480e89aeebdSAndreas Gohr    505 => 'balanced-parens in URL destination: not supported (regex single-level)',
481e89aeebdSAndreas Gohr
482e89aeebdSAndreas Gohr    // Other URL-level edges.
483e89aeebdSAndreas Gohr    495 => 'empty URL destination `[link]()`: pattern requires non-empty URL',
484e89aeebdSAndreas Gohr    512 => 'link destination that parses as a title: edge case not supported',
485b414dba2SAndreas Gohr    337 => 'entity-decoded `&quot;` inside link URL slot: spec rejects the'
486b414dba2SAndreas Gohr         . ' link because the decoded `"` would split URL from title, but'
487b414dba2SAndreas Gohr         . ' GfmLink uses a permissive `[^)\n]+` URL slot and accepts the'
488b414dba2SAndreas Gohr         . ' whole run as the URL — strict GFM URL rejection not implemented',
489b37c6ef7SAndreas Gohr    497 => 'unquoted whitespace in URL slot `[link](/my uri)`: GfmLink truncates'
490b37c6ef7SAndreas Gohr         . ' at the first space and discards the remainder as a (would-be)'
491b37c6ef7SAndreas Gohr         . ' title; spec rejects the whole construct and emits literal text —'
492b37c6ef7SAndreas Gohr         . ' strict GFM URL rejection not implemented',
493e89aeebdSAndreas Gohr
494e89aeebdSAndreas Gohr    // Inherent single-pass-lexer limits for link text containing nested
495e89aeebdSAndreas Gohr    // structures. These cannot be resolved inside one mode.
496b37c6ef7SAndreas Gohr    520 => 'link label with literal nested brackets `[link [foo [bar]]](/uri)`:'
497b37c6ef7SAndreas Gohr         . ' GfmLink label class forbids `[`/`]`, so the outer match fails —'
498b37c6ef7SAndreas Gohr         . ' same family as #522/#526',
499e89aeebdSAndreas Gohr    522 => 'nested bracket forms inner link, outer falls back to literal',
500b37c6ef7SAndreas Gohr    523 => 'link label with backslash-escaped bracket `[link \\[bar](/uri)`:'
501b37c6ef7SAndreas Gohr         . ' GfmLink label class forbids `[` even when escaped — same family'
502b37c6ef7SAndreas Gohr         . ' as #522/#526',
503b37c6ef7SAndreas Gohr    524 => 'inline formatting inside link label `[link *foo **bar** `#`*](/uri)`:'
504b37c6ef7SAndreas Gohr         . ' GfmLink takes the label as a flat string and does not re-tokenize'
505b37c6ef7SAndreas Gohr         . ' inline spans — same family as #428/#442',
506e89aeebdSAndreas Gohr    526 => 'nested links: inner is a link, outer falls back to literal',
507e89aeebdSAndreas Gohr    527 => 'nested links inside emphasis: not supported',
508e89aeebdSAndreas Gohr    529 => 'link text grouping vs. emphasis: leftmost-match cannot override',
509e89aeebdSAndreas Gohr    530 => 'emphasis/bracket crossing: leftmost-match cannot override',
510b37c6ef7SAndreas Gohr    482 => 'emphasis/bracket crossing `*[bar*](/url)`: opener `*` precedes the'
511b37c6ef7SAndreas Gohr         . ' link, closer `*` falls inside the link label — GFM flanking'
512b37c6ef7SAndreas Gohr         . ' rejects the pair; DW takes the leftmost `*` as an emphasis'
513b37c6ef7SAndreas Gohr         . ' opener and never finds a closer (same family as #529/#530)',
514b37c6ef7SAndreas Gohr    483 => 'emphasis/bracket crossing `_foo [bar_](/url)`: closer `_` falls'
515b37c6ef7SAndreas Gohr         . ' inside link label — same family as #482/#529/#530',
516b37c6ef7SAndreas Gohr    428 => 'emphasis inside link label `*foo [*bar*](/url)*`: GfmLink takes'
517b37c6ef7SAndreas Gohr         . ' the label as a flat string (DW link instructions have no'
518b37c6ef7SAndreas Gohr         . ' re-parsed-inline label slot), so inner `*bar*` stays literal',
519b37c6ef7SAndreas Gohr    442 => 'emphasis inside link label `**foo [*bar*](/url)**`: same as #428'
520b37c6ef7SAndreas Gohr         . ' — link label is a flat string and inner `*bar*` is not'
521b37c6ef7SAndreas Gohr         . ' re-tokenized as emphasis',
522e89aeebdSAndreas Gohr    532 => 'raw HTML inside link text: project-wide "no raw HTML" limit',
523e89aeebdSAndreas Gohr    533 => 'code span inside link text: requires pre-scan pass (see #351)',
524e89aeebdSAndreas Gohr    534 => 'autolink inside link text: raw `<URL>` autolinks not supported (see #356)',
525e89aeebdSAndreas Gohr
526e89aeebdSAndreas Gohr    // Reference links (`[text][id]`, `[text][]`, `[foo]` with matching
527e89aeebdSAndreas Gohr    // `[foo]: url` definition). Not implemented: resolving forward
528e89aeebdSAndreas Gohr    // references would require a two-pass parse, but DokuWiki's lexer is
529e89aeebdSAndreas Gohr    // single-pass. Inline links `[text](url)` are the only supported
530e89aeebdSAndreas Gohr    // form.
531e89aeebdSAndreas Gohr    535 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
532e89aeebdSAndreas Gohr    536 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
533e89aeebdSAndreas Gohr    537 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
534e89aeebdSAndreas Gohr    538 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
535e89aeebdSAndreas Gohr    539 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
536e89aeebdSAndreas Gohr    540 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
537e89aeebdSAndreas Gohr    541 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
538e89aeebdSAndreas Gohr    542 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
539e89aeebdSAndreas Gohr    543 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
540e89aeebdSAndreas Gohr    544 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
541e89aeebdSAndreas Gohr    545 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
542e89aeebdSAndreas Gohr    546 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
543e89aeebdSAndreas Gohr    547 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
544e89aeebdSAndreas Gohr    548 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
545e89aeebdSAndreas Gohr    549 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
546e89aeebdSAndreas Gohr    550 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
547e89aeebdSAndreas Gohr    551 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
548e89aeebdSAndreas Gohr    552 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
549e89aeebdSAndreas Gohr    553 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
550e89aeebdSAndreas Gohr    557 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
551e89aeebdSAndreas Gohr    558 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
552e89aeebdSAndreas Gohr    560 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
553e89aeebdSAndreas Gohr    561 => 'collapsed reference link: forward-reference definitions not supported (single-pass lexer)',
554e89aeebdSAndreas Gohr    562 => 'collapsed reference link: forward-reference definitions not supported (single-pass lexer)',
555e89aeebdSAndreas Gohr    563 => 'collapsed reference link: forward-reference definitions not supported (single-pass lexer)',
556e89aeebdSAndreas Gohr    564 => 'collapsed reference link: forward-reference definitions not supported (single-pass lexer)',
557e89aeebdSAndreas Gohr    565 => 'shortcut reference link: forward-reference definitions not supported (single-pass lexer)',
558e89aeebdSAndreas Gohr    566 => 'shortcut reference link: forward-reference definitions not supported (single-pass lexer)',
559e89aeebdSAndreas Gohr    567 => 'shortcut reference link: forward-reference definitions not supported (single-pass lexer)',
560e89aeebdSAndreas Gohr    568 => 'shortcut reference link: forward-reference definitions not supported (single-pass lexer)',
561e89aeebdSAndreas Gohr    569 => 'shortcut reference link: forward-reference definitions not supported (single-pass lexer)',
562e89aeebdSAndreas Gohr    570 => 'shortcut reference link: forward-reference definitions not supported (single-pass lexer)',
563e89aeebdSAndreas Gohr    571 => 'shortcut reference link with escape: forward-reference definitions not supported (single-pass lexer)',
564e89aeebdSAndreas Gohr    572 => 'shortcut reference link with emphasis: forward-reference definitions not supported (single-pass lexer)',
565e89aeebdSAndreas Gohr    573 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
566e89aeebdSAndreas Gohr    574 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
567e89aeebdSAndreas Gohr    575 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
568e89aeebdSAndreas Gohr    576 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
569e89aeebdSAndreas Gohr    577 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
570e89aeebdSAndreas Gohr    578 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
571e89aeebdSAndreas Gohr    579 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
572e89aeebdSAndreas Gohr
573e89aeebdSAndreas Gohr    // --------------------------------------------------------------------
5743440a8c0SAndreas Gohr    // Inline image `![alt](url)`. The XHTML renderer's default media
5753440a8c0SAndreas Gohr    // rendering diverges from GFM's bare <img> (it wraps in a details <a>
5763440a8c0SAndreas Gohr    // with fetch.php/detail.php proxy URLs) — GfmSpecTest uses
5773440a8c0SAndreas Gohr    // SpecCompatRenderer to emit spec-shape bare <img>, so only the
5783440a8c0SAndreas Gohr    // parser-level or feature-level gaps remain as skips: title attribute
5793440a8c0SAndreas Gohr    // (no DW slot), reference images, pointy-bracket destinations, nested
5803440a8c0SAndreas Gohr    // brackets, and escape-dependent cases.
5813440a8c0SAndreas Gohr    // --------------------------------------------------------------------
5823440a8c0SAndreas Gohr
583b37c6ef7SAndreas Gohr    528 => 'image-as-alt with nested link `![[[foo](uri1)](uri2)](uri3)`: alt'
584b37c6ef7SAndreas Gohr         . ' class forbids brackets so the outer image match fails; the inner'
585b37c6ef7SAndreas Gohr         . ' `[foo](uri1)` matches as a regular link and the outer falls back'
586b37c6ef7SAndreas Gohr         . ' to literal — same family as #582/#583/#598',
5873440a8c0SAndreas Gohr    580 => 'image with title attribute: GfmMedia discards titles (no DW slot)',
5883440a8c0SAndreas Gohr    581 => 'reference-style image: forward-reference definitions not supported (single-pass lexer)',
5893440a8c0SAndreas Gohr    582 => 'nested image-in-image `![foo ![bar](x)](y)`: alt class forbids brackets;'
5903440a8c0SAndreas Gohr         . ' leftmost-match cannot reorder — outer falls back to literal (see #526)',
5913440a8c0SAndreas Gohr    583 => 'link-in-image alt `![foo [bar](x)](y)`: alt class forbids brackets;'
5923440a8c0SAndreas Gohr         . ' leftmost-match cannot reorder — outer falls back to literal (see #526)',
5933440a8c0SAndreas Gohr    584 => 'collapsed reference-style image: forward-reference definitions not supported',
5943440a8c0SAndreas Gohr    585 => 'full reference-style image: forward-reference definitions not supported',
5953440a8c0SAndreas Gohr    587 => 'image with title attribute: title discarded (no DW slot)',
5963440a8c0SAndreas Gohr    588 => 'pointy-bracket image destination `![alt](<url>)`: not supported (see GfmLink #496)',
5973440a8c0SAndreas Gohr    590 => 'reference-style image: forward-reference definitions not supported',
5983440a8c0SAndreas Gohr    591 => 'reference-style image (case-insensitive label): forward-reference definitions not supported',
5993440a8c0SAndreas Gohr    592 => 'collapsed reference-style image `![foo][]`: forward-reference definitions not supported',
6003440a8c0SAndreas Gohr    593 => 'collapsed reference-style image with emphasis in label: forward-reference definitions not supported',
6013440a8c0SAndreas Gohr    594 => 'collapsed reference-style image (case-insensitive): forward-reference definitions not supported',
6023440a8c0SAndreas Gohr    595 => 'reference-style image with intervening whitespace: forward-reference definitions not supported',
6033440a8c0SAndreas Gohr    596 => 'shortcut reference-style image `![foo]`: forward-reference definitions not supported',
6043440a8c0SAndreas Gohr    597 => 'shortcut reference-style image with emphasis: forward-reference definitions not supported',
6053440a8c0SAndreas Gohr    598 => 'image with unescaped nested brackets `![[foo]]`: literal-fallback behavior not supported',
6063440a8c0SAndreas Gohr    599 => 'shortcut reference-style image (case-insensitive): forward-reference definitions not supported',
607b414dba2SAndreas Gohr    600 => 'image-via-reference fallback `!\[foo]` with `[foo]: /url`: forward-reference definitions not supported (single-pass lexer)',
608b414dba2SAndreas Gohr    601 => 'image-via-reference fallback `\![foo]` with `[foo]: /url`: forward-reference definitions not supported (single-pass lexer)',
6093440a8c0SAndreas Gohr
6103440a8c0SAndreas Gohr    // --------------------------------------------------------------------
6118719732dSAndreas Gohr    // ATX heading collisions with DokuWiki-specific behavior.
6128719732dSAndreas Gohr    // --------------------------------------------------------------------
6138719732dSAndreas Gohr    38 => 'ATX heading with leading spaces: GFM tolerates 0-3 spaces of'
6148719732dSAndreas Gohr        . ' indent before the opener; we require the `#` at column 0.'
6158719732dSAndreas Gohr        . ' Indent tolerance collides with DokuWiki\'s 2-space-indent'
6168719732dSAndreas Gohr        . ' preformatted block and isn\'t worth untangling',
6178719732dSAndreas Gohr    39 => 'indented code block: DokuWiki uses 2-space indent for'
6188719732dSAndreas Gohr        . ' preformatted; GFM 4-space indented code blocks are not'
6198719732dSAndreas Gohr        . ' implemented',
6208719732dSAndreas Gohr    40 => 'indented code block: 4-space indent after a paragraph is a'
6218719732dSAndreas Gohr        . ' continuation in GFM but preformatted in DokuWiki — not'
6228719732dSAndreas Gohr        . ' implemented',
6238719732dSAndreas Gohr    41 => 'ATX heading with leading spaces: second heading is indented'
6248719732dSAndreas Gohr        . ' by 2 spaces; we require the `#` at column 0',
6258719732dSAndreas Gohr    49 => 'empty ATX heading: DokuWiki\'s XHTML renderer deliberately'
6268719732dSAndreas Gohr        . ' skips blank headings (blank() guard in Doku_Renderer_xhtml::header)',
627685560ebSAndreas Gohr
628685560ebSAndreas Gohr    // --------------------------------------------------------------------
629685560ebSAndreas Gohr    // List items / Lists — list features GfmListblock deliberately does
630685560ebSAndreas Gohr    // not implement. The simplifications are by design: indentation uses
631685560ebSAndreas Gohr    // a fixed 2-space-multiple step starting at 0, lazy continuation is
632685560ebSAndreas Gohr    // not supported, and the rewriter groups items by 'u'/'o' type only.
633685560ebSAndreas Gohr    // The buckets are:
634685560ebSAndreas Gohr    //
635685560ebSAndreas Gohr    //  A. Extra spaces after the marker. CommonMark rolls them (up to
636685560ebSAndreas Gohr    //     4) into the content column; we dedent at `marker_width + 1`,
637685560ebSAndreas Gohr    //     collapsing the extras.
638685560ebSAndreas Gohr    //  B. 1- or 3-space indent for nesting (we round down to nearest 2).
639685560ebSAndreas Gohr    //  C. Lazy continuation (column-0 paragraph wrap inside an item).
640685560ebSAndreas Gohr    //  D. Strict CommonMark loose/tight classification (every blank line
641685560ebSAndreas Gohr    //     between items / inside items reclassifies; we use a simpler
642685560ebSAndreas Gohr    //     single-paragraph-tight, multi-paragraph-loose rule).
643685560ebSAndreas Gohr    //  E. Marker-character-change splits ordered lists ('.' vs ')') or
644685560ebSAndreas Gohr    //     unordered ('-' vs '+' vs '*'). Our rewriter groups by 'u' / 'o'
645685560ebSAndreas Gohr    //     type only, not by marker character.
646685560ebSAndreas Gohr    //  F. List interrupting a paragraph without a blank line — requires a
647685560ebSAndreas Gohr    //     multi-pass block parser to revisit prior text.
648685560ebSAndreas Gohr    //
649685560ebSAndreas Gohr    // Examples that depend on a pending mode (GfmQuote, GfmEscape, …) are
650685560ebSAndreas Gohr    // intentionally NOT skipped — they remain visible failing tests until
651685560ebSAndreas Gohr    // the mode lands.
652685560ebSAndreas Gohr    // --------------------------------------------------------------------
653309a0852SAndreas Gohr    // --------------------------------------------------------------------
654309a0852SAndreas Gohr    // Block quotes — deliberate scope reductions vs. strict GFM. The
655309a0852SAndreas Gohr    // unified GfmQuote mode (replacing DW Quote) covers `>` blockquotes
656309a0852SAndreas Gohr    // for both DW and MD pages, but several CommonMark blockquote rules
657309a0852SAndreas Gohr    // are out of scope:
658309a0852SAndreas Gohr    //
659309a0852SAndreas Gohr    // - 1-3 space indent before `>` (column-0-only policy, consistent
660309a0852SAndreas Gohr    //   with GfmCode / GfmFile / GfmHeader).
661309a0852SAndreas Gohr    // - Lazy continuation (paragraph text without `>` on continuation
662309a0852SAndreas Gohr    //   lines). Same policy as GfmListblock — markers required on
663309a0852SAndreas Gohr    //   every line.
664309a0852SAndreas Gohr    // - Headers inside quotes — sub-parser excludes BASEONLY so header
665309a0852SAndreas Gohr    //   instructions don't drive TOC/section-edit anchors that don't
666309a0852SAndreas Gohr    //   compose with `<blockquote>`. Same rationale as GfmListblock's
667309a0852SAndreas Gohr    //   header exclusion inside list items.
668309a0852SAndreas Gohr    // - Setext-style block constructs (the `---` underline collides
669309a0852SAndreas Gohr    //   with DW's HR rule).
670309a0852SAndreas Gohr    //
671309a0852SAndreas Gohr    // Examples that depend on still-pending modes (GfmHr) are
672309a0852SAndreas Gohr    // intentionally NOT skipped — they stay visible until those modes
673309a0852SAndreas Gohr    // land.
674309a0852SAndreas Gohr    // --------------------------------------------------------------------
675309a0852SAndreas Gohr    206 => 'block quotes: header inside quote — sub-parser excludes'
676309a0852SAndreas Gohr         . ' BASEONLY (TOC / section-edit anchors do not compose with'
677309a0852SAndreas Gohr         . ' `<blockquote>`). Same policy as GfmListblock for `<li>`.',
678309a0852SAndreas Gohr    207 => 'block quotes: header inside quote with no space after `>` —'
679309a0852SAndreas Gohr         . ' see #206 for the BASEONLY exclusion rationale.',
680309a0852SAndreas Gohr    208 => 'block quotes: leading-space `>` (1-3 spaces of indent) —'
681309a0852SAndreas Gohr         . ' column-0-only policy, consistent with GfmCode / GfmFile.',
682309a0852SAndreas Gohr    210 => 'block quotes: lazy continuation `> # Foo\n> bar\nbaz` —'
683309a0852SAndreas Gohr         . ' every quote line must begin with `>` at column 0. Same'
684309a0852SAndreas Gohr         . ' policy as GfmListblock.',
685309a0852SAndreas Gohr    211 => 'block quotes: lazy continuation `> bar\nbaz\n> foo` —'
686309a0852SAndreas Gohr         . ' see #210.',
687309a0852SAndreas Gohr    212 => 'block quotes: Setext heading underline `---` after `> foo`'
688309a0852SAndreas Gohr         . ' — no Setext headings (the `---` collides with DW HR syntax).',
689309a0852SAndreas Gohr    215 => 'block quotes: fenced code block split across blockquote'
690309a0852SAndreas Gohr         . ' boundary — fence inside quote followed by non-`>` lines'
691309a0852SAndreas Gohr         . ' depends on the same lazy-continuation rule we do not'
692309a0852SAndreas Gohr         . ' implement (see #210).',
693309a0852SAndreas Gohr    216 => 'block quotes: lazy continuation `> foo\n    - bar` — see #210.',
694309a0852SAndreas Gohr    225 => 'block quotes: lazy continuation `> bar\nbaz` — see #210.',
695309a0852SAndreas Gohr    227 => 'block quotes: lazy continuation `> bar\n>\nbaz` — see #210.',
696309a0852SAndreas Gohr    228 => 'block quotes: lazy continuation in nested quote'
697309a0852SAndreas Gohr         . ' `> > > foo\nbar` — see #210.',
698309a0852SAndreas Gohr    229 => 'block quotes: lazy continuation across nested levels'
699309a0852SAndreas Gohr         . ' `>>> foo\n> bar\n>>baz` — see #210.',
700309a0852SAndreas Gohr
701685560ebSAndreas Gohr    232 => 'list items: marker-width content-column alignment (A)',
702685560ebSAndreas Gohr    235 => 'list items: marker-width content-column alignment (A)',
703b37c6ef7SAndreas Gohr    237 => 'list items: ordered list nested in `>>` with 3-space leading'
704b37c6ef7SAndreas Gohr         . ' indent and marker-width content column (B+A; see #208 for'
705b37c6ef7SAndreas Gohr         . ' the leading-`>` indent policy).',
706b37c6ef7SAndreas Gohr    238 => 'list items: bullet inside `>>` followed by leading-space'
707b37c6ef7SAndreas Gohr         . ' `  >  > two` continuation — column-0-only `>` policy plus'
708b37c6ef7SAndreas Gohr         . ' interior space inside the nested quote (B; see #208).',
709b37c6ef7SAndreas Gohr    241 => 'list items: marker-width content column for `1.  foo` with'
710b37c6ef7SAndreas Gohr         . ' fenced code, paragraph and blockquote at content column 4'
711b37c6ef7SAndreas Gohr         . ' (A; sub-blocks would also need to open at non-zero column).',
712b37c6ef7SAndreas Gohr    242 => 'list items: marker-width content column + indented code must'
713b37c6ef7SAndreas Gohr         . ' span multiple internal blank lines (A; the multi-blank'
714b37c6ef7SAndreas Gohr         . ' indented-code rule is a separate gap).',
715685560ebSAndreas Gohr    249 => 'list items: marker-width-driven content-column alignment for `10. foo` (A)',
716685560ebSAndreas Gohr    254 => 'list items: marker-width content-column alignment edge case (A)',
717b37c6ef7SAndreas Gohr    257 => 'list items: empty bullet line then content on the next line —'
718b37c6ef7SAndreas Gohr         . ' content column derived from next non-blank line\'s indent'
719b37c6ef7SAndreas Gohr         . ' (A sub-case).',
720685560ebSAndreas Gohr    258 => 'list items: marker-width content-column for `1.  foo` (A)',
721685560ebSAndreas Gohr    263 => 'list items: indent ambiguity at column 0/1/2 (B)',
722685560ebSAndreas Gohr    264 => 'list items: 1-space-indent variation (B)',
723685560ebSAndreas Gohr    265 => 'list items: marker-width with multi-line continuation (A)',
724685560ebSAndreas Gohr    266 => 'list items: marker-width with multi-line continuation (A)',
725685560ebSAndreas Gohr    267 => 'list items: lazy continuation (C)',
726685560ebSAndreas Gohr    268 => 'list items: lazy continuation (C)',
727685560ebSAndreas Gohr    270 => 'list items: lazy continuation across blank line (C+D)',
728b37c6ef7SAndreas Gohr    271 => 'list items: lazy continuation in nested quote-list-quote'
729b37c6ef7SAndreas Gohr         . ' (`> 1. > Blockquote` then `> continued here.`) (C; see #210).',
730685560ebSAndreas Gohr    273 => 'list items: list interrupting a paragraph without blank line (F)',
731b37c6ef7SAndreas Gohr    376 => 'lone `*` on the line after `*foo bar` is taken as an empty list'
732b37c6ef7SAndreas Gohr         . ' marker by GfmListblock, breaking the paragraph; GFM keeps the'
733b37c6ef7SAndreas Gohr         . ' whole input as one paragraph because the trailing `*` does not'
734b37c6ef7SAndreas Gohr         . ' pair as emphasis. List-interrupts-paragraph (F), same family'
735b37c6ef7SAndreas Gohr         . ' as #273 / #284.',
736685560ebSAndreas Gohr    275 => 'list items: 3-space indent rounds to 2 — sub-list under previous item (B)',
737685560ebSAndreas Gohr    276 => 'list items: marker-width content-column with mixed types (A+E)',
738685560ebSAndreas Gohr    277 => 'list items: nested markers on a single line (A)',
739685560ebSAndreas Gohr    278 => 'list items: marker-character switch splits the list (E)',
740685560ebSAndreas Gohr    281 => 'lists: marker-character change splits unordered list `-` -> `+` (E)',
741685560ebSAndreas Gohr    282 => 'lists: ordered delimiter switch splits list `.` -> `)` (E)',
742685560ebSAndreas Gohr    284 => 'lists: list interrupting paragraph without blank line (F)',
743685560ebSAndreas Gohr    286 => 'lists: marker-width content-column alignment for ordered list (A)',
744685560ebSAndreas Gohr    287 => 'lists: triple blank line + indented continuation in deeply nested item (D)',
745685560ebSAndreas Gohr    288 => 'lists: marker-character change at deeper level (E)',
746685560ebSAndreas Gohr    289 => 'lists: marker-character change with type switch (E)',
747685560ebSAndreas Gohr    290 => 'lists: 1-space-indent variations of items, all stay top-level (B)',
748685560ebSAndreas Gohr    291 => 'lists: 1-space-indent variations on ordered list (B)',
749685560ebSAndreas Gohr    292 => 'lists: marker-character change splits inside nested list (E)',
750685560ebSAndreas Gohr    293 => 'lists: marker-character change with mixed indent (E+B)',
751685560ebSAndreas Gohr    294 => 'lists: lazy continuation across types (C+E)',
752685560ebSAndreas Gohr    295 => 'lists: lazy continuation in nested list (C)',
753685560ebSAndreas Gohr    296 => 'lists: lazy continuation across blank line (C+D)',
754685560ebSAndreas Gohr    297 => 'lists: blank-line classification for loose/tight in nested list (D)',
755685560ebSAndreas Gohr    298 => 'lists: blank-line classification (D)',
756685560ebSAndreas Gohr    300 => 'lists: blank-line classification with marker change (D+E)',
757685560ebSAndreas Gohr    301 => 'lists: blank-line classification + marker-width alignment (D+A)',
758685560ebSAndreas Gohr    304 => 'lists: blank line between sub-list items affects loose/tight (D)',
759685560ebSAndreas Gohr    305 => 'lists: blank line between deeply nested items (D)',
760685560ebSAndreas Gohr    306 => 'lists: blank line at the end of a loose list affects classification (D)',
76174031e46SAndreas Gohr
76274031e46SAndreas Gohr    // --------------------------------------------------------------------
76374031e46SAndreas Gohr    // Backslash-escape examples (§6.1) that fail for reasons unrelated to
76474031e46SAndreas Gohr    // GfmEscape itself: renderer divergences, typography conversion, and
76574031e46SAndreas Gohr    // already-skipped GFM features (autolinks, raw HTML, reference links,
76674031e46SAndreas Gohr    // discarded link titles). The escape mechanic itself works.
76774031e46SAndreas Gohr    // --------------------------------------------------------------------
76874031e46SAndreas Gohr    316 => 'backslash escapes inside angle-bracket autolinks: GFM autolink'
76974031e46SAndreas Gohr         . ' `<URL>` form not implemented (see example 356)',
77074031e46SAndreas Gohr    317 => 'backslash escapes inside raw HTML: raw HTML pass-through is not'
77174031e46SAndreas Gohr         . ' supported by default (see example 354)',
77274031e46SAndreas Gohr    318 => 'backslash escapes in link title: title attribute is discarded — DW'
773309a0852SAndreas Gohr         . ' link instructions have no title slot',
77474031e46SAndreas Gohr    319 => 'backslash escapes in reference-link definition: link reference'
77574031e46SAndreas Gohr         . ' definitions not supported (single-pass lexer cannot resolve'
77674031e46SAndreas Gohr         . ' forward references)',
777c4bcbc2eSAndreas Gohr
778c4bcbc2eSAndreas Gohr    // --------------------------------------------------------------------
779b414dba2SAndreas Gohr    // Raw HTML (§6.6) — inline raw HTML pass-through. Same project-wide
780b414dba2SAndreas Gohr    // decision as HTML blocks (#118-160): DokuWiki escapes `<` as `&lt;`
781b414dba2SAndreas Gohr    // by default; the `<html>` block is the opt-in. Examples #637 and
782b414dba2SAndreas Gohr    // #640 are intentionally NOT listed — the spec there expects literal
783b414dba2SAndreas Gohr    // `&lt;...&gt;` escaping for malformed tags, which DW also produces,
784b414dba2SAndreas Gohr    // so they pass naturally.
785b414dba2SAndreas Gohr    // --------------------------------------------------------------------
786b414dba2SAndreas Gohr    632 => 'raw HTML inline (open tag): raw HTML pass-through not supported',
787b414dba2SAndreas Gohr    633 => 'raw HTML inline (closing tag): raw HTML pass-through not supported',
788b414dba2SAndreas Gohr    634 => 'raw HTML inline (multi-line attributes): raw HTML pass-through not supported',
789b414dba2SAndreas Gohr    635 => 'raw HTML inline (line breaks in attributes): raw HTML pass-through not supported',
790b414dba2SAndreas Gohr    636 => 'raw HTML inline (custom tags / attribute syntax): raw HTML pass-through not supported',
791b414dba2SAndreas Gohr    638 => 'raw HTML inline (illegal attribute names): raw HTML pass-through not supported',
792b414dba2SAndreas Gohr    639 => 'raw HTML inline (illegal attribute values): raw HTML pass-through not supported',
793b414dba2SAndreas Gohr    641 => 'raw HTML inline (open and closing tags): raw HTML pass-through not supported',
794b414dba2SAndreas Gohr    642 => 'raw HTML inline (HTML comment): raw HTML pass-through not supported',
795b414dba2SAndreas Gohr    643 => 'raw HTML inline (invalid comment): raw HTML pass-through not supported',
796b414dba2SAndreas Gohr    644 => 'raw HTML inline (processing instruction): raw HTML pass-through not supported',
797b414dba2SAndreas Gohr    645 => 'raw HTML inline (declaration): raw HTML pass-through not supported',
798b414dba2SAndreas Gohr    646 => 'raw HTML inline (declaration single-letter name): raw HTML pass-through not supported',
799b414dba2SAndreas Gohr    647 => 'raw HTML inline (declaration EMPTY): raw HTML pass-through not supported',
800b414dba2SAndreas Gohr    648 => 'raw HTML inline (CDATA section): raw HTML pass-through not supported',
801b414dba2SAndreas Gohr    649 => 'raw HTML inline (entity reference inside attribute): raw HTML pass-through not supported',
802b414dba2SAndreas Gohr    650 => 'raw HTML inline (backslash escape inside attribute): raw HTML pass-through not supported',
803b414dba2SAndreas Gohr    651 => 'raw HTML inline (entity-escaped quote inside attribute): raw HTML pass-through not supported',
804*506762f4SAndreas Gohr    652 => 'Disallowed Raw HTML (extension) is a filter on top of raw HTML'
805*506762f4SAndreas Gohr         . ' pass-through; DokuWiki escapes raw HTML by policy (see #118-160),'
806*506762f4SAndreas Gohr         . ' so the filter has no input to operate on.',
807b37c6ef7SAndreas Gohr    484 => 'raw HTML inline `<img …/>` adjacent to `*`: raw HTML pass-through not supported',
808b37c6ef7SAndreas Gohr    485 => 'raw HTML inline `<a href="**">` adjacent to `**`: raw HTML pass-through not supported',
809b37c6ef7SAndreas Gohr    486 => 'raw HTML inline `<a href="__">` adjacent to `__`: raw HTML pass-through not supported',
810b414dba2SAndreas Gohr
811b414dba2SAndreas Gohr    // --------------------------------------------------------------------
812c4bcbc2eSAndreas Gohr    // Hard line breaks (GfmLinebreak) — both delimiter forms (two trailing
813c4bcbc2eSAndreas Gohr    // spaces and `\` before newline) work in paragraphs, emphasis, and
814c4bcbc2eSAndreas Gohr    // other inline containers. The skipped cases sit inside raw HTML tags,
815c4bcbc2eSAndreas Gohr    // which DokuWiki does not pass through by default.
816c4bcbc2eSAndreas Gohr    // --------------------------------------------------------------------
817b414dba2SAndreas Gohr    662 => 'hard line break inside a raw HTML tag: raw HTML pass-through not supported',
818c4bcbc2eSAndreas Gohr    663 => 'hard line break (backslash form) inside a raw HTML tag — see'
819c4bcbc2eSAndreas Gohr         . ' #662. Raw HTML out of scope.',
82072b2703bSAndreas Gohr];
821