1<?php 2 3/** 4 * GFM spec examples that GfmSpecTest should skip, keyed by example number 5 * (as numbered in spec.txt / the rendered spec). 6 * 7 * Add entries here ONLY for behavior DokuWiki has explicitly decided not to 8 * implement — not for features that are merely pending. Unimplemented 9 * features should show as real failures so they remain visible TODOs on 10 * the branch. 11 * 12 * Each value is a short human-readable reason that will appear in phpunit's 13 * skip output. 14 */ 15 16return [ 17 // -------------------------------------------------------------------- 18 // Tabs (§2.2) — DokuWiki's tab handling is binary: a leading tab 19 // (matching `\n\t` directly after the newline) is the indented-code 20 // trigger; otherwise tabs are ordinary characters. CommonMark 21 // instead advances each tab to the next 4-column stop and uses the 22 // resulting column count to drive list-continuation, list-nesting, 23 // blockquote-interior, and 4-column indented-code decisions. The 24 // column arithmetic is what's missing. 25 // 26 // Examples #1, #3, #8, #10 are not listed: they happen to render 27 // correctly because a leading tab matches `\n\t`, four leading 28 // spaces match the `md`-mode 4-space code trigger, and GfmHeader 29 // accepts a tab as the post-`#` separator. 30 // -------------------------------------------------------------------- 31 2 => 'tab indented-code: 2 spaces then tab. The 4-space trigger needs' 32 . ' 4 spaces; the `\n\t` trigger needs the tab directly after the' 33 . ' newline. Neither fires. CommonMark counts the tab as advancing' 34 . ' to column 4 → code block; DokuWiki does no such arithmetic.', 35 4 => 'tab as 4-column lazy-continuation indent inside a list item.' 36 . ' DokuWiki treats a leading tab as the indented-code trigger,' 37 . ' not as list continuation. Resolving requires column arithmetic' 38 . ' against the list\'s content column.', 39 5 => 'two tabs (8 columns) inside a list item → code block inside list.' 40 . ' Requires column arithmetic to subtract the list\'s content' 41 . ' column from the indent and route the residue into a nested' 42 . ' code block.', 43 6 => 'tabs after blockquote marker → indented code inside blockquote.' 44 . ' Requires column arithmetic for the blockquote interior;' 45 . ' DokuWiki treats the tab as a top-level code trigger instead.', 46 7 => 'tabs after list marker → indented code inside list item.' 47 . ' Requires column arithmetic for the list interior; DokuWiki' 48 . ' treats the tab as a top-level code trigger instead.', 49 9 => 'tab as 4-column indent for list nesting. DokuWiki treats a' 50 . ' leading tab as the indented-code trigger, never as list' 51 . ' nesting indent.', 52 11 => '`*\t*\t*\t` thematic break with tab separators. Strict-bare-run' 53 . ' HR policy rejects internal whitespace (same family as #21-23);' 54 . ' the tab form is the same case.', 55 56 // -------------------------------------------------------------------- 57 // Thematic breaks (GfmHr) — strict-only HR is intentional. The 58 // delimiter run must be bare: no leading, trailing, or internal 59 // whitespace in either DW or GFM flavor. The list-precedence cases 60 // additionally need a GfmListblock guard that is out of scope. 61 // -------------------------------------------------------------------- 62 17 => 'thematic break: 0-3 spaces of leading indent. Strict policy:' 63 . ' opener must be at column 0 in either flavor.', 64 21 => 'thematic break: spaces between delimiter chars (`- - -`).' 65 . ' Strict policy: bare run only.', 66 22 => 'thematic break: spaces between delimiter chars (`** * **`).' 67 . ' Strict policy: bare run only.', 68 23 => 'thematic break: spaces between delimiter chars (`- -`).' 69 . ' Strict policy: bare run only.', 70 24 => 'thematic break: trailing spaces after the run. Strict policy:' 71 . ' bare run only.', 72 29 => 'thematic break: Setext heading underline `Foo\n---` should' 73 . ' render as `<h2>`. Setext headings are deliberately not' 74 . ' supported — `---` collides with DokuWiki HR and `===` would' 75 . ' collide with DokuWiki heading syntax.', 76 30 => 'thematic break vs. list-item precedence (`* * *` between list' 77 . ' items): requires internal-space HR support and a GfmListblock' 78 . ' guard so the list refuses to absorb the HR-shaped line. Both' 79 . ' out of scope; the line stays a list-item body.', 80 31 => 'thematic break inside list with different bullet (`- * * *`):' 81 . ' depends on internal-space HR support inside the sub-parsed' 82 . ' item body. See example 30.', 83 84 // -------------------------------------------------------------------- 85 // Setext headings (§4.3) — deliberately not supported across the 86 // whole section. The `---` underline collides with DokuWiki\'s HR 87 // syntax and `===` would collide with DokuWiki\'s heading delimiter. 88 // Same rationale as #29 (thematic break vs. Setext underline), 89 // #111 (fence after Setext), and #212 (Setext after blockquote). 90 // 91 // Examples #62, #64, #67, #68, #69, #71, #74 are NOT listed: those 92 // are cases where Setext is deliberately NOT triggered (blockquote / 93 // list / paragraph wins, or blank lines disambiguate), so the spec 94 // output matches DokuWiki\'s no-Setext rendering and they pass 95 // naturally. 96 // 97 // #58 and #75 also depend on DokuWiki\'s strict-bare-run HR rule 98 // (`--- -` and `* * *` need internal-space HR, see #21-23) — they 99 // sit in the Setext section because the spec uses them to 100 // illustrate Setext-underline edge cases. 101 // -------------------------------------------------------------------- 102 50 => 'Setext heading (`Foo *bar*\n=====` / `\n-----`): Setext' 103 . ' headings deliberately not supported — `---`/`===` underlines' 104 . ' collide with DokuWiki HR / heading syntax.', 105 51 => 'Setext heading with multi-line content: Setext headings' 106 . ' deliberately not supported (see #50).', 107 52 => 'Setext heading with indented multi-line content: Setext' 108 . ' headings deliberately not supported (see #50).', 109 53 => 'Setext heading with any-length underline: Setext headings' 110 . ' deliberately not supported (see #50).', 111 54 => 'Setext heading with 3-space-indented content / underline:' 112 . ' Setext headings deliberately not supported (see #50).', 113 55 => 'Setext heading: 4-space-indented content forms code block,' 114 . ' then `---` HR. Setext headings deliberately not supported' 115 . ' (see #50).', 116 56 => 'Setext heading: underline indented up to 3 spaces with' 117 . ' trailing spaces. Setext headings deliberately not' 118 . ' supported (see #50).', 119 57 => 'Setext heading vs. 4-space-indented underline (paragraph' 120 . ' wins). Setext headings deliberately not supported (see #50).', 121 58 => 'Setext heading: underline cannot contain internal spaces' 122 . ' (`= =` / `--- -`). Setext headings deliberately not supported' 123 . ' (see #50); also depends on internal-space HR support DokuWiki' 124 . ' lacks (see #21-23).', 125 59 => 'Setext heading: trailing spaces in content do not cause a' 126 . ' line break. Setext headings deliberately not supported (see' 127 . ' #50).', 128 60 => 'Setext heading: trailing backslash in content. Setext' 129 . ' headings deliberately not supported (see #50).', 130 61 => 'Setext heading: block-structure precedence over inline.' 131 . ' Setext headings deliberately not supported (see #50).', 132 63 => 'Setext heading: underline cannot be a lazy continuation in' 133 . ' a blockquote. Setext headings deliberately not supported' 134 . ' (see #50).', 135 65 => 'Setext heading: preceding paragraph becomes part of heading' 136 . ' content. Setext headings deliberately not supported (see #50).', 137 66 => 'Setext heading: no blank line required before/after. Setext' 138 . ' headings deliberately not supported (see #50).', 139 70 => 'Setext heading: 4-space-indented content forms code block,' 140 . ' then `---` HR. Setext headings deliberately not supported' 141 . ' (see #50).', 142 72 => 'Setext heading with backslash-escaped marker `\\> foo`.' 143 . ' Setext headings deliberately not supported (see #50).', 144 73 => 'Setext heading: blank-line-separated paragraph + heading +' 145 . ' paragraph. Setext headings deliberately not supported (see' 146 . ' #50).', 147 75 => 'Setext heading boundary: `* * *` should be HR (cannot count' 148 . ' as Setext underline). Setext headings deliberately not' 149 . ' supported (see #50); also depends on internal-space HR' 150 . ' support DokuWiki lacks (see #21-23).', 151 76 => 'Setext heading: backslash-escaped underline `\\---` keeps' 152 . ' content as paragraph. Setext headings deliberately not' 153 . ' supported (see #50).', 154 155 // -------------------------------------------------------------------- 156 // Indented code blocks (§4.4) vs. paragraph continuation — the 157 // single-pass lexer cannot carry paragraph-open state across modes, 158 // so DokuWiki\'s `Preformatted` triggers on every `\n ` and exits 159 // on every `\n`. Two CommonMark rules consequently cannot be 160 // expressed: 161 // 162 // - The 4-space indent must NOT open a code block on a 163 // paragraph-continuation line — GFM treats it as lazy paragraph 164 // text. We have no `paragraph-open` flag to consult. 165 // - An indented code block MAY span blank lines as long as the 166 // next non-blank line is still 4-space indented. Our exit-on-any- 167 // blank-line behavior splits the block. 168 // 169 // List-interior indented code (#79, #80, #193) additionally needs the 170 // column arithmetic that the §2.2 tabs family already documents as 171 // out of scope (see #4-9). 172 // -------------------------------------------------------------------- 173 19 => 'thematic break preceded by paragraph: `Foo\n ***` should be' 174 . ' a paragraph continuation followed by an HR — DokuWiki\'s' 175 . ' `Preformatted` mode triggers on the 4-space indent regardless' 176 . ' of paragraph-open state. Single-pass lexer cannot carry block' 177 . ' context across modes.', 178 79 => 'list item containing indented code: requires column arithmetic' 179 . ' for list interior plus paragraph-context-aware indent trigger' 180 . ' (see #4-9 for the column-arithmetic rationale).', 181 80 => 'list item with indented code after content: same as #79 — list' 182 . ' interior column arithmetic plus paragraph-context-aware indent' 183 . ' trigger.', 184 81 => 'indented code block spanning blank lines: GFM keeps the run open' 185 . ' as long as the next non-blank line is also 4-space indented;' 186 . ' DokuWiki\'s `Preformatted` exits on any `\n`. Same single-pass' 187 . ' lexer limit as #19.', 188 83 => 'indented code trigger mid-paragraph: 4-space indent on a' 189 . ' paragraph-continuation line should be lazy paragraph text in' 190 . ' GFM, not a code block. Same root cause as #19.', 191 85 => 'indented code trigger mid-paragraph (variant): see #83 / #19.', 192 87 => 'indented code block spanning blank lines (variant): see #81.', 193 193 => 'list item with indented code: same family as #79 / #80 — list' 194 . ' interior column arithmetic plus paragraph-context-aware' 195 . ' indent trigger.', 196 197 // -------------------------------------------------------------------- 198 // Fenced code blocks (GfmCode / GfmFile) — deliberate simplifications 199 // versus strict GFM. All of these are consequences of lexer constraints 200 // (no regex backreferences) or the deliberate column-0-only policy. 201 // -------------------------------------------------------------------- 202 94 => 'fenced code: closing fence must be ≥ opening length — DokuWiki' 203 . ' accepts any 3+ run as a closer (no regex backreferences for' 204 . ' length pairing). Deliberate relaxation.', 205 95 => 'fenced code (tilde variant): closing fence must be ≥ opening' 206 . ' length — see example 94.', 207 96 => 'fenced code: unclosed fence — DokuWiki convention requires a' 208 . ' closer (matches DW <code> tag), so unclosed fences stay' 209 . ' literal rather than consuming to EOF. GFM\'s "close at end"' 210 . ' rule is really "close at any container boundary" in' 211 . ' CommonMark\'s two-pass block parser, which our single-pass' 212 . ' lexer cannot implement.', 213 97 => 'fenced code: unclosed fence with intervening short run — stays' 214 . ' literal, see example 96.', 215 98 => 'fenced code inside blockquote: GFM closes the fence at the' 216 . ' blockquote\'s end, but DokuWiki requires an explicit closing' 217 . ' fence and the single-pass lexer has no notion of container' 218 . ' boundaries to close at. Same root cause as example 96 —' 219 . ' unclosed fences stay literal.', 220 101 => 'fenced code: opener indented 1 space — DokuWiki requires' 221 . ' column-0 fences. Indent tolerance + per-line body dedent out' 222 . ' of scope.', 223 102 => 'fenced code: opener indented 2 spaces — see example 101.', 224 103 => 'fenced code: opener indented 3 spaces — see example 101.', 225 105 => 'fenced code: closer indented 2 spaces — column-0-only policy,' 226 . ' see example 101.', 227 106 => 'fenced code: indented opener with less-indented closer —' 228 . ' column-0-only policy, see example 101.', 229 107 => 'fenced code: 4-space-indented closer — with column-0-only' 230 . ' policy there is no valid closer, so the fence stays literal' 231 . ' (see example 96).', 232 109 => 'fenced code: malformed closer `~~~ ~~` (space-broken run) —' 233 . ' with no valid closer the fence stays literal (see example 96).', 234 108 => 'fenced code: `` `` is not a valid fence; GFM falls back to an' 235 . ' inline code span of length 3. Inline spans with n≥3 not' 236 . ' implemented (GfmBacktickSingle/Double cover only n=1, n=2).', 237 111 => 'fenced code interrupting Setext heading (`foo\n---`): Setext' 238 . ' headings are deliberately not supported — the `---` underline' 239 . ' collides with DokuWiki\'s horizontal rule and `===` would' 240 . ' collide with DokuWiki heading syntax.', 241 115 => 'fenced code: `` `` backtick-fence-with-backticks-in-info-string' 242 . ' is invalid; GFM falls back to n=3 inline span — inline spans' 243 . ' with n≥3 not implemented. See example 108.', 244 245 // -------------------------------------------------------------------- 246 // HTML blocks (§4.6) — raw HTML pass-through is not supported 247 // -------------------------------------------------------------------- 248 118 => 'raw HTML block (script/pre/style/textarea group): raw HTML pass-through not supported — DokuWiki escapes `<` as `<`', 249 119 => 'raw HTML block: raw HTML pass-through not supported', 250 120 => 'raw HTML block: raw HTML pass-through not supported', 251 121 => 'raw HTML block: raw HTML pass-through not supported', 252 122 => 'raw HTML block (comment): raw HTML pass-through not supported', 253 123 => 'raw HTML block (processing instruction): raw HTML pass-through not supported', 254 124 => 'raw HTML block (declaration): raw HTML pass-through not supported', 255 125 => 'raw HTML block (CDATA): raw HTML pass-through not supported', 256 126 => 'raw HTML block (block-level tag group): raw HTML pass-through not supported', 257 127 => 'raw HTML block: raw HTML pass-through not supported', 258 128 => 'raw HTML block: raw HTML pass-through not supported', 259 129 => 'raw HTML block: raw HTML pass-through not supported', 260 130 => 'raw HTML block: raw HTML pass-through not supported', 261 131 => 'raw HTML block: raw HTML pass-through not supported', 262 132 => 'raw HTML block: raw HTML pass-through not supported', 263 133 => 'raw HTML block: raw HTML pass-through not supported', 264 134 => 'raw HTML block: raw HTML pass-through not supported', 265 135 => 'raw HTML block: raw HTML pass-through not supported', 266 136 => 'raw HTML block (any-tag group): raw HTML pass-through not supported', 267 137 => 'raw HTML block: raw HTML pass-through not supported', 268 138 => 'raw HTML block: raw HTML pass-through not supported', 269 139 => 'raw HTML block: raw HTML pass-through not supported', 270 140 => 'raw HTML block: raw HTML pass-through not supported', 271 141 => 'raw HTML block: raw HTML pass-through not supported', 272 142 => 'raw HTML block: raw HTML pass-through not supported', 273 143 => 'raw HTML block: raw HTML pass-through not supported', 274 144 => 'raw HTML block: raw HTML pass-through not supported', 275 145 => 'raw HTML block: raw HTML pass-through not supported', 276 146 => 'raw HTML block: raw HTML pass-through not supported', 277 147 => 'raw HTML block: raw HTML pass-through not supported', 278 148 => 'raw HTML block: raw HTML pass-through not supported', 279 149 => 'raw HTML block: raw HTML pass-through not supported', 280 150 => 'raw HTML block: raw HTML pass-through not supported', 281 151 => 'raw HTML block: raw HTML pass-through not supported', 282 152 => 'raw HTML block: raw HTML pass-through not supported', 283 153 => 'raw HTML block: raw HTML pass-through not supported', 284 154 => 'raw HTML block: raw HTML pass-through not supported', 285 155 => 'raw HTML block: raw HTML pass-through not supported', 286 156 => 'raw HTML block: raw HTML pass-through not supported', 287 157 => 'raw HTML block: raw HTML pass-through not supported', 288 158 => 'raw HTML block: raw HTML pass-through not supported', 289 159 => 'raw HTML block: raw HTML pass-through not supported', 290 160 => 'raw HTML block: raw HTML pass-through not supported', 291 292 // -------------------------------------------------------------------- 293 // Link reference definitions (§4.7) — single-pass lexer cannot resolve 294 // forward references, so the `[foo]: /url` definition lines are not 295 // recognised and the matching `[foo]` references stay literal. Same 296 // rationale as the reference-link entries at #535-579. 297 // Examples #168, #180-182 are NOT listed: their definitions are 298 // invalid (empty URL / inside indented code / inside fenced code / 299 // attached to a paragraph), so the spec also expects literal output 300 // for the `[foo]` reference, and DW agrees. 301 // -------------------------------------------------------------------- 302 161 => 'link reference definition: forward-reference definitions not supported (single-pass lexer)', 303 162 => 'link reference definition: forward-reference definitions not supported (single-pass lexer)', 304 163 => 'link reference definition (multi-line title): forward-reference definitions not supported (single-pass lexer)', 305 164 => 'link reference definition (case-insensitive label): forward-reference definitions not supported (single-pass lexer)', 306 165 => 'link reference definition (Unicode case folding): forward-reference definitions not supported (single-pass lexer)', 307 166 => 'link reference definition (whitespace-collapsed label): forward-reference definitions not supported (single-pass lexer)', 308 167 => 'link reference definition (no link text used): forward-reference definitions not supported (single-pass lexer)', 309 169 => 'link reference definition (pointy-bracket destination): forward-reference definitions not supported (single-pass lexer)', 310 170 => 'link reference definition (no title, blank line in between): forward-reference definitions not supported (single-pass lexer)', 311 171 => 'link reference definition (title only, no destination): forward-reference definitions not supported (single-pass lexer)', 312 172 => 'link reference definition (multiple definitions): forward-reference definitions not supported (single-pass lexer)', 313 173 => 'link reference definition (first wins on duplicate label): forward-reference definitions not supported (single-pass lexer)', 314 174 => 'link reference definition (label case-insensitive): forward-reference definitions not supported (single-pass lexer)', 315 175 => 'link reference definition (used as paragraph delimiter): forward-reference definitions not supported (single-pass lexer)', 316 176 => 'link reference definition (no body following): forward-reference definitions not supported (single-pass lexer)', 317 177 => 'link reference definition (label with surrounding whitespace): forward-reference definitions not supported (single-pass lexer)', 318 178 => 'link reference definition (indented up to 3 spaces): forward-reference definitions not supported (single-pass lexer)', 319 179 => 'link reference definition (multi-line definition with title): forward-reference definitions not supported (single-pass lexer)', 320 183 => 'link reference definition (does not interrupt paragraph): forward-reference definitions not supported (single-pass lexer)', 321 184 => 'link reference definition (between blockquote and paragraph): forward-reference definitions not supported (single-pass lexer)', 322 185 => 'link reference definition (lone definition emits nothing): forward-reference definitions not supported (single-pass lexer)', 323 186 => 'link reference definition (definition then HR): forward-reference definitions not supported (single-pass lexer)', 324 187 => 'link reference definition (multiple defs in a row): forward-reference definitions not supported (single-pass lexer)', 325 188 => 'link reference definition (def inside blockquote): forward-reference definitions not supported (single-pass lexer)', 326 329 => 'reference link with entity-decoded URL in definition: depends on' 327 . ' link reference definitions, which forward-reference definitions' 328 . ' are not supported (single-pass lexer)', 329 330 // -------------------------------------------------------------------- 331 // Code-span edge cases that collide with project-wide decisions 332 // (no raw HTML, no GFM angle-bracket autolinks, typography on by 333 // default) or with the single-pass lexer's limits. 334 // -------------------------------------------------------------------- 335 351 => 'code span vs. emphasis: cross-positional precedence would require' 336 . ' a pre-scan pass — the single-pass lexer matches leftmost-first' 337 . ' and cannot reject an earlier emphasis opener because a later' 338 . ' backtick span would consume its closer', 339 352 => 'code span vs. link `[not a `link](/foo`)`: the link opener is' 340 . ' leftmost but a backtick span inside its label should consume' 341 . ' the closing `]` and `)` — single-pass lexer matches' 342 . ' leftmost-first and cannot reorder spans (see #351).', 343 327 => 'raw HTML tag with entity in attribute: raw HTML pass-through not supported', 344 354 => 'raw HTML tag pass-through: raw HTML pass-through not supported', 345 605 => 'angle-bracket autolink with `MAILTO:` scheme: Externallink' 346 . ' builds one regex per scheme listed in `conf/scheme.conf`, and' 347 . ' `mailto` is not in the default allow-list. The brackets fall' 348 . ' through to default escaping and the URL is emitted as literal' 349 . ' text — same security policy as DokuWiki\'s bare-URL detection.', 350 606 => 'angle-bracket autolink with `a+b+c` scheme: scheme is not in' 351 . ' DokuWiki\'s `conf/scheme.conf` allow-list (see #605).', 352 607 => 'angle-bracket autolink with `made-up-scheme`: scheme is not in' 353 . ' DokuWiki\'s `conf/scheme.conf` allow-list (see #605).', 354 609 => 'angle-bracket autolink with `localhost:5001/foo`: `localhost` is' 355 . ' not in DokuWiki\'s `conf/scheme.conf` allow-list (see #605).', 356 357 // -------------------------------------------------------------------- 358 // CommonMark §6.2 flanking-delimiter analysis — deliberately not 359 // implemented. DokuWiki's regex lexer uses leftmost-match and cannot 360 // apply CommonMark's left/right-flanking rules that distinguish 361 // word-chars, whitespace, and punctuation for `*`/`_` delimiters, or 362 // the "multiple-of-3" rule for overlapping runs. These examples all 363 // rely on that machinery. 364 // -------------------------------------------------------------------- 365 366 // Unicode whitespace in flanking context. Our `\s` is ASCII-only 367 // because the lexer doesn't set the PCRE `u` flag. 368 363 => 'Unicode whitespace (U+00A0) flanking — requires u-flag-aware regex', 369 370 // Punctuation-adjacent flanking for `*` / `_` / `**` / `__` 371 362 => 'flanking: punctuation-adjacent `*` (left-flanking vs. right-flanking)', 372 368 => 'flanking: punctuation-adjacent `_`', 373 372 => 'flanking: intraword `_` with punctuation inside', 374 377 => 'flanking: `*` followed by `(` requires punctuation-aware flanking', 375 378 => 'flanking: nested `*(*foo*)*` requires flanking + balanced-pair analysis', 376 382 => 'flanking: nested `_(_foo_)_` requires flanking + balanced-pair analysis', 377 389 => 'flanking: punctuation-adjacent `**`', 378 394 => 'flanking: punctuation-adjacent `__`', 379 401 => 'flanking: `**` followed by `(`', 380 404 => 'flanking: nested `*bar*` inside `**foo ... foo**` with punctuation', 381 407 => 'flanking: `__` followed by `(`', 382 470 => 'flanking: nested `*_foo_*` requires balanced-pair analysis', 383 472 => 'flanking: nested `_*foo*_` requires balanced-pair analysis', 384 385 // Intraword `__` strong (even multibyte) — flanking rule for `_` requires 386 // examining whether the delimiter run is word-boundary-flanking, which our 387 // simple lookbehind/lookahead approximation doesn't fully match. 388 395 => 'flanking: intraword `__` (`foo__bar__`) — left-flanking vs right-flanking', 389 396 => 'flanking: intraword `__` across digits (`5__6__78`)', 390 397 => 'flanking: intraword `__` with Cyrillic', 391 398 => 'flanking: `__foo, __bar__, baz__` — flanking + balanced pairing', 392 409 => 'flanking: `__foo__bar` — intraword close', 393 410 => 'flanking: intraword `__` with Cyrillic (leading)', 394 411 => 'flanking: `__foo__bar__baz__` — multiple `__` pairs with flanking', 395 412 => 'flanking: `__(bar)__.` — punctuation-adjacent', 396 397 // Overlapping / multiple-of-3 rule for runs 398 416 => 'CommonMark rule 9 (overlapping same-delimiter `_foo _bar_ baz_`)', 399 417 => 'CommonMark overlapping `_` / `__` with flanking', 400 418 => 'CommonMark overlapping `*foo *bar**` — multiple-of-3 rule', 401 419 => 'CommonMark nested `*foo **bar** baz*` — balanced-pair analysis', 402 421 => 'CommonMark overlapping `*foo**bar*` — multiple-of-3', 403 422 => 'CommonMark nested `***foo** bar*` — triple-delimiter analysis', 404 423 => 'CommonMark nested `*foo **bar***` — triple-delimiter analysis', 405 424 => 'CommonMark nested `*foo**bar***` — triple-delimiter analysis', 406 425 => 'CommonMark triple `foo***bar***baz` — triple-delimiter analysis', 407 426 => 'CommonMark long delimiter runs `foo******bar*********baz`', 408 427 => 'CommonMark deeply nested `*foo **bar *baz* bim** bop*`', 409 434 => 'CommonMark overlapping `__foo __bar__ baz__` — multiple-of-3', 410 435 => 'CommonMark `____foo__ bar__` — leading long delimiter run', 411 436 => 'CommonMark `**foo **bar****` — trailing long delimiter run', 412 439 => 'CommonMark nested `***foo* bar**` — triple-delimiter', 413 440 => 'CommonMark nested `**foo *bar***` — triple-delimiter', 414 441 => 'CommonMark deeply nested `**foo *bar **baz** bim* bop**`', 415 416 // `__foo_` / `_foo__` — mixing `_` and `__` requires flanking to decide 417 // which delimiter pairs open/close. 418 463 => 'flanking: `__foo_` — mixed `_`/`__` pairing', 419 464 => 'flanking: `_foo__` — mixed `_`/`__` pairing', 420 465 => 'flanking: `___foo__` — delimiter-run length analysis', 421 466 => 'flanking: `____foo_` — delimiter-run length analysis', 422 467 => 'flanking: `__foo___` — delimiter-run length analysis', 423 468 => 'flanking: `_foo____` — delimiter-run length analysis', 424 425 // Long delimiter runs require excess-drop logic (2 outer chars dropped 426 // from each side). Stack-based pairing needed — out of scope. 427 473 => 'CommonMark `****foo****` — excess-drop (4+4 → strong only)', 428 474 => 'CommonMark `____foo____` — excess-drop (4+4 → strong only)', 429 475 => 'CommonMark `******foo******` — excess-drop (6+6 → strong only)', 430 477 => 'CommonMark `_____foo_____` — excess-drop (5+5 → em+strong, 2 dropped each side)', 431 432 // Overlapping / crossing delimiters 433 478 => 'CommonMark `*foo _bar* baz_` — overlapping different delimiters', 434 479 => 'CommonMark `*foo __bar *baz bim__ bam*` — crossing delimiters', 435 480 => 'CommonMark `**foo **bar baz**` — overlapping same delimiter', 436 437 // Emphasis vs. angle-bracket autolink: same root cause as #351 (the 438 // single-pass lexer matches leftmost-first and cannot reject an 439 // earlier `**`/`__` opener because a later `<URL>` autolink would 440 // consume its closer). 441 489 => 'emphasis vs. angle-bracket autolink `**a<http://...?q=**>`:' 442 . ' leftmost-match cannot reorder spans — see #351 for the' 443 . ' single-pass-lexer rationale.', 444 490 => 'emphasis vs. angle-bracket autolink `__a<http://...?q=__>`:' 445 . ' leftmost-match cannot reorder spans — see #351.', 446 447 // -------------------------------------------------------------------- 448 // Inline link `[text](url)` — features GfmLink deliberately does not 449 // implement. Either rarely-used syntax paid for with disproportionate 450 // regex complexity, or single-pass-lexer limits that can't be worked 451 // around inside one mode. 452 // -------------------------------------------------------------------- 453 454 // GFM link title attribute (`"title"` / `'title'` / `(title)` after 455 // the URL). Parses cleanly but is discarded: DokuWiki's link handler 456 // instructions have no title-attribute slot, and plumbing one through 457 // every renderer is out of scope for GfmLink. 458 328 => 'link with entity-decoded URL and title: URL side decodes correctly,' 459 . ' but the title attribute is discarded — DokuWiki link instructions' 460 . ' have no title slot.', 461 493 => 'link title attribute: GfmLink parses but discards — DokuWiki link instructions have no title slot', 462 513 => 'link title attribute (three quoting styles): discarded by GfmLink', 463 514 => 'link title with HTML-entity escape `"title \\"""`: title slot not supported (see #493)', 464 515 => 'link title separated by non-breaking space: title slot not supported', 465 516 => 'link title with nested balanced quotes: Markdown.pl quirk, not supported', 466 517 => 'link title with different quote type for inner quotes: title slot not supported', 467 518 => 'multi-line link title: title slot not supported', 468 469 // Pointy-bracket link destinations `<...>`. Rarely used; regex cost 470 // and interaction with raw-HTML detection outweigh the benefit. 471 496 => 'pointy-bracket link destination `<>`: not supported', 472 498 => 'pointy-bracket destination with spaces `<...>`: not supported', 473 500 => 'pointy-bracket destination with newline: not supported', 474 501 => 'pointy-bracket destination containing `)`: not supported', 475 502 => 'pointy-bracket destination with trailing backslash: not supported', 476 503 => 'malformed pointy-bracket destinations: renderer output differs', 477 507 => 'pointy-bracket destination wrapping unbalanced parens: not supported', 478 479 // Balanced-parens inside URL destinations. 480 505 => 'balanced-parens in URL destination: not supported (regex single-level)', 481 482 // Other URL-level edges. 483 495 => 'empty URL destination `[link]()`: pattern requires non-empty URL', 484 512 => 'link destination that parses as a title: edge case not supported', 485 337 => 'entity-decoded `"` inside link URL slot: spec rejects the' 486 . ' link because the decoded `"` would split URL from title, but' 487 . ' GfmLink uses a permissive `[^)\n]+` URL slot and accepts the' 488 . ' whole run as the URL — strict GFM URL rejection not implemented', 489 497 => 'unquoted whitespace in URL slot `[link](/my uri)`: GfmLink truncates' 490 . ' at the first space and discards the remainder as a (would-be)' 491 . ' title; spec rejects the whole construct and emits literal text —' 492 . ' strict GFM URL rejection not implemented', 493 494 // Inherent single-pass-lexer limits for link text containing nested 495 // structures. These cannot be resolved inside one mode. 496 520 => 'link label with literal nested brackets `[link [foo [bar]]](/uri)`:' 497 . ' GfmLink label class forbids `[`/`]`, so the outer match fails —' 498 . ' same family as #522/#526', 499 522 => 'nested bracket forms inner link, outer falls back to literal', 500 523 => 'link label with backslash-escaped bracket `[link \\[bar](/uri)`:' 501 . ' GfmLink label class forbids `[` even when escaped — same family' 502 . ' as #522/#526', 503 524 => 'inline formatting inside link label `[link *foo **bar** `#`*](/uri)`:' 504 . ' GfmLink takes the label as a flat string and does not re-tokenize' 505 . ' inline spans — same family as #428/#442', 506 526 => 'nested links: inner is a link, outer falls back to literal', 507 527 => 'nested links inside emphasis: not supported', 508 529 => 'link text grouping vs. emphasis: leftmost-match cannot override', 509 530 => 'emphasis/bracket crossing: leftmost-match cannot override', 510 482 => 'emphasis/bracket crossing `*[bar*](/url)`: opener `*` precedes the' 511 . ' link, closer `*` falls inside the link label — GFM flanking' 512 . ' rejects the pair; DW takes the leftmost `*` as an emphasis' 513 . ' opener and never finds a closer (same family as #529/#530)', 514 483 => 'emphasis/bracket crossing `_foo [bar_](/url)`: closer `_` falls' 515 . ' inside link label — same family as #482/#529/#530', 516 428 => 'emphasis inside link label `*foo [*bar*](/url)*`: GfmLink takes' 517 . ' the label as a flat string (DW link instructions have no' 518 . ' re-parsed-inline label slot), so inner `*bar*` stays literal', 519 442 => 'emphasis inside link label `**foo [*bar*](/url)**`: same as #428' 520 . ' — link label is a flat string and inner `*bar*` is not' 521 . ' re-tokenized as emphasis', 522 532 => 'raw HTML inside link text: project-wide "no raw HTML" limit', 523 533 => 'code span inside link text: requires pre-scan pass (see #351)', 524 534 => 'autolink inside link text: raw `<URL>` autolinks not supported (see #356)', 525 526 // Reference links (`[text][id]`, `[text][]`, `[foo]` with matching 527 // `[foo]: url` definition). Not implemented: resolving forward 528 // references would require a two-pass parse, but DokuWiki's lexer is 529 // single-pass. Inline links `[text](url)` are the only supported 530 // form. 531 535 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 532 536 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 533 537 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 534 538 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 535 539 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 536 540 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 537 541 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 538 542 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 539 543 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 540 544 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 541 545 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 542 546 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 543 547 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 544 548 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 545 549 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 546 550 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 547 551 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 548 552 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 549 553 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 550 557 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 551 558 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 552 560 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 553 561 => 'collapsed reference link: forward-reference definitions not supported (single-pass lexer)', 554 562 => 'collapsed reference link: forward-reference definitions not supported (single-pass lexer)', 555 563 => 'collapsed reference link: forward-reference definitions not supported (single-pass lexer)', 556 564 => 'collapsed reference link: forward-reference definitions not supported (single-pass lexer)', 557 565 => 'shortcut reference link: forward-reference definitions not supported (single-pass lexer)', 558 566 => 'shortcut reference link: forward-reference definitions not supported (single-pass lexer)', 559 567 => 'shortcut reference link: forward-reference definitions not supported (single-pass lexer)', 560 568 => 'shortcut reference link: forward-reference definitions not supported (single-pass lexer)', 561 569 => 'shortcut reference link: forward-reference definitions not supported (single-pass lexer)', 562 570 => 'shortcut reference link: forward-reference definitions not supported (single-pass lexer)', 563 571 => 'shortcut reference link with escape: forward-reference definitions not supported (single-pass lexer)', 564 572 => 'shortcut reference link with emphasis: forward-reference definitions not supported (single-pass lexer)', 565 573 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 566 574 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 567 575 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 568 576 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 569 577 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 570 578 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 571 579 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 572 573 // -------------------------------------------------------------------- 574 // Inline image ``. The XHTML renderer's default media 575 // rendering diverges from GFM's bare <img> (it wraps in a details <a> 576 // with fetch.php/detail.php proxy URLs) — GfmSpecTest uses 577 // SpecCompatRenderer to emit spec-shape bare <img>, so only the 578 // parser-level or feature-level gaps remain as skips: title attribute 579 // (no DW slot), reference images, pointy-bracket destinations, nested 580 // brackets, and escape-dependent cases. 581 // -------------------------------------------------------------------- 582 583 528 => 'image-as-alt with nested link `](uri2)](uri3)`: alt' 584 . ' class forbids brackets so the outer image match fails; the inner' 585 . ' `[foo](uri1)` matches as a regular link and the outer falls back' 586 . ' to literal — same family as #582/#583/#598', 587 580 => 'image with title attribute: GfmMedia discards titles (no DW slot)', 588 581 => 'reference-style image: forward-reference definitions not supported (single-pass lexer)', 589 582 => 'nested image-in-image `](y)`: alt class forbids brackets;' 590 . ' leftmost-match cannot reorder — outer falls back to literal (see #526)', 591 583 => 'link-in-image alt `](y)`: alt class forbids brackets;' 592 . ' leftmost-match cannot reorder — outer falls back to literal (see #526)', 593 584 => 'collapsed reference-style image: forward-reference definitions not supported', 594 585 => 'full reference-style image: forward-reference definitions not supported', 595 587 => 'image with title attribute: title discarded (no DW slot)', 596 588 => 'pointy-bracket image destination ``: not supported (see GfmLink #496)', 597 590 => 'reference-style image: forward-reference definitions not supported', 598 591 => 'reference-style image (case-insensitive label): forward-reference definitions not supported', 599 592 => 'collapsed reference-style image `![foo][]`: forward-reference definitions not supported', 600 593 => 'collapsed reference-style image with emphasis in label: forward-reference definitions not supported', 601 594 => 'collapsed reference-style image (case-insensitive): forward-reference definitions not supported', 602 595 => 'reference-style image with intervening whitespace: forward-reference definitions not supported', 603 596 => 'shortcut reference-style image `![foo]`: forward-reference definitions not supported', 604 597 => 'shortcut reference-style image with emphasis: forward-reference definitions not supported', 605 598 => 'image with unescaped nested brackets `![[foo]]`: literal-fallback behavior not supported', 606 599 => 'shortcut reference-style image (case-insensitive): forward-reference definitions not supported', 607 600 => 'image-via-reference fallback `!\[foo]` with `[foo]: /url`: forward-reference definitions not supported (single-pass lexer)', 608 601 => 'image-via-reference fallback `\![foo]` with `[foo]: /url`: forward-reference definitions not supported (single-pass lexer)', 609 610 // -------------------------------------------------------------------- 611 // ATX heading collisions with DokuWiki-specific behavior. 612 // -------------------------------------------------------------------- 613 38 => 'ATX heading with leading spaces: GFM tolerates 0-3 spaces of' 614 . ' indent before the opener; we require the `#` at column 0.' 615 . ' Indent tolerance collides with DokuWiki\'s 2-space-indent' 616 . ' preformatted block and isn\'t worth untangling', 617 39 => 'indented code block: DokuWiki uses 2-space indent for' 618 . ' preformatted; GFM 4-space indented code blocks are not' 619 . ' implemented', 620 40 => 'indented code block: 4-space indent after a paragraph is a' 621 . ' continuation in GFM but preformatted in DokuWiki — not' 622 . ' implemented', 623 41 => 'ATX heading with leading spaces: second heading is indented' 624 . ' by 2 spaces; we require the `#` at column 0', 625 49 => 'empty ATX heading: DokuWiki\'s XHTML renderer deliberately' 626 . ' skips blank headings (blank() guard in Doku_Renderer_xhtml::header)', 627 628 // -------------------------------------------------------------------- 629 // List items / Lists — list features GfmListblock deliberately does 630 // not implement. The simplifications are by design: indentation uses 631 // a fixed 2-space-multiple step starting at 0, lazy continuation is 632 // not supported, and the rewriter groups items by 'u'/'o' type only. 633 // The buckets are: 634 // 635 // A. Extra spaces after the marker. CommonMark rolls them (up to 636 // 4) into the content column; we dedent at `marker_width + 1`, 637 // collapsing the extras. 638 // B. 1- or 3-space indent for nesting (we round down to nearest 2). 639 // C. Lazy continuation (column-0 paragraph wrap inside an item). 640 // D. Strict CommonMark loose/tight classification (every blank line 641 // between items / inside items reclassifies; we use a simpler 642 // single-paragraph-tight, multi-paragraph-loose rule). 643 // E. Marker-character-change splits ordered lists ('.' vs ')') or 644 // unordered ('-' vs '+' vs '*'). Our rewriter groups by 'u' / 'o' 645 // type only, not by marker character. 646 // F. List interrupting a paragraph without a blank line — requires a 647 // multi-pass block parser to revisit prior text. 648 // 649 // Examples that depend on a pending mode (GfmQuote, GfmEscape, …) are 650 // intentionally NOT skipped — they remain visible failing tests until 651 // the mode lands. 652 // -------------------------------------------------------------------- 653 // -------------------------------------------------------------------- 654 // Block quotes — deliberate scope reductions vs. strict GFM. The 655 // unified GfmQuote mode (replacing DW Quote) covers `>` blockquotes 656 // for both DW and MD pages, but several CommonMark blockquote rules 657 // are out of scope: 658 // 659 // - 1-3 space indent before `>` (column-0-only policy, consistent 660 // with GfmCode / GfmFile / GfmHeader). 661 // - Lazy continuation (paragraph text without `>` on continuation 662 // lines). Same policy as GfmListblock — markers required on 663 // every line. 664 // - Headers inside quotes — sub-parser excludes BASEONLY so header 665 // instructions don't drive TOC/section-edit anchors that don't 666 // compose with `<blockquote>`. Same rationale as GfmListblock's 667 // header exclusion inside list items. 668 // - Setext-style block constructs (the `---` underline collides 669 // with DW's HR rule). 670 // 671 // Examples that depend on still-pending modes (GfmHr) are 672 // intentionally NOT skipped — they stay visible until those modes 673 // land. 674 // -------------------------------------------------------------------- 675 206 => 'block quotes: header inside quote — sub-parser excludes' 676 . ' BASEONLY (TOC / section-edit anchors do not compose with' 677 . ' `<blockquote>`). Same policy as GfmListblock for `<li>`.', 678 207 => 'block quotes: header inside quote with no space after `>` —' 679 . ' see #206 for the BASEONLY exclusion rationale.', 680 208 => 'block quotes: leading-space `>` (1-3 spaces of indent) —' 681 . ' column-0-only policy, consistent with GfmCode / GfmFile.', 682 210 => 'block quotes: lazy continuation `> # Foo\n> bar\nbaz` —' 683 . ' every quote line must begin with `>` at column 0. Same' 684 . ' policy as GfmListblock.', 685 211 => 'block quotes: lazy continuation `> bar\nbaz\n> foo` —' 686 . ' see #210.', 687 212 => 'block quotes: Setext heading underline `---` after `> foo`' 688 . ' — no Setext headings (the `---` collides with DW HR syntax).', 689 215 => 'block quotes: fenced code block split across blockquote' 690 . ' boundary — fence inside quote followed by non-`>` lines' 691 . ' depends on the same lazy-continuation rule we do not' 692 . ' implement (see #210).', 693 216 => 'block quotes: lazy continuation `> foo\n - bar` — see #210.', 694 225 => 'block quotes: lazy continuation `> bar\nbaz` — see #210.', 695 227 => 'block quotes: lazy continuation `> bar\n>\nbaz` — see #210.', 696 228 => 'block quotes: lazy continuation in nested quote' 697 . ' `> > > foo\nbar` — see #210.', 698 229 => 'block quotes: lazy continuation across nested levels' 699 . ' `>>> foo\n> bar\n>>baz` — see #210.', 700 701 232 => 'list items: marker-width content-column alignment (A)', 702 235 => 'list items: marker-width content-column alignment (A)', 703 237 => 'list items: ordered list nested in `>>` with 3-space leading' 704 . ' indent and marker-width content column (B+A; see #208 for' 705 . ' the leading-`>` indent policy).', 706 238 => 'list items: bullet inside `>>` followed by leading-space' 707 . ' ` > > two` continuation — column-0-only `>` policy plus' 708 . ' interior space inside the nested quote (B; see #208).', 709 241 => 'list items: marker-width content column for `1. foo` with' 710 . ' fenced code, paragraph and blockquote at content column 4' 711 . ' (A; sub-blocks would also need to open at non-zero column).', 712 242 => 'list items: marker-width content column + indented code must' 713 . ' span multiple internal blank lines (A; the multi-blank' 714 . ' indented-code rule is a separate gap).', 715 249 => 'list items: marker-width-driven content-column alignment for `10. foo` (A)', 716 254 => 'list items: marker-width content-column alignment edge case (A)', 717 257 => 'list items: empty bullet line then content on the next line —' 718 . ' content column derived from next non-blank line\'s indent' 719 . ' (A sub-case).', 720 258 => 'list items: marker-width content-column for `1. foo` (A)', 721 263 => 'list items: indent ambiguity at column 0/1/2 (B)', 722 264 => 'list items: 1-space-indent variation (B)', 723 265 => 'list items: marker-width with multi-line continuation (A)', 724 266 => 'list items: marker-width with multi-line continuation (A)', 725 267 => 'list items: lazy continuation (C)', 726 268 => 'list items: lazy continuation (C)', 727 270 => 'list items: lazy continuation across blank line (C+D)', 728 271 => 'list items: lazy continuation in nested quote-list-quote' 729 . ' (`> 1. > Blockquote` then `> continued here.`) (C; see #210).', 730 273 => 'list items: list interrupting a paragraph without blank line (F)', 731 376 => 'lone `*` on the line after `*foo bar` is taken as an empty list' 732 . ' marker by GfmListblock, breaking the paragraph; GFM keeps the' 733 . ' whole input as one paragraph because the trailing `*` does not' 734 . ' pair as emphasis. List-interrupts-paragraph (F), same family' 735 . ' as #273 / #284.', 736 275 => 'list items: 3-space indent rounds to 2 — sub-list under previous item (B)', 737 276 => 'list items: marker-width content-column with mixed types (A+E)', 738 277 => 'list items: nested markers on a single line (A)', 739 278 => 'list items: marker-character switch splits the list (E)', 740 279 => 'task list items (extension): `- [ ] foo` checkbox markers are not' 741 . ' implemented — the literal `[ ]` / `[x]` stays as the first content' 742 . ' of the list item.', 743 280 => 'task list items (extension): nested checkbox markers are not' 744 . ' implemented — see #279.', 745 281 => 'lists: marker-character change splits unordered list `-` -> `+` (E)', 746 282 => 'lists: ordered delimiter switch splits list `.` -> `)` (E)', 747 284 => 'lists: list interrupting paragraph without blank line (F)', 748 286 => 'lists: marker-width content-column alignment for ordered list (A)', 749 287 => 'lists: triple blank line + indented continuation in deeply nested item (D)', 750 288 => 'lists: marker-character change at deeper level (E)', 751 289 => 'lists: marker-character change with type switch (E)', 752 290 => 'lists: 1-space-indent variations of items, all stay top-level (B)', 753 291 => 'lists: 1-space-indent variations on ordered list (B)', 754 292 => 'lists: marker-character change splits inside nested list (E)', 755 293 => 'lists: marker-character change with mixed indent (E+B)', 756 294 => 'lists: lazy continuation across types (C+E)', 757 295 => 'lists: lazy continuation in nested list (C)', 758 296 => 'lists: lazy continuation across blank line (C+D)', 759 297 => 'lists: blank-line classification for loose/tight in nested list (D)', 760 298 => 'lists: blank-line classification (D)', 761 300 => 'lists: blank-line classification with marker change (D+E)', 762 301 => 'lists: blank-line classification + marker-width alignment (D+A)', 763 304 => 'lists: blank line between sub-list items affects loose/tight (D)', 764 305 => 'lists: blank line between deeply nested items (D)', 765 306 => 'lists: blank line at the end of a loose list affects classification (D)', 766 767 // -------------------------------------------------------------------- 768 // Backslash-escape examples (§6.1) that fail for reasons unrelated to 769 // GfmEscape itself: renderer divergences, typography conversion, and 770 // already-skipped GFM features (autolinks, raw HTML, reference links, 771 // discarded link titles). The escape mechanic itself works. 772 // -------------------------------------------------------------------- 773 316 => 'backslash escapes inside angle-bracket autolinks: GFM autolink' 774 . ' `<URL>` form not implemented (see example 356)', 775 317 => 'backslash escapes inside raw HTML: raw HTML pass-through is not' 776 . ' supported by default (see example 354)', 777 318 => 'backslash escapes in link title: title attribute is discarded — DW' 778 . ' link instructions have no title slot', 779 319 => 'backslash escapes in reference-link definition: link reference' 780 . ' definitions not supported (single-pass lexer cannot resolve' 781 . ' forward references)', 782 783 // -------------------------------------------------------------------- 784 // Raw HTML (§6.6) — inline raw HTML pass-through. Same project-wide 785 // decision as HTML blocks (#118-160): DokuWiki escapes `<` as `<` 786 // by default; the `<html>` block is the opt-in. Examples #637 and 787 // #640 are intentionally NOT listed — the spec there expects literal 788 // `<...>` escaping for malformed tags, which DW also produces, 789 // so they pass naturally. 790 // -------------------------------------------------------------------- 791 632 => 'raw HTML inline (open tag): raw HTML pass-through not supported', 792 633 => 'raw HTML inline (closing tag): raw HTML pass-through not supported', 793 634 => 'raw HTML inline (multi-line attributes): raw HTML pass-through not supported', 794 635 => 'raw HTML inline (line breaks in attributes): raw HTML pass-through not supported', 795 636 => 'raw HTML inline (custom tags / attribute syntax): raw HTML pass-through not supported', 796 638 => 'raw HTML inline (illegal attribute names): raw HTML pass-through not supported', 797 639 => 'raw HTML inline (illegal attribute values): raw HTML pass-through not supported', 798 641 => 'raw HTML inline (open and closing tags): raw HTML pass-through not supported', 799 642 => 'raw HTML inline (HTML comment): raw HTML pass-through not supported', 800 643 => 'raw HTML inline (invalid comment): raw HTML pass-through not supported', 801 644 => 'raw HTML inline (processing instruction): raw HTML pass-through not supported', 802 645 => 'raw HTML inline (declaration): raw HTML pass-through not supported', 803 646 => 'raw HTML inline (declaration single-letter name): raw HTML pass-through not supported', 804 647 => 'raw HTML inline (declaration EMPTY): raw HTML pass-through not supported', 805 648 => 'raw HTML inline (CDATA section): raw HTML pass-through not supported', 806 649 => 'raw HTML inline (entity reference inside attribute): raw HTML pass-through not supported', 807 650 => 'raw HTML inline (backslash escape inside attribute): raw HTML pass-through not supported', 808 651 => 'raw HTML inline (entity-escaped quote inside attribute): raw HTML pass-through not supported', 809 652 => 'Disallowed Raw HTML (extension) is a filter on top of raw HTML' 810 . ' pass-through; DokuWiki escapes raw HTML by policy (see #118-160),' 811 . ' so the filter has no input to operate on.', 812 484 => 'raw HTML inline `<img …/>` adjacent to `*`: raw HTML pass-through not supported', 813 485 => 'raw HTML inline `<a href="**">` adjacent to `**`: raw HTML pass-through not supported', 814 486 => 'raw HTML inline `<a href="__">` adjacent to `__`: raw HTML pass-through not supported', 815 816 // -------------------------------------------------------------------- 817 // Hard line breaks (GfmLinebreak) — both delimiter forms (two trailing 818 // spaces and `\` before newline) work in paragraphs, emphasis, and 819 // other inline containers. The skipped cases sit inside raw HTML tags, 820 // which DokuWiki does not pass through by default. 821 // -------------------------------------------------------------------- 822 662 => 'hard line break inside a raw HTML tag: raw HTML pass-through not supported', 823 663 => 'hard line break (backslash form) inside a raw HTML tag — see' 824 . ' #662. Raw HTML out of scope.', 825]; 826