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 // -------------------------------------------------------------------- 18b1c59bedSAndreas Gohr // Fenced code blocks (GfmCode / GfmFile) — deliberate simplifications 19b1c59bedSAndreas Gohr // versus strict GFM. All of these are consequences of lexer constraints 20b1c59bedSAndreas Gohr // (no regex backreferences) or the deliberate column-0-only policy. 21b1c59bedSAndreas Gohr // -------------------------------------------------------------------- 22b1c59bedSAndreas Gohr 94 => 'fenced code: closing fence must be ≥ opening length — DokuWiki' 23b1c59bedSAndreas Gohr . ' accepts any 3+ run as a closer (no regex backreferences for' 24b1c59bedSAndreas Gohr . ' length pairing). Deliberate relaxation.', 25b1c59bedSAndreas Gohr 95 => 'fenced code (tilde variant): closing fence must be ≥ opening' 26b1c59bedSAndreas Gohr . ' length — see example 94.', 27b1c59bedSAndreas Gohr 96 => 'fenced code: unclosed fence — DokuWiki convention requires a' 28b1c59bedSAndreas Gohr . ' closer (matches DW <code> tag), so unclosed fences stay' 29b1c59bedSAndreas Gohr . ' literal rather than consuming to EOF. GFM spec rule depends' 30b1c59bedSAndreas Gohr . ' on CommonMark\'s two-pass block parser, which our single-pass' 31b1c59bedSAndreas Gohr . ' lexer cannot implement fully anyway (see example 98).', 32b1c59bedSAndreas Gohr 97 => 'fenced code: unclosed fence with intervening short run — stays' 33b1c59bedSAndreas Gohr . ' literal, see example 96.', 34b1c59bedSAndreas Gohr 101 => 'fenced code: opener indented 1 space — DokuWiki requires' 35b1c59bedSAndreas Gohr . ' column-0 fences. Indent tolerance + per-line body dedent out' 36b1c59bedSAndreas Gohr . ' of scope.', 37b1c59bedSAndreas Gohr 102 => 'fenced code: opener indented 2 spaces — see example 101.', 38b1c59bedSAndreas Gohr 103 => 'fenced code: opener indented 3 spaces — see example 101.', 39b1c59bedSAndreas Gohr 105 => 'fenced code: closer indented 2 spaces — column-0-only policy,' 40b1c59bedSAndreas Gohr . ' see example 101.', 41b1c59bedSAndreas Gohr 106 => 'fenced code: indented opener with less-indented closer —' 42b1c59bedSAndreas Gohr . ' column-0-only policy, see example 101.', 43b1c59bedSAndreas Gohr 107 => 'fenced code: 4-space-indented closer — with column-0-only' 44b1c59bedSAndreas Gohr . ' policy there is no valid closer, so the fence stays literal' 45b1c59bedSAndreas Gohr . ' (see example 96).', 46b1c59bedSAndreas Gohr 109 => 'fenced code: malformed closer `~~~ ~~` (space-broken run) —' 47b1c59bedSAndreas Gohr . ' with no valid closer the fence stays literal (see example 96).', 48b1c59bedSAndreas Gohr 108 => 'fenced code: `` `` is not a valid fence; GFM falls back to an' 49b1c59bedSAndreas Gohr . ' inline code span of length 3. Inline spans with n≥3 not' 50b1c59bedSAndreas Gohr . ' implemented (GfmBacktickSingle/Double cover only n=1, n=2).', 51b1c59bedSAndreas Gohr 111 => 'fenced code interrupting Setext heading (`foo\n---`): Setext' 52685560ebSAndreas Gohr . ' headings are deliberately not supported — the `---` underline' 53685560ebSAndreas Gohr . ' collides with DokuWiki\'s horizontal rule and `===` would' 54685560ebSAndreas Gohr . ' collide with DokuWiki heading syntax.', 55b1c59bedSAndreas Gohr 115 => 'fenced code: `` `` backtick-fence-with-backticks-in-info-string' 56b1c59bedSAndreas Gohr . ' is invalid; GFM falls back to n=3 inline span — inline spans' 57b1c59bedSAndreas Gohr . ' with n≥3 not implemented. See example 108.', 58b1c59bedSAndreas Gohr 59b1c59bedSAndreas Gohr // -------------------------------------------------------------------- 608ed75a23SAndreas Gohr // Code-span edge cases that collide with project-wide decisions 618ed75a23SAndreas Gohr // (no raw HTML, no GFM angle-bracket autolinks, typography on by 628ed75a23SAndreas Gohr // default) or with the single-pass lexer's limits. 638ed75a23SAndreas Gohr // -------------------------------------------------------------------- 648ed75a23SAndreas Gohr 351 => 'code span vs. emphasis: cross-positional precedence would require' 658ed75a23SAndreas Gohr . ' a pre-scan pass — the single-pass lexer matches leftmost-first' 668ed75a23SAndreas Gohr . ' and cannot reject an earlier emphasis opener because a later' 678ed75a23SAndreas Gohr . ' backtick span would consume its closer', 688ed75a23SAndreas Gohr 353 => 'code span: the trailing `"` outside the span is converted to a' 698ed75a23SAndreas Gohr . ' curly quote by DokuWiki typography, diverging from the spec HTML', 708ed75a23SAndreas Gohr 354 => 'raw HTML tag pass-through: DokuWiki does not render raw HTML by' 718ed75a23SAndreas Gohr . ' default; `<html>` blocks are the opt-in', 728ed75a23SAndreas Gohr 356 => 'GFM angle-bracket autolink `<http://…>`: not implemented — we' 738ed75a23SAndreas Gohr . ' rely on DokuWiki\'s existing bare-URL detection, which does not' 748ed75a23SAndreas Gohr . ' parse `<URL>` form', 758ed75a23SAndreas Gohr 768ed75a23SAndreas Gohr // -------------------------------------------------------------------- 7772b2703bSAndreas Gohr // CommonMark §6.2 flanking-delimiter analysis — deliberately not 7872b2703bSAndreas Gohr // implemented. DokuWiki's regex lexer uses leftmost-match and cannot 7972b2703bSAndreas Gohr // apply CommonMark's left/right-flanking rules that distinguish 8072b2703bSAndreas Gohr // word-chars, whitespace, and punctuation for `*`/`_` delimiters, or 8172b2703bSAndreas Gohr // the "multiple-of-3" rule for overlapping runs. These examples all 8272b2703bSAndreas Gohr // rely on that machinery. 8372b2703bSAndreas Gohr // -------------------------------------------------------------------- 8472b2703bSAndreas Gohr 8572b2703bSAndreas Gohr // Unicode whitespace in flanking context. Our `\s` is ASCII-only 8672b2703bSAndreas Gohr // because the lexer doesn't set the PCRE `u` flag. 8772b2703bSAndreas Gohr 363 => 'Unicode whitespace (U+00A0) flanking — requires u-flag-aware regex', 8872b2703bSAndreas Gohr 8972b2703bSAndreas Gohr // Punctuation-adjacent flanking for `*` / `_` / `**` / `__` 9072b2703bSAndreas Gohr 362 => 'flanking: punctuation-adjacent `*` (left-flanking vs. right-flanking)', 9172b2703bSAndreas Gohr 368 => 'flanking: punctuation-adjacent `_`', 9272b2703bSAndreas Gohr 372 => 'flanking: intraword `_` with punctuation inside', 9372b2703bSAndreas Gohr 377 => 'flanking: `*` followed by `(` requires punctuation-aware flanking', 9472b2703bSAndreas Gohr 378 => 'flanking: nested `*(*foo*)*` requires flanking + balanced-pair analysis', 9572b2703bSAndreas Gohr 382 => 'flanking: nested `_(_foo_)_` requires flanking + balanced-pair analysis', 9672b2703bSAndreas Gohr 389 => 'flanking: punctuation-adjacent `**`', 9772b2703bSAndreas Gohr 394 => 'flanking: punctuation-adjacent `__`', 9872b2703bSAndreas Gohr 401 => 'flanking: `**` followed by `(`', 9972b2703bSAndreas Gohr 404 => 'flanking: nested `*bar*` inside `**foo ... foo**` with punctuation', 10072b2703bSAndreas Gohr 407 => 'flanking: `__` followed by `(`', 10172b2703bSAndreas Gohr 470 => 'flanking: nested `*_foo_*` requires balanced-pair analysis', 10272b2703bSAndreas Gohr 472 => 'flanking: nested `_*foo*_` requires balanced-pair analysis', 10372b2703bSAndreas Gohr 10472b2703bSAndreas Gohr // Intraword `__` strong (even multibyte) — flanking rule for `_` requires 10572b2703bSAndreas Gohr // examining whether the delimiter run is word-boundary-flanking, which our 10672b2703bSAndreas Gohr // simple lookbehind/lookahead approximation doesn't fully match. 10772b2703bSAndreas Gohr 395 => 'flanking: intraword `__` (`foo__bar__`) — left-flanking vs right-flanking', 10872b2703bSAndreas Gohr 396 => 'flanking: intraword `__` across digits (`5__6__78`)', 10972b2703bSAndreas Gohr 397 => 'flanking: intraword `__` with Cyrillic', 11072b2703bSAndreas Gohr 398 => 'flanking: `__foo, __bar__, baz__` — flanking + balanced pairing', 11172b2703bSAndreas Gohr 409 => 'flanking: `__foo__bar` — intraword close', 11272b2703bSAndreas Gohr 410 => 'flanking: intraword `__` with Cyrillic (leading)', 11372b2703bSAndreas Gohr 411 => 'flanking: `__foo__bar__baz__` — multiple `__` pairs with flanking', 11472b2703bSAndreas Gohr 412 => 'flanking: `__(bar)__.` — punctuation-adjacent', 11572b2703bSAndreas Gohr 11672b2703bSAndreas Gohr // Overlapping / multiple-of-3 rule for runs 11772b2703bSAndreas Gohr 416 => 'CommonMark rule 9 (overlapping same-delimiter `_foo _bar_ baz_`)', 11872b2703bSAndreas Gohr 417 => 'CommonMark overlapping `_` / `__` with flanking', 11972b2703bSAndreas Gohr 418 => 'CommonMark overlapping `*foo *bar**` — multiple-of-3 rule', 12072b2703bSAndreas Gohr 419 => 'CommonMark nested `*foo **bar** baz*` — balanced-pair analysis', 12172b2703bSAndreas Gohr 421 => 'CommonMark overlapping `*foo**bar*` — multiple-of-3', 12272b2703bSAndreas Gohr 422 => 'CommonMark nested `***foo** bar*` — triple-delimiter analysis', 12372b2703bSAndreas Gohr 423 => 'CommonMark nested `*foo **bar***` — triple-delimiter analysis', 12472b2703bSAndreas Gohr 424 => 'CommonMark nested `*foo**bar***` — triple-delimiter analysis', 12572b2703bSAndreas Gohr 425 => 'CommonMark triple `foo***bar***baz` — triple-delimiter analysis', 12672b2703bSAndreas Gohr 426 => 'CommonMark long delimiter runs `foo******bar*********baz`', 12772b2703bSAndreas Gohr 427 => 'CommonMark deeply nested `*foo **bar *baz* bim** bop*`', 12872b2703bSAndreas Gohr 434 => 'CommonMark overlapping `__foo __bar__ baz__` — multiple-of-3', 12972b2703bSAndreas Gohr 435 => 'CommonMark `____foo__ bar__` — leading long delimiter run', 13072b2703bSAndreas Gohr 436 => 'CommonMark `**foo **bar****` — trailing long delimiter run', 13172b2703bSAndreas Gohr 439 => 'CommonMark nested `***foo* bar**` — triple-delimiter', 13272b2703bSAndreas Gohr 440 => 'CommonMark nested `**foo *bar***` — triple-delimiter', 13372b2703bSAndreas Gohr 441 => 'CommonMark deeply nested `**foo *bar **baz** bim* bop**`', 13472b2703bSAndreas Gohr 13572b2703bSAndreas Gohr // `__foo_` / `_foo__` — mixing `_` and `__` requires flanking to decide 13672b2703bSAndreas Gohr // which delimiter pairs open/close. 13772b2703bSAndreas Gohr 463 => 'flanking: `__foo_` — mixed `_`/`__` pairing', 13872b2703bSAndreas Gohr 464 => 'flanking: `_foo__` — mixed `_`/`__` pairing', 13972b2703bSAndreas Gohr 465 => 'flanking: `___foo__` — delimiter-run length analysis', 14072b2703bSAndreas Gohr 466 => 'flanking: `____foo_` — delimiter-run length analysis', 14172b2703bSAndreas Gohr 467 => 'flanking: `__foo___` — delimiter-run length analysis', 14272b2703bSAndreas Gohr 468 => 'flanking: `_foo____` — delimiter-run length analysis', 14372b2703bSAndreas Gohr 14472b2703bSAndreas Gohr // Long delimiter runs require excess-drop logic (2 outer chars dropped 14572b2703bSAndreas Gohr // from each side). Stack-based pairing needed — out of scope. 14672b2703bSAndreas Gohr 473 => 'CommonMark `****foo****` — excess-drop (4+4 → strong only)', 14772b2703bSAndreas Gohr 474 => 'CommonMark `____foo____` — excess-drop (4+4 → strong only)', 14872b2703bSAndreas Gohr 475 => 'CommonMark `******foo******` — excess-drop (6+6 → strong only)', 14972b2703bSAndreas Gohr 477 => 'CommonMark `_____foo_____` — excess-drop (5+5 → em+strong, 2 dropped each side)', 15072b2703bSAndreas Gohr 15172b2703bSAndreas Gohr // Overlapping / crossing delimiters 15272b2703bSAndreas Gohr 478 => 'CommonMark `*foo _bar* baz_` — overlapping different delimiters', 15372b2703bSAndreas Gohr 479 => 'CommonMark `*foo __bar *baz bim__ bam*` — crossing delimiters', 15472b2703bSAndreas Gohr 480 => 'CommonMark `**foo **bar baz**` — overlapping same delimiter', 1558719732dSAndreas Gohr 1568719732dSAndreas Gohr // -------------------------------------------------------------------- 157e89aeebdSAndreas Gohr // Inline link `[text](url)` — features GfmLink deliberately does not 158e89aeebdSAndreas Gohr // implement. Either rarely-used syntax paid for with disproportionate 159e89aeebdSAndreas Gohr // regex complexity, or single-pass-lexer limits that can't be worked 160e89aeebdSAndreas Gohr // around inside one mode. 161e89aeebdSAndreas Gohr // -------------------------------------------------------------------- 162e89aeebdSAndreas Gohr 163e89aeebdSAndreas Gohr // GFM link title attribute (`"title"` / `'title'` / `(title)` after 164e89aeebdSAndreas Gohr // the URL). Parses cleanly but is discarded: DokuWiki's link handler 165e89aeebdSAndreas Gohr // instructions have no title-attribute slot, and plumbing one through 166e89aeebdSAndreas Gohr // every renderer is out of scope for GfmLink. 167e89aeebdSAndreas Gohr 493 => 'link title attribute: GfmLink parses but discards — DokuWiki link instructions have no title slot', 168e89aeebdSAndreas Gohr 513 => 'link title attribute (three quoting styles): discarded by GfmLink', 169e89aeebdSAndreas Gohr 515 => 'link title separated by non-breaking space: title slot not supported', 170e89aeebdSAndreas Gohr 516 => 'link title with nested balanced quotes: Markdown.pl quirk, not supported', 171e89aeebdSAndreas Gohr 517 => 'link title with different quote type for inner quotes: title slot not supported', 172e89aeebdSAndreas Gohr 518 => 'multi-line link title: title slot not supported', 173e89aeebdSAndreas Gohr 174e89aeebdSAndreas Gohr // Pointy-bracket link destinations `<...>`. Rarely used; regex cost 175e89aeebdSAndreas Gohr // and interaction with raw-HTML detection outweigh the benefit. 176e89aeebdSAndreas Gohr 496 => 'pointy-bracket link destination `<>`: not supported', 177e89aeebdSAndreas Gohr 498 => 'pointy-bracket destination with spaces `<...>`: not supported', 178e89aeebdSAndreas Gohr 500 => 'pointy-bracket destination with newline: not supported', 179e89aeebdSAndreas Gohr 501 => 'pointy-bracket destination containing `)`: not supported', 180e89aeebdSAndreas Gohr 502 => 'pointy-bracket destination with trailing backslash: not supported', 181e89aeebdSAndreas Gohr 503 => 'malformed pointy-bracket destinations: renderer output differs', 182e89aeebdSAndreas Gohr 507 => 'pointy-bracket destination wrapping unbalanced parens: not supported', 183e89aeebdSAndreas Gohr 184e89aeebdSAndreas Gohr // Balanced-parens inside URL destinations. 185e89aeebdSAndreas Gohr 505 => 'balanced-parens in URL destination: not supported (regex single-level)', 186e89aeebdSAndreas Gohr 187e89aeebdSAndreas Gohr // Other URL-level edges. 188e89aeebdSAndreas Gohr 495 => 'empty URL destination `[link]()`: pattern requires non-empty URL', 189e89aeebdSAndreas Gohr 510 => 'backslash in URL destination: URL-encoding differs from spec', 190e89aeebdSAndreas Gohr 511 => 'HTML entity / percent-encoding in URL: renderer normalization differs', 191e89aeebdSAndreas Gohr 512 => 'link destination that parses as a title: edge case not supported', 192e89aeebdSAndreas Gohr 193e89aeebdSAndreas Gohr // Inherent single-pass-lexer limits for link text containing nested 194e89aeebdSAndreas Gohr // structures. These cannot be resolved inside one mode. 195e89aeebdSAndreas Gohr 522 => 'nested bracket forms inner link, outer falls back to literal', 196e89aeebdSAndreas Gohr 526 => 'nested links: inner is a link, outer falls back to literal', 197e89aeebdSAndreas Gohr 527 => 'nested links inside emphasis: not supported', 198e89aeebdSAndreas Gohr 529 => 'link text grouping vs. emphasis: leftmost-match cannot override', 199e89aeebdSAndreas Gohr 530 => 'emphasis/bracket crossing: leftmost-match cannot override', 200e89aeebdSAndreas Gohr 532 => 'raw HTML inside link text: project-wide "no raw HTML" limit', 201e89aeebdSAndreas Gohr 533 => 'code span inside link text: requires pre-scan pass (see #351)', 202e89aeebdSAndreas Gohr 534 => 'autolink inside link text: raw `<URL>` autolinks not supported (see #356)', 203e89aeebdSAndreas Gohr 204e89aeebdSAndreas Gohr // Reference links (`[text][id]`, `[text][]`, `[foo]` with matching 205e89aeebdSAndreas Gohr // `[foo]: url` definition). Not implemented: resolving forward 206e89aeebdSAndreas Gohr // references would require a two-pass parse, but DokuWiki's lexer is 207e89aeebdSAndreas Gohr // single-pass. Inline links `[text](url)` are the only supported 208e89aeebdSAndreas Gohr // form. 209e89aeebdSAndreas Gohr 535 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 210e89aeebdSAndreas Gohr 536 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 211e89aeebdSAndreas Gohr 537 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 212e89aeebdSAndreas Gohr 538 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 213e89aeebdSAndreas Gohr 539 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 214e89aeebdSAndreas Gohr 540 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 215e89aeebdSAndreas Gohr 541 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 216e89aeebdSAndreas Gohr 542 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 217e89aeebdSAndreas Gohr 543 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 218e89aeebdSAndreas Gohr 544 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 219e89aeebdSAndreas Gohr 545 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 220e89aeebdSAndreas Gohr 546 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 221e89aeebdSAndreas Gohr 547 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 222e89aeebdSAndreas Gohr 548 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 223e89aeebdSAndreas Gohr 549 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 224e89aeebdSAndreas Gohr 550 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 225e89aeebdSAndreas Gohr 551 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 226e89aeebdSAndreas Gohr 552 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 227e89aeebdSAndreas Gohr 553 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 228e89aeebdSAndreas Gohr 557 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 229e89aeebdSAndreas Gohr 558 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 230e89aeebdSAndreas Gohr 560 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 231e89aeebdSAndreas Gohr 561 => 'collapsed reference link: forward-reference definitions not supported (single-pass lexer)', 232e89aeebdSAndreas Gohr 562 => 'collapsed reference link: forward-reference definitions not supported (single-pass lexer)', 233e89aeebdSAndreas Gohr 563 => 'collapsed reference link: forward-reference definitions not supported (single-pass lexer)', 234e89aeebdSAndreas Gohr 564 => 'collapsed reference link: forward-reference definitions not supported (single-pass lexer)', 235e89aeebdSAndreas Gohr 565 => 'shortcut reference link: forward-reference definitions not supported (single-pass lexer)', 236e89aeebdSAndreas Gohr 566 => 'shortcut reference link: forward-reference definitions not supported (single-pass lexer)', 237e89aeebdSAndreas Gohr 567 => 'shortcut reference link: forward-reference definitions not supported (single-pass lexer)', 238e89aeebdSAndreas Gohr 568 => 'shortcut reference link: forward-reference definitions not supported (single-pass lexer)', 239e89aeebdSAndreas Gohr 569 => 'shortcut reference link: forward-reference definitions not supported (single-pass lexer)', 240e89aeebdSAndreas Gohr 570 => 'shortcut reference link: forward-reference definitions not supported (single-pass lexer)', 241e89aeebdSAndreas Gohr 571 => 'shortcut reference link with escape: forward-reference definitions not supported (single-pass lexer)', 242e89aeebdSAndreas Gohr 572 => 'shortcut reference link with emphasis: forward-reference definitions not supported (single-pass lexer)', 243e89aeebdSAndreas Gohr 573 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 244e89aeebdSAndreas Gohr 574 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 245e89aeebdSAndreas Gohr 575 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 246e89aeebdSAndreas Gohr 576 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 247e89aeebdSAndreas Gohr 577 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 248e89aeebdSAndreas Gohr 578 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 249e89aeebdSAndreas Gohr 579 => 'reference link: forward-reference definitions not supported (single-pass lexer)', 250e89aeebdSAndreas Gohr 251e89aeebdSAndreas Gohr // -------------------------------------------------------------------- 2523440a8c0SAndreas Gohr // Inline image ``. The XHTML renderer's default media 2533440a8c0SAndreas Gohr // rendering diverges from GFM's bare <img> (it wraps in a details <a> 2543440a8c0SAndreas Gohr // with fetch.php/detail.php proxy URLs) — GfmSpecTest uses 2553440a8c0SAndreas Gohr // SpecCompatRenderer to emit spec-shape bare <img>, so only the 2563440a8c0SAndreas Gohr // parser-level or feature-level gaps remain as skips: title attribute 2573440a8c0SAndreas Gohr // (no DW slot), reference images, pointy-bracket destinations, nested 2583440a8c0SAndreas Gohr // brackets, and escape-dependent cases. 2593440a8c0SAndreas Gohr // -------------------------------------------------------------------- 2603440a8c0SAndreas Gohr 2613440a8c0SAndreas Gohr 580 => 'image with title attribute: GfmMedia discards titles (no DW slot)', 2623440a8c0SAndreas Gohr 581 => 'reference-style image: forward-reference definitions not supported (single-pass lexer)', 2633440a8c0SAndreas Gohr 582 => 'nested image-in-image `](y)`: alt class forbids brackets;' 2643440a8c0SAndreas Gohr . ' leftmost-match cannot reorder — outer falls back to literal (see #526)', 2653440a8c0SAndreas Gohr 583 => 'link-in-image alt `](y)`: alt class forbids brackets;' 2663440a8c0SAndreas Gohr . ' leftmost-match cannot reorder — outer falls back to literal (see #526)', 2673440a8c0SAndreas Gohr 584 => 'collapsed reference-style image: forward-reference definitions not supported', 2683440a8c0SAndreas Gohr 585 => 'full reference-style image: forward-reference definitions not supported', 2693440a8c0SAndreas Gohr 587 => 'image with title attribute: title discarded (no DW slot)', 2703440a8c0SAndreas Gohr 588 => 'pointy-bracket image destination ``: not supported (see GfmLink #496)', 2713440a8c0SAndreas Gohr 590 => 'reference-style image: forward-reference definitions not supported', 2723440a8c0SAndreas Gohr 591 => 'reference-style image (case-insensitive label): forward-reference definitions not supported', 2733440a8c0SAndreas Gohr 592 => 'collapsed reference-style image `![foo][]`: forward-reference definitions not supported', 2743440a8c0SAndreas Gohr 593 => 'collapsed reference-style image with emphasis in label: forward-reference definitions not supported', 2753440a8c0SAndreas Gohr 594 => 'collapsed reference-style image (case-insensitive): forward-reference definitions not supported', 2763440a8c0SAndreas Gohr 595 => 'reference-style image with intervening whitespace: forward-reference definitions not supported', 2773440a8c0SAndreas Gohr 596 => 'shortcut reference-style image `![foo]`: forward-reference definitions not supported', 2783440a8c0SAndreas Gohr 597 => 'shortcut reference-style image with emphasis: forward-reference definitions not supported', 2793440a8c0SAndreas Gohr 598 => 'image with unescaped nested brackets `![[foo]]`: literal-fallback behavior not supported', 2803440a8c0SAndreas Gohr 599 => 'shortcut reference-style image (case-insensitive): forward-reference definitions not supported', 2813440a8c0SAndreas Gohr 2823440a8c0SAndreas Gohr // -------------------------------------------------------------------- 2838719732dSAndreas Gohr // ATX heading collisions with DokuWiki-specific behavior. 2848719732dSAndreas Gohr // -------------------------------------------------------------------- 2858719732dSAndreas Gohr 38 => 'ATX heading with leading spaces: GFM tolerates 0-3 spaces of' 2868719732dSAndreas Gohr . ' indent before the opener; we require the `#` at column 0.' 2878719732dSAndreas Gohr . ' Indent tolerance collides with DokuWiki\'s 2-space-indent' 2888719732dSAndreas Gohr . ' preformatted block and isn\'t worth untangling', 2898719732dSAndreas Gohr 39 => 'indented code block: DokuWiki uses 2-space indent for' 2908719732dSAndreas Gohr . ' preformatted; GFM 4-space indented code blocks are not' 2918719732dSAndreas Gohr . ' implemented', 2928719732dSAndreas Gohr 40 => 'indented code block: 4-space indent after a paragraph is a' 2938719732dSAndreas Gohr . ' continuation in GFM but preformatted in DokuWiki — not' 2948719732dSAndreas Gohr . ' implemented', 2958719732dSAndreas Gohr 41 => 'ATX heading with leading spaces: second heading is indented' 2968719732dSAndreas Gohr . ' by 2 spaces; we require the `#` at column 0', 2978719732dSAndreas Gohr 49 => 'empty ATX heading: DokuWiki\'s XHTML renderer deliberately' 2988719732dSAndreas Gohr . ' skips blank headings (blank() guard in Doku_Renderer_xhtml::header)', 299685560ebSAndreas Gohr 300685560ebSAndreas Gohr // -------------------------------------------------------------------- 301685560ebSAndreas Gohr // List items / Lists — list features GfmListblock deliberately does 302685560ebSAndreas Gohr // not implement. The simplifications are by design: indentation uses 303685560ebSAndreas Gohr // a fixed 2-space-multiple step starting at 0, lazy continuation is 304685560ebSAndreas Gohr // not supported, and the rewriter groups items by 'u'/'o' type only. 305685560ebSAndreas Gohr // The buckets are: 306685560ebSAndreas Gohr // 307685560ebSAndreas Gohr // A. Extra spaces after the marker. CommonMark rolls them (up to 308685560ebSAndreas Gohr // 4) into the content column; we dedent at `marker_width + 1`, 309685560ebSAndreas Gohr // collapsing the extras. 310685560ebSAndreas Gohr // B. 1- or 3-space indent for nesting (we round down to nearest 2). 311685560ebSAndreas Gohr // C. Lazy continuation (column-0 paragraph wrap inside an item). 312685560ebSAndreas Gohr // D. Strict CommonMark loose/tight classification (every blank line 313685560ebSAndreas Gohr // between items / inside items reclassifies; we use a simpler 314685560ebSAndreas Gohr // single-paragraph-tight, multi-paragraph-loose rule). 315685560ebSAndreas Gohr // E. Marker-character-change splits ordered lists ('.' vs ')') or 316685560ebSAndreas Gohr // unordered ('-' vs '+' vs '*'). Our rewriter groups by 'u' / 'o' 317685560ebSAndreas Gohr // type only, not by marker character. 318685560ebSAndreas Gohr // F. List interrupting a paragraph without a blank line — requires a 319685560ebSAndreas Gohr // multi-pass block parser to revisit prior text. 320685560ebSAndreas Gohr // 321685560ebSAndreas Gohr // Examples that depend on a pending mode (GfmQuote, GfmEscape, …) are 322685560ebSAndreas Gohr // intentionally NOT skipped — they remain visible failing tests until 323685560ebSAndreas Gohr // the mode lands. 324685560ebSAndreas Gohr // -------------------------------------------------------------------- 325*309a0852SAndreas Gohr // -------------------------------------------------------------------- 326*309a0852SAndreas Gohr // Block quotes — deliberate scope reductions vs. strict GFM. The 327*309a0852SAndreas Gohr // unified GfmQuote mode (replacing DW Quote) covers `>` blockquotes 328*309a0852SAndreas Gohr // for both DW and MD pages, but several CommonMark blockquote rules 329*309a0852SAndreas Gohr // are out of scope: 330*309a0852SAndreas Gohr // 331*309a0852SAndreas Gohr // - 1-3 space indent before `>` (column-0-only policy, consistent 332*309a0852SAndreas Gohr // with GfmCode / GfmFile / GfmHeader). 333*309a0852SAndreas Gohr // - Lazy continuation (paragraph text without `>` on continuation 334*309a0852SAndreas Gohr // lines). Same policy as GfmListblock — markers required on 335*309a0852SAndreas Gohr // every line. 336*309a0852SAndreas Gohr // - Headers inside quotes — sub-parser excludes BASEONLY so header 337*309a0852SAndreas Gohr // instructions don't drive TOC/section-edit anchors that don't 338*309a0852SAndreas Gohr // compose with `<blockquote>`. Same rationale as GfmListblock's 339*309a0852SAndreas Gohr // header exclusion inside list items. 340*309a0852SAndreas Gohr // - Setext-style block constructs (the `---` underline collides 341*309a0852SAndreas Gohr // with DW's HR rule). 342*309a0852SAndreas Gohr // 343*309a0852SAndreas Gohr // Examples that depend on still-pending modes (GfmHr) are 344*309a0852SAndreas Gohr // intentionally NOT skipped — they stay visible until those modes 345*309a0852SAndreas Gohr // land. 346*309a0852SAndreas Gohr // -------------------------------------------------------------------- 347*309a0852SAndreas Gohr 206 => 'block quotes: header inside quote — sub-parser excludes' 348*309a0852SAndreas Gohr . ' BASEONLY (TOC / section-edit anchors do not compose with' 349*309a0852SAndreas Gohr . ' `<blockquote>`). Same policy as GfmListblock for `<li>`.', 350*309a0852SAndreas Gohr 207 => 'block quotes: header inside quote with no space after `>` —' 351*309a0852SAndreas Gohr . ' see #206 for the BASEONLY exclusion rationale.', 352*309a0852SAndreas Gohr 208 => 'block quotes: leading-space `>` (1-3 spaces of indent) —' 353*309a0852SAndreas Gohr . ' column-0-only policy, consistent with GfmCode / GfmFile.', 354*309a0852SAndreas Gohr 210 => 'block quotes: lazy continuation `> # Foo\n> bar\nbaz` —' 355*309a0852SAndreas Gohr . ' every quote line must begin with `>` at column 0. Same' 356*309a0852SAndreas Gohr . ' policy as GfmListblock.', 357*309a0852SAndreas Gohr 211 => 'block quotes: lazy continuation `> bar\nbaz\n> foo` —' 358*309a0852SAndreas Gohr . ' see #210.', 359*309a0852SAndreas Gohr 212 => 'block quotes: Setext heading underline `---` after `> foo`' 360*309a0852SAndreas Gohr . ' — no Setext headings (the `---` collides with DW HR syntax).', 361*309a0852SAndreas Gohr 215 => 'block quotes: fenced code block split across blockquote' 362*309a0852SAndreas Gohr . ' boundary — fence inside quote followed by non-`>` lines' 363*309a0852SAndreas Gohr . ' depends on the same lazy-continuation rule we do not' 364*309a0852SAndreas Gohr . ' implement (see #210).', 365*309a0852SAndreas Gohr 216 => 'block quotes: lazy continuation `> foo\n - bar` — see #210.', 366*309a0852SAndreas Gohr 225 => 'block quotes: lazy continuation `> bar\nbaz` — see #210.', 367*309a0852SAndreas Gohr 227 => 'block quotes: lazy continuation `> bar\n>\nbaz` — see #210.', 368*309a0852SAndreas Gohr 228 => 'block quotes: lazy continuation in nested quote' 369*309a0852SAndreas Gohr . ' `> > > foo\nbar` — see #210.', 370*309a0852SAndreas Gohr 229 => 'block quotes: lazy continuation across nested levels' 371*309a0852SAndreas Gohr . ' `>>> foo\n> bar\n>>baz` — see #210.', 372*309a0852SAndreas Gohr 373685560ebSAndreas Gohr 232 => 'list items: marker-width content-column alignment (A)', 374685560ebSAndreas Gohr 235 => 'list items: marker-width content-column alignment (A)', 375685560ebSAndreas Gohr 249 => 'list items: marker-width-driven content-column alignment for `10. foo` (A)', 376685560ebSAndreas Gohr 254 => 'list items: marker-width content-column alignment edge case (A)', 377685560ebSAndreas Gohr 258 => 'list items: marker-width content-column for `1. foo` (A)', 378685560ebSAndreas Gohr 263 => 'list items: indent ambiguity at column 0/1/2 (B)', 379685560ebSAndreas Gohr 264 => 'list items: 1-space-indent variation (B)', 380685560ebSAndreas Gohr 265 => 'list items: marker-width with multi-line continuation (A)', 381685560ebSAndreas Gohr 266 => 'list items: marker-width with multi-line continuation (A)', 382685560ebSAndreas Gohr 267 => 'list items: lazy continuation (C)', 383685560ebSAndreas Gohr 268 => 'list items: lazy continuation (C)', 384685560ebSAndreas Gohr 270 => 'list items: lazy continuation across blank line (C+D)', 385685560ebSAndreas Gohr 273 => 'list items: list interrupting a paragraph without blank line (F)', 386685560ebSAndreas Gohr 275 => 'list items: 3-space indent rounds to 2 — sub-list under previous item (B)', 387685560ebSAndreas Gohr 276 => 'list items: marker-width content-column with mixed types (A+E)', 388685560ebSAndreas Gohr 277 => 'list items: nested markers on a single line (A)', 389685560ebSAndreas Gohr 278 => 'list items: marker-character switch splits the list (E)', 390685560ebSAndreas Gohr 281 => 'lists: marker-character change splits unordered list `-` -> `+` (E)', 391685560ebSAndreas Gohr 282 => 'lists: ordered delimiter switch splits list `.` -> `)` (E)', 392685560ebSAndreas Gohr 284 => 'lists: list interrupting paragraph without blank line (F)', 393685560ebSAndreas Gohr 286 => 'lists: marker-width content-column alignment for ordered list (A)', 394685560ebSAndreas Gohr 287 => 'lists: triple blank line + indented continuation in deeply nested item (D)', 395685560ebSAndreas Gohr 288 => 'lists: marker-character change at deeper level (E)', 396685560ebSAndreas Gohr 289 => 'lists: marker-character change with type switch (E)', 397685560ebSAndreas Gohr 290 => 'lists: 1-space-indent variations of items, all stay top-level (B)', 398685560ebSAndreas Gohr 291 => 'lists: 1-space-indent variations on ordered list (B)', 399685560ebSAndreas Gohr 292 => 'lists: marker-character change splits inside nested list (E)', 400685560ebSAndreas Gohr 293 => 'lists: marker-character change with mixed indent (E+B)', 401685560ebSAndreas Gohr 294 => 'lists: lazy continuation across types (C+E)', 402685560ebSAndreas Gohr 295 => 'lists: lazy continuation in nested list (C)', 403685560ebSAndreas Gohr 296 => 'lists: lazy continuation across blank line (C+D)', 404685560ebSAndreas Gohr 297 => 'lists: blank-line classification for loose/tight in nested list (D)', 405685560ebSAndreas Gohr 298 => 'lists: blank-line classification (D)', 406685560ebSAndreas Gohr 300 => 'lists: blank-line classification with marker change (D+E)', 407685560ebSAndreas Gohr 301 => 'lists: blank-line classification + marker-width alignment (D+A)', 408685560ebSAndreas Gohr 304 => 'lists: blank line between sub-list items affects loose/tight (D)', 409685560ebSAndreas Gohr 305 => 'lists: blank line between deeply nested items (D)', 410685560ebSAndreas Gohr 306 => 'lists: blank line at the end of a loose list affects classification (D)', 41174031e46SAndreas Gohr 41274031e46SAndreas Gohr // -------------------------------------------------------------------- 41374031e46SAndreas Gohr // Backslash-escape examples (§6.1) that fail for reasons unrelated to 41474031e46SAndreas Gohr // GfmEscape itself: renderer divergences, typography conversion, and 41574031e46SAndreas Gohr // already-skipped GFM features (autolinks, raw HTML, reference links, 41674031e46SAndreas Gohr // discarded link titles). The escape mechanic itself works. 41774031e46SAndreas Gohr // -------------------------------------------------------------------- 41874031e46SAndreas Gohr 308 => 'backslash escapes: apostrophe is rendered as `'` by DW while' 41974031e46SAndreas Gohr . ' the spec expects a literal `\'` — renderer policy difference,' 42074031e46SAndreas Gohr . ' not an escape bug', 42174031e46SAndreas Gohr 310 => 'backslash escapes: DW typography converts straight `"..."` to curly' 42274031e46SAndreas Gohr . ' quotes when $conf[typography] is on, diverging from spec output', 42374031e46SAndreas Gohr 316 => 'backslash escapes inside angle-bracket autolinks: GFM autolink' 42474031e46SAndreas Gohr . ' `<URL>` form not implemented (see example 356)', 42574031e46SAndreas Gohr 317 => 'backslash escapes inside raw HTML: raw HTML pass-through is not' 42674031e46SAndreas Gohr . ' supported by default (see example 354)', 42774031e46SAndreas Gohr 318 => 'backslash escapes in link title: title attribute is discarded — DW' 428*309a0852SAndreas Gohr . ' link instructions have no title slot', 42974031e46SAndreas Gohr 319 => 'backslash escapes in reference-link definition: link reference' 43074031e46SAndreas Gohr . ' definitions not supported (single-pass lexer cannot resolve' 43174031e46SAndreas Gohr . ' forward references)', 43272b2703bSAndreas Gohr]; 433